diff --git a/build.sh b/build.sh deleted file mode 100755 index cd55f467..00000000 --- a/build.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -docker build -t sismics/docs . diff --git a/docs-core/src/main/java/com/sismics/docs/core/util/PdfUtil.java b/docs-core/src/main/java/com/sismics/docs/core/util/PdfUtil.java index 86d22da2..f1268545 100644 --- a/docs-core/src/main/java/com/sismics/docs/core/util/PdfUtil.java +++ b/docs-core/src/main/java/com/sismics/docs/core/util/PdfUtil.java @@ -64,7 +64,7 @@ public class PdfUtil { PDFTextStripper stripper = new PDFTextStripper(); pdfDocument = PDDocument.load(inputStream); content = stripper.getText(pdfDocument); - } catch (IOException e) { + } catch (Exception e) { log.error("Error while extracting text from the PDF", e); } finally { if (pdfDocument != null) { diff --git a/docs-core/src/main/java/com/sismics/util/mime/MimeType.java b/docs-core/src/main/java/com/sismics/util/mime/MimeType.java index b85517ef..b844aced 100644 --- a/docs-core/src/main/java/com/sismics/util/mime/MimeType.java +++ b/docs-core/src/main/java/com/sismics/util/mime/MimeType.java @@ -19,4 +19,6 @@ public class MimeType { public static final String OPEN_DOCUMENT_TEXT = "application/vnd.oasis.opendocument.text"; public static final String OFFICE_DOCUMENT = "application/vnd.openxmlformats-officedocument.wordprocessingml.document"; + + public static final String DEFAULT = "application/octet-stream"; } diff --git a/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java b/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java index 2eb5f079..c784de77 100644 --- a/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java +++ b/docs-core/src/main/java/com/sismics/util/mime/MimeTypeUtil.java @@ -60,7 +60,7 @@ public class MimeTypeUtil { return MimeType.APPLICATION_PDF; } - return null; + return MimeType.DEFAULT; } /** diff --git a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java index f27c87f7..8734fea7 100644 --- a/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java +++ b/docs-web/src/main/java/com/sismics/docs/rest/resource/FileResource.java @@ -41,6 +41,7 @@ import java.io.ByteArrayInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; +import java.net.URISyntaxException; import java.nio.file.Files; import java.nio.file.Paths; import java.text.MessageFormat; @@ -129,10 +130,7 @@ public class FileResource extends BaseResource { } catch (IOException e) { throw new ServerException("ErrorGuessMime", "Error guessing mime type", e); } - if (mimeType == null) { - throw new ClientException("InvalidFileType", "File type not recognized"); - } - + // Validate quota if (user.getStorageCurrent() + fileData.length > user.getStorageQuota()) { throw new ClientException("QuotaReached", "Quota limit reached"); @@ -535,7 +533,11 @@ public class FileResource extends BaseResource { mimeType = MimeType.IMAGE_JPEG; // Thumbnails are JPEG decrypt = true; // Thumbnails are encrypted if (!Files.exists(storedFile)) { - storedFile = Paths.get(getClass().getResource("/image/file.png").getFile()); + try { + storedFile = Paths.get(getClass().getResource("/image/file.png").toURI()); + } catch (URISyntaxException e) { + // Ignore + } mimeType = MimeType.IMAGE_PNG; decrypt = false; } diff --git a/docs-web/src/main/webapp/src/app/docs/controller/document/DocumentEdit.js b/docs-web/src/main/webapp/src/app/docs/controller/document/DocumentEdit.js index e13839f9..fa007e67 100644 --- a/docs-web/src/main/webapp/src/app/docs/controller/document/DocumentEdit.js +++ b/docs-web/src/main/webapp/src/app/docs/controller/document/DocumentEdit.js @@ -94,6 +94,7 @@ angular.module('docs').controller('DocumentEdit', function($rootScope, $scope, $ // Upload files after edition promise.then(function(data) { + console.log('document created, adding file', $scope.newFiles); $scope.fileProgress = 0; // When all files upload are over, attach orphan files and move on @@ -133,6 +134,7 @@ angular.module('docs').controller('DocumentEdit', function($rootScope, $scope, $ }; // Build the payload + console.log('sending file', key, $scope.newFiles[key], data); var file = $scope.newFiles[key]; var formData = new FormData(); formData.append('id', data.id); @@ -147,6 +149,7 @@ angular.module('docs').controller('DocumentEdit', function($rootScope, $scope, $ contentType: false, processData: false, success: function(response) { + console.log('file uploaded successfully', formData); deferred.resolve(response); }, error: function(jqXHR) { @@ -192,11 +195,13 @@ angular.module('docs').controller('DocumentEdit', function($rootScope, $scope, $ var then = function() { key++; if ($scope.newFiles[key]) { + console.log('sending new file'); sendFile(key).then(then); } else { $scope.fileIsUploading = false; $scope.fileProgress = 0; $rootScope.pageTitle = 'Sismics Docs'; + console.log('finished sending files, bye'); navigateNext(); } }; diff --git a/docs-web/src/main/webapp/src/partial/docs/document.edit.html b/docs-web/src/main/webapp/src/partial/docs/document.edit.html index 049c0d77..68fca1e4 100644 --- a/docs-web/src/main/webapp/src/partial/docs/document.edit.html +++ b/docs-web/src/main/webapp/src/partial/docs/document.edit.html @@ -40,9 +40,7 @@
- +
+ {{ orphanFiles.length }} file{{ orphanFiles.length > 1 ? 's' : '' }} diff --git a/docs-web/src/main/webapp/src/partial/docs/document.view.content.html b/docs-web/src/main/webapp/src/partial/docs/document.view.content.html index 15127f09..cc58fdee 100644 --- a/docs-web/src/main/webapp/src/partial/docs/document.view.content.html +++ b/docs-web/src/main/webapp/src/partial/docs/document.view.content.html @@ -39,7 +39,7 @@
+ ng-file-change="fileDropped($files, $event, $rejectedFiles)">
diff --git a/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java b/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java index a5435ed4..71766de2 100644 --- a/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java +++ b/docs-web/src/test/java/com/sismics/docs/rest/TestFileResource.java @@ -36,7 +36,7 @@ public class TestFileResource extends BaseJerseyTest { /** * Test the file resource. * - * @throws Exception + * @throws Exception e */ @Test public void testFileResource() throws Exception { @@ -124,7 +124,7 @@ public class TestFileResource extends BaseJerseyTest { // Check that the files are not readable directly from FS Path storedFile = DirectoryUtil.getStorageDirectory().resolve(file1Id); try (InputStream storedFileInputStream = new BufferedInputStream(Files.newInputStream(storedFile))) { - Assert.assertNull(MimeTypeUtil.guessMimeType(storedFileInputStream)); + Assert.assertEquals(MimeType.DEFAULT, MimeTypeUtil.guessMimeType(storedFileInputStream)); } // Get all files from a document @@ -197,17 +197,57 @@ public class TestFileResource extends BaseJerseyTest { files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); } - + + /** + * Test using a ZIP file. + * + * @throws Exception e + */ + @Test + public void testZipFile() throws Exception { + // Login file1 + clientUtil.createUser("file2"); + String file2Token = clientUtil.login("file2"); + + // Create a document + long create1Date = new Date().getTime(); + JsonObject json = target().path("/document").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .put(Entity.form(new Form() + .param("title", "File test document 1") + .param("language", "eng") + .param("create_date", Long.toString(create1Date))), JsonObject.class); + String document1Id = json.getString("id"); + Assert.assertNotNull(document1Id); + + // Add a file + String file1Id; + try (InputStream is = Resources.getResource("file/wikipedia.zip").openStream()) { + StreamDataBodyPart streamDataBodyPart = new StreamDataBodyPart("file", is, "wikipedia.zip"); + try (FormDataMultiPart multiPart = new FormDataMultiPart()) { + json = target() + .register(MultiPartFeature.class) + .path("/file").request() + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .put(Entity.entity(multiPart.field("id", document1Id).bodyPart(streamDataBodyPart), + MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); + file1Id = json.getString("id"); + Assert.assertNotNull(file1Id); + Assert.assertEquals(525069L, json.getJsonNumber("size").longValue()); + } + } + } + /** * Test orphan files (without linked document). * - * @throws Exception + * @throws Exception e */ @Test public void testOrphanFile() throws Exception { - // Login file2 - clientUtil.createUser("file2"); - String file2Token = clientUtil.login("file2"); + // Login file3 + clientUtil.createUser("file3"); + String file3Token = clientUtil.login("file3"); // Add a file String file1Id; @@ -217,7 +257,7 @@ public class TestFileResource extends BaseJerseyTest { JsonObject json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file1Id = json.getString("id"); @@ -227,14 +267,14 @@ public class TestFileResource extends BaseJerseyTest { // Get all orphan files JsonObject json = target().path("/file/list").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .get(JsonObject.class); JsonArray files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); // Get the file data Response response = target().path("/file/" + file1Id + "/data").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .get(); InputStream is = (InputStream) response.getEntity(); byte[] fileBytes = ByteStreams.toByteArray(is); @@ -243,7 +283,7 @@ public class TestFileResource extends BaseJerseyTest { // Create a document json = target().path("/document").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .put(Entity.form(new Form() .param("title", "File test document 1") .param("language", "eng")), JsonObject.class); @@ -252,7 +292,7 @@ public class TestFileResource extends BaseJerseyTest { // Attach a file to a document target().path("/file/" + file1Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .post(Entity.form(new Form() .param("id", document1Id)), JsonObject.class); @@ -260,7 +300,7 @@ public class TestFileResource extends BaseJerseyTest { json = target().path("/file/list") .queryParam("id", document1Id) .request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .get(JsonObject.class); files = json.getJsonArray("files"); Assert.assertEquals(1, files.size()); @@ -273,7 +313,7 @@ public class TestFileResource extends BaseJerseyTest { json = target() .register(MultiPartFeature.class) .path("/file").request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .put(Entity.entity(multiPart.bodyPart(streamDataBodyPart), MediaType.MULTIPART_FORM_DATA_TYPE), JsonObject.class); file2Id = json.getString("id"); @@ -283,7 +323,7 @@ public class TestFileResource extends BaseJerseyTest { // Deletes a file json = target().path("/file/" + file2Id).request() - .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file2Token) + .cookie(TokenBasedSecurityFilter.COOKIE_NAME, file3Token) .delete(JsonObject.class); Assert.assertEquals("ok", json.getString("status")); } @@ -291,7 +331,7 @@ public class TestFileResource extends BaseJerseyTest { /** * Test user quota. * - * @throws Exception + * @throws Exception e */ @Test public void testQuota() throws Exception { diff --git a/docs-web/src/test/resources/file/wikipedia.zip b/docs-web/src/test/resources/file/wikipedia.zip new file mode 100644 index 00000000..0cfb3f91 Binary files /dev/null and b/docs-web/src/test/resources/file/wikipedia.zip differ diff --git a/run-service.sh b/run-service.sh deleted file mode 100755 index b9749c19..00000000 --- a/run-service.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -docker rm -f sismics_docs -docker run \ - -d --name=sismics_docs --restart=always \ - -v sismics_docs_data:/data \ - -e 'VIRTUAL_HOST_SECURE=docs.bgamard.org' -e 'VIRTUAL_PORT=80' \ - sismics/docs:latest