diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js index 64679faba0f0d005725549c27637b2b8674edd21..d9eb87fa1d9a5df2e2082ba39e432538396b986d 100644 --- a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js +++ b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js @@ -159,7 +159,7 @@ AddProjectDialog.prototype.createGeneralTabContent = function () { name: "project-file" }); fileInput.addEventListener("change", function () { - return self.callListeners("onFileUpload", fileInput.files[0]); + return self.callListeners("onFileUpload", fileInput.files[0]).then(null, GuiConnector.alert); }, false); self.addListener("onFileUpload", function (e) { var file = e.arg; @@ -936,6 +936,8 @@ AddProjectDialog.prototype.createZipEntry = function (jsZipEntry, zipObject) { data.description = ""; } }); + } else if (this.isIgnoredZipEntry(filename)) { + type = undefined; } else if (filename.indexOf("\\") === -1 && filename.indexOf("/") === -1) { type = "MAP"; data.root = true; @@ -972,7 +974,11 @@ AddProjectDialog.prototype.createZipEntry = function (jsZipEntry, zipObject) { } return processingPromise.then(function () { - return new ZipEntry({filename: filename, type: type, data: data}); + if (type !== undefined) { + return new ZipEntry({filename: filename, type: type, data: data}); + } else { + return null; + } }); }; @@ -986,6 +992,15 @@ AddProjectDialog.prototype.setZipEntries = function (entries) { }; +AddProjectDialog.prototype.isIgnoredZipEntry = function (filename) { + var lowercaseString = filename.toLowerCase(); + if (lowercaseString.startsWith("__macosx") || lowercaseString.startsWith(".ds_store")) { + return true; + } else { + return false; + } +}; + AddProjectDialog.prototype.getEntryByFilename = function (filename) { var self = this; var entries = self.getZipEntries(); diff --git a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js index 97133089ed9a036b5aff78fde3454033eca57107..f76d54a2d73f8d2c9ffd53312fc935a7d159137d 100644 --- a/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js +++ b/frontend-js/src/test/js/gui/admin/AddProjectDialog-test.js @@ -172,7 +172,7 @@ describe('AddProjectDialog', function () { dialog.setProjectId("(invalid id)"); return dialog.checkValidity().then(function () { assert.notOk("Expected validity to reject"); - }).catch(function(error){ + }).catch(function (error) { assert.ok(error instanceof ValidationError); }); }).then().finally(function () { @@ -198,4 +198,38 @@ describe('AddProjectDialog', function () { }); }); + describe('isIgnoredZipEntry', function () { + it('valid entry', function () { + var dialog = new AddProjectDialog({ + element: testDiv, + customMap: null + }); + + assert.notOk(dialog.isIgnoredZipEntry("images/a.png")); + assert.notOk(dialog.isIgnoredZipEntry("main.xml")); + return dialog.destroy(); + }); + it('invalid MAC OS entry', function () { + var dialog = new AddProjectDialog({ + element: testDiv, + customMap: null + }); + + // noinspection SpellCheckingInspection + assert.ok(dialog.isIgnoredZipEntry("__MACOSX/.desc")); + assert.ok(dialog.isIgnoredZipEntry("__macosx/.desc")); + return dialog.destroy(); + }); + it('invalid old MAC OS entry', function () { + var dialog = new AddProjectDialog({ + element: testDiv, + customMap: null + }); + + assert.ok(dialog.isIgnoredZipEntry(".DS_Store/.desc")); + assert.ok(dialog.isIgnoredZipEntry(".ds_store/.desc")); + return dialog.destroy(); + }); + }); + });