From 41106cb13c8fb6b8c5e659b4b66f460e49dc5479 Mon Sep 17 00:00:00 2001 From: Timm Fitschen <timm.fitschen@ds.mpg.de> Date: Tue, 26 Mar 2019 16:48:23 +0100 Subject: [PATCH] ENH: Anonymous User configurable permissions --- conf/core/global_entity_permissions.xml | 10 +++++ conf/core/server.conf | 2 + conf/server.conf.template | 44 ------------------- .../java/caosdb/server/ServerProperties.java | 2 + .../caosdb/server/permissions/EntityACL.java | 44 ++++++++++++++----- .../server/permissions/EntityACLTest.java | 10 +++++ 6 files changed, 58 insertions(+), 54 deletions(-) create mode 100644 conf/core/global_entity_permissions.xml delete mode 100644 conf/server.conf.template diff --git a/conf/core/global_entity_permissions.xml b/conf/core/global_entity_permissions.xml new file mode 100644 index 00000000..3cebb79b --- /dev/null +++ b/conf/core/global_entity_permissions.xml @@ -0,0 +1,10 @@ +<globalPermissions> + <Grant priority="false" role="?OWNER?"><Permission name="*"/></Grant> + <Grant priority="false" role="?OTHER?"><Permission name="RETRIEVE:*"/></Grant> + <Grant priority="false" role="?OTHER?"><Permission name="USE:*"/></Grant> + <Grant priority="false" role="anonymous"><Permission name="RETRIEVE:*"/></Grant> + <Grant priority="false" role="anonymous"><Permission name="USE:*"/></Grant> + <Deny priority="false" role="?OTHER?"><Permission name="UPDATE:*"/></Deny> + <Deny priority="false" role="?OTHER?"><Permission name="DELETE"/></Deny> + <Deny priority="true" role="?OTHER?"><Permission name="EDIT:ACL"/></Deny> +</globalPermissions> diff --git a/conf/core/server.conf b/conf/core/server.conf index 6ef583d3..78a7605b 100644 --- a/conf/core/server.conf +++ b/conf/core/server.conf @@ -60,3 +60,5 @@ SUDO_PASSWORD= QUERY_FILTER_ENTITIES_WITHOUT_RETRIEVE_PERMISSIONS=TRUE CHECK_ENTITY_ACL_ROLES_MODE=MUST + +GLOBAL_ENTITY_PERMISSIONS_FILE=./conf/core/global_entity_permissions.xml diff --git a/conf/server.conf.template b/conf/server.conf.template deleted file mode 100644 index 44914348..00000000 --- a/conf/server.conf.template +++ /dev/null @@ -1,44 +0,0 @@ -# -# ** header v3.0 -# This file is a part of the CaosDB Project. -# -# Copyright (C) 2018 Research Group Biomedical Physics, -# Max-Planck-Institute for Dynamics and Self-Organization Göttingen -# -# This program is free software: you can redistribute it and/or modify -# it under the terms of the GNU Affero General Public License as -# published by the Free Software Foundation, either version 3 of the -# License, or (at your option) any later version. -# -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -# GNU Affero General Public License for more details. -# -# You should have received a copy of the GNU Affero General Public License -# along with this program. If not, see <https://www.gnu.org/licenses/>. -# -# ** end header -# - -# MySQL -MYSQL_USER_NAME = {mysql-user-name} -MYSQL_USER_PASSWORD = {mysql-user-password} -MYSQL_DATABASE_NAME = {mysql-database_name} -MYSQL_HOST = {mysql-host} - -# (HTTP will be redirected to HTTPS) -SERVER_PORT_HTTP = {server-port-http} -SERVER_PORT_HTTPS = {server-port-https} - -# about certificates needed for HTTPS auth -CERTIFICATES_KEY_PASSWORD = {certificates-key-password} -CERTIFICATES_KEY_STORE_PATH = {certificates-key-store-path} -CERTIFICATES_KEY_STORE_PASSWORD = {certificates-key-store-password} - -# Location of the internal file storage -FILE_SYSTEM_ROOT = {file-system-root} -DROP_OFF_BOX = {drop-off-box} -TMP_FILES = {tmp-files} - -SESSION_TIMEOUT_MS = 43200000 diff --git a/src/main/java/caosdb/server/ServerProperties.java b/src/main/java/caosdb/server/ServerProperties.java index 6dc25483..3543d9c3 100644 --- a/src/main/java/caosdb/server/ServerProperties.java +++ b/src/main/java/caosdb/server/ServerProperties.java @@ -126,6 +126,8 @@ public class ServerProperties extends Properties { public static final String KEY_CHECK_ENTITY_ACL_ROLES_MODE = "CHECK_ENTITY_ACL_ROLES_MODE"; + public static final String KEY_GLOBAL_ENTITY_PERMISSIONS_FILE = "GLOBAL_ENTITY_PERMISSIONS_FILE"; + /** * Read the config files and initialize the server properties. * diff --git a/src/main/java/caosdb/server/permissions/EntityACL.java b/src/main/java/caosdb/server/permissions/EntityACL.java index f2f89765..34ef3435 100644 --- a/src/main/java/caosdb/server/permissions/EntityACL.java +++ b/src/main/java/caosdb/server/permissions/EntityACL.java @@ -25,9 +25,13 @@ package caosdb.server.permissions; import static caosdb.server.permissions.Role.OTHER_ROLE; import static caosdb.server.permissions.Role.OWNER_ROLE; +import caosdb.server.CaosDBServer; +import caosdb.server.ServerProperties; import caosdb.server.accessControl.AuthenticationUtils; import caosdb.server.accessControl.Principal; import caosdb.server.database.exceptions.TransactionException; +import java.io.File; +import java.io.IOException; import java.util.ArrayList; import java.util.BitSet; import java.util.Collection; @@ -39,7 +43,10 @@ import java.util.Set; import org.apache.shiro.subject.Subject; import org.eclipse.jetty.util.ajax.JSON; import org.jdom2.DataConversionException; +import org.jdom2.Document; import org.jdom2.Element; +import org.jdom2.JDOMException; +import org.jdom2.input.SAXBuilder; public class EntityACL { @@ -57,16 +64,24 @@ public class EntityACL { } private static EntityACL loadGlobalPermissions() { - final EntityACLFactory f = new EntityACLFactory(); - f.grant(OWNER_ROLE, "*"); - f.grant(OTHER_ROLE, "RETRIEVE:*"); - f.grant(OTHER_ROLE, "USE:*"); - f.grant(Role.ANONYMOUS_ROLE, "RETRIEVE:*"); - f.grant(Role.ANONYMOUS_ROLE, "USE:*"); - f.deny(OTHER_ROLE, "UPDATE:*"); - f.deny(OTHER_ROLE, "DELETE"); - f.deny(OTHER_ROLE, true, "EDIT:ACL"); - return f.create(); + SAXBuilder saxBuilder = new SAXBuilder(); + File file = + new File( + CaosDBServer.getServerProperty(ServerProperties.KEY_GLOBAL_ENTITY_PERMISSIONS_FILE) + .trim()); + + try { + Document doc = saxBuilder.build(file); + Element root = doc.getRootElement(); + return parseFromElement(root); + } catch (JDOMException e) { + e.printStackTrace(); + System.exit(1); + } catch (IOException e) { + e.printStackTrace(); + System.exit(1); + } + return null; } public EntityACL(final EntityACI... aci) { @@ -262,6 +277,15 @@ public class EntityACL { return new EntityACL(priorityAcl); } + /** + * Example + * + * <p><globalPermission> <Grant priority="false" role="%OWNER%"><Permission name="*"/></Grant> + * </globalPermissions> + * + * @param e + * @return + */ public static final EntityACL parseFromElement(final Element e) { final EntityACLFactory factory = new EntityACLFactory(); diff --git a/src/test/java/caosdb/server/permissions/EntityACLTest.java b/src/test/java/caosdb/server/permissions/EntityACLTest.java index 6e99aa78..13ebb627 100644 --- a/src/test/java/caosdb/server/permissions/EntityACLTest.java +++ b/src/test/java/caosdb/server/permissions/EntityACLTest.java @@ -22,6 +22,9 @@ */ package caosdb.server.permissions; +import static org.junit.Assert.assertNotNull; + +import caosdb.server.CaosDBServer; import caosdb.server.resource.AbstractCaosDBServerResource; import caosdb.server.resource.AbstractCaosDBServerResource.XMLParser; import caosdb.server.utils.Utils; @@ -31,6 +34,7 @@ import java.util.LinkedList; import org.jdom2.Element; import org.jdom2.JDOMException; import org.junit.Assert; +import org.junit.BeforeClass; import org.junit.Test; public class EntityACLTest { @@ -43,6 +47,12 @@ public class EntityACLTest { return value; } + @BeforeClass + public static void init() throws IOException { + CaosDBServer.initServerProperties(); + assertNotNull(EntityACL.GLOBAL_PERMISSIONS); + } + @Test public void testConvert() { long l = Integer.MAX_VALUE; -- GitLab