diff --git a/src/main/java/org/caosdb/server/CaosDBServer.java b/src/main/java/org/caosdb/server/CaosDBServer.java index b445749d68fafaeac74cc398912769acd6841a8b..f238bdd72df110db7021353272b87bd71fd8ff52 100644 --- a/src/main/java/org/caosdb/server/CaosDBServer.java +++ b/src/main/java/org/caosdb/server/CaosDBServer.java @@ -60,6 +60,8 @@ import org.caosdb.server.entity.EntityInterface; import org.caosdb.server.entity.Role; import org.caosdb.server.entity.container.Container; import org.caosdb.server.grpc.GRPCServer; +import org.caosdb.server.jobs.core.AccessControl; +import org.caosdb.server.jobs.core.CheckStateTransition; import org.caosdb.server.logging.RequestErrorLogMessage; import org.caosdb.server.resource.AuthenticationResource; import org.caosdb.server.resource.DefaultResource; @@ -81,6 +83,7 @@ import org.caosdb.server.resource.Webinterface; import org.caosdb.server.resource.WebinterfaceBuildNumber; import org.caosdb.server.resource.transaction.EntityNamesResource; import org.caosdb.server.resource.transaction.EntityResource; +import org.caosdb.server.scripting.ScriptingPermissions; import org.caosdb.server.transaction.ChecksumUpdater; import org.caosdb.server.utils.FileUtils; import org.caosdb.server.utils.Initialization; @@ -280,6 +283,13 @@ public class CaosDBServer extends Application { // init Shiro (user authentication/authorization and session management) final Ini config = getShiroConfig(); initShiro(config); + + // Init Permissions + logger.debug("Register permissions: ", ScriptingPermissions.PERMISSION_EXECUTION("*")); + logger.debug("Register permissions: ", CheckStateTransition.STATE_PERMISSIONS.toString()); + logger.debug( + "Register permissions: ", CheckStateTransition.PERMISSION_STATE_FORCE_FINAL.toString()); + logger.debug("Register permissions: ", AccessControl.TRANSACTION_PERMISSIONS.toString()); } public static Ini getShiroConfig() { diff --git a/src/main/java/org/caosdb/server/accessControl/ACMPermissions.java b/src/main/java/org/caosdb/server/accessControl/ACMPermissions.java index 264af44456586fc84e4d391047d5f9c18c8cc28a..854fc07f9ed93eda28e8aca99c1ea1983c73f4fe 100644 --- a/src/main/java/org/caosdb/server/accessControl/ACMPermissions.java +++ b/src/main/java/org/caosdb/server/accessControl/ACMPermissions.java @@ -26,9 +26,6 @@ import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Set; -import org.caosdb.server.jobs.core.AccessControl; -import org.caosdb.server.jobs.core.CheckStateTransition; -import org.caosdb.server.scripting.ScriptingPermissions; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -264,15 +261,6 @@ public class ACMPermissions implements Comparable<ACMPermissions> { return assign_role.toString(role); } - static { - // trigger adding all permissions to ALL - LOGGER.debug("Register permissions: ", ScriptingPermissions.PERMISSION_EXECUTION("*")); - LOGGER.debug("Register permissions: ", CheckStateTransition.STATE_PERMISSIONS.toString()); - LOGGER.debug( - "Register permissions: ", CheckStateTransition.PERMISSION_STATE_FORCE_FINAL.toString()); - LOGGER.debug("Register permissions: ", AccessControl.TRANSACTION_PERMISSIONS.toString()); - } - @Override public int compareTo(ACMPermissions that) { return this.toString().compareToIgnoreCase(that.toString()); diff --git a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java index dc596e50883dd5cd2210332b7cbab954a1e76c92..724dd89844097dad5bd1a6fbf2102c8f2c4ceb8c 100644 --- a/src/main/java/org/caosdb/server/jobs/core/AccessControl.java +++ b/src/main/java/org/caosdb/server/jobs/core/AccessControl.java @@ -53,6 +53,10 @@ public class AccessControl extends ContainerJob { public final String toString(String transaction, String entityRole) { return "TRANSACTION:" + transaction + (entityRole != null ? (":" + entityRole) : ""); } + + public static String init() { + return TransactionPermission.class.getSimpleName(); + } } public static final TransactionPermission TRANSACTION_PERMISSIONS = diff --git a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java index fa21ed3a72c22237b2d10a51b566e9a753f01480..a43face9ae14f3fac57890ccb8617e5637c95c16 100644 --- a/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java +++ b/src/main/java/org/caosdb/server/jobs/core/CheckStateTransition.java @@ -54,6 +54,10 @@ public class CheckStateTransition extends EntityStateJob { public final String toString(String state_model) { return toString().replace(STATE_MODEL_PARAMETER, state_model); } + + public static String init() { + return StateModelPermission.class.getSimpleName(); + } } public static final StateModelPermission PERMISSION_STATE_FORCE_FINAL = diff --git a/src/main/java/org/caosdb/server/scripting/ScriptingPermissions.java b/src/main/java/org/caosdb/server/scripting/ScriptingPermissions.java index ff596a794a6b646003422e63e86b78cf80c475c4..0af49e9faf6ec8ad9a4107d72554a44744184661 100644 --- a/src/main/java/org/caosdb/server/scripting/ScriptingPermissions.java +++ b/src/main/java/org/caosdb/server/scripting/ScriptingPermissions.java @@ -22,4 +22,8 @@ public class ScriptingPermissions extends ACMPermissions { public static final String PERMISSION_EXECUTION(final String call) { return execution.toString(call); } + + public static String init() { + return ScriptingPermissions.class.getSimpleName(); + } } diff --git a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java index c82ff76e696d73da030f6b0c1b815a0620e6e7c4..cd9c5c0841557da579c3581f876a1180ecd06f8d 100644 --- a/src/main/java/org/caosdb/server/transaction/RetrieveACL.java +++ b/src/main/java/org/caosdb/server/transaction/RetrieveACL.java @@ -24,6 +24,7 @@ package org.caosdb.server.transaction; import com.google.protobuf.ProtocolStringList; import java.util.UUID; import org.apache.shiro.SecurityUtils; +import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.database.backend.transaction.RetrieveEntityACLTransaction; import org.caosdb.server.entity.Entity; import org.caosdb.server.entity.EntityInterface; @@ -71,7 +72,7 @@ public class RetrieveACL extends Transaction<TransactionContainer> { e.setEntityACL(acl); } else if (acl != null && acl.isPermitted(getTransactor(), EntityPermission.RETRIEVE_ENTITY)) { - e.addError(org.caosdb.server.utils.ServerMessages.AUTHORIZATION_ERROR); + throw new AuthorizationException("You are not permitted to update this entity's ACL."); } else { e.addError(org.caosdb.server.utils.ServerMessages.ENTITY_DOES_NOT_EXIST); } diff --git a/src/main/java/org/caosdb/server/transaction/UpdateACL.java b/src/main/java/org/caosdb/server/transaction/UpdateACL.java index e0b0c5cf7b1d1cfd95ef48f9823e01aaae69afce..84c73080550d8899f4f1a5156bebb2a44c39df6a 100644 --- a/src/main/java/org/caosdb/server/transaction/UpdateACL.java +++ b/src/main/java/org/caosdb/server/transaction/UpdateACL.java @@ -23,6 +23,7 @@ package org.caosdb.server.transaction; import static org.caosdb.server.query.Query.clearCache; +import org.apache.shiro.authz.AuthorizationException; import org.caosdb.server.database.backend.transaction.RetrieveFullEntityTransaction; import org.caosdb.server.database.backend.transaction.UpdateEntityTransaction; import org.caosdb.server.entity.EntityInterface; @@ -88,8 +89,8 @@ public class UpdateACL extends Transaction<TransactionContainer> } else { if (!oldAcl.getPriorityEntityACL().equals(newAcl.getPriorityEntityACL()) && !oldAcl.isPermitted(getTransactor(), EntityPermission.EDIT_PRIORITY_ACL)) { - // the user is now permitted to update the prioriy acl. - result.addError(org.caosdb.server.utils.ServerMessages.AUTHORIZATION_ERROR); + throw new AuthorizationException( + "You are not permitted to change prioritized permission rules of this entity."); } // we're good to go. set new entity acl @@ -99,7 +100,8 @@ public class UpdateACL extends Transaction<TransactionContainer> } else if (oldAcl != null && oldAcl.isPermitted(getTransactor(), EntityPermission.RETRIEVE_ENTITY)) { // the user knows that this entity exists - result.addError(org.caosdb.server.utils.ServerMessages.AUTHORIZATION_ERROR); + throw new AuthorizationException( + "You are not permitted to change permission rules of this entity."); } else { // we pretend this entity doesn't exist result.addError(org.caosdb.server.utils.ServerMessages.ENTITY_DOES_NOT_EXIST);