/**
* Copyright (c) 2000-present Liferay, Inc. All rights reserved.
*
* This library 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 2.1 of the License, or (at your option)
* any later version.
*
* This library 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.
*/
package com.liferay.document.library.web.internal.portlet.action;
import com.liferay.document.library.kernel.document.conversion.DocumentConversionUtil;
import com.liferay.document.library.kernel.exception.NoSuchFileEntryException;
import com.liferay.document.library.kernel.model.DLFileEntry;
import com.liferay.document.library.kernel.service.DLAppServiceUtil;
import com.liferay.document.library.kernel.service.DLFileEntryLocalServiceUtil;
import com.liferay.document.library.kernel.util.DLUtil;
import com.liferay.portal.kernel.flash.FlashMagicBytesUtil;
import com.liferay.portal.kernel.model.User;
import com.liferay.portal.kernel.repository.model.FileEntry;
import com.liferay.portal.kernel.repository.model.FileShortcut;
import com.liferay.portal.kernel.repository.model.FileVersion;
import com.liferay.portal.kernel.security.auth.PrincipalException;
import com.liferay.portal.kernel.security.permission.ActionKeys;
import com.liferay.portal.kernel.security.permission.PermissionChecker;
import com.liferay.portal.kernel.servlet.ServletResponseUtil;
import com.liferay.portal.kernel.theme.ThemeDisplay;
import com.liferay.portal.kernel.util.FileUtil;
import com.liferay.portal.kernel.util.HttpUtil;
import com.liferay.portal.kernel.util.MimeTypesUtil;
import com.liferay.portal.kernel.util.ParamUtil;
import com.liferay.portal.kernel.util.PortalUtil;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.util.WebKeys;
import com.liferay.portal.repository.liferayrepository.model.LiferayFileEntry;
import com.liferay.portlet.documentlibrary.service.permission.DLFileEntryPermission;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author Iván Zaera
*/
public class GetFileActionHelper {
public void processRequest(
HttpServletRequest request, HttpServletResponse response)
throws Exception {
try {
long fileEntryId = ParamUtil.getLong(request, "fileEntryId");
long folderId = ParamUtil.getLong(request, "folderId");
String name = ParamUtil.getString(request, "name");
String title = ParamUtil.getString(request, "title");
String version = ParamUtil.getString(request, "version");
long fileShortcutId = ParamUtil.getLong(request, "fileShortcutId");
String uuid = ParamUtil.getString(request, "uuid");
String targetExtension = ParamUtil.getString(
request, "targetExtension");
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
long groupId = ParamUtil.getLong(
request, "groupId", themeDisplay.getScopeGroupId());
getFile(
fileEntryId, folderId, name, title, version, fileShortcutId,
uuid, groupId, targetExtension, request, response);
}
catch (NoSuchFileEntryException nsfee) {
PortalUtil.sendError(
HttpServletResponse.SC_NOT_FOUND, nsfee, request, response);
}
catch (PrincipalException pe) {
processPrincipalException(pe, request, response);
}
catch (Exception e) {
PortalUtil.sendError(e, request, response);
}
}
protected void getFile(
long fileEntryId, long folderId, String name, String title,
String version, long fileShortcutId, String uuid, long groupId,
String targetExtension, HttpServletRequest request,
HttpServletResponse response)
throws Exception {
if (name.startsWith("DLFE-")) {
name = name.substring(5);
}
name = FileUtil.stripExtension(name);
FileEntry fileEntry = null;
if (Validator.isNotNull(uuid) && (groupId > 0)) {
fileEntry = DLAppServiceUtil.getFileEntryByUuidAndGroupId(
uuid, groupId);
folderId = fileEntry.getFolderId();
}
if (fileEntryId > 0) {
fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
}
else if (fileShortcutId <= 0) {
if (Validator.isNotNull(title)) {
fileEntry = DLAppServiceUtil.getFileEntry(
groupId, folderId, title);
}
else if (Validator.isNotNull(name)) {
DLFileEntry dlFileEntry =
DLFileEntryLocalServiceUtil.fetchFileEntryByName(
groupId, folderId, name);
if (dlFileEntry == null) {
// LPS-30374
List<DLFileEntry> dlFileEntries =
DLFileEntryLocalServiceUtil.getFileEntries(
folderId, name);
if (!dlFileEntries.isEmpty()) {
dlFileEntry = dlFileEntries.get(0);
}
}
if (dlFileEntry != null) {
ThemeDisplay themeDisplay =
(ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
PermissionChecker permissionChecker =
themeDisplay.getPermissionChecker();
DLFileEntryPermission.check(
permissionChecker, dlFileEntry, ActionKeys.VIEW);
fileEntry = new LiferayFileEntry(dlFileEntry);
}
}
}
else {
FileShortcut fileShortcut = DLAppServiceUtil.getFileShortcut(
fileShortcutId);
fileEntryId = fileShortcut.getToFileEntryId();
fileEntry = DLAppServiceUtil.getFileEntry(fileEntryId);
}
if (Validator.isNull(version)) {
if ((fileEntry != null) &&
Validator.isNotNull(fileEntry.getVersion())) {
version = fileEntry.getVersion();
}
else {
throw new NoSuchFileEntryException(
"{fileEntryId=" + fileEntryId + "}");
}
}
FileVersion fileVersion = fileEntry.getFileVersion(version);
InputStream is = fileVersion.getContentStream(true);
String fileName = fileVersion.getTitle();
String sourceExtension = fileVersion.getExtension();
if (Validator.isNotNull(sourceExtension) &&
!fileName.endsWith(StringPool.PERIOD + sourceExtension)) {
fileName += StringPool.PERIOD + sourceExtension;
}
long contentLength = fileVersion.getSize();
String contentType = fileVersion.getMimeType();
if (Validator.isNotNull(targetExtension)) {
String id = DLUtil.getTempFileId(
fileEntry.getFileEntryId(), version);
File convertedFile = DocumentConversionUtil.convert(
id, is, sourceExtension, targetExtension);
if (convertedFile != null) {
fileName = FileUtil.stripExtension(fileName).concat(
StringPool.PERIOD).concat(targetExtension);
is = new FileInputStream(convertedFile);
contentLength = convertedFile.length();
contentType = MimeTypesUtil.getContentType(fileName);
}
}
FlashMagicBytesUtil.Result flashMagicBytesUtilResult =
FlashMagicBytesUtil.check(is);
if (flashMagicBytesUtilResult.isFlash()) {
fileName = FileUtil.stripExtension(fileName) + ".swf";
}
is = flashMagicBytesUtilResult.getInputStream();
ServletResponseUtil.sendFile(
request, response, fileName, is, contentLength, contentType);
}
protected void processPrincipalException(
Throwable t, HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException {
ThemeDisplay themeDisplay = (ThemeDisplay)request.getAttribute(
WebKeys.THEME_DISPLAY);
PermissionChecker permissionChecker =
themeDisplay.getPermissionChecker();
User user = permissionChecker.getUser();
if ((user != null) && !user.isDefaultUser()) {
PortalUtil.sendError(
HttpServletResponse.SC_UNAUTHORIZED, (Exception)t, request,
response);
return;
}
String redirect = PortalUtil.getPathMain() + "/portal/login";
String currentURL = PortalUtil.getCurrentURL(request);
redirect = HttpUtil.addParameter(redirect, "redirect", currentURL);
response.sendRedirect(redirect);
}
}