001    /**
002     * Copyright (c) 2000-2013 Liferay, Inc. All rights reserved.
003     *
004     * This library is free software; you can redistribute it and/or modify it under
005     * the terms of the GNU Lesser General Public License as published by the Free
006     * Software Foundation; either version 2.1 of the License, or (at your option)
007     * any later version.
008     *
009     * This library is distributed in the hope that it will be useful, but WITHOUT
010     * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
011     * FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more
012     * details.
013     */
014    
015    package com.liferay.portlet.documentlibrary.action;
016    
017    import com.liferay.portal.kernel.flash.FlashMagicBytesUtil;
018    import com.liferay.portal.kernel.repository.model.FileEntry;
019    import com.liferay.portal.kernel.repository.model.FileVersion;
020    import com.liferay.portal.kernel.servlet.ServletResponseUtil;
021    import com.liferay.portal.kernel.util.FileUtil;
022    import com.liferay.portal.kernel.util.HttpUtil;
023    import com.liferay.portal.kernel.util.MimeTypesUtil;
024    import com.liferay.portal.kernel.util.ParamUtil;
025    import com.liferay.portal.kernel.util.StringPool;
026    import com.liferay.portal.kernel.util.Validator;
027    import com.liferay.portal.model.User;
028    import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
029    import com.liferay.portal.security.auth.PrincipalException;
030    import com.liferay.portal.security.permission.ActionKeys;
031    import com.liferay.portal.security.permission.PermissionChecker;
032    import com.liferay.portal.struts.ActionConstants;
033    import com.liferay.portal.struts.PortletAction;
034    import com.liferay.portal.theme.ThemeDisplay;
035    import com.liferay.portal.util.PortalUtil;
036    import com.liferay.portal.util.WebKeys;
037    import com.liferay.portlet.documentlibrary.NoSuchFileEntryException;
038    import com.liferay.portlet.documentlibrary.model.DLFileEntry;
039    import com.liferay.portlet.documentlibrary.model.DLFileShortcut;
040    import com.liferay.portlet.documentlibrary.service.DLAppServiceUtil;
041    import com.liferay.portlet.documentlibrary.service.DLFileEntryLocalServiceUtil;
042    import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
043    import com.liferay.portlet.documentlibrary.util.DLUtil;
044    import com.liferay.portlet.documentlibrary.util.DocumentConversionUtil;
045    
046    import java.io.File;
047    import java.io.FileInputStream;
048    import java.io.IOException;
049    import java.io.InputStream;
050    
051    import java.util.List;
052    
053    import javax.portlet.ActionRequest;
054    import javax.portlet.ActionResponse;
055    import javax.portlet.PortletConfig;
056    
057    import javax.servlet.ServletException;
058    import javax.servlet.http.HttpServletRequest;
059    import javax.servlet.http.HttpServletResponse;
060    
061    import org.apache.struts.action.ActionForm;
062    import org.apache.struts.action.ActionForward;
063    import org.apache.struts.action.ActionMapping;
064    
065    /**
066     * @author Brian Wing Shun Chan
067     * @author Jorge Ferrer
068     * @author Charles May
069     * @author Bruno Farache
070     */
071    public class GetFileAction extends PortletAction {
072    
073            @Override
074            public void processAction(
075                            ActionMapping actionMapping, ActionForm actionForm,
076                            PortletConfig portletConfig, ActionRequest actionRequest,
077                            ActionResponse actionResponse)
078                    throws Exception {
079    
080                    HttpServletRequest request = PortalUtil.getHttpServletRequest(
081                            actionRequest);
082                    HttpServletResponse response = PortalUtil.getHttpServletResponse(
083                            actionResponse);
084    
085                    try {
086                            long fileEntryId = ParamUtil.getLong(actionRequest, "fileEntryId");
087    
088                            long folderId = ParamUtil.getLong(actionRequest, "folderId");
089                            String name = ParamUtil.getString(actionRequest, "name");
090                            String title = ParamUtil.getString(actionRequest, "title");
091                            String version = ParamUtil.getString(actionRequest, "version");
092    
093                            long fileShortcutId = ParamUtil.getLong(
094                                    actionRequest, "fileShortcutId");
095    
096                            String uuid = ParamUtil.getString(actionRequest, "uuid");
097    
098                            String targetExtension = ParamUtil.getString(
099                                    actionRequest, "targetExtension");
100    
101                            ThemeDisplay themeDisplay =
102                                    (ThemeDisplay)actionRequest.getAttribute(WebKeys.THEME_DISPLAY);
103    
104                            long groupId = ParamUtil.getLong(
105                                    actionRequest, "groupId", themeDisplay.getScopeGroupId());
106    
107                            getFile(
108                                    fileEntryId, folderId, name, title, version, fileShortcutId,
109                                    uuid, groupId, targetExtension, request, response);
110    
111                            setForward(actionRequest, ActionConstants.COMMON_NULL);
112                    }
113                    catch (NoSuchFileEntryException nsfee) {
114                            PortalUtil.sendError(
115                                    HttpServletResponse.SC_NOT_FOUND, nsfee, actionRequest,
116                                    actionResponse);
117                    }
118                    catch (PrincipalException pe) {
119                            processPrincipalException(pe, request, response);
120                    }
121                    catch (Exception e) {
122                            PortalUtil.sendError(e, actionRequest, actionResponse);
123                    }
124            }
125    
126            @Override
127            public ActionForward strutsExecute(
128                            ActionMapping actionMapping, ActionForm actionForm,
129                            HttpServletRequest request, HttpServletResponse response)
130                    throws Exception {
131    
132                    try {
133                            long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
134    
135                            long folderId = ParamUtil.getLong(request, "folderId");
136                            String name = ParamUtil.getString(request, "name");
137                            String title = ParamUtil.getString(request, "title");
138                            String version = ParamUtil.getString(request, "version");
139    
140                            long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
141    
142                            String uuid = ParamUtil.getString(request, "uuid");
143    
144                            String targetExtension = ParamUtil.getString(
145                                    request, "targetExtension");
146    
147                            ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
148                                    WebKeys.THEME_DISPLAY);
149    
150                            long groupId = ParamUtil.getLong(
151                                    request, "groupId", themeDisplay.getScopeGroupId());
152    
153                            getFile(
154                                    fileEntryId, folderId, name, title, version, fileShortcutId,
155                                    uuid, groupId, targetExtension, request, response);
156    
157                            return null;
158                    }
159                    catch (PrincipalException pe) {
160                            processPrincipalException(pe, request, response);
161    
162                            return null;
163                    }
164                    catch (Exception e) {
165                            PortalUtil.sendError(e, request, response);
166    
167                            return null;
168                    }
169            }
170    
171            protected void getFile(
172                            long fileEntryId, long folderId, String name, String title,
173                            String version, long fileShortcutId, String uuid, long groupId,
174                            String targetExtension, HttpServletRequest request,
175                            HttpServletResponse response)
176                    throws Exception {
177    
178                    if (name.startsWith("DLFE-")) {
179                            name = name.substring(5);
180                    }
181    
182                    name = FileUtil.stripExtension(name);
183    
184                    FileEntry fileEntry = null;
185    
186                    if (Validator.isNotNull(uuid) && (groupId > 0)) {
187                            fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
188                                    uuid, groupId);
189    
190                            folderId = fileEntry.getFolderId();
191                    }
192    
193                    if (fileEntryId > 0) {
194                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
195                    }
196                    else if (fileShortcutId <= 0) {
197                            if (Validator.isNotNull(title)) {
198                                    fileEntry = DLAppServiceUtil.getFileEntry(
199                                            groupId, folderId, title);
200                            }
201                            else if (Validator.isNotNull(name)) {
202                                    DLFileEntry dlFileEntry =
203                                            DLFileEntryLocalServiceUtil.fetchFileEntryByName(
204                                                    groupId, folderId, name);
205    
206                                    if (dlFileEntry == null) {
207    
208                                            // LPS-30374
209    
210                                            List<DLFileEntry> dlFileEntries =
211                                                    DLFileEntryLocalServiceUtil.getFileEntries(
212                                                            folderId, name);
213    
214                                            if (!dlFileEntries.isEmpty()) {
215                                                    dlFileEntry = dlFileEntries.get(0);
216                                            }
217                                    }
218    
219                                    if (dlFileEntry != null) {
220                                            ThemeDisplay themeDisplay =
221                                                    (ThemeDisplay)request.getAttribute(
222                                                            WebKeys.THEME_DISPLAY);
223    
224                                            PermissionChecker permissionChecker =
225                                                    themeDisplay.getPermissionChecker();
226    
227                                            DLFileEntryPermission.check(
228                                                    permissionChecker, dlFileEntry, ActionKeys.VIEW);
229    
230                                            fileEntry = new LiferayFileEntry(dlFileEntry);
231                                    }
232                            }
233                    }
234                    else {
235                            DLFileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
236                                    fileShortcutId);
237    
238                            fileEntryId = fileShortcut.getToFileEntryId();
239    
240                            fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
241                    }
242    
243                    if (Validator.isNull(version)) {
244                            if ((fileEntry != null) &&
245                                    Validator.isNotNull(fileEntry.getVersion())) {
246    
247                                    version = fileEntry.getVersion();
248                            }
249                            else {
250                                    throw new NoSuchFileEntryException(
251                                            "{fileEntryId=" + fileEntryId + "}");
252                            }
253                    }
254    
255                    FileVersion fileVersion = fileEntry.getFileVersion(version);
256    
257                    InputStream is = fileVersion.getContentStream(true);
258    
259                    String fileName = fileVersion.getTitle();
260    
261                    String sourceExtension = fileVersion.getExtension();
262    
263                    if (Validator.isNotNull(sourceExtension) &&
264                            !fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
265    
266                            fileName += StringPool.PERIOD + sourceExtension;
267                    }
268    
269                    long contentLength = fileVersion.getSize();
270                    String contentType = fileVersion.getMimeType();
271    
272                    if (Validator.isNotNull(targetExtension)) {
273                            String id = DLUtil.getTempFileId(
274                                    fileEntry.getFileEntryId(), version);
275    
276                            File convertedFile = DocumentConversionUtil.convert(
277                                    id, is, sourceExtension, targetExtension);
278    
279                            if (convertedFile != null) {
280                                    fileName = FileUtil.stripExtension(fileName).concat(
281                                            StringPool.PERIOD).concat(targetExtension);
282                                    is = new FileInputStream(convertedFile);
283                                    contentLength = convertedFile.length();
284                                    contentType = MimeTypesUtil.getContentType(fileName);
285                            }
286                    }
287    
288                    FlashMagicBytesUtil.Result flashMagicBytesUtilResult =
289                            FlashMagicBytesUtil.check(is);
290    
291                    if (flashMagicBytesUtilResult.isFlash()) {
292                            fileName = FileUtil.stripExtension(fileName) + ".swf";
293                    }
294    
295                    is = flashMagicBytesUtilResult.getInputStream();
296    
297                    ServletResponseUtil.sendFile(
298                            request, response, fileName, is, contentLength, contentType);
299            }
300    
301            @Override
302            protected boolean isCheckMethodOnProcessAction() {
303                    return _CHECK_METHOD_ON_PROCESS_ACTION;
304            }
305    
306            protected void processPrincipalException(
307                            Throwable t, HttpServletRequest request,
308                            HttpServletResponse response)
309                    throws IOException, ServletException {
310    
311                    ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
312                            WebKeys.THEME_DISPLAY);
313    
314                    PermissionChecker permissionChecker =
315                            themeDisplay.getPermissionChecker();
316    
317                    User user = permissionChecker.getUser();
318    
319                    if ((user != null) && !user.isDefaultUser()) {
320                            PortalUtil.sendError(
321                                    HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
322                                    response);
323    
324                            return;
325                    }
326    
327                    String redirect = PortalUtil.getPathMain() + "/portal/login";
328    
329                    String currentURL = PortalUtil.getCurrentURL(request);
330    
331                    redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
332    
333                    response.sendRedirect(redirect);
334            }
335    
336            private static final boolean _CHECK_METHOD_ON_PROCESS_ACTION = false;
337    
338    }