From 2592fc749ff64e85653bf04c367f2d6b194824d8 Mon Sep 17 00:00:00 2001
From: Piotr Gawron <piotr.gawron@uni.lu>
Date: Thu, 15 Feb 2018 17:31:16 +0100
Subject: [PATCH] project privileges are set according to user defaults (or
 general defaults if user specific not defined)

---
 .../src/main/js/gui/admin/MapsAdminPanel.js   |  3 ++
 .../services/impl/LayoutService.java          |  1 -
 .../services/impl/ProjectService.java         | 48 +++++++++++--------
 .../mapviewer/services/impl/UserService.java  | 35 ++++++--------
 .../services/utils/CreateProjectParams.java   |  7 +--
 .../services/impl/LayoutServiceTest.java      |  6 ---
 .../services/impl/ProjectServiceTest.java     | 36 ++++++++++++--
 .../services/impl/UserServiceTest.java        |  8 +---
 8 files changed, 83 insertions(+), 61 deletions(-)

diff --git a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
index b32f01eca3..1c1a6e3c14 100644
--- a/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
+++ b/frontend-js/src/main/js/gui/admin/MapsAdminPanel.js
@@ -273,6 +273,9 @@ MapsAdminPanel.prototype.onRefreshClicked = function () {
   var self = this;
   return ServerConnector.getProjects(true).then(function (projects) {
     return self.setProjects(projects);
+  }).then(function () {
+    //we need to refresh users as well because of privileges
+    return ServerConnector.getUsers(true);
   });
 };
 
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
index be6946bd40..753d7999db 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java
@@ -35,7 +35,6 @@ import lcsb.mapviewer.model.Project;
 import lcsb.mapviewer.model.cache.UploadedFileEntry;
 import lcsb.mapviewer.model.log.LogType;
 import lcsb.mapviewer.model.map.MiriamData;
-import lcsb.mapviewer.model.map.MiriamType;
 import lcsb.mapviewer.model.map.layout.ColorSchema;
 import lcsb.mapviewer.model.map.layout.GeneVariation;
 import lcsb.mapviewer.model.map.layout.GeneVariationColorSchema;
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
index b037f9c125..5e6664973f 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java
@@ -570,33 +570,41 @@ public class ProjectService implements IProjectService {
         newUsers[i][j] = users.get(i)[j];
       }
     }
-    newUsers[users.size()][0] = "anonymous";
-    newUsers[users.size()][1] = "";
+    Set<User> processedUser = new HashSet<>();
     for (int i = 0; i < newUsers.length; i++) {
-      boolean admin = (users.size() != i);
       String login = newUsers[i][0];
-      String passwd = newUsers[i][1];
       User user = userService.getUserByLogin(login);
-      if (userService.getUserByLogin(login) == null) {
-        logger.debug("User " + login + " does not exist. Creating");
-        user = new User();
-        user.setCryptedPassword(passwordEncoder.encode(passwd));
-        user.setLogin(login);
-        userService.addUser(user);
-      }
-      if (project != null) {
-        logger.debug("Privileges for " + login + " for project " + project.getProjectId());
+      if (user != null) {
+        processedUser.add(user);
+        logger.debug("Root privileges for " + login + " for project " + project.getProjectId());
         ObjectPrivilege privilege = new ObjectPrivilege(project, 1, PrivilegeType.VIEW_PROJECT, user);
         userService.setUserPrivilege(user, privilege);
-        if (admin) {
-          privilege = new ObjectPrivilege(project, 1, PrivilegeType.LAYOUT_MANAGEMENT, user);
-          userService.setUserPrivilege(user, privilege);
-          privilege = new ObjectPrivilege(project, 1, PrivilegeType.EDIT_COMMENTS_PROJECT, user);
-          userService.setUserPrivilege(user, privilege);
+        privilege = new ObjectPrivilege(project, 1, PrivilegeType.LAYOUT_MANAGEMENT, user);
+        userService.setUserPrivilege(user, privilege);
+        privilege = new ObjectPrivilege(project, 1, PrivilegeType.EDIT_COMMENTS_PROJECT, user);
+        userService.setUserPrivilege(user, privilege);
+      }
+    }
+    for (User user : userDao.getAll()) {
+      if (!processedUser.contains(user)) {
+        processedUser.add(user);
+        for (PrivilegeType type : PrivilegeType.values()) {
+          if (Project.class.equals(type.getPrivilegeObjectType())) {
+            int level = userService.getUserPrivilegeLevel(user, type, (Integer) null);
+            if (level < 0) {
+              if (configurationService.getValue(type).getValue().equalsIgnoreCase("true")) {
+                level = 1;
+              } else {
+                level = 0;
+              }
+            }
+            ObjectPrivilege privilege = new ObjectPrivilege(project, level, type, user);
+            userService.setUserPrivilege(user, privilege);
+          }
         }
-
       }
     }
+
   }
 
   /**
@@ -1023,7 +1031,7 @@ public class ProjectService implements IProjectService {
           if (taxonomyBackend.getNameForTaxonomy(organism) != null) {
             project.setOrganism(organism);
           } else {
-            logger.warn(project.getProjectId()+"\tNo valid organism is provided for project. " + organism);
+            logger.warn(project.getProjectId() + "\tNo valid organism is provided for project. " + organism);
           }
 
           modelDao.update(originalModel);
diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
index 3336c87546..f2bbf63c14 100644
--- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
+++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java
@@ -26,7 +26,6 @@ import lcsb.mapviewer.model.user.ConfigurationElementType;
 import lcsb.mapviewer.model.user.ObjectPrivilege;
 import lcsb.mapviewer.model.user.PrivilegeType;
 import lcsb.mapviewer.model.user.User;
-import lcsb.mapviewer.model.user.UserAnnotationSchema;
 import lcsb.mapviewer.persist.dao.ProjectDao;
 import lcsb.mapviewer.persist.dao.user.PrivilegeDao;
 import lcsb.mapviewer.persist.dao.user.UserDao;
@@ -289,9 +288,8 @@ public class UserService implements IUserService {
     for (User user : users) {
       List<BasicPrivilege> toRemove = new ArrayList<BasicPrivilege>();
       for (BasicPrivilege privilege : user.getPrivileges()) {
-        if (privilege.getType().equals(type) && 
-            privilege instanceof ObjectPrivilege && 
-            integerComparator.compare(((ObjectPrivilege) privilege).getIdObject() ,id)==0) {
+        if (privilege.getType().equals(type) && privilege instanceof ObjectPrivilege
+            && integerComparator.compare(((ObjectPrivilege) privilege).getIdObject(), id) == 0) {
           toRemove.add(privilege);
         }
       }
@@ -317,19 +315,18 @@ public class UserService implements IUserService {
 
   @Override
   public int getUserPrivilegeLevel(User user, PrivilegeType type, Object object) {
-    if (object == null) {
-      throw new InvalidArgumentException("Object cannot be null");
-    }
     Integer id = null;
-    try {
-      id = ObjectUtils.getIdOfObject(object);
-    } catch (Exception e) {
-      logger.error(e.getMessage(), e);
-      throw new InvalidArgumentException("Internal server error. Problem with accessing id of the parameter object");
-    }
-    if (!type.getPrivilegeObjectType().isAssignableFrom(object.getClass())) {
-      throw new InvalidArgumentException("This privilege accept only " + type.getPrivilegeObjectType()
-          + " objects parameter, but " + object.getClass() + " class found.");
+    if (object != null) {
+      try {
+        id = ObjectUtils.getIdOfObject(object);
+      } catch (Exception e) {
+        logger.error(e.getMessage(), e);
+        throw new InvalidArgumentException("Internal server error. Problem with accessing id of the parameter object");
+      }
+      if (!type.getPrivilegeObjectType().isAssignableFrom(object.getClass())) {
+        throw new InvalidArgumentException("This privilege accept only " + type.getPrivilegeObjectType()
+            + " objects parameter, but " + object.getClass() + " class found.");
+      }
     }
     return getUserPrivilegeLevel(user, type, id);
   }
@@ -338,9 +335,6 @@ public class UserService implements IUserService {
     if (type.getPrivilegeClassType() != ObjectPrivilege.class) {
       throw new InvalidArgumentException("This privilege doesn't accept object parameter");
     }
-    if (id == null) {
-      throw new InvalidArgumentException("Parameter object has null id value");
-    }
     if (user == null) {
       throw new InvalidArgumentException("User cannot be null");
     }
@@ -349,10 +343,11 @@ public class UserService implements IUserService {
     if (user.getId() != null) {
       user = userDao.getById(user.getId());
     }
+    IntegerComparator integerComparator = new IntegerComparator();
     for (BasicPrivilege privilege : user.getPrivileges()) {
       if (privilege.getClass() == ObjectPrivilege.class) {
         ObjectPrivilege oPrivilege = (ObjectPrivilege) privilege;
-        if (oPrivilege.getType().equals(type) && oPrivilege.getIdObject().equals(id)) {
+        if (oPrivilege.getType().equals(type) && integerComparator.compare(oPrivilege.getIdObject(), id) == 0) {
           return privilege.getLevel();
         }
       }
diff --git a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
index a1f3ab33bc..c6b976f181 100644
--- a/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
+++ b/service/src/main/java/lcsb/mapviewer/services/utils/CreateProjectParams.java
@@ -136,14 +136,15 @@ public class CreateProjectParams {
 
   /**
    * Directory with the static images that will be stored on server. This
-   * directory is relative and it's a simple uniqe name within folder with images.
+   * directory is relative and it's a simple unique name within folder with
+   * images.
    */
   private String projectDir;
 
   private AuthenticationToken authenticationToken;
 
   /**
-   * Map that contains informnation what kind of annotators should be used for
+   * Map that contains information what kind of annotators should be used for
    * specific class.
    */
   private Map<Class<?>, List<String>> annotatorsMap = null;
@@ -156,7 +157,7 @@ public class CreateProjectParams {
 
   /**
    * Map that contains information which {@link MiriamType miriam types} are
-   * obigatory for which class.
+   * obligatory for which class.
    */
   private Map<Class<? extends BioEntity>, Set<MiriamType>> requiredAnnotations = null;
 
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
index b148ea934a..ca85d27c3a 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/LayoutServiceTest.java
@@ -95,12 +95,6 @@ public class LayoutServiceTest extends ServiceTestFunctions {
 
     projectService.addProject(project);
 
-    if (userDao.getUserByLogin("john.doe")!=null) {
-      userService.deleteUser(userDao.getUserByLogin("john.doe"));
-    }
-    if (userDao.getUserByLogin("john.doe.bis")!=null) {
-      userService.deleteUser(userDao.getUserByLogin("john.doe.bis"));
-    }
     createUser();
     createUser2();
 
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
index 40d94a3fc6..67a3fcdfd6 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java
@@ -56,6 +56,7 @@ import lcsb.mapviewer.services.overlay.AnnotatedObjectTreeRow;
 import lcsb.mapviewer.services.utils.CreateProjectParams;
 import lcsb.mapviewer.services.utils.data.BuildInLayout;
 import lcsb.mapviewer.services.view.AuthenticationToken;
+import lcsb.mapviewer.services.view.ConfigurationView;
 import lcsb.mapviewer.services.view.ProjectView;
 
 @Rollback(true)
@@ -235,10 +236,9 @@ public class ProjectServiceTest extends ServiceTestFunctions {
           images(true).//
           async(false).//
           projectDir(tmpResultDir).//
-          addUser("gawi", "gawi").//
+          addUser("admin", "admin").//
           analyzeAnnotations(true));
-      AuthenticationToken token = userService.login("gawi", "gawi");
-      Project project = projectService.getProjectByProjectId(project_id, token);
+      Project project = projectService.getProjectByProjectId(project_id, adminToken);
       assertEquals(ProjectStatus.DONE, project.getStatus());
       projectService.removeProject(project, null, false, adminToken);
     } catch (Exception e) {
@@ -251,6 +251,9 @@ public class ProjectServiceTest extends ServiceTestFunctions {
   public void testCreateComplex() throws Exception {
     String projectId = "test_id";
     try {
+      createUser();
+      AuthenticationToken token = userService.login(user.getLogin(), "passwd");
+
       ZipEntryFile entry1 = new ModelZipEntryFile("main.xml", "main", true, false, SubmodelType.UNKNOWN);
       ZipEntryFile entry2 = new ModelZipEntryFile("s1.xml", "s1", false, false, SubmodelType.UNKNOWN);
       ZipEntryFile entry3 = new ModelZipEntryFile("s2.xml", "s2", false, false, SubmodelType.UNKNOWN);
@@ -272,9 +275,8 @@ public class ProjectServiceTest extends ServiceTestFunctions {
           images(true).//
           async(false).//
           projectDir(tmpResultDir).//
-          addUser("gawi", "gawi").//
+          addUser(user.getLogin(), "admin").//
           analyzeAnnotations(true));
-      AuthenticationToken token = userService.login("gawi", "gawi");
       Project project = projectService.getProjectByProjectId(projectId, token);
 
       Model model = modelService.getLastModelByProjectId(projectId, token);
@@ -893,4 +895,28 @@ public class ProjectServiceTest extends ServiceTestFunctions {
     }
   }
 
+  @Test
+  public void testCheckPrivilegesAfterCreateProject() throws Exception {
+    try {
+      createUser();
+
+      String name = "Some_id";
+      String filename = "testFiles/complexModel/empty_complex_model.zip";
+      Project project = createComplexProject(name, filename);
+
+      for (PrivilegeType type : PrivilegeType.values()) {
+        if (Project.class.equals(type.getPrivilegeObjectType())) {
+          ConfigurationView confParam = configurationService.getValue(type);
+          assertEquals("User has invalid " + type + " privilege for new project",
+              confParam.getValue().equalsIgnoreCase("true"), userService.userHasPrivilege(user, type, project));
+        }
+      }
+
+      projectService.removeProject(project, null, false, adminToken);
+    } catch (Exception e) {
+      e.printStackTrace();
+      throw e;
+    }
+  }
+
 }
diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/UserServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/UserServiceTest.java
index 967910ca14..128344b26f 100644
--- a/service/src/test/java/lcsb/mapviewer/services/impl/UserServiceTest.java
+++ b/service/src/test/java/lcsb/mapviewer/services/impl/UserServiceTest.java
@@ -146,12 +146,8 @@ public class UserServiceTest extends ServiceTestFunctions {
   }
 
   @Test
-  public void testUserHasPrivilegeUserPrivilegeTypeObject2() {
-    try {
-      userService.userHasPrivilege(user, PrivilegeType.VIEW_PROJECT, null);
-      fail("Exception should occur");
-    } catch (InvalidArgumentException e) {
-    }
+  public void testUserHasPrivilegeForDefaultProjectWithoutSetting() {
+    assertFalse(userService.userHasPrivilege(user, PrivilegeType.VIEW_PROJECT, null));
   }
 
   @Test
-- 
GitLab