/*
* #%L
* Alfresco Repository WAR Community
* %%
* Copyright (C) 2005 - 2016 Alfresco Software Limited
* %%
* This file is part of the Alfresco software.
* If the software was purchased under a paid Alfresco license, the terms of
* the paid license agreement will prevail. Otherwise, the software is
* provided under the following open source license terms:
*
* Alfresco is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* Alfresco is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with Alfresco. If not, see
* The URL to the servlet should be generated thus: *
/alfresco/guestDownload/attach/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf* or *
/alfresco/guestDownload/direct/workspace/SpacesStore/0000-0000-0000-0000/myfile.pdf* or *
/alfresco/guestDownload/[direct|attach]?path=/Company%20Home/MyFolder/myfile.pdf* 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. *
* 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. *
* By default, the download assumes that the content is on the
* {@link org.alfresco.model.ContentModel#PROP_CONTENT content property}.
* To retrieve the content of a specific model property, use a 'property' arg, providing the workspace,
* node ID AND the qualified name of the property.
*
* This servlet only accesses content available to the guest user. If the guest user does not * have access to the requested a 403 Forbidden response is returned to the caller. *
* This servlet does not effect the current session, therefore if guest access is required to a * resource this servlet can be used without logging out the current user. * * @author gavinc */ public class GuestDownloadContentServlet extends BaseDownloadContentServlet { private static final long serialVersionUID = -5258137503339817457L; private static Log logger = LogFactory.getLog(GuestDownloadContentServlet.class); private static final String DOWNLOAD_URL = "/gd/" + URL_ATTACH + "/{0}/{1}/{2}/{3}"; private static final String BROWSER_URL = "/gd/" + URL_DIRECT + "/{0}/{1}/{2}/{3}"; @Override protected Log getLogger() { return logger; } /** * @see javax.servlet.http.HttpServlet#doGet(javax.servlet.http.HttpServletRequest, javax.servlet.http.HttpServletResponse) */ protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { if (logger.isDebugEnabled()) { String queryString = req.getQueryString(); logger.debug("Setting up guest access to URL: " + req.getRequestURI() + ((queryString != null && queryString.length() > 0) ? ("?" + queryString) : "")); } DownloadContentWork dcw = new DownloadContentWork(req, res); AuthenticationUtil.runAs(dcw, AuthenticationUtil.getGuestUserName()); } /** * Helper to generate a URL to a content node for downloading content from the server. * The content is supplied as an HTTP1.1 attachment to the response. This generally means * a browser should prompt the user to save the content to specified location. * * @param ref NodeRef of the content node to generate URL for (cannot be null) * @param name File name to return in the URL (cannot be null) * * @return URL to download the content from the specified node */ public final static String generateDownloadURL(NodeRef ref, String name) { return generateUrl(DOWNLOAD_URL, ref, name); } /** * Helper to generate a URL to a content node for downloading content from the server. * The content is supplied directly in the reponse. This generally means a browser will * attempt to open the content directly if possible, else it will prompt to save the file. * * @param ref NodeRef of the content node to generate URL for (cannot be null) * @param name File name to return in the URL (cannot be null) * * @return URL to download the content from the specified node */ public final static String generateBrowserURL(NodeRef ref, String name) { return generateUrl(BROWSER_URL, ref, name); } /** * Class to wrap the call to processDownloadRequest. * * @author gavinc */ public class DownloadContentWork implements RunAsWork