From 8cfde5920ecc9f73b9166ca6a2db6bd8c06d1af6 Mon Sep 17 00:00:00 2001 From: Sascha Herzinger <sascha.herzinger@uni.lu> Date: Mon, 17 Jun 2019 15:32:42 +0200 Subject: [PATCH] introduced object domains and removed roles --- .../mapviewer/model/security/AccessType.java | 4 +- .../model/security/ObjectPrivilege.java | 31 +++-------- .../mapviewer/model/security/Privilege.java | 36 +++++++++---- .../model/security/PrivilegeDomain.java | 52 +++++++++++++++++++ .../model/security/PrivilegeType.java | 35 ------------- .../model/user/ConfigurationElementType.java | 4 +- .../java/lcsb/mapviewer/model/user/User.java | 15 ------ .../mapviewer/model/user/AllUserTests.java | 2 +- .../model/user/ObjectPrivilegeTest.java | 5 +- ...TypeTest.java => PrivilegeDomainTest.java} | 8 +-- .../persist/SpringPersistConfig.java | 2 - .../persist/dao/user/UserDaoTest.java | 2 - .../configuration/ConfigurationRestImpl.java | 6 +-- .../api/projects/ProjectController.java | 16 +++--- .../projects/overlays/OverlayController.java | 8 +-- .../mapviewer/api/users/UserRestImpl.java | 31 ++++++----- .../api/plugins/PluginRestImplTest.java | 3 -- .../overlays/OverlayRestImplTest.java | 3 -- .../mapviewer/api/users/UserRestImplTest.java | 2 - .../services/impl/ConfigurationService.java | 4 +- .../services/impl/LayoutService.java | 8 +-- .../services/impl/ProjectService.java | 6 +-- .../mapviewer/services/impl/UserService.java | 4 +- .../interfaces/IConfigurationService.java | 4 +- .../services/interfaces/IUserService.java | 6 +-- .../impl/ConfigurationServiceTest.java | 2 - .../services/impl/ProjectServiceTest.java | 5 -- .../web/config/CustomUserDetailsService.java | 4 +- 28 files changed, 143 insertions(+), 165 deletions(-) create mode 100644 model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java delete mode 100644 model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java rename model/src/test/java/lcsb/mapviewer/model/user/{PrivilegeTypeTest.java => PrivilegeDomainTest.java} (70%) diff --git a/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java b/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java index aefd916be8..32becc5cce 100644 --- a/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java +++ b/model/src/main/java/lcsb/mapviewer/model/security/AccessType.java @@ -1,6 +1,8 @@ package lcsb.mapviewer.model.security; public enum AccessType { + CREATE, READ, - WRITE + UPDATE, + DELETE } diff --git a/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java b/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java index 312cddd3a3..815773a964 100644 --- a/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java +++ b/model/src/main/java/lcsb/mapviewer/model/security/ObjectPrivilege.java @@ -5,11 +5,6 @@ import java.util.Objects; import javax.persistence.DiscriminatorValue; import javax.persistence.Entity; -import javax.persistence.EnumType; -import javax.persistence.Enumerated; - -import lcsb.mapviewer.common.ObjectUtils; -import lcsb.mapviewer.model.user.User; /** * This class extends {@link Privilege} class which define typical user @@ -27,21 +22,17 @@ public class ObjectPrivilege extends Privilege implements Serializable { */ private Integer objectId; - @Enumerated(EnumType.STRING) - private AccessType accessType; - public ObjectPrivilege() { } - public ObjectPrivilege(Integer objectId, PrivilegeType type, AccessType accessType) { - super(type); + public ObjectPrivilege(Integer objectId, PrivilegeDomain type, AccessType accessType) { + super(type, accessType); this.objectId = objectId; - this.accessType = accessType; } @Override public String toString() { - return getPrivilegeType().name() + ":" + objectId.toString() + ":" + accessType.name(); + return getPrivilegeDomain().name() + ":" + objectId.toString() + ":" + getAccessType().name(); } @Override @@ -53,17 +44,17 @@ public class ObjectPrivilege extends Privilege implements Serializable { return false; } ObjectPrivilege privilege = (ObjectPrivilege) obj; - return privilege.getPrivilegeType() == getPrivilegeType() - && privilege.getAccessType() == accessType + return privilege.getPrivilegeDomain() == getPrivilegeDomain() + && privilege.getAccessType() == getAccessType() && Objects.equals(privilege.getObjectId(), objectId); } @Override public int hashCode() { - if (objectId == null || accessType == null) { + if (objectId == null || getPrivilegeDomain() == null || getAccessType() == null) { return 0; } - return Objects.hash(objectId, accessType, getPrivilegeType()); + return Objects.hash(objectId, getAccessType(), getPrivilegeDomain()); } public Integer getObjectId() { @@ -78,12 +69,4 @@ public class ObjectPrivilege extends Privilege implements Serializable { this.objectId = Integer.valueOf(idObject); } - public AccessType getAccessType() { - return accessType; - } - - public void setAccessType(AccessType accessType) { - this.accessType = accessType; - } - } \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java b/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java index a429762d30..b2191d0a79 100644 --- a/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java +++ b/model/src/main/java/lcsb/mapviewer/model/security/Privilege.java @@ -1,6 +1,7 @@ package lcsb.mapviewer.model.security; import java.io.Serializable; +import java.util.Objects; import javax.persistence.*; @@ -17,18 +18,22 @@ public class Privilege implements Serializable { private int id; @Enumerated(EnumType.STRING) - private PrivilegeType privilegeType; + private PrivilegeDomain privilegeDomain; + + @Enumerated(EnumType.STRING) + private AccessType accessType; public Privilege() { } - public Privilege(PrivilegeType privilegeType) { - this.privilegeType = privilegeType; + public Privilege(PrivilegeDomain privilegeDomain, AccessType accessType) { + this.privilegeDomain = privilegeDomain; + this.accessType = accessType; } @Override public String toString() { - return privilegeType.name(); + return privilegeDomain.name() + ":" + accessType.name(); } @Override @@ -40,15 +45,16 @@ public class Privilege implements Serializable { return false; } Privilege privilege = ((Privilege) obj); - return privilege.getPrivilegeType() == privilegeType; + return privilege.getPrivilegeDomain() == privilegeDomain + && privilege.getAccessType() == accessType; } @Override public int hashCode() { - if (privilegeType == null) { + if (privilegeDomain == null || accessType == null) { return 0; } - return privilegeType.name().hashCode(); + return Objects.hash(privilegeDomain, accessType); } public int getId() { @@ -59,11 +65,19 @@ public class Privilege implements Serializable { this.id = id; } - public PrivilegeType getPrivilegeType() { - return privilegeType; + public PrivilegeDomain getPrivilegeDomain() { + return privilegeDomain; + } + + public void setPrivilegeDomain(PrivilegeDomain privilegeDomain) { + this.privilegeDomain = privilegeDomain; + } + + public AccessType getAccessType() { + return accessType; } - public void setPrivilegeType(PrivilegeType privilegeType) { - this.privilegeType = privilegeType; + public void setAccessType(AccessType accessType) { + this.accessType = accessType; } } diff --git a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java new file mode 100644 index 0000000000..bfaa2f2b01 --- /dev/null +++ b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeDomain.java @@ -0,0 +1,52 @@ +package lcsb.mapviewer.model.security; + +import lcsb.mapviewer.model.Project; +import lcsb.mapviewer.model.map.layout.Layout; +import lcsb.mapviewer.model.user.User; + +/** + * All privilege domains are non-hierarchical. + * + * The ability to create and delete projects (PROJECTS_DOMAIN + CREATE/DELETE access), does not imply the ability to + * read or write to a singular project (PROJECT_DOMAIN + READ/WRITE access). Mind the plural in the previous sentence. + * + * There are however overlapping domains. From the perspective of a singular project the ability to delete any project + * (PROJECTS_DOMAIN + DELETE access) is no different than the ability to delete the project itself (PROJECT_DOMAIN + DELETE access). + * + * Please note that ObjectPrivilege domains are specific to a certain object, whereas Privilege domains are usually + * more general. + */ +public enum PrivilegeDomain { + + PROJECT_DOMAIN(ObjectPrivilege.class, Project.class, ""), + OVERLAY_DOMAIN(ObjectPrivilege.class, Layout.class, ""), + USER_DOMAIN(ObjectPrivilege.class, User.class, ""), + PROJECTS_DOMAIN(Privilege.class, null, ""), + OVERLAYS_DOMAIN(Privilege.class, null, ""), + ADMIN_DOMAIN(Privilege.class, null, ""); + + private Class<? extends Privilege> privilegeClassType; + + private Class<?> privilegeObjectType; + + private String description; + + PrivilegeDomain(Class<? extends Privilege> privilegeClazz, Class<?> objectClazz, String description) { + this.privilegeClassType = privilegeClazz; + this.privilegeObjectType = objectClazz; + this.description = description; + } + + public Class<? extends Privilege> getPrivilegeClassType() { + return privilegeClassType; + } + + public Class<?> getPrivilegeObjectType() { + return privilegeObjectType; + } + + public String getDescription() { + return description; + } + +} \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java b/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java deleted file mode 100644 index 8e9f984b44..0000000000 --- a/model/src/main/java/lcsb/mapviewer/model/security/PrivilegeType.java +++ /dev/null @@ -1,35 +0,0 @@ -package lcsb.mapviewer.model.security; - -import lcsb.mapviewer.model.Project; -import lcsb.mapviewer.model.map.layout.Layout; - -public enum PrivilegeType { - - PROJECT_DOMAIN_ACCESS(ObjectPrivilege.class, Project.class, "Access to project domain."), - OVERLAY_DOMAIN_ACCESS(ObjectPrivilege.class, Layout.class, "Access to overlay domain."); - - private Class<? extends Privilege> privilegeClassType; - - private Class<?> privilegeObjectType; - - private String description; - - PrivilegeType(Class<? extends Privilege> privilegeClazz, Class<?> objectClazz, String description) { - this.privilegeClassType = privilegeClazz; - this.privilegeObjectType = objectClazz; - this.description = description; - } - - public Class<? extends Privilege> getPrivilegeClassType() { - return privilegeClassType; - } - - public Class<?> getPrivilegeObjectType() { - return privilegeObjectType; - } - - public String getDescription() { - return description; - } - -} \ No newline at end of file diff --git a/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java b/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java index 6c2569f338..b1953690ec 100644 --- a/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java +++ b/model/src/main/java/lcsb/mapviewer/model/user/ConfigurationElementType.java @@ -1,6 +1,6 @@ package lcsb.mapviewer.model.user; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; /** * This enumerate defines all possible configuration parameter that are @@ -210,7 +210,7 @@ public enum ConfigurationElementType { "Dear Disease map team,\nI would like to request an account in the system.\nKind regards", ConfigurationElementEditType.TEXT, false, ConfigurationElementTypeGroup.EMAIL_NOTIFICATION), - DEFAULT_VIEW_PROJECT("Default user privilege for: " + PrivilegeType.PROJECT_DOMAIN_ACCESS.getDescription(), "true", + DEFAULT_VIEW_PROJECT("Default user privilege for: " + PrivilegeDomain.PROJECT_DOMAIN.getDescription(), "true", ConfigurationElementEditType.BOOLEAN, false, ConfigurationElementTypeGroup.DEFAULT_USER_PRIVILEGES), SHOW_REACTION_TYPE("Show reaction type", "true", ConfigurationElementEditType.BOOLEAN, false, diff --git a/model/src/main/java/lcsb/mapviewer/model/user/User.java b/model/src/main/java/lcsb/mapviewer/model/user/User.java index d044cce5bc..64f8433f55 100644 --- a/model/src/main/java/lcsb/mapviewer/model/user/User.java +++ b/model/src/main/java/lcsb/mapviewer/model/user/User.java @@ -3,19 +3,15 @@ package lcsb.mapviewer.model.user; import java.awt.Color; import java.io.Serializable; import java.util.Calendar; -import java.util.Comparator; import java.util.HashSet; import java.util.Set; import javax.persistence.*; import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.security.RoleType; import org.hibernate.annotations.Cascade; -import lcsb.mapviewer.common.comparator.StringComparator; - @Entity public class User implements Serializable { @@ -79,9 +75,6 @@ public class User implements Serializable { ) private Set<Privilege> privileges = new HashSet<>(); - @Enumerated(EnumType.STRING) - private RoleType role; - @OneToOne(cascade = CascadeType.ALL) @JoinColumn private UserAnnotationSchema annotationSchema; @@ -153,14 +146,6 @@ public class User implements Serializable { this.privileges = privileges; } - public RoleType getRole() { - return role; - } - - public void setRole(RoleType role) { - this.role = role; - } - public boolean isRemoved() { return removed; } diff --git a/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java b/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java index 50bfcea41c..92ccc55185 100644 --- a/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java +++ b/model/src/test/java/lcsb/mapviewer/model/user/AllUserTests.java @@ -13,7 +13,7 @@ import lcsb.mapviewer.model.user.annotator.AllAnnotatorTests; ConfigurationElementEditTypeTest.class, ConfigurationTest.class, ObjectPrivilegeTest.class, - PrivilegeTypeTest.class, + PrivilegeDomainTest.class, UserAnnotationSchemaTest.class, UserClassAnnotatorsTest.class, UserClassRequiredAnnotationsTest.class, diff --git a/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java b/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java index 21831a69a8..3dc25e4a14 100644 --- a/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/user/ObjectPrivilegeTest.java @@ -7,8 +7,7 @@ import static org.junit.Assert.assertTrue; import lcsb.mapviewer.model.security.AccessType; import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import org.apache.commons.lang3.SerializationUtils; import org.junit.After; import org.junit.Before; @@ -42,7 +41,7 @@ public class ObjectPrivilegeTest { Integer id = 12; Project project = new Project(); project.setId(id); - ObjectPrivilege privilege = new ObjectPrivilege(project.getId(), PrivilegeType.PROJECT_DOMAIN_ACCESS, AccessType.READ); + ObjectPrivilege privilege = new ObjectPrivilege(project.getId(), PrivilegeDomain.PROJECT_DOMAIN, AccessType.READ); assertEquals(id, privilege.getObjectId()); } catch (Exception e) { e.printStackTrace(); diff --git a/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java b/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java similarity index 70% rename from model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java rename to model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java index 947a4ff170..74e358a540 100644 --- a/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeTypeTest.java +++ b/model/src/test/java/lcsb/mapviewer/model/user/PrivilegeDomainTest.java @@ -2,12 +2,12 @@ package lcsb.mapviewer.model.user; import static org.junit.Assert.assertNotNull; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import org.junit.After; import org.junit.Before; import org.junit.Test; -public class PrivilegeTypeTest { +public class PrivilegeDomainTest { @Before public void setUp() throws Exception { @@ -19,11 +19,11 @@ public class PrivilegeTypeTest { @Test public void testValidValues() { - for (PrivilegeType type : PrivilegeType.values()) { + for (PrivilegeDomain type : PrivilegeDomain.values()) { assertNotNull(type); // for coverage tests - PrivilegeType.valueOf(type.toString()); + PrivilegeDomain.valueOf(type.toString()); assertNotNull(type.getDescription()); assertNotNull(type.getPrivilegeClassType()); } diff --git a/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java b/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java index 95af7afba5..3e16648477 100644 --- a/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java +++ b/persist/src/main/java/lcsb/mapviewer/persist/SpringPersistConfig.java @@ -11,8 +11,6 @@ import org.springframework.jdbc.datasource.init.DataSourceInitializer; import org.springframework.jdbc.datasource.init.DatabasePopulator; import org.springframework.orm.hibernate5.HibernateTransactionManager; import org.springframework.orm.hibernate5.LocalSessionFactoryBean; -import org.springframework.security.crypto.password.MessageDigestPasswordEncoder; -import org.springframework.security.crypto.password.PasswordEncoder; import org.springframework.transaction.annotation.EnableTransactionManagement; import javax.sql.DataSource; diff --git a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java index 860432faaf..ec5bee7d1d 100644 --- a/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java +++ b/persist/src/test/java/lcsb/mapviewer/persist/dao/user/UserDaoTest.java @@ -19,8 +19,6 @@ import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.species.Species; import lcsb.mapviewer.model.user.AnnotatorParamDefinition; -import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.model.user.UserAnnotationSchema; import lcsb.mapviewer.model.user.UserClassAnnotators; diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java index 26b84213e0..7006e6adaf 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/configuration/ConfigurationRestImpl.java @@ -9,6 +9,7 @@ import java.util.Queue; import java.util.Set; import java.util.TreeMap; +import lcsb.mapviewer.model.security.PrivilegeDomain; import org.apache.logging.log4j.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; @@ -34,7 +35,6 @@ import lcsb.mapviewer.model.map.species.field.ModificationState; import lcsb.mapviewer.model.user.ConfigurationElementEditType; import lcsb.mapviewer.model.user.ConfigurationElementType; import lcsb.mapviewer.model.user.ConfigurationOption; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.annotator.BioEntityField; import lcsb.mapviewer.modelutils.map.ClassTreeNode; import lcsb.mapviewer.modelutils.map.ElementUtils; @@ -208,13 +208,13 @@ public class ConfigurationRestImpl extends BaseRestImpl { public Map<String, Object> getPrivilegeTypes() { Map<String, Object> result = new TreeMap<>(); - for (PrivilegeType type : PrivilegeType.values()) { + for (PrivilegeDomain type : PrivilegeDomain.values()) { result.put(type.name(), createPrivilegeTypeResponse(type)); } return result; } - private Map<String, Object> createPrivilegeTypeResponse(PrivilegeType type) { + private Map<String, Object> createPrivilegeTypeResponse(PrivilegeDomain type) { Map<String, Object> result = new TreeMap<>(); result.put("commonName", type.getDescription()); if (type.getPrivilegeObjectType() != null) { diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java index 057112fc32..23b6daf0cf 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/ProjectController.java @@ -5,18 +5,17 @@ import java.util.List; import java.util.Map; import javax.servlet.ServletContext; - -import lcsb.mapviewer.model.user.User; -import lcsb.mapviewer.services.impl.UserService; -import lcsb.mapviewer.services.interfaces.IUserService; import org.apache.logging.log4j.*; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; +import org.springframework.security.access.prepost.PreAuthorize; import org.springframework.security.core.Authentication; import org.springframework.util.MultiValueMap; import org.springframework.web.bind.annotation.*; +import lcsb.mapviewer.model.user.User; +import lcsb.mapviewer.services.interfaces.IUserService; import lcsb.mapviewer.api.BaseController; import lcsb.mapviewer.api.ObjectNotFoundException; import lcsb.mapviewer.api.QueryException; @@ -26,8 +25,6 @@ import lcsb.mapviewer.services.SecurityException; @RestController @RequestMapping(value = "/projects", produces = MediaType.APPLICATION_JSON_VALUE) public class ProjectController extends BaseController { - @SuppressWarnings("unused") - private Logger logger = LogManager.getLogger(ProjectController.class); private ServletContext context; private ProjectRestImpl projectController; @@ -40,12 +37,14 @@ public class ProjectController extends BaseController { this.userService = userService; } + @PreAuthorize("hasRole('ADMIN') or hasPermission(#projectId, 'Project', 'READ')") @GetMapping(value = "/{projectId:.+}") - public Map<String, Object> getProject(@PathVariable(value = "projectId") String projectId - ) throws ObjectNotFoundException { + public Map<String, Object> getProject(@PathVariable(value = "projectId") String projectId) + throws ObjectNotFoundException { return projectController.getProject(projectId); } + @PreAuthorize("hasRole('ADMIN') or hasPermission(#projectId, 'Project', 'WRITE')") @PatchMapping(value = "/{projectId:.+}") public Map<String, Object> updateProject( @RequestBody String body, @@ -56,6 +55,7 @@ public class ProjectController extends BaseController { return projectController.updateProject(projectId, data); } + @PreAuthorize("hasAnyRole('ADMIN', 'CURATOR')") @PostMapping(value = "/{projectId:.+}") public Map<String, Object> addProject( Authentication authentication, diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java index 3b9777ef66..db1892e08d 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/projects/overlays/OverlayController.java @@ -4,6 +4,7 @@ import java.io.IOException; import java.util.List; import java.util.Map; +import lcsb.mapviewer.model.security.PrivilegeDomain; import org.springframework.http.MediaType; import org.springframework.http.ResponseEntity; import org.springframework.security.access.prepost.PostFilter; @@ -13,7 +14,6 @@ import org.springframework.web.bind.annotation.*; import lcsb.mapviewer.model.security.AccessType; import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.services.interfaces.IUserService; import lcsb.mapviewer.api.BaseController; @@ -110,9 +110,9 @@ public class OverlayController extends BaseController { Map<String, Object> overlay = overlayRestImp.addOverlay( projectId, name, description, content, fileId, filename, type, googleLicenseConsent, user); userService.grantUserPrivilege( - user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ)); + user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ)); userService.grantUserPrivilege( - user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.WRITE)); + user, new ObjectPrivilege((Integer) overlay.get("idObject"), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.WRITE)); return overlay; } @@ -124,7 +124,7 @@ public class OverlayController extends BaseController { @PathVariable(value = "projectId") String projectId, @PathVariable(value = "overlayId") String overlayId) throws QueryException, IOException { Map<String, Object> response = overlayRestImp.removeOverlay(projectId, overlayId); - userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.OVERLAY_DOMAIN_ACCESS, Integer.valueOf(overlayId)); + userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, Integer.valueOf(overlayId)); return response; } diff --git a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java index ea05828a6f..19d4d196a7 100644 --- a/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java +++ b/rest-api/src/main/java/lcsb/mapviewer/api/users/UserRestImpl.java @@ -2,7 +2,7 @@ package lcsb.mapviewer.api.users; import java.util.*; -import lcsb.mapviewer.model.security.AccessType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import lcsb.mapviewer.services.impl.Md5PasswordEncoder; import org.apache.logging.log4j.*; import org.springframework.beans.factory.annotation.Autowired; @@ -23,7 +23,6 @@ import lcsb.mapviewer.model.user.AnnotatorParamDefinition; import lcsb.mapviewer.model.user.ConfigurationOption; import lcsb.mapviewer.model.security.ObjectPrivilege; import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.model.user.UserAnnotationSchema; import lcsb.mapviewer.model.user.UserClassAnnotators; @@ -509,24 +508,24 @@ public class UserRestImpl extends BaseRestImpl { private List<Map<String, Object>> preparePrivileges(User user) { List<Map<String, Object>> result = new ArrayList<>(); - Set<PrivilegeType> definedDefaultProjectPrivilegeTypes = new LinkedHashSet<>(); + Set<PrivilegeDomain> definedDefaultProjectPrivilegeDomains = new LinkedHashSet<>(); List<Privilege> privileges = new ArrayList<>(); privileges.addAll(user.getPrivileges()); for (Privilege privilege : privileges) { if (privilege instanceof ObjectPrivilege) { - if (Project.class.equals(privilege.getPrivilegeType().getPrivilegeObjectType()) + if (Project.class.equals(privilege.getPrivilegeDomain().getPrivilegeObjectType()) && ((ObjectPrivilege) privilege).getObjectId() == null) { - definedDefaultProjectPrivilegeTypes.add(privilege.getPrivilegeType()); + definedDefaultProjectPrivilegeDomains.add(privilege.getPrivilegeDomain()); } result.add(prepareObjectPrivilege((ObjectPrivilege) privilege)); } else { result.add(preparePrivilege(privilege)); } } - for (PrivilegeType privilegeType : PrivilegeType.values()) { - if (Project.class.equals(privilegeType.getPrivilegeObjectType()) - && !definedDefaultProjectPrivilegeTypes.contains(privilegeType)) { - result.add(prepareDefaultObjectPrivilege(privilegeType)); + for (PrivilegeDomain privilegeDomain : PrivilegeDomain.values()) { + if (Project.class.equals(privilegeDomain.getPrivilegeObjectType()) + && !definedDefaultProjectPrivilegeDomains.contains(privilegeDomain)) { + result.add(prepareDefaultObjectPrivilege(privilegeDomain)); } } Map<String, Object> customLayouts = new TreeMap<>(); @@ -534,10 +533,10 @@ public class UserRestImpl extends BaseRestImpl { return result; } - private Map<String, Object> prepareDefaultObjectPrivilege(PrivilegeType privilegeType) { + private Map<String, Object> prepareDefaultObjectPrivilege(PrivilegeDomain privilegeDomain) { Map<String, Object> result = new TreeMap<>(); - result.put("type", privilegeType); - ConfigurationOption value = configurationService.getValue(privilegeType); + result.put("type", privilegeDomain); + ConfigurationOption value = configurationService.getValue(privilegeDomain); if (value == null) { result.put("value", 0); } else if (value.getValue().equalsIgnoreCase("true")) { @@ -553,7 +552,7 @@ public class UserRestImpl extends BaseRestImpl { private Map<String, Object> prepareObjectPrivilege(ObjectPrivilege privilege) { Map<String, Object> result = new TreeMap<>(); - result.put("privilegeType", privilege.getPrivilegeType()); + result.put("privilegeType", privilege.getPrivilegeDomain()); result.put("accessType", privilege.getAccessType()); result.put("objectId", privilege.getObjectId()); return result; @@ -562,7 +561,7 @@ public class UserRestImpl extends BaseRestImpl { private Map<String, Object> preparePrivilege(Privilege privilege) { Map<String, Object> result = new TreeMap<>(); if (privilege.getClass().equals(Privilege.class)) { - result.put("privilegeType", privilege.getPrivilegeType()); + result.put("privilegeType", privilege.getPrivilegeDomain()); return result; } else { throw new InvalidArgumentException("Don't know how to handle class: " + privilege.getClass()); @@ -590,10 +589,10 @@ public class UserRestImpl extends BaseRestImpl { for (String key : privilegesData.keySet()) { Object value = privilegesData.get(key); - PrivilegeType type = PrivilegeType.valueOf(key); + PrivilegeDomain type = PrivilegeDomain.valueOf(key); if (type.getPrivilegeClassType().equals(Privilege.class)) { - getUserService().grantUserPrivilege(modifiedUser, new Privilege(type)); + getUserService().grantUserPrivilege(modifiedUser, new Privilege(type, accessType)); } else if (type.getPrivilegeClassType().equals(ObjectPrivilege.class)) { if (value instanceof Map) { Map<?, ?> objects = (Map<?, ?>) value; diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java index a86d7f4df4..d05034cbbd 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/plugins/PluginRestImplTest.java @@ -4,9 +4,6 @@ import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import lcsb.mapviewer.api.RestTestFunctions; -import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; -import lcsb.mapviewer.model.user.User; public class PluginRestImplTest extends RestTestFunctions { diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java index 8408f42dde..a7e4c47115 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/projects/overlays/OverlayRestImplTest.java @@ -15,9 +15,6 @@ import lcsb.mapviewer.api.RestTestFunctions; import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.map.layout.ColorSchemaType; import lcsb.mapviewer.model.map.model.Model; -import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.persist.dao.ProjectDao; import lcsb.mapviewer.services.interfaces.IProjectService; diff --git a/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java b/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java index fef817156b..76d4a83691 100644 --- a/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java +++ b/rest-api/src/test/java/lcsb/mapviewer/api/users/UserRestImplTest.java @@ -7,7 +7,6 @@ import static org.junit.Assert.assertTrue; import static org.junit.Assert.fail; import java.io.IOException; -import java.util.HashMap; import java.util.HashSet; import java.util.Map; import java.util.Set; @@ -31,7 +30,6 @@ import lcsb.mapviewer.api.RestTestFunctions; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.model.map.MiriamType; import lcsb.mapviewer.model.user.AnnotatorParamDefinition; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.UserGuiPreference; import lcsb.mapviewer.model.user.annotator.AnnotatorConfigParameter; import lcsb.mapviewer.model.user.annotator.AnnotatorInputParameter; diff --git a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java index d84cc2ba4a..2ba11ee041 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ConfigurationService.java @@ -3,6 +3,7 @@ package lcsb.mapviewer.services.impl; import java.util.ArrayList; import java.util.List; +import lcsb.mapviewer.model.security.PrivilegeDomain; import org.apache.commons.lang3.EnumUtils; import org.apache.commons.lang3.StringUtils; import org.apache.logging.log4j.*; @@ -16,7 +17,6 @@ import lcsb.mapviewer.common.exception.InvalidArgumentException; import lcsb.mapviewer.model.user.ConfigurationElementEditType; import lcsb.mapviewer.model.user.ConfigurationElementType; import lcsb.mapviewer.model.user.ConfigurationOption; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.persist.dao.ConfigurationDao; import lcsb.mapviewer.services.interfaces.IConfigurationService; @@ -171,7 +171,7 @@ public class ConfigurationService implements IConfigurationService { } @Override - public ConfigurationOption getValue(PrivilegeType type) { + public ConfigurationOption getValue(PrivilegeDomain type) { String name = "DEFAULT_" + type.name(); if (EnumUtils.isValidEnum(ConfigurationElementType.class, name)) { return getValue(ConfigurationElementType.valueOf(name)); 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 98e9437349..b41994151b 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/LayoutService.java @@ -47,7 +47,7 @@ import lcsb.mapviewer.model.map.model.ModelSubmodelConnection; import lcsb.mapviewer.model.map.reaction.Reaction; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.persist.DbUtils; import lcsb.mapviewer.persist.dao.map.LayoutDao; @@ -135,7 +135,7 @@ public class LayoutService implements ILayoutService { email = null; } - userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.OVERLAY_DOMAIN_ACCESS, layout.getId()); + userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, layout.getId()); layout.getProject().removeLayout(layout); layoutDao.delete(layout); @@ -171,14 +171,14 @@ public class LayoutService implements ILayoutService { @Override public void grantViewAccess(Layout layout, User user) { userService.grantUserPrivilege( - user, new ObjectPrivilege(layout.getId(), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ) + user, new ObjectPrivilege(layout.getId(), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ) ); } @Override public void revokeViewAccess(Layout layout, User user) { userService.revokeUserPrivilege( - user, new ObjectPrivilege(layout.getId(), PrivilegeType.OVERLAY_DOMAIN_ACCESS, AccessType.READ) + user, new ObjectPrivilege(layout.getId(), PrivilegeDomain.OVERLAY_DOMAIN_ACCESS, AccessType.READ) ); } 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 e6fe98afc5..96fb532f10 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/ProjectService.java @@ -18,7 +18,6 @@ import java.util.concurrent.CountDownLatch; import javax.mail.MessagingException; import lcsb.mapviewer.converter.*; -import lcsb.mapviewer.model.security.AccessType; import org.apache.commons.io.FileUtils; import org.apache.logging.log4j.*; import org.hibernate.HibernateException; @@ -63,8 +62,7 @@ import lcsb.mapviewer.model.map.model.Model; import lcsb.mapviewer.model.map.model.ModelData; import lcsb.mapviewer.model.map.model.ModelSubmodelConnection; import lcsb.mapviewer.model.user.ConfigurationElementType; -import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.model.user.UserAnnotationSchema; import lcsb.mapviewer.model.user.UserClassAnnotators; @@ -311,7 +309,7 @@ public class ProjectService implements IProjectService { } } } - userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeType.PROJECT_DOMAIN_ACCESS, project.getId()); + userService.revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain.PROJECT_DOMAIN_ACCESS, project.getId()); projectDao.delete(project); if (async) { projectDao.commit(); 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 a49b2010bc..c94791ed50 100644 --- a/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java +++ b/service/src/main/java/lcsb/mapviewer/services/impl/UserService.java @@ -94,10 +94,10 @@ public class UserService implements IUserService { } @Override - public void revokeObjectDomainPrivilegesForAllUsers(PrivilegeType privilegeType, Integer objectId) { + public void revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain privilegeDomain, Integer objectId) { for (AccessType accessType : AccessType.values()) { for (User user : userDao.getAll()) { - ObjectPrivilege privilege = new ObjectPrivilege(objectId, privilegeType, accessType); + ObjectPrivilege privilege = new ObjectPrivilege(objectId, privilegeDomain, accessType); user.revokePrivilege(privilege); } } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java index e4d307c6db..60e87e3481 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IConfigurationService.java @@ -3,9 +3,9 @@ package lcsb.mapviewer.services.interfaces; import java.util.List; import lcsb.mapviewer.common.FrameworkVersion; +import lcsb.mapviewer.model.security.PrivilegeDomain; import lcsb.mapviewer.model.user.ConfigurationElementType; import lcsb.mapviewer.model.user.ConfigurationOption; -import lcsb.mapviewer.model.security.PrivilegeType; /** * Service used for accessing and modifying configuration parameters. @@ -114,5 +114,5 @@ public interface IConfigurationService { ConfigurationOption getValue(ConfigurationElementType type); - ConfigurationOption getValue(PrivilegeType type); + ConfigurationOption getValue(PrivilegeDomain type); } diff --git a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java index cacdc9c4cc..e075565611 100644 --- a/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java +++ b/service/src/main/java/lcsb/mapviewer/services/interfaces/IUserService.java @@ -6,7 +6,7 @@ import java.util.Map; import lcsb.mapviewer.commands.ColorExtractor; import lcsb.mapviewer.model.security.Privilege; -import lcsb.mapviewer.model.security.PrivilegeType; +import lcsb.mapviewer.model.security.PrivilegeDomain; import lcsb.mapviewer.model.security.RoleType; import lcsb.mapviewer.model.user.User; @@ -36,11 +36,11 @@ public interface IUserService { * When an object is deleted we have to manually remove the access rights to it for every user to avoid pollution. * Hibernate delete cascading does not work here, because security is completely decoupled from the business logic. * - * @param privilegeType The concerned privilege domain. + * @param privilegeDomain The concerned privilege domain. * @param objectId The objectId for which to remove all access rights. * */ - void revokeObjectDomainPrivilegesForAllUsers(PrivilegeType privilegeType, Integer objectId); + void revokeObjectDomainPrivilegesForAllUsers(PrivilegeDomain privilegeDomain, Integer objectId); /** * Returns {@link ColorExtractor} that transform overlay values into colors for given user. diff --git a/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java b/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java index 036178c633..7f1adb2138 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/ConfigurationServiceTest.java @@ -15,10 +15,8 @@ import org.springframework.test.annotation.Rollback; import lcsb.mapviewer.common.Configuration; import lcsb.mapviewer.common.FrameworkVersion; -import lcsb.mapviewer.model.Project; import lcsb.mapviewer.model.user.ConfigurationElementType; import lcsb.mapviewer.model.user.ConfigurationOption; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.services.ServiceTestFunctions; @Rollback(true) 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 abb718550f..96e6a7244c 100644 --- a/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java +++ b/service/src/test/java/lcsb/mapviewer/services/impl/ProjectServiceTest.java @@ -18,12 +18,10 @@ import java.util.Set; import java.util.zip.ZipEntry; import java.util.zip.ZipFile; -import lcsb.mapviewer.model.security.Privilege; import org.apache.logging.log4j.*; import org.apache.poi.util.IOUtils; import org.junit.After; import org.junit.Before; -import org.junit.Ignore; import org.junit.Test; import org.mockito.Mockito; import org.primefaces.model.TreeNode; @@ -55,9 +53,6 @@ import lcsb.mapviewer.model.map.model.SubmodelType; import lcsb.mapviewer.model.map.species.Element; import lcsb.mapviewer.model.map.species.Protein; import lcsb.mapviewer.model.user.ConfigurationElementType; -import lcsb.mapviewer.model.user.ConfigurationOption; -import lcsb.mapviewer.model.security.ObjectPrivilege; -import lcsb.mapviewer.model.security.PrivilegeType; import lcsb.mapviewer.model.user.User; import lcsb.mapviewer.model.user.UserAnnotationSchema; import lcsb.mapviewer.model.user.UserClassAnnotators; diff --git a/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java b/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java index e71b314f72..f1b774d31e 100644 --- a/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java +++ b/web/src/main/java/lcsb/mapviewer/web/config/CustomUserDetailsService.java @@ -34,10 +34,10 @@ public class CustomUserDetailsService implements UserDetailsService { List<GrantedAuthority> authorities = user.getPrivileges().stream() .map(privilege -> new SimpleGrantedAuthority(privilege.toString())) .collect(Collectors.toList()); - return org.springframework.security.core.userdetails.User.withUsername(username) + return org.springframework.security.core.userdetails.User + .withUsername(username) .password(user.getCryptedPassword()) .disabled(user.isRemoved()) - .roles(user.getRole().name()) .authorities(authorities) .build(); } -- GitLab