PageRenderTime 43ms CodeModel.GetById 14ms RepoModel.GetById 0ms app.codeStats 1ms

/jira-project/jira-components/jira-plugins/jira-rest/jira-rest-plugin/src/main/java/com/atlassian/jira/rest/internal/v1/attachment/AttachTemporaryFileResource.java

https://bitbucket.org/ahmed_bilal_360factors/jira7-core
Java | 192 lines | 167 code | 25 blank | 0 comment | 21 complexity | 89b7508de1e7670f3e3dce34b3fc5f0e MD5 | raw file
Possible License(s): Apache-2.0
  1. package com.atlassian.jira.rest.internal.v1.attachment;
  2. import com.atlassian.core.util.FileSize;
  3. import com.atlassian.jira.bc.issue.IssueService;
  4. import com.atlassian.jira.bc.project.ProjectService;
  5. import com.atlassian.jira.config.properties.APKeys;
  6. import com.atlassian.jira.issue.Issue;
  7. import com.atlassian.jira.issue.attachment.TemporaryAttachment;
  8. import com.atlassian.jira.project.Project;
  9. import com.atlassian.jira.rest.internal.common.bean.AttachTemporaryFileBadResultBean;
  10. import com.atlassian.jira.rest.internal.common.bean.AttachTemporaryFileGoodResultBean;
  11. import com.atlassian.jira.rest.util.AttachmentHelper;
  12. import com.atlassian.jira.security.JiraAuthenticationContext;
  13. import com.atlassian.jira.security.xsrf.XsrfTokenGenerator;
  14. import com.atlassian.jira.user.ApplicationUser;
  15. import com.atlassian.jira.user.SecureUserTokenManager;
  16. import com.atlassian.jira.web.util.AttachmentException;
  17. import com.atlassian.jira.web.util.WebAttachmentManager;
  18. import com.atlassian.plugins.rest.common.security.AnonymousAllowed;
  19. import com.atlassian.plugins.rest.common.security.CorsAllowed;
  20. import org.apache.commons.io.IOUtils;
  21. import webwork.config.Configuration;
  22. import javax.servlet.http.HttpServletRequest;
  23. import javax.ws.rs.Consumes;
  24. import javax.ws.rs.POST;
  25. import javax.ws.rs.Path;
  26. import javax.ws.rs.Produces;
  27. import javax.ws.rs.QueryParam;
  28. import javax.ws.rs.WebApplicationException;
  29. import javax.ws.rs.core.Context;
  30. import javax.ws.rs.core.MediaType;
  31. import javax.ws.rs.core.Response;
  32. import java.io.InputStream;
  33. import java.util.Collection;
  34. import static com.atlassian.jira.rest.api.http.CacheControl.never;
  35. @Path("AttachTemporaryFile")
  36. @Produces(MediaType.APPLICATION_JSON)
  37. @AnonymousAllowed
  38. @CorsAllowed
  39. public class AttachTemporaryFileResource {
  40. private final JiraAuthenticationContext authContext;
  41. private final WebAttachmentManager webAttachmentManager;
  42. private final IssueService issueService;
  43. private final ProjectService projectService;
  44. private final XsrfTokenGenerator xsrfGenerator;
  45. private final AttachmentHelper attachmentHelper;
  46. private final SecureUserTokenManager secureUserTokenManager;
  47. public AttachTemporaryFileResource(JiraAuthenticationContext authContext,
  48. WebAttachmentManager webAttachmentManager, IssueService issueService, ProjectService projectService,
  49. XsrfTokenGenerator xsrfGenerator, AttachmentHelper attachmentHelper, final SecureUserTokenManager secureUserTokenManager) {
  50. this.authContext = authContext;
  51. this.webAttachmentManager = webAttachmentManager;
  52. this.issueService = issueService;
  53. this.projectService = projectService;
  54. this.xsrfGenerator = xsrfGenerator;
  55. this.attachmentHelper = attachmentHelper;
  56. this.secureUserTokenManager = secureUserTokenManager;
  57. }
  58. @POST
  59. @Consumes(MediaType.WILDCARD)
  60. @Path("/secure")
  61. public Response addTemporaryAttachment(@QueryParam("filename") String filename,
  62. @QueryParam("projectId") Long projectId, @QueryParam("issueId") Long issueId,
  63. @QueryParam("size") Long size, @QueryParam("secureToken") String secureToken,
  64. @QueryParam("formToken") String formToken, @Context HttpServletRequest request) {
  65. if (secureToken == null) {
  66. return Response.status(Response.Status.BAD_REQUEST).cacheControl(never()).build();
  67. }
  68. ApplicationUser secureUser = secureUserTokenManager.useToken(secureToken, SecureUserTokenManager.TokenType.SCREENSHOT);
  69. if (secureUser == null) {
  70. return Response.status(Response.Status.UNAUTHORIZED).cacheControl(never()).build();
  71. }
  72. authContext.setLoggedInUser(secureUser);
  73. return addTemporaryAttachment(filename, projectId, issueId, size, formToken, request);
  74. }
  75. @POST
  76. @Consumes(MediaType.WILDCARD)
  77. public Response addTemporaryAttachment(@QueryParam("filename") String filename,
  78. @QueryParam("projectId") Long projectId, @QueryParam("issueId") Long issueId,
  79. @QueryParam("size") Long size, @QueryParam("formToken") String formToken, @Context HttpServletRequest request) {
  80. final AttachmentHelper.ValidationResult validationResult = attachmentHelper.validate(request, filename, size);
  81. if (!validationResult.isValid()) {
  82. switch (validationResult.getErrorType()) {
  83. case ATTACHMENT_TO_LARGE: {
  84. final String message = authContext.getI18nHelper().getText("upload.too.big", filename,
  85. FileSize.format(size),
  86. FileSize.format(new Long(Configuration.getString(APKeys.JIRA_ATTACHMENT_SIZE))));
  87. return createError(Response.Status.BAD_REQUEST, message);
  88. }
  89. case ATTACHMENT_IO_SIZE: {
  90. final String message = authContext.getI18nHelper().getText("attachfile.error.io.size", filename);
  91. return createError(Response.Status.BAD_REQUEST, message);
  92. }
  93. case ATTACHMENT_IO_UNKNOWN: {
  94. final String message = authContext.getI18nHelper().getText("attachfile.error.io.error", filename, validationResult.getErrorMessage());
  95. return createError(Response.Status.INTERNAL_SERVER_ERROR, message);
  96. }
  97. case FILENAME_BLANK:
  98. return Response.status(Response.Status.BAD_REQUEST).cacheControl(never()).build();
  99. case XSRF_TOKEN_INVALID:
  100. return createTokenError(xsrfGenerator.generateToken(request));
  101. }
  102. }
  103. if (issueId == null && projectId == null) {
  104. return Response.status(Response.Status.BAD_REQUEST).cacheControl(never()).build();
  105. }
  106. Project project = null;
  107. Issue issue = null;
  108. final ApplicationUser user = authContext.getUser();
  109. if (issueId != null) {
  110. issue = getIssue(user, issueId);
  111. } else {
  112. project = getProject(user, projectId);
  113. }
  114. InputStream inputStream = validationResult.getInputStream();
  115. try {
  116. final TemporaryAttachment attach = webAttachmentManager.createTemporaryAttachment(validationResult.getInputStream(), filename,
  117. validationResult.getContentType(), validationResult.getSize(), issue, project, formToken);
  118. return Response.status(Response.Status.CREATED)
  119. .entity(new AttachTemporaryFileGoodResultBean(attach.getId().toString(), filename)).cacheControl(never()).build();
  120. } catch (AttachmentException e) {
  121. return createError(Response.Status.INTERNAL_SERVER_ERROR, e.getMessage());
  122. } finally {
  123. IOUtils.closeQuietly(inputStream);
  124. }
  125. }
  126. private Issue getIssue(ApplicationUser user, Long id) {
  127. IssueService.IssueResult result = issueService.getIssue(user, id);
  128. if (result.isValid()) {
  129. return result.getIssue();
  130. } else {
  131. return throwFourOhFour(result.getErrorCollection());
  132. }
  133. }
  134. private Project getProject(ApplicationUser user, Long id) {
  135. ProjectService.GetProjectResult projectResult = projectService.getProjectById(user, id);
  136. if (projectResult.isValid()) {
  137. return projectResult.getProject();
  138. } else {
  139. return throwFourOhFour(projectResult.getErrorCollection());
  140. }
  141. }
  142. private static Response createError(Response.Status status, com.atlassian.jira.util.ErrorCollection collection) {
  143. String message = getFirstElement(collection.getErrorMessages());
  144. if (message == null) {
  145. message = getFirstElement(collection.getErrors().values());
  146. }
  147. return createError(status, message);
  148. }
  149. private static Response createError(Response.Status status, String message) {
  150. return Response.status(status).cacheControl(never()).entity(new AttachTemporaryFileBadResultBean(message)).build();
  151. }
  152. private Response createTokenError(String newToken) {
  153. String message = authContext.getI18nHelper().getText("attachfile.xsrf.try.again");
  154. return Response.status(Response.Status.INTERNAL_SERVER_ERROR)
  155. .cacheControl(never()).entity(new AttachTemporaryFileBadResultBean(message, newToken)).build();
  156. }
  157. private <T> T throwFourOhFour(com.atlassian.jira.util.ErrorCollection errorCollection) {
  158. throw new WebApplicationException(createError(Response.Status.NOT_FOUND, errorCollection));
  159. }
  160. private static <T> T getFirstElement(Collection<? extends T> values) {
  161. if (!values.isEmpty()) {
  162. return values.iterator().next();
  163. } else {
  164. return null;
  165. }
  166. }
  167. }