/** *================================================================================ * THIS SOFTWARE IS PROVIDED BY JAVAZOOM "AS IS". * JAVAZOOM DISCLAIMS ANY OTHER WARRANTIES, EXPRESS OR IMPLIED, INCLUDING, BUT NOT * LIMITED TO, ANY IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR * PURPOSE AND NONINFRINGEMENT. *================================================================================ */ package javazoom.download; import java.io.IOException; import java.util.Properties; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javazoom.download.util.Debug; import javazoom.download.util.Keys; /** * This class implements a servlet to download files through DownloadImpl. */ public class DownloadServlet extends HttpServlet { private DownloadImpl downloader = null; /** * Initializes DownloadServlet. *
* Instanciates DownloadBean with scope application.
* Instanciates DownloadImpl.
* @throws ServletException */ public void init() throws ServletException { String configfile = getInitParameter("configfile"); String configPath = getInitParameter("configpath"); if (configPath == null) configPath = (getServletContext().getRealPath("/WEB-INF")); try { if ((configfile == null) || (configPath == null)) { if (configfile == null) Debug.getInstance().trace(Debug.PANIC,getClass().getName()+": Please setup configfile init parameter in web.xml"); if (configPath == null) Debug.getInstance().trace(Debug.PANIC,getClass().getName()+": Please setup configpath init parameter in web.xml"); } else downloader = new DownloadImpl(configPath,configfile); } catch (Exception ex) { ex.printStackTrace(); } } /** * Processes HTTP Get. * @param request incoming user's request. * @param response user's response * @throws ServletException * @throws IOException */ public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { performDownload(request, response); } /** * Processes HTTP Post. * @param request incoming user's request. * @param response user's response * @throws ServletException * @throws IOException */ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { performDownload(request, response); } /** * Processes the download. * @param request HttpRequest from browser * @param response HttpResponse sent to browser * @throws ServletException * @throws IOException */ public void performDownload(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String filename = request.getParameter(Keys.FILENAMEPARAMETER); String uid = request.getParameter(Keys.IDPARAMETER); String custom = request.getParameter(Keys.CUSTOMPARAMETER); if (filename == null) filename = request.getPathInfo(); if ((filename != null) && (!filename.equals(""))) { String securedfilename = filename; if (Keys.SECUREFILENAME == true) securedfilename = checkFilename(filename); if (securedfilename.startsWith("/")) securedfilename = securedfilename.substring(1,securedfilename.length()); Properties props = new Properties(); String wwwauth = request.getHeader("Authorization"); String remoteaddr = request.getRemoteAddr(); if (wwwauth != null) props.setProperty("Authorization",wwwauth); if (remoteaddr != null) props.setProperty("RemoteAddr",remoteaddr); if (custom == null) custom = ""; props.setProperty("customfield",custom); if (uid == null) uid = ""; props.setProperty("uid",uid); if (downloader != null) { try { downloader.process(securedfilename, props, response); } catch (IOException ex) { Debug.getInstance().trace(Debug.INFO,getClass().getName()+" Download Error : "+ex.getMessage()); } } else response.sendError(HttpServletResponse.SC_NO_CONTENT); } } /** * Removes UnSafe characters in URL (for instance %2E%2E/ means ../) * An Download4J malicious user could try to download files outside the downloadRoot. * @param filename from URL * @return securedFilename */ public String checkFilename(String filename) { String securedFilename = filename; securedFilename = securedFilename.trim(); if (Keys.BLACKLIST != null) { for (int i=0;i