mirror of
https://github.com/Alfresco/alfresco-community-repo.git
synced 2025-07-31 17:39:05 +00:00
. Fix to issue in login page redirect code where URL arguments (e.g. for templates and scripts) were removed and not passed through.
- this only affected the template/command servlets that were using parameters and had not already logged in . Support for 'path' argument on DownloadContentServlet for example /alfresco/download/direct?path=/Company%20Home/Kev's%20Home%20Space/myimage.jpg - paths are specified in a similar way to webdav path - they are 'cm:name' based URL encoded strings - this means we no longer need to have the NodeRef to a document to download it . Support for 'templatePath' and 'contextPath' URL arguments in TemplateContentServlet for example: /alfresco/template?templatePath=/Company%20Home/Data%20Dictionary/Presentation%20Templates/doc_info.ftl&contextPath=/Company%20Home/file.txt - the 'templatePath' argument specifies the cm:name based path to the template to execute - the 'contextPath' argument specifies the cm:name based path to the context for the template . Support for 'scriptPath' and 'contextPath' URL arguments in Script CommandProcessor for example: /alfresco/command/script/execute?scriptPath=/Company%20Home/Data%20Dictionary/Scripts/append%20copyright.js&contextPath=/Company%20Home/file.txt - the 'scriptPath' argument specifies the cm:name based path to the script to execute - the 'contextPath' argument specifies the cm:name based path to the context for the script . Adding debugging output to get timings for executing templates and scripts . Enhancements and additions to JavaScript API: setPermission() removePermission() get/setInheritsPermissions() git-svn-id: https://svn.alfresco.com/repos/alfresco-enterprise/alfresco/HEAD/root@3297 c4b6b30b-aa2e-2d43-bbcb-ca4b014f7261
This commit is contained in:
@@ -23,6 +23,7 @@ import java.util.ArrayList;
|
|||||||
import java.util.HashSet;
|
import java.util.HashSet;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import javax.faces.context.FacesContext;
|
import javax.faces.context.FacesContext;
|
||||||
import javax.servlet.ServletContext;
|
import javax.servlet.ServletContext;
|
||||||
@@ -140,9 +141,10 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
throws IOException
|
throws IOException
|
||||||
{
|
{
|
||||||
// authentication failed - so end servlet execution and redirect to login page
|
// authentication failed - so end servlet execution and redirect to login page
|
||||||
// also save the requested URL so the login page knows where to redirect too later
|
// also save the full requested URL so the login page knows where to redirect too later
|
||||||
res.sendRedirect(req.getContextPath() + FACES_SERVLET + Application.getLoginPage(sc));
|
res.sendRedirect(req.getContextPath() + FACES_SERVLET + Application.getLoginPage(sc));
|
||||||
String uri = req.getRequestURI();
|
String uri = req.getRequestURI();
|
||||||
|
String url = uri + (req.getQueryString() != null ? ("?" + req.getQueryString()) : "");
|
||||||
if (uri.indexOf(req.getContextPath() + FACES_SERVLET) != -1)
|
if (uri.indexOf(req.getContextPath() + FACES_SERVLET) != -1)
|
||||||
{
|
{
|
||||||
// if we find a JSF servlet reference in the URI then we need to check if the rest of the
|
// if we find a JSF servlet reference in the URI then we need to check if the rest of the
|
||||||
@@ -150,12 +152,12 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
int jspIndex = uri.indexOf(BaseServlet.FACES_SERVLET) + BaseServlet.FACES_SERVLET.length();
|
int jspIndex = uri.indexOf(BaseServlet.FACES_SERVLET) + BaseServlet.FACES_SERVLET.length();
|
||||||
if (uri.length() > jspIndex && BaseServlet.validRedirectJSP(uri.substring(jspIndex)))
|
if (uri.length() > jspIndex && BaseServlet.validRedirectJSP(uri.substring(jspIndex)))
|
||||||
{
|
{
|
||||||
req.getSession().setAttribute(LoginBean.LOGIN_REDIRECT_KEY, uri);
|
req.getSession().setAttribute(LoginBean.LOGIN_REDIRECT_KEY, url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
req.getSession().setAttribute(LoginBean.LOGIN_REDIRECT_KEY, uri);
|
req.getSession().setAttribute(LoginBean.LOGIN_REDIRECT_KEY, url);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -179,9 +181,47 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
* Resolves the given path elements to a NodeRef in the current repository
|
* Resolves the given path elements to a NodeRef in the current repository
|
||||||
*
|
*
|
||||||
* @param context Faces context
|
* @param context Faces context
|
||||||
* @param args The elements of the path to lookup
|
* @param args The elements of the path to lookup
|
||||||
*/
|
*/
|
||||||
public static NodeRef resolveWebDAVPath(FacesContext context, String[] args)
|
public static NodeRef resolveWebDAVPath(FacesContext context, String[] args)
|
||||||
|
{
|
||||||
|
WebApplicationContext wc = FacesContextUtils.getRequiredWebApplicationContext(context);
|
||||||
|
return resolveWebDAVPath(wc, args, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the given path elements to a NodeRef in the current repository
|
||||||
|
*
|
||||||
|
* @param context ServletContext context
|
||||||
|
* @param args The elements of the path to lookup
|
||||||
|
*/
|
||||||
|
public static NodeRef resolveWebDAVPath(ServletContext context, String[] args)
|
||||||
|
{
|
||||||
|
WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
|
||||||
|
return resolveWebDAVPath(wc, args, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the given path elements to a NodeRef in the current repository
|
||||||
|
*
|
||||||
|
* @param context ServletContext context
|
||||||
|
* @param args The elements of the path to lookup
|
||||||
|
* @param decode True to decode the arg from UTF-8 format, false for no decoding
|
||||||
|
*/
|
||||||
|
public static NodeRef resolveWebDAVPath(ServletContext context, String[] args, boolean decode)
|
||||||
|
{
|
||||||
|
WebApplicationContext wc = WebApplicationContextUtils.getRequiredWebApplicationContext(context);
|
||||||
|
return resolveWebDAVPath(wc, args, decode);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolves the given path elements to a NodeRef in the current repository
|
||||||
|
*
|
||||||
|
* @param WebApplicationContext Context
|
||||||
|
* @param args The elements of the path to lookup
|
||||||
|
* @param decode True to decode the arg from UTF-8 format, false for no decoding
|
||||||
|
*/
|
||||||
|
private static NodeRef resolveWebDAVPath(WebApplicationContext wc, String[] args, boolean decode)
|
||||||
{
|
{
|
||||||
NodeRef nodeRef = null;
|
NodeRef nodeRef = null;
|
||||||
|
|
||||||
@@ -193,7 +233,7 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
// create a list of path elements (decode the URL as we go)
|
// create a list of path elements (decode the URL as we go)
|
||||||
for (int x = 1; x < args.length; x++)
|
for (int x = 1; x < args.length; x++)
|
||||||
{
|
{
|
||||||
paths.add(URLDecoder.decode(args[x], "UTF-8"));
|
paths.add(decode ? URLDecoder.decode(args[x], "UTF-8") : args[x]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
@@ -203,7 +243,6 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
NodeRef companyHome = new NodeRef(Repository.getStoreRef(),
|
NodeRef companyHome = new NodeRef(Repository.getStoreRef(),
|
||||||
Application.getCompanyRootId());
|
Application.getCompanyRootId());
|
||||||
|
|
||||||
WebApplicationContext wc = FacesContextUtils.getRequiredWebApplicationContext(context);
|
|
||||||
FileFolderService ffs = (FileFolderService)wc.getBean("FileFolderService");
|
FileFolderService ffs = (FileFolderService)wc.getBean("FileFolderService");
|
||||||
file = ffs.resolveNamePath(companyHome, paths);
|
file = ffs.resolveNamePath(companyHome, paths);
|
||||||
nodeRef = file.getNodeRef();
|
nodeRef = file.getNodeRef();
|
||||||
@@ -228,4 +267,50 @@ public abstract class BaseServlet extends HttpServlet
|
|||||||
|
|
||||||
return nodeRef;
|
return nodeRef;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Resolve a name based into a NodeRef and Filename string
|
||||||
|
*
|
||||||
|
* @param sc ServletContext
|
||||||
|
* @param path 'cm:name' based path using the '/' character as a separator
|
||||||
|
*
|
||||||
|
* @return PathRefInfo structure containing the resolved NodeRef and filename
|
||||||
|
*
|
||||||
|
* @throws IllegalArgumentException
|
||||||
|
*/
|
||||||
|
public final static PathRefInfo resolveNamePath(ServletContext sc, String path)
|
||||||
|
{
|
||||||
|
StringTokenizer t = new StringTokenizer(path, "/");
|
||||||
|
int tokenCount = t.countTokens();
|
||||||
|
String[] elements = new String[tokenCount];
|
||||||
|
for (int i=0; i<tokenCount; i++)
|
||||||
|
{
|
||||||
|
elements[i] = t.nextToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
// process name based path tokens using the webdav path resolving helper
|
||||||
|
NodeRef nodeRef = resolveWebDAVPath(sc, elements, false);
|
||||||
|
if (nodeRef == null)
|
||||||
|
{
|
||||||
|
// unable to resolve path - output helpful error to the user
|
||||||
|
throw new IllegalArgumentException("Unable to resolve item Path: " + path);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new PathRefInfo(nodeRef, elements[tokenCount - 1]);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Simple structure class for returning both a NodeRef and Filename String
|
||||||
|
* @author Kevin Roast
|
||||||
|
*/
|
||||||
|
public static class PathRefInfo
|
||||||
|
{
|
||||||
|
PathRefInfo(NodeRef ref, String filename)
|
||||||
|
{
|
||||||
|
this.NodeRef = ref;
|
||||||
|
this.Filename = filename;
|
||||||
|
}
|
||||||
|
public NodeRef NodeRef;
|
||||||
|
public String Filename;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@@ -18,6 +18,9 @@ package org.alfresco.web.app.servlet;
|
|||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.Enumeration;
|
||||||
|
import java.util.HashMap;
|
||||||
|
import java.util.Map;
|
||||||
import java.util.StringTokenizer;
|
import java.util.StringTokenizer;
|
||||||
|
|
||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
@@ -101,10 +104,19 @@ public class CommandServlet extends BaseServlet
|
|||||||
String command = t.nextToken();
|
String command = t.nextToken();
|
||||||
|
|
||||||
// get any remaining uri elements to pass to the processor
|
// get any remaining uri elements to pass to the processor
|
||||||
String[] args = new String[tokenCount - 3];
|
String[] urlElements = new String[tokenCount - 3];
|
||||||
for (int i=0; i<tokenCount-3; i++)
|
for (int i=0; i<tokenCount-3; i++)
|
||||||
{
|
{
|
||||||
args[i] = t.nextToken();
|
urlElements[i] = t.nextToken();
|
||||||
|
}
|
||||||
|
|
||||||
|
// retrieve the URL arguments to pass to the processor
|
||||||
|
Map<String, String> args = new HashMap<String, String>(8, 1.0f);
|
||||||
|
Enumeration names = req.getParameterNames();
|
||||||
|
while (names.hasMoreElements())
|
||||||
|
{
|
||||||
|
String name = (String)names.nextElement();
|
||||||
|
args.put(name, req.getParameter(name));
|
||||||
}
|
}
|
||||||
|
|
||||||
try
|
try
|
||||||
@@ -113,13 +125,13 @@ public class CommandServlet extends BaseServlet
|
|||||||
CommandProcessor processor = createCommandProcessor(procName);
|
CommandProcessor processor = createCommandProcessor(procName);
|
||||||
|
|
||||||
// validate that the processor has everything it needs to run the command
|
// validate that the processor has everything it needs to run the command
|
||||||
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
|
if (processor.validateArguments(getServletContext(), command, args, urlElements) == false)
|
||||||
if (processor.validateArguments(serviceRegistry, command, args) == false)
|
|
||||||
{
|
{
|
||||||
redirectToLoginPage(req, res, getServletContext());
|
redirectToLoginPage(req, res, getServletContext());
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
|
||||||
UserTransaction txn = null;
|
UserTransaction txn = null;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
|
@@ -52,9 +52,11 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
* <pre>/alfresco/download/attach/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf</pre>
|
* <pre>/alfresco/download/attach/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf</pre>
|
||||||
* or
|
* or
|
||||||
* <pre>/alfresco/download/direct/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf</pre>
|
* <pre>/alfresco/download/direct/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf</pre>
|
||||||
* <p>
|
* or
|
||||||
* The store protocol, followed by the store ID, followed by the content Node Id
|
* <pre>/alfresco/download/[direct|attach]?path=/Company%20Home/MyFolder/myfile.pdf</pre>
|
||||||
* the last element is used for mimetype calculation and browser default filename.
|
* The protocol, followed by either the store and Id (NodeRef) or instead specify a name based
|
||||||
|
* encoded Path to the content, note that the filename element is used for mimetype lookup and
|
||||||
|
* as the returning filename for the response stream.
|
||||||
* <p>
|
* <p>
|
||||||
* The 'attach' or 'direct' element is used to indicate whether to display the stream directly
|
* The 'attach' or 'direct' element is used to indicate whether to display the stream directly
|
||||||
* in the browser or download it as a file attachment.
|
* in the browser or download it as a file attachment.
|
||||||
@@ -86,6 +88,7 @@ public class DownloadContentServlet extends BaseServlet
|
|||||||
|
|
||||||
private static final String ARG_PROPERTY = "property";
|
private static final String ARG_PROPERTY = "property";
|
||||||
private static final String ARG_ATTACH = "attach";
|
private static final String ARG_ATTACH = "attach";
|
||||||
|
private static final String ARG_PATH = "path";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
@@ -93,11 +96,6 @@ public class DownloadContentServlet extends BaseServlet
|
|||||||
protected void doGet(HttpServletRequest req, HttpServletResponse res)
|
protected void doGet(HttpServletRequest req, HttpServletResponse res)
|
||||||
throws ServletException, IOException
|
throws ServletException, IOException
|
||||||
{
|
{
|
||||||
// The URL contains multiple parts
|
|
||||||
// /alfresco/download/attach/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf
|
|
||||||
// the protocol, followed by the store, followed by the Id
|
|
||||||
// the last part is only used for mimetype and browser use
|
|
||||||
// may be followed by valid ticket for pre-authenticated usage: ?ticket=1234567890
|
|
||||||
String uri = req.getRequestURI();
|
String uri = req.getRequestURI();
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
@@ -114,34 +112,53 @@ public class DownloadContentServlet extends BaseServlet
|
|||||||
// only really needed if we don't use the built in compression of the servlet container
|
// only really needed if we don't use the built in compression of the servlet container
|
||||||
uri = uri.substring(req.getContextPath().length());
|
uri = uri.substring(req.getContextPath().length());
|
||||||
StringTokenizer t = new StringTokenizer(uri, "/");
|
StringTokenizer t = new StringTokenizer(uri, "/");
|
||||||
if (t.countTokens() < 6)
|
int tokenCount = t.countTokens();
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Download URL did not contain all required args: " + uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
t.nextToken(); // skip servlet name
|
t.nextToken(); // skip servlet name
|
||||||
|
|
||||||
|
// attachment mode (either 'attach' or 'direct')
|
||||||
String attachToken = t.nextToken();
|
String attachToken = t.nextToken();
|
||||||
boolean attachment = attachToken.equals(ARG_ATTACH);
|
boolean attachment = attachToken.equals(ARG_ATTACH);
|
||||||
|
|
||||||
StoreRef storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
// get or calculate the noderef and filename to download as
|
||||||
String id = t.nextToken();
|
NodeRef nodeRef;
|
||||||
String filename = t.nextToken();
|
String filename;
|
||||||
|
|
||||||
// get property qualified name
|
// do we have a path parameter instead of a NodeRef?
|
||||||
QName propertyQName = null;
|
String path = req.getParameter(ARG_PATH);
|
||||||
String property = req.getParameter(ARG_PROPERTY);
|
if (path != null && path.length() != 0)
|
||||||
if (property == null || property.length() == 0)
|
|
||||||
{
|
{
|
||||||
propertyQName = ContentModel.PROP_CONTENT;
|
// process the name based path to resolve the NodeRef and the Filename element
|
||||||
|
PathRefInfo pathInfo = resolveNamePath(getServletContext(), path);
|
||||||
|
|
||||||
|
nodeRef = pathInfo.NodeRef;
|
||||||
|
filename = pathInfo.Filename;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
propertyQName = QName.createQName(property);
|
// a NodeRef must have been specified if no path has been found
|
||||||
|
if (tokenCount < 6)
|
||||||
|
{
|
||||||
|
throw new IllegalArgumentException("Download URL did not contain all required args: " + uri);
|
||||||
|
}
|
||||||
|
|
||||||
|
// assume 'workspace' or other NodeRef based protocol for remaining URL elements
|
||||||
|
StoreRef storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
||||||
|
String id = t.nextToken();
|
||||||
|
// build noderef from the appropriate URL elements
|
||||||
|
nodeRef = new NodeRef(storeRef, id);
|
||||||
|
|
||||||
|
// filename is last remaining token
|
||||||
|
filename = t.nextToken();
|
||||||
}
|
}
|
||||||
|
|
||||||
// build noderef from the appropriate URL elements
|
// get qualified of the property to get content from - default to ContentModel.PROP_CONTENT
|
||||||
NodeRef nodeRef = new NodeRef(storeRef, id);
|
QName propertyQName = ContentModel.PROP_CONTENT;
|
||||||
|
String property = req.getParameter(ARG_PROPERTY);
|
||||||
|
if (property != null && property.length() != 0)
|
||||||
|
{
|
||||||
|
propertyQName = QName.createQName(property);
|
||||||
|
}
|
||||||
|
|
||||||
if (logger.isDebugEnabled())
|
if (logger.isDebugEnabled())
|
||||||
{
|
{
|
||||||
@@ -199,7 +216,9 @@ public class DownloadContentServlet extends BaseServlet
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
// set mimetype for the content and the character encoding for the stream
|
||||||
res.setContentType(mimetype);
|
res.setContentType(mimetype);
|
||||||
|
res.setCharacterEncoding(reader.getEncoding());
|
||||||
|
|
||||||
// get the content and stream directly to the response output stream
|
// get the content and stream directly to the response output stream
|
||||||
// assuming the repo is capable of streaming in chunks, this should allow large files
|
// assuming the repo is capable of streaming in chunks, this should allow large files
|
||||||
|
@@ -27,7 +27,6 @@ import java.util.StringTokenizer;
|
|||||||
import javax.servlet.ServletException;
|
import javax.servlet.ServletException;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpServletResponse;
|
import javax.servlet.http.HttpServletResponse;
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
import javax.transaction.UserTransaction;
|
import javax.transaction.UserTransaction;
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
@@ -56,10 +55,15 @@ import org.apache.commons.logging.LogFactory;
|
|||||||
* <pre>/alfresco/template/workspace/SpacesStore/0000-0000-0000-0000</pre>
|
* <pre>/alfresco/template/workspace/SpacesStore/0000-0000-0000-0000</pre>
|
||||||
* or
|
* or
|
||||||
* <pre>/alfresco/template/workspace/SpacesStore/0000-0000-0000-0000/workspace/SpacesStore/0000-0000-0000-0000</pre>
|
* <pre>/alfresco/template/workspace/SpacesStore/0000-0000-0000-0000/workspace/SpacesStore/0000-0000-0000-0000</pre>
|
||||||
|
* or
|
||||||
|
* <pre>/alfresco/template?templatePath=/Company%20Home/Data%20Dictionary/Presentation%20Templates/doc_info.ftl&contextPath=/Company%20Home/mydoc.txt</pre>
|
||||||
* <p>
|
* <p>
|
||||||
* The store protocol, followed by the store ID, followed by the content Node Id used to
|
* The store protocol, followed by the store ID, followed by the content Node Id used to
|
||||||
* identify the node to execute the default template for. The second set of elements encode
|
* identify the node to execute the default template for. The second set of elements encode
|
||||||
* the store and node Id of the template to used if a default is not set or not requested.
|
* the store and node Id of the template to used if a default is not set or not requested. Instead
|
||||||
|
* of using NodeRef references to the template and context, path arguments can be used. The URL args
|
||||||
|
* of 'templatePath' and 'contextPath' can be used instead to specify name based encoded Paths to the
|
||||||
|
* template and its context.
|
||||||
* <p>
|
* <p>
|
||||||
* The URL may be followed by a 'mimetype' argument specifying the mimetype to return the result as
|
* The URL may be followed by a 'mimetype' argument specifying the mimetype to return the result as
|
||||||
* on the stream. Otherwise it is assumed that HTML is the default response mimetype.
|
* on the stream. Otherwise it is assumed that HTML is the default response mimetype.
|
||||||
@@ -85,6 +89,8 @@ public class TemplateContentServlet extends BaseServlet
|
|||||||
private static final String MSG_ERROR_CONTENT_MISSING = "error_content_missing";
|
private static final String MSG_ERROR_CONTENT_MISSING = "error_content_missing";
|
||||||
|
|
||||||
private static final String ARG_MIMETYPE = "mimetype";
|
private static final String ARG_MIMETYPE = "mimetype";
|
||||||
|
private static final String ARG_TEMPLATE_PATH = "templatePath";
|
||||||
|
private static final String ARG_CONTEXT_PATH = "contextPath";
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
* @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse)
|
||||||
@@ -106,25 +112,54 @@ public class TemplateContentServlet extends BaseServlet
|
|||||||
uri = uri.substring(req.getContextPath().length());
|
uri = uri.substring(req.getContextPath().length());
|
||||||
StringTokenizer t = new StringTokenizer(uri, "/");
|
StringTokenizer t = new StringTokenizer(uri, "/");
|
||||||
int tokenCount = t.countTokens();
|
int tokenCount = t.countTokens();
|
||||||
if (tokenCount < 4)
|
|
||||||
{
|
|
||||||
throw new IllegalArgumentException("Template Servlet URL did not contain all required args: " + uri);
|
|
||||||
}
|
|
||||||
|
|
||||||
t.nextToken(); // skip servlet name
|
t.nextToken(); // skip servlet name
|
||||||
|
|
||||||
// get NodeRef to the content
|
NodeRef nodeRef = null;
|
||||||
StoreRef storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
NodeRef templateRef = null;
|
||||||
NodeRef nodeRef = new NodeRef(storeRef, t.nextToken());
|
|
||||||
|
String contentPath = req.getParameter(ARG_CONTEXT_PATH);
|
||||||
|
if (contentPath != null && contentPath.length() != 0)
|
||||||
|
{
|
||||||
|
// process the name based path to resolve the NodeRef
|
||||||
|
PathRefInfo pathInfo = resolveNamePath(getServletContext(), contentPath);
|
||||||
|
|
||||||
|
nodeRef = pathInfo.NodeRef;
|
||||||
|
}
|
||||||
|
else if (tokenCount > 3)
|
||||||
|
{
|
||||||
|
// get NodeRef to the content from the URL elements
|
||||||
|
StoreRef storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
||||||
|
nodeRef = new NodeRef(storeRef, t.nextToken());
|
||||||
|
}
|
||||||
|
|
||||||
// get NodeRef to the template if supplied
|
// get NodeRef to the template if supplied
|
||||||
NodeRef templateRef = null;
|
String templatePath = req.getParameter(ARG_TEMPLATE_PATH);
|
||||||
if (tokenCount >= 7)
|
if (templatePath != null && templatePath.length() != 0)
|
||||||
{
|
{
|
||||||
storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
// process the name based path to resolve the NodeRef
|
||||||
|
PathRefInfo pathInfo = resolveNamePath(getServletContext(), templatePath);
|
||||||
|
|
||||||
|
templateRef = pathInfo.NodeRef;
|
||||||
|
}
|
||||||
|
else if (tokenCount == 7)
|
||||||
|
{
|
||||||
|
StoreRef storeRef = new StoreRef(t.nextToken(), t.nextToken());
|
||||||
templateRef = new NodeRef(storeRef, t.nextToken());
|
templateRef = new NodeRef(storeRef, t.nextToken());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// if no context is specified, use the template itself
|
||||||
|
// TODO: should this default to something else?
|
||||||
|
if (nodeRef == null && templateRef != null)
|
||||||
|
{
|
||||||
|
nodeRef = templateRef;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodeRef == null)
|
||||||
|
{
|
||||||
|
throw new TemplateException("Not enough arguments supplied in URL.");
|
||||||
|
}
|
||||||
|
|
||||||
// get the services we need to retrieve the content
|
// get the services we need to retrieve the content
|
||||||
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
|
ServiceRegistry serviceRegistry = getServiceRegistry(getServletContext());
|
||||||
NodeService nodeService = serviceRegistry.getNodeService();
|
NodeService nodeService = serviceRegistry.getNodeService();
|
||||||
|
@@ -16,11 +16,15 @@
|
|||||||
*/
|
*/
|
||||||
package org.alfresco.web.app.servlet.command;
|
package org.alfresco.web.app.servlet.command;
|
||||||
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
|
|
||||||
import org.alfresco.service.cmr.repository.NodeRef;
|
import org.alfresco.service.cmr.repository.NodeRef;
|
||||||
import org.alfresco.service.cmr.repository.StoreRef;
|
import org.alfresco.service.cmr.repository.StoreRef;
|
||||||
import org.alfresco.service.cmr.security.AccessStatus;
|
import org.alfresco.service.cmr.security.AccessStatus;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
|
import org.alfresco.web.bean.repository.Repository;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Initial implementation of a Command Processor that is always passed enough URL elements
|
* Initial implementation of a Command Processor that is always passed enough URL elements
|
||||||
@@ -37,21 +41,21 @@ public abstract class BaseNodeCommandProcessor implements CommandProcessor
|
|||||||
protected NodeRef targetRef;
|
protected NodeRef targetRef;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.alfresco.web.app.servlet.command.CommandProcessor#validateArguments(org.alfresco.service.ServiceRegistry, java.lang.String, java.lang.String[])
|
* @see org.alfresco.web.app.servlet.command.CommandProcessor#validateArguments(javax.servlet.ServletContext, java.lang.String, java.util.Map, java.lang.String[])
|
||||||
*/
|
*/
|
||||||
public boolean validateArguments(ServiceRegistry serviceRegistry, String command, String[] args)
|
public boolean validateArguments(ServletContext sc, String command, Map<String, String> args, String[] urlElements)
|
||||||
{
|
{
|
||||||
if (args.length < 3)
|
if (urlElements.length < 3)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("Not enough URL arguments passed to command servlet.");
|
throw new IllegalArgumentException("Not enough URL arguments passed to command servlet.");
|
||||||
}
|
}
|
||||||
|
|
||||||
// get NodeRef to the node with the workflow attached to it
|
// get NodeRef to the node with the workflow attached to it
|
||||||
StoreRef storeRef = new StoreRef(args[0], args[1]);
|
StoreRef storeRef = new StoreRef(urlElements[0], urlElements[1]);
|
||||||
this.targetRef = new NodeRef(storeRef, args[2]);
|
this.targetRef = new NodeRef(storeRef, urlElements[2]);
|
||||||
|
|
||||||
// get the services we need to execute the workflow command
|
// get the services we need to execute the workflow command
|
||||||
PermissionService permissionService = serviceRegistry.getPermissionService();
|
PermissionService permissionService = Repository.getServiceRegistry(sc).getPermissionService();
|
||||||
|
|
||||||
// check that the user has at least READ access on the node - else redirect to the login page
|
// check that the user has at least READ access on the node - else redirect to the login page
|
||||||
return (permissionService.hasPermission(this.targetRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
return (permissionService.hasPermission(this.targetRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
||||||
|
@@ -17,9 +17,10 @@
|
|||||||
package org.alfresco.web.app.servlet.command;
|
package org.alfresco.web.app.servlet.command;
|
||||||
|
|
||||||
import java.io.PrintWriter;
|
import java.io.PrintWriter;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
|
|
||||||
@@ -45,13 +46,15 @@ public interface CommandProcessor
|
|||||||
* convert the supplied arguments to the objects it expects, and also check any permissions
|
* convert the supplied arguments to the objects it expects, and also check any permissions
|
||||||
* that are required by the current user to execute the command.
|
* that are required by the current user to execute the command.
|
||||||
*
|
*
|
||||||
* @param serviceRegistry ServiceRegistry instance
|
* @param sc ServletContext, can be used to retrieve ServiceRegistry instance
|
||||||
|
* from the Repository bean.
|
||||||
* @param command Name of the command the arguments are for
|
* @param command Name of the command the arguments are for
|
||||||
* @param args String[] of the remaining URL arguments to the command servlet.
|
* @param args Map of URL args passed to the command servlet
|
||||||
|
* @param urlElements String[] of the remaining URL arguments to the command servlet
|
||||||
*
|
*
|
||||||
* @return true if the command can be executed by the current user given the supplied args.
|
* @return true if the command can be executed by the current user given the supplied args.
|
||||||
*/
|
*/
|
||||||
public boolean validateArguments(ServiceRegistry serviceRegistry, String command, String[] args);
|
public boolean validateArguments(ServletContext sc, String command, Map<String, String> args, String[] urlElements);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Process the supplied command name. It is the responsibility of the Command Processor
|
* Process the supplied command name. It is the responsibility of the Command Processor
|
||||||
|
@@ -21,6 +21,7 @@ import java.util.Enumeration;
|
|||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
|
import javax.servlet.ServletContext;
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
@@ -31,6 +32,8 @@ import org.alfresco.service.cmr.repository.StoreRef;
|
|||||||
import org.alfresco.service.cmr.security.AccessStatus;
|
import org.alfresco.service.cmr.security.AccessStatus;
|
||||||
import org.alfresco.service.cmr.security.PermissionService;
|
import org.alfresco.service.cmr.security.PermissionService;
|
||||||
import org.alfresco.web.app.Application;
|
import org.alfresco.web.app.Application;
|
||||||
|
import org.alfresco.web.app.servlet.BaseServlet;
|
||||||
|
import org.alfresco.web.bean.repository.Repository;
|
||||||
import org.alfresco.web.bean.repository.User;
|
import org.alfresco.web.bean.repository.User;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -42,6 +45,9 @@ import org.alfresco.web.bean.repository.User;
|
|||||||
*/
|
*/
|
||||||
public final class ScriptCommandProcessor implements CommandProcessor
|
public final class ScriptCommandProcessor implements CommandProcessor
|
||||||
{
|
{
|
||||||
|
private static final String ARG_SCRIPT_PATH = "scriptPath";
|
||||||
|
private static final String ARG_CONTEXT_PATH = "contextPath";
|
||||||
|
|
||||||
private NodeRef scriptRef;
|
private NodeRef scriptRef;
|
||||||
private NodeRef docRef;
|
private NodeRef docRef;
|
||||||
private Object result;
|
private Object result;
|
||||||
@@ -52,29 +58,47 @@ public final class ScriptCommandProcessor implements CommandProcessor
|
|||||||
CommandFactory.getInstance().registerCommand("execute", ExecuteScriptCommand.class);
|
CommandFactory.getInstance().registerCommand("execute", ExecuteScriptCommand.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @see org.alfresco.web.app.servlet.command.CommandProcessor#validateArguments(org.alfresco.service.ServiceRegistry, java.lang.String, java.lang.String[])
|
* @see org.alfresco.web.app.servlet.command.CommandProcessor#validateArguments(javax.servlet.ServletContext, java.lang.String, java.util.Map, java.lang.String[])
|
||||||
*/
|
*/
|
||||||
public boolean validateArguments(ServiceRegistry serviceRegistry, String command, String[] args)
|
public boolean validateArguments(ServletContext sc, String command, Map<String, String> args, String[] urlElements)
|
||||||
{
|
{
|
||||||
if (args.length < 3)
|
boolean allowed = false;
|
||||||
|
String scriptPath = args.get(ARG_SCRIPT_PATH);
|
||||||
|
if (scriptPath != null)
|
||||||
{
|
{
|
||||||
throw new IllegalArgumentException("Not enough URL arguments passed to command servlet.");
|
// resolve path to a node
|
||||||
|
this.scriptRef = BaseServlet.resolveNamePath(sc, scriptPath).NodeRef;
|
||||||
|
|
||||||
|
// same for the document context path if specified
|
||||||
|
String docPath = args.get(ARG_CONTEXT_PATH);
|
||||||
|
if (docPath != null)
|
||||||
|
{
|
||||||
|
this.docRef = BaseServlet.resolveNamePath(sc, docPath).NodeRef;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else
|
||||||
// get NodeRef to the node script to execute
|
|
||||||
StoreRef storeRef = new StoreRef(args[0], args[1]);
|
|
||||||
this.scriptRef = new NodeRef(storeRef, args[2]);
|
|
||||||
|
|
||||||
if (args.length >= 6)
|
|
||||||
{
|
{
|
||||||
storeRef = new StoreRef(args[3], args[4]);
|
if (urlElements.length < 3)
|
||||||
this.docRef = new NodeRef(storeRef, args[5]);
|
{
|
||||||
|
throw new IllegalArgumentException("Not enough URL arguments passed to command servlet.");
|
||||||
|
}
|
||||||
|
|
||||||
|
// get NodeRef to the node script to execute
|
||||||
|
StoreRef storeRef = new StoreRef(urlElements[0], urlElements[1]);
|
||||||
|
this.scriptRef = new NodeRef(storeRef, urlElements[2]);
|
||||||
|
|
||||||
|
if (urlElements.length >= 6)
|
||||||
|
{
|
||||||
|
storeRef = new StoreRef(urlElements[3], urlElements[4]);
|
||||||
|
this.docRef = new NodeRef(storeRef, urlElements[5]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// check we can access the nodes specified
|
// check we can access the nodes specified
|
||||||
PermissionService ps = serviceRegistry.getPermissionService();
|
PermissionService ps = Repository.getServiceRegistry(sc).getPermissionService();
|
||||||
boolean allowed = (ps.hasPermission(this.scriptRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
allowed = (ps.hasPermission(this.scriptRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
||||||
if (this.docRef != null)
|
if (this.docRef != null)
|
||||||
{
|
{
|
||||||
allowed &= (ps.hasPermission(this.docRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
allowed &= (ps.hasPermission(this.docRef, PermissionService.READ) == AccessStatus.ALLOWED);
|
||||||
|
@@ -21,7 +21,6 @@ import java.util.HashMap;
|
|||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import javax.servlet.http.HttpServletRequest;
|
import javax.servlet.http.HttpServletRequest;
|
||||||
import javax.servlet.http.HttpSession;
|
|
||||||
|
|
||||||
import org.alfresco.error.AlfrescoRuntimeException;
|
import org.alfresco.error.AlfrescoRuntimeException;
|
||||||
import org.alfresco.service.ServiceRegistry;
|
import org.alfresco.service.ServiceRegistry;
|
||||||
|
Reference in New Issue
Block a user