package com.owera.xaps.base.http; import java.io.IOException; import java.io.OutputStream; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.owera.common.log.Context; import com.owera.xaps.base.BaseCache; import com.owera.xaps.base.DownloadLogic; import com.owera.xaps.base.Log; import com.owera.xaps.base.db.DBAccess; import com.owera.xaps.base.db.DBAccessStatic; import com.owera.xaps.dbi.File; import com.owera.xaps.dbi.FileType; import com.owera.xaps.dbi.Unittype; import com.owera.xaps.dbi.XAPS; import com.owera.xaps.tr069.HTTPReqResData; import com.owera.xaps.tr069.Properties; public class FileServlet extends HttpServlet { private static final long serialVersionUID = -9027563648829505599L; protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { String firmwareName = null; String unittypeName = null; OutputStream out = null; String authUnittypeName = null; try { // Create the main object which contains all objects concerning the entire // session. This object also contains the SessionData object if (Properties.isFileAuthUsed()) { HTTPReqResData reqRes = new HTTPReqResData(req, res); // 2. Authenticate the client (first issue challenge, then authenticate) if (!Authenticator.authenticate(reqRes)) return; if (reqRes.getSessionData() != null && reqRes.getSessionData().getUnittype() != null) { authUnittypeName = reqRes.getSessionData().getUnittype().getName(); } } XAPS xaps = DBAccess.getDBI().getXaps(); File firmware = null; String pathInfo = req.getPathInfo().substring(1); pathInfo = pathInfo.replaceAll("--", " "); String[] pathInfoArr = pathInfo.split("/"); FileType fileType = FileType.valueOf(pathInfoArr[0]); // Expect it to be a // FileType.TYPE_SOFTWARE/TYPE_SCRIPT String firmwareVersion = pathInfoArr[1]; unittypeName = pathInfoArr[2]; if (authUnittypeName != null && !unittypeName.equals(authUnittypeName)) { Log.error(FileServlet.class, "Requested file in " + unittypeName + ", but was only authorized for files in " + authUnittypeName); res.sendError(HttpServletResponse.SC_FORBIDDEN); return; } if (pathInfoArr.length > 3) // The optional unit-id is also sent - only // for logging purpose Context.put(Context.X, pathInfoArr[3], BaseCache.SESSIONDATA_CACHE_TIMEOUT); else Context.remove(Context.X); Unittype unittype = xaps.getUnittype(unittypeName); if (unittype == null) { Log.error(FileServlet.class, "Could not find unittype " + unittypeName + " in xAPS, hence file URL is incorrect"); res.sendError(HttpServletResponse.SC_NOT_FOUND); return; } firmware = unittype.getFiles().getByVersionType(firmwareVersion, fileType); if (firmware == null) { Log.error(FileServlet.class, "Could not find " + fileType + " version " + firmwareVersion + " (in unittype " + unittype + ") in xAPS"); res.sendError(HttpServletResponse.SC_NOT_FOUND); return; } firmwareName = firmware.getName(); Log.debug(FileServlet.class, "Firmware " + firmwareName + " exists, will now retrieve binaries for unittype-name " + unittypeName); out = res.getOutputStream(); byte[] firmwareImage = DBAccessStatic.readFirmwareImage(firmware); if (firmwareImage == null || firmwareImage.length == 0) { res.sendError(HttpServletResponse.SC_NOT_FOUND); Log.error(FileServlet.class, "No binaries found for firmware " + firmwareName + " (in unittype " + unittypeName + ")"); return; } Log.debug(FileServlet.class, "Binaries found for firmware " + firmwareName + " (in unittype " + unittypeName + "), starts to transmit firmware image"); res.setContentType("application/octet-stream"); res.setContentLength(firmwareImage.length); out.write(firmwareImage); Log.debug(FileServlet.class, "Transmission of firmware " + firmwareName + " (in unittype " + unittypeName + ") ends"); } catch (Throwable t) { Log.error(FileServlet.class, "Error while retrieving the firmware " + firmwareName + " (in unittype " + unittypeName + ")", t); res.sendError(HttpServletResponse.SC_NOT_FOUND); } finally { DownloadLogic.removeOldest(); if (out != null) { out.flush(); out.close(); } } } protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { doGet(req, res); } }