package fi.otavanopisto.pyramus.binary.reports; import java.io.UnsupportedEncodingException; import javax.servlet.http.HttpServletResponse; import org.apache.commons.lang3.StringUtils; import fi.internetix.smvc.AccessDeniedException; import fi.internetix.smvc.LoginRequiredException; import fi.internetix.smvc.SmvcRuntimeException; import fi.internetix.smvc.StatusCode; import fi.internetix.smvc.controllers.BinaryRequestContext; import fi.internetix.smvc.controllers.RequestContext; import fi.otavanopisto.pyramus.dao.DAOFactory; import fi.otavanopisto.pyramus.dao.base.MagicKeyDAO; import fi.otavanopisto.pyramus.dao.reports.ReportDAO; import fi.otavanopisto.pyramus.domainmodel.base.MagicKey; import fi.otavanopisto.pyramus.domainmodel.base.MagicKeyScope; import fi.otavanopisto.pyramus.domainmodel.reports.Report; import fi.otavanopisto.pyramus.framework.BinaryRequestController; import fi.otavanopisto.pyramus.framework.UserRole; public class GetDesignFileBinaryRequestController extends BinaryRequestController { public void process(BinaryRequestContext binaryRequestContext) { ReportDAO reportDAO = DAOFactory.getInstance().getReportDAO(); Long reportId = binaryRequestContext.getLong("reportId"); Report report = reportDAO.findById(reportId); long ifModifiedSince = binaryRequestContext.getRequest().getDateHeader("If-Modified-Since"); try { if (ifModifiedSince != -1 && ifModifiedSince >= report.getLastModified().getTime()) { binaryRequestContext.getResponse().setStatus(HttpServletResponse.SC_NOT_MODIFIED); return; } } catch (IllegalArgumentException ex) { throw new SmvcRuntimeException(StatusCode.UNDEFINED, "Invalid modified since header", ex); } try { binaryRequestContext.getResponse().setDateHeader("Last-Modified", report.getLastModified().getTime()); binaryRequestContext.setResponseContent(report.getData().getBytes("UTF-8"), "application/octet-stream"); } catch (UnsupportedEncodingException e) { throw new SmvcRuntimeException(StatusCode.UNDEFINED, "Invalid charset UTF-8", e); } } @Override public UserRole[] getAllowedRoles() { return new UserRole[] { UserRole.EVERYONE }; } @Override public void authorize(RequestContext requestContext) throws LoginRequiredException, AccessDeniedException { String authorizationHeader = requestContext.getRequest().getHeader("Authorization"); if (StringUtils.startsWith(authorizationHeader, "MagicKey ")) { String headerKey = StringUtils.substring(authorizationHeader, 9); if (StringUtils.isNotBlank(headerKey)) { MagicKeyDAO magicKeyDAO = DAOFactory.getInstance().getMagicKeyDAO(); MagicKey magicKey = magicKeyDAO.findByName(headerKey); if (magicKey != null) { // Delete Request scoped MagicKeys automatically if (MagicKeyScope.REQUEST.equals(magicKey.getScope())) magicKeyDAO.delete(magicKey); return; } } } throw new AccessDeniedException(requestContext.getRequest().getLocale()); } }