blob: cfae77af647e0f354e1052116552090437a41bc6 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License") + you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
package org.apache.openmeetings.servlet.outputhandler;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.catalina.connector.ClientAbortException;
import org.apache.commons.lang3.StringUtils;
import org.apache.openmeetings.OpenmeetingsVariables;
import org.apache.openmeetings.data.basic.SessiondataDao;
import org.apache.openmeetings.data.file.dao.FileExplorerItemDao;
import org.apache.openmeetings.data.user.UserManager;
import org.apache.openmeetings.persistence.beans.files.FileExplorerItem;
import org.apache.openmeetings.servlet.BaseHttpServlet;
import org.apache.openmeetings.servlet.ServerNotInitializedException;
import org.apache.openmeetings.utils.OmFileHelper;
import org.red5.logging.Red5LoggerFactory;
import org.slf4j.Logger;
public class DownloadHandler extends BaseHttpServlet {
private static final long serialVersionUID = 7243653203578587544L;
private static final Logger log = Red5LoggerFactory.getLogger(
DownloadHandler.class, OpenmeetingsVariables.webAppRootKey);
private static final String defaultImageName = "deleted.jpg";
private static final String defaultProfileImageName = "profile_pic.jpg";
private static final String defaultProfileImageNameBig = "_big_profile_pic.jpg";
private static final String defaultChatImageName = "_chat_profile_pic.jpg";
private static final String defaultSWFName = "deleted.swf";
private void logNonExistentFolder(File f) {
if (!f.exists()) {
boolean c = f.mkdir();
if (!c) {
log.error("cannot write to directory");
}
}
}
/*
* (non-Javadoc)
*
* @see
* javax.servlet.http.HttpServlet#doPost(javax.servlet.http.HttpServletRequest
* , javax.servlet.http.HttpServletResponse)
*/
@Override
protected void service(HttpServletRequest httpServletRequest,
HttpServletResponse httpServletResponse) throws ServletException,
IOException {
try {
httpServletRequest.setCharacterEncoding("UTF-8");
log.debug("\nquery = " + httpServletRequest.getQueryString());
log.debug("\n\nfileName = "
+ httpServletRequest.getParameter("fileName"));
log.debug("\n\nparentPath = "
+ httpServletRequest.getParameter("parentPath"));
String queryString = httpServletRequest.getQueryString();
if (queryString == null) {
queryString = "";
}
String sid = httpServletRequest.getParameter("sid");
if (sid == null) {
sid = "default";
}
log.debug("sid: " + sid);
Long users_id = getBean(SessiondataDao.class).checkSession(sid);
Long user_level = getBean(UserManager.class).getUserLevelByID(users_id);
if (user_level != null && user_level > 0) {
String room_id = httpServletRequest.getParameter("room_id");
if (room_id == null) {
room_id = "default";
}
String moduleName = httpServletRequest
.getParameter("moduleName");
if (moduleName == null) {
moduleName = "nomodule";
}
String parentPath = httpServletRequest
.getParameter("parentPath");
if (parentPath == null) {
parentPath = "nomodule";
}
String requestedFile = httpServletRequest
.getParameter("fileName");
if (requestedFile == null) {
requestedFile = "";
}
String fileExplorerItemIdParam = httpServletRequest
.getParameter("fileExplorerItemId");
Long fileExplorerItemId = null;
if (fileExplorerItemIdParam != null) {
fileExplorerItemId = Long.parseLong(fileExplorerItemIdParam);
}
// make a complete name out of domain(organisation) + roomname
String roomName = room_id;
// trim whitespaces cause it is a directory name
roomName = StringUtils.deleteWhitespace(roomName);
// Get the current User-Directory
File working_dir;
// Add the Folder for the Room
if (moduleName.equals("lzRecorderApp")) {
working_dir = OmFileHelper.getStreamsHibernateDir();
} else if (moduleName.equals("videoconf1")) {
working_dir = OmFileHelper.getUploadRoomDir(roomName);
if (parentPath.length() != 0 && !parentPath.equals("/")) {
working_dir = new File(working_dir, parentPath);
}
} else if (moduleName.equals("userprofile")) {
working_dir = OmFileHelper.getUploadProfilesUserDir(users_id);
logNonExistentFolder(working_dir);
} else if (moduleName.equals("remoteuserprofile")) {
String remoteUser_id = httpServletRequest.getParameter("remoteUserid");
working_dir = OmFileHelper.getUploadProfilesUserDir(remoteUser_id == null ? "0" : remoteUser_id);
logNonExistentFolder(working_dir);
} else if (moduleName.equals("remoteuserprofilebig")) {
String remoteUser_id = httpServletRequest.getParameter("remoteUserid");
working_dir = OmFileHelper.getUploadProfilesUserDir(remoteUser_id == null ? "0" : remoteUser_id);
logNonExistentFolder(working_dir);
requestedFile = getBigProfileUserName(working_dir);
} else if (moduleName.equals("chat")) {
String remoteUser_id = httpServletRequest.getParameter("remoteUserid");
working_dir = OmFileHelper.getUploadProfilesUserDir(remoteUser_id == null ? "0" : remoteUser_id);
logNonExistentFolder(working_dir);
requestedFile = getChatUserName(working_dir);
} else {
working_dir = OmFileHelper.getUploadRoomDir(roomName);
}
if (!moduleName.equals("nomodule")) {
log.debug("requestedFile: " + requestedFile
+ " current_dir: " + working_dir);
File full_path = new File(working_dir, requestedFile);
// If the File does not exist or is not readable show/load a
// place-holder picture
if (!full_path.exists() || !full_path.canRead()) {
if (!full_path.canRead()) {
log.debug("LOG DownloadHandler: The request file is not readable ");
} else {
log.debug("LOG DownloadHandler: The request file does not exist / has already been deleted");
}
log.debug("LOG ERROR requestedFile: " + requestedFile);
// replace the path with the default picture/document
if (requestedFile.endsWith(".jpg")) {
log.debug("LOG endsWith d.jpg");
log.debug("LOG moduleName: " + moduleName);
requestedFile = DownloadHandler.defaultImageName;
if (moduleName.equals("remoteuserprofile")) {
requestedFile = DownloadHandler.defaultProfileImageName;
} else if (moduleName.equals("remoteuserprofilebig")) {
requestedFile = DownloadHandler.defaultProfileImageNameBig;
} else if (moduleName.equals("userprofile")) {
requestedFile = DownloadHandler.defaultProfileImageName;
} else if (moduleName.equals("chat")) {
requestedFile = DownloadHandler.defaultChatImageName;
}
} else if (requestedFile.endsWith(".swf")) {
requestedFile = DownloadHandler.defaultSWFName;
} else {
requestedFile = DownloadHandler.defaultImageName;
}
full_path = new File(OmFileHelper.getDefaultDir(), requestedFile);
}
log.debug("full_path: " + full_path);
if (!full_path.exists() || !full_path.canRead()) {
if (!full_path.canRead()) {
log.debug("DownloadHandler: The request DEFAULT-file does not exist / has already been deleted");
} else {
log.debug("DownloadHandler: The request DEFAULT-file does not exist / has already been deleted");
}
// no file to handle abort processing
return;
}
// Requested file is outside OM webapp folder
File curDirFile = OmFileHelper.getOmHome();
if (!full_path.getCanonicalPath()
.startsWith(curDirFile.getCanonicalPath())) {
throw new Exception("Invalid file requested: f2.cp == "
+ full_path.getCanonicalPath() + "; curDir.cp == "
+ curDirFile.getCanonicalPath());
}
// Default type - Explorer, Chrome and others
int browserType = 0;
// Firefox and Opera browsers
if (httpServletRequest.getHeader("User-Agent") != null) {
if ((httpServletRequest.getHeader("User-Agent")
.contains("Firefox"))
|| (httpServletRequest.getHeader("User-Agent")
.contains("Opera"))) {
browserType = 1;
}
}
log.debug("Detected browser type:" + browserType);
httpServletResponse.reset();
httpServletResponse.resetBuffer();
OutputStream out = httpServletResponse.getOutputStream();
if (requestedFile.endsWith(".swf")) {
// trigger download to SWF => THIS is a workaround for
// Flash Player 10, FP 10 does not seem
// to accept SWF-Downloads with the Content-Disposition
// in the Header
httpServletResponse
.setContentType("application/x-shockwave-flash");
httpServletResponse.setHeader("Content-Length",
"" + full_path.length());
} else {
httpServletResponse
.setContentType("APPLICATION/OCTET-STREAM");
String fileNameResult = requestedFile;
if (fileExplorerItemId != null && fileExplorerItemId > 0) {
FileExplorerItem fileExplorerItem = getBean(FileExplorerItemDao.class).getFileExplorerItemsById(fileExplorerItemId);
if (fileExplorerItem != null) {
fileNameResult = fileExplorerItem.getFileName().substring(0, fileExplorerItem.getFileName().length()-4)
+ fileNameResult.substring(fileNameResult.length()-4, fileNameResult.length());
}
}
if (browserType == 0) {
httpServletResponse.setHeader(
"Content-Disposition",
"attachment; filename="
+ java.net.URLEncoder.encode(
fileNameResult, "UTF-8"));
} else {
httpServletResponse.setHeader(
"Content-Disposition",
"attachment; filename*=UTF-8'en'"
+ java.net.URLEncoder.encode(
fileNameResult, "UTF-8"));
}
httpServletResponse.setHeader("Content-Length",
"" + full_path.length());
}
OmFileHelper.copyFile(full_path, out);
out.flush();
out.close();
}
} else {
log.error("ERROR DownloadHandler: not authorized FileDownload ");
}
} catch (ClientAbortException e) {
log.warn("catch ClientAbortException : ", e);
} catch (ServerNotInitializedException e) {
return;
} catch (Exception er) {
log.error("Error downloading: ", er);
}
}
private String getChatUserName(File f) throws Exception {
if (f.exists() && f.isDirectory()) {
String filesString[] = f.list();
for (int i = 0; i < filesString.length; i++) {
String fileName = filesString[i];
if (fileName.startsWith("_chat_"))
return fileName;
}
}
return "_no.jpg";
}
private String getBigProfileUserName(File f) throws Exception {
if (f.exists() && f.isDirectory()) {
String filesString[] = f.list();
for (int i = 0; i < filesString.length; i++) {
String fileName = filesString[i];
if (fileName.startsWith("_big_"))
return fileName;
}
}
return "_no.jpg";
}
}