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 aefd916be8727652c73c6dcb535086e51308346b..32becc5cceb88e2c5b84b8338bc7cfd9f4b6bc22 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 312cddd3a32579186678058c90cb73944570c368..815773a9644177cde3ad5076ca4e184b45c55d31 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 a429762d30b84df4221ac9ced1ff661231b5ad95..b2191d0a792b262f792893e01249587c4cb28d4e 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 0000000000000000000000000000000000000000..bfaa2f2b01daf97cbb21ee3039d22b569ad934fa --- /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 8e9f984b444ecbc25802cf8a726a27596e640526..0000000000000000000000000000000000000000 --- 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 6c2569f33831af66053a67304d0fb4167174b05b..b1953690ec426d0d36060274674c25a6a6e32ac2 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 d044cce5bcdf94f016ad1cbd664e4266b43f1d01..64f8433f5559dcecea76c866779458a469d45d2f 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 50bfcea41c38d602220e077a873eb2285f1a4287..92ccc55185c61ac66cae62550cf833249014670b 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 21831a69a86b42f113c4a2a0823cf9409f13b103..3dc25e4a14217a844baeafb95e415e2f3c5418a3 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 947a4ff1707bc1fffdaef97ffd54dc8c962d8ccd..74e358a5404f40f357d0a2427d75fd8c5af88c0a 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 95af7afba50ad7ca6c8019bdac5117b6f806b8d1..3e166484777a10dcc335eb6ebffc0b869f366a1e 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 860432faaf5881d2358b1624037623b5a4015cd9..ec5bee7d1d713e61c1397c7652306fce9486de9c 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 26b84213e0512ca5235b4b58c601d7a9c69a4379..7006e6adafbe82b00872245f48289dc1baafc0f2 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 057112fc32562df7404d6ce733cf128efc2a8f75..23b6daf0cf3ec2e060566940a2be1c078c5033b1 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 3b9777ef668e240a35bff4260ee94ad5edf0a7d7..db1892e08d6679544497a90475eecc7d0c433d7b 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 ea05828a6f7c8f4eef9a9fe8187edfe3f41619b9..19d4d196a78b0190080a9c4cd9cb53581d2630e6 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 a86d7f4df42f22a7c09b9f6e573a2ee8a196e286..d05034cbbd17786444e29b82456cf1c1b3b43ad2 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 8408f42ddee2b9896a1256472741121899e3b5e1..a7e4c47115630f6ef384b08328b6a897b424e92c 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 fef817156b826894ae2bdecf64f7aee22cc82b1d..76d4a836913d775b4caef41b293690839e81a95b 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 d84cc2ba4afa63101b9d94863c9d84b035f6686f..2ba11ee0411f620b07c96601ff3c3e6ae961668c 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 98e943734998520ff8952396b645e196f4478d35..b41994151bf3f9ef3eb20a0e432b72b33cb9b614 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 e6fe98afc5c42406398c94afc2c1061d366369ae..96fb532f103b05dba332b8a150ae915f2c000316 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 a49b2010bc58224f1e162d57e2b0969585772f0c..c94791ed50baa3be46111d8140520faa57c06881 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 e4d307c6dbb13dd490294d9495bacdbaaef40cc8..60e87e3481e390961f8aed97d8d723f4a953a907 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 cacdc9c4cc53bed8e3c372c3c2804aeed192d4a8..e0755656112cbfe8aa8b6801f964a8214fb04894 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 036178c6333d4855dbb25de21328b82dbcf026d5..7f1adb2138ba4d17f6c0c52ed868c2827be69827 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 abb718550fe4aedeb5e18f5db82160df1ffbec33..96e6a7244c2cd6b0e776af264f14752db6c1fa39 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 e71b314f72b039d21478a2bb739cbe2b84b8354a..f1b774d31eb6366dace1755614e75ae21ea09795 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(); }