org.kawanfw.file.servlet.ServerFileManager Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of awake-file-server Show documentation
Show all versions of awake-file-server Show documentation
Awake FILE is a secure Open Source framework that allows to program very easily file uploads/downloads and RPC through http. File transfers include
powerful features like file chunking and automatic recovery mechanism.
Security has been taken into account from the design: server side allows
to specify strong security rules in order to protect the files and to secure the RPC calls.
The newest version!
/*
* This file is part of Awake FILE.
* Awake file: Easy file upload & download over HTTP with Java.
* Copyright (C) 2015, KawanSoft SAS
* (http://www.kawansoft.com). All rights reserved.
*
* Awake FILE 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.
*
* Awake FILE 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 this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
* 02110-1301 USA
*
* Any modifications to this file must keep this entire header
* intact.
*/
package org.kawanfw.file.servlet;
import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.io.StringReader;
import java.util.List;
import java.util.Set;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.servlet.ServletConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang3.StringUtils;
import org.apache.commons.lang3.exception.ExceptionUtils;
import org.kawanfw.commons.api.server.CommonsConfigurator;
import org.kawanfw.commons.api.server.DefaultCommonsConfigurator;
import org.kawanfw.commons.server.util.ServerLogger;
import org.kawanfw.commons.util.DefaultParms;
import org.kawanfw.commons.util.Tag;
import org.kawanfw.commons.util.TransferStatus;
import org.kawanfw.file.api.server.DefaultFileConfigurator;
import org.kawanfw.file.api.server.FileConfigurator;
import org.kawanfw.file.reflection.ClassPathUtil;
import org.kawanfw.file.servlet.convert.HttpServletRequestConvertor;
import org.kawanfw.file.servlet.util.HttpConfigurationUtil;
import org.kawanfw.file.version.FileVersion;
/**
* The main Awake FILE Manager Servlet
*
* @author Nicolas de Pomereu
*/
@SuppressWarnings("serial")
public class ServerFileManager extends HttpServlet {
private static final String SPACES_3 = " ";
public static String CR_LF = System.getProperty("line.separator");
public static final String FILE_CONFIGURATOR_CLASS_NAME = "fileConfiguratorClassName";
public static final String COMMONS_CONFIGURATOR_CLASS_NAME = "commonsConfiguratorClassName";
private CommonsConfigurator commonsConfigurator = null;
private FileConfigurator fileConfigurator = null;
/** The init error message trapped */
private String initErrrorMesage = null;
/** The Exception thrown at init */
private Exception exception = null;
/** Says that the ServerLogger is ok and we can log the exceptions */
private boolean serverLoggerOk = false;
/**
* Init.
*/
public void init(ServletConfig config) throws ServletException {
super.init(config);
// Clean the olders folders of uploader classes, can't be done when closing
String classpathUsernames = ClassPathUtil.getUserHomeDotKawansoftDotClasspath() + File.separator + ".usernames";
try {
FileUtils.deleteDirectory(new File(classpathUsernames));
new File(classpathUsernames).delete();
} catch (IOException ignore) {
ignore.printStackTrace(System.out);
}
// Variable use to store the current name when loading, used to
// detail
// the exception in the catch clauses
String classNameToLoad = null;
String commonsConfiguratorClassName = config
.getInitParameter(COMMONS_CONFIGURATOR_CLASS_NAME);
String fileConfiguratorClassName = config
.getInitParameter(FILE_CONFIGURATOR_CLASS_NAME);
try {
// Check spelling with first letter capitalized
if (commonsConfiguratorClassName == null
|| commonsConfiguratorClassName.isEmpty()) {
String capitalized = StringUtils
.capitalize(COMMONS_CONFIGURATOR_CLASS_NAME);
commonsConfiguratorClassName = config
.getInitParameter(capitalized);
}
if (fileConfiguratorClassName == null
|| fileConfiguratorClassName.isEmpty()) {
String capitalized = StringUtils
.capitalize(FILE_CONFIGURATOR_CLASS_NAME);
fileConfiguratorClassName = config
.getInitParameter(capitalized);
}
// Call the specific FILE Configurator class to use
classNameToLoad = commonsConfiguratorClassName;
if (commonsConfiguratorClassName != null
&& !commonsConfiguratorClassName.isEmpty()) {
Class> c = Class.forName(commonsConfiguratorClassName);
commonsConfigurator = (CommonsConfigurator) c
.newInstance();
} else {
commonsConfigurator = new DefaultCommonsConfigurator();
}
// Immediately create the Logger
Logger logger = null;
try {
logger = commonsConfigurator.getLogger();
ServerLogger.createLogger(logger);
ServerLogger.getLogger().log(Level.WARNING, "Starting " + FileVersion.PRODUCT.NAME + "...");
serverLoggerOk = true;
} catch (Exception e) {
initErrrorMesage = Tag.PRODUCT_USER_CONFIG_FAIL
+ " Impossible to create the Logger: " + logger;
exception = e;
}
classNameToLoad = fileConfiguratorClassName;
if (fileConfiguratorClassName != null
&& !fileConfiguratorClassName.isEmpty()) {
Class> c = Class.forName(fileConfiguratorClassName);
fileConfigurator = (FileConfigurator) c.newInstance();
} else {
fileConfigurator = new DefaultFileConfigurator();
}
} catch (ClassNotFoundException e) {
initErrrorMesage = Tag.PRODUCT_USER_CONFIG_FAIL
+ " Impossible to load (ClassNotFoundException) Configurator class: "
+ classNameToLoad;
exception = e;
} catch (InstantiationException e) {
initErrrorMesage = Tag.PRODUCT_USER_CONFIG_FAIL
+ " Impossible to load (InstantiationException) Configurator class: "
+ classNameToLoad;
exception = e;
} catch (IllegalAccessException e) {
initErrrorMesage = Tag.PRODUCT_USER_CONFIG_FAIL
+ " Impossible to load (IllegalAccessException) Configurator class: "
+ classNameToLoad;
exception = e;
} catch (Exception e) {
initErrrorMesage = Tag.PRODUCT_PRODUCT_FAIL + " Please contact support [email protected]";
exception = e;
}
if (commonsConfigurator == null) {
commonsConfiguratorClassName = COMMONS_CONFIGURATOR_CLASS_NAME;
} else {
commonsConfiguratorClassName = commonsConfigurator
.getClass().getName();
}
if (fileConfigurator == null) {
fileConfiguratorClassName = FILE_CONFIGURATOR_CLASS_NAME;
} else {
fileConfiguratorClassName = fileConfigurator.getClass()
.getName();
}
System.out.println();
System.out.println(Tag.PRODUCT_START + " "
+ org.kawanfw.file.version.FileVersion.getVersion());
System.out.println(Tag.PRODUCT_START + " "+ this.getServletName()
+ " Servlet:");
System.out.println(Tag.PRODUCT_START
+ " - Init Parameter commonsConfiguratorClassName: " + CR_LF + Tag.PRODUCT_START + SPACES_3
+ commonsConfiguratorClassName);
System.out.println(Tag.PRODUCT_START
+ " - Init Parameter fileConfiguratorClassName: " + CR_LF + Tag.PRODUCT_START + SPACES_3
+ fileConfiguratorClassName);
if (exception == null) {
System.out.println(Tag.PRODUCT_START + " " + FileVersion.PRODUCT.NAME + " Configurator Status: OK.");
System.out.println();
}
else {
System.out.println(Tag.PRODUCT_START + " " + FileVersion.PRODUCT.NAME + " Configurator Status: KO.");
System.out.println(initErrrorMesage);
System.out.println( ExceptionUtils.getStackTrace(exception));
}
if (serverLoggerOk) {
if (KawanNotifier.existsNoNotifyTxt()) {
ServerLogger.getLogger().log(Level.WARNING, Tag.PRODUCT_START
+ " Notification to Kawan Servers: OFF");
}
} else {
if (KawanNotifier.existsNoNotifyTxt()) {
System.out.println(Tag.PRODUCT_START
+ " Notification to Kawan Servers: OFF");
}
}
}
/**
* TestReload the configurators main methods to see if they throw Exceptions
*/
private void testConfiguratorMethods() {
if (exception == null) {
// TestReload that the login method does not throw an Exception
@SuppressWarnings("unused")
boolean isOk = false;
try {
isOk = commonsConfigurator.login("dummy",
"dummy".toCharArray());
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(commonsConfigurator, "login");
exception = e;
}
}
if (exception == null) {
try {
File serverRootFile = fileConfigurator.getServerRoot();
HttpConfigurationUtil.testServerRootValidity(serverRootFile);
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "getServerRoot");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
// String tokenRecomputed = commonsConfigurator
// .computeAuthToken("dummy");
String tokenRecomputed = CommonsConfiguratorCall.computeAuthToken(commonsConfigurator, "dummy");
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "getServerRoot");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
//boolean forceHttps = commonsConfigurator.forceSecureHttp();
boolean forceHttps = CommonsConfiguratorCall.forceSecureHttp(commonsConfigurator);
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "forceSecureHttp");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
//Set usernameSet = commonsConfigurator.getBannedUsernames();
Set usernameSet = CommonsConfiguratorCall.getBannedUsernames(commonsConfigurator);
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "getBannedUsernames");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
List ipsBlacklist = CommonsConfiguratorCall.getIPsBlacklist(commonsConfigurator);
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "getIPsBlacklist");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
List ipsWhitelist = CommonsConfiguratorCall.getIPsWhitelist(commonsConfigurator);
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "getIPsWhitelist");
exception = e;
}
}
if (exception == null) {
try {
@SuppressWarnings("unused")
boolean doUseOneRootPerUsername = fileConfigurator
.useOneRootPerUsername();
} catch (Exception e) {
initErrrorMesage = ServerUserThrowable.getErrorMessage(
commonsConfigurator, "useOneRootPerUsername");
exception = e;
}
}
}
/**
* Post request.
*/
@Override
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
request.setCharacterEncoding("UTF-8");
response.setCharacterEncoding("UTF-8");
// Store the host info in RequestInfoStore
// Important to do it before Exception, otw will throw Exception in
// DefaultCommonsConfigurator.getServletNameFromServletPath() will throw Exception
RequestInfoStore.init(request);
// If init fail, say it cleanly client, instead of bad 500 Servlet Error
if (exception != null) {
OutputStream out = response.getOutputStream();
writeLine(out, TransferStatus.SEND_FAILED);
writeLine(out, exception.getClass().getName()); // Exception class name
writeLine(out, initErrrorMesage + " Reason: " + exception.getMessage()); // Exception message
writeLine(out, ExceptionUtils.getStackTrace(exception)); // stack trace
return;
}
// Configure a repository (to ensure a secure temp location is used)
ServletContext servletContext = this.getServletConfig()
.getServletContext();
File servletContextTempDir = (File) servletContext
.getAttribute("javax.servlet.context.tempdir");
// Wrap the HttpServletRequest with HttpServletRequestEncrypted for
// parameters decryption
HttpServletRequestConvertor requestEncrypted = new HttpServletRequestConvertor(
request, commonsConfigurator);
ServerFileDispatch dispatch = new ServerFileDispatch();
dispatch.executeRequest(requestEncrypted, response,
servletContextTempDir, commonsConfigurator,
fileConfigurator);
}
/**
* Write a line of string on the servlet output stream. Will add the
* necessary CR_LF
*
* @param out
* the servlet output stream
* @param s
* the string to write
* @throws IOException
*/
private void writeLine(OutputStream out, String s) throws IOException {
out.write((s + CR_LF).getBytes());
}
/**
* Get request.
*/
@Override
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
//request.setCharacterEncoding("UTF-8");
// Store the host info in RequestInfoStore
// Important to do it before Exception, otw will throw Exception in
// DefaultCommonsConfigurator.getServletNameFromServletPath() wil throw Exception
RequestInfoStore.init(request);
response.setContentType("text/html");
PrintWriter out = response.getWriter();
String status = ""
+ "OK & Running.";
// TestReload all methods
testConfiguratorMethods();
if (exception != null) {
String stackTrace = ExceptionUtils.getStackTrace(exception);
BufferedReader bufferedReader = new BufferedReader(
new StringReader(stackTrace));
StringBuffer sb = new StringBuffer();
String line = null;
while ((line = bufferedReader.readLine()) != null) {
// All subsequent lines contain the result
sb.append(line);
sb.append("
");
}
status = ""
+ initErrrorMesage + "
"
+ sb.toString();
}
String commonsConfiguratorClassName = null;
if (commonsConfigurator == null) {
commonsConfiguratorClassName = COMMONS_CONFIGURATOR_CLASS_NAME;
} else {
commonsConfiguratorClassName = commonsConfigurator
.getClass().getName();
}
String fileConfiguratorClassName = null;
if (fileConfigurator == null) {
fileConfiguratorClassName = FILE_CONFIGURATOR_CLASS_NAME;
} else {
fileConfiguratorClassName = fileConfigurator.getClass()
.getName();
}
out.println("");
out.println("");
out.println("" + FileVersion.getVersion() + "");
out.println("
");
out.println("
");
out.println(this.getServletName() + " Servlet Configuration");
out.println("");
out.println("
");
out.println("");
out.println("");
out.println(" Configurator Parameter ");
out.println(" Configurator Value ");
out.println(" ");
out.println("");
out.println(" " + COMMONS_CONFIGURATOR_CLASS_NAME + " ");
out.println(" " + commonsConfiguratorClassName + " ");
out.println(" ");
out.println("");
out.println(" " + FILE_CONFIGURATOR_CLASS_NAME + " ");
out.println(" " + fileConfiguratorClassName + " ");
out.println(" ");
out.println("
");
out.println("
");
out.println("");
out.println("");
out.println(" " + FileVersion.PRODUCT.NAME + " Configuration Status ");
out.println(" ");
out.println("");
out.println(" " + status + " ");
out.println(" ");
out.println("
");
out.println("");
}
}
© 2015 - 2025 Weber Informatics LLC | Privacy Policy