From eb819fd547784899a6508e231fc8c242974f696c Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Mon, 12 Feb 2018 17:19:53 +0100
Subject: [PATCH] ignoring of mac specific hiden entries in zip file

---
 .../src/main/js/gui/admin/AddProjectDialog.js | 19 ++++++++--
 .../js/gui/admin/AddProjectDialog-test.js     | 36 ++++++++++++++++++-
 2 files changed, 52 insertions(+), 3 deletions(-)

diff --git a/frontend-js/src/main/js/gui/admin/AddProjectDialog.js b/frontend-js/src/main/js/gui/admin/AddProjectDialog.js
index 64679faba0..d9eb87fa1d 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 97133089ed..f76d54a2d7 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();
+    });
+  });
+
 });
-- 
GitLab