From 78081efa7c1a882e504a508d685678b3dff0c04c Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Mon, 20 Apr 2020 11:03:28 +0200 Subject: [PATCH 1/2] DBT-326 add DBTStrategy and SOLR configuration --- .../dbt/authorization/DBTStrategy.java | 66 +++++++++++++++++++ .../resources/config/dbt/mycore.properties | 9 +++ .../config/dbt/solr/main/solr-schema.json | 6 ++ src/main/resources/xsl/dbt-solr.xsl | 17 +++++ 4 files changed, 98 insertions(+) create mode 100644 src/main/java/de/urmel_dl/dbt/authorization/DBTStrategy.java create mode 100644 src/main/resources/xsl/dbt-solr.xsl diff --git a/src/main/java/de/urmel_dl/dbt/authorization/DBTStrategy.java b/src/main/java/de/urmel_dl/dbt/authorization/DBTStrategy.java new file mode 100644 index 00000000..aa9b0a7a --- /dev/null +++ b/src/main/java/de/urmel_dl/dbt/authorization/DBTStrategy.java @@ -0,0 +1,66 @@ +package de.urmel_dl.dbt.authorization; + +import java.util.concurrent.ExecutionException; +import java.util.concurrent.TimeUnit; + +import org.apache.logging.log4j.LogManager; +import org.apache.logging.log4j.Logger; +import org.mycore.common.MCRSessionMgr; +import org.mycore.common.MCRUserInformation; +import org.mycore.common.config.MCRConfiguration2; +import org.mycore.datamodel.common.MCRCreatorCache; +import org.mycore.datamodel.metadata.MCRMetadataManager; +import org.mycore.datamodel.metadata.MCRObject; +import org.mycore.datamodel.metadata.MCRObjectID; +import org.mycore.mir.authorization.MIRStrategy; + +public class DBTStrategy extends MIRStrategy { + private static Logger LOGGER = LogManager.getLogger(); + + private static final String FLAG_TYPE = "dbt-dini"; + + private static final String FLAG_VALUE = "exclude"; + + private static final String CREATOR_ROLE = MCRConfiguration2.getString("MCR.Access.Strategy.CreatorRole") + .orElse("submitter"); + + @Override + public boolean checkPermission(String id, String permission) { + final boolean hasPermission = super.checkPermission(id, permission); + return hasPermission || checkPermissionForNonDINI(id, permission); + } + + private boolean checkPermissionForNonDINI(String id, String permission) { + if (!MCRObjectID.isValid(id)) { + return false; + } + final MCRObjectID mcrId = MCRObjectID.getInstance(id); + MCRUserInformation currentUser = MCRSessionMgr.getCurrentSession().getUserInformation(); + return currentUser.isUserInRole(CREATOR_ROLE) && isCurrentUserCreator(mcrId, currentUser) + && isNonDINIDocument(mcrId); + + } + + private static boolean isCurrentUserCreator(MCRObjectID mcrId, MCRUserInformation currentUser) { + try { + String creator = MCRCreatorCache.getCreator(mcrId); + return currentUser.getUserID().equals(creator); + } catch (ExecutionException e) { + LOGGER.error("Error while getting creator information.", e); + return false; + } + } + + private static boolean isNonDINIDocument(MCRObjectID mcrId) { + MCRObjectID objectID = "derivate".equals(mcrId.getTypeId()) + ? MCRMetadataManager.getObjectId(mcrId, 1, TimeUnit.DAYS) + : mcrId; + if (objectID == null) { + LOGGER.error("Could not find object id to {}.", mcrId); + return false; + } + final MCRObject obj = MCRMetadataManager.retrieveMCRObject(objectID); + return obj.getService().getFlags(FLAG_TYPE).contains(FLAG_VALUE); + } + +} diff --git a/src/main/resources/config/dbt/mycore.properties b/src/main/resources/config/dbt/mycore.properties index b4b5c7e8..3c1e1891 100644 --- a/src/main/resources/config/dbt/mycore.properties +++ b/src/main/resources/config/dbt/mycore.properties @@ -270,3 +270,12 @@ MCR.Access.Strategy.SubmittedCategory=%MCR.Access.Strategy.SubmittedCategory%,st MCR.ContentTransformer.deepgreenjats2mods.Class=org.mycore.common.content.transformer.MCRXSLTransformer MCR.ContentTransformer.deepgreenjats2mods.Stylesheet=xsl/sword/jats2mods.xsl + +###################################################################### +# Digital Summer Semester 2020 DBT-326 +###################################################################### +MCR.OAIDataProvider.OAI2.Search.Restriction=+objectType\:mods -dbt.dini\:exclude +MCR.Access.Strategy.Class=de.urmel_dl.dbt.authorization.DBTStrategy +MIR.AccessKeyStrategy.FallbackClass=de.urmel_dl.dbt.authorization.DBTStrategy +MIR.OwnerStrategy.FallbackClass=de.urmel_dl.dbt.authorization.DBTStrategy +MCR.URIResolver.xslImports.solr-document=%MCR.URIResolver.xslImports.solr-document%,dbt-solr.xsl diff --git a/src/main/resources/config/dbt/solr/main/solr-schema.json b/src/main/resources/config/dbt/solr/main/solr-schema.json index 035b026d..61bcf482 100644 --- a/src/main/resources/config/dbt/solr/main/solr-schema.json +++ b/src/main/resources/config/dbt/solr/main/solr-schema.json @@ -48,5 +48,11 @@ "name": "slotId", "type": "string" } + }, + { + "add-field": { + "name": "dbt.dini", + "type": "string" + } } ] diff --git a/src/main/resources/xsl/dbt-solr.xsl b/src/main/resources/xsl/dbt-solr.xsl new file mode 100644 index 00000000..81270582 --- /dev/null +++ b/src/main/resources/xsl/dbt-solr.xsl @@ -0,0 +1,17 @@ + + + + + + + + + + + + + + + + + From 08da1aa1fc9009e1989d7f99a9f4fa2f6b971745 Mon Sep 17 00:00:00 2001 From: Thomas Scheffler Date: Tue, 21 Apr 2020 12:37:45 +0200 Subject: [PATCH 2/2] DBT-326 add support for DBTStrategy in editor forms --- .../META-INF/resources/editor/editor-dbt.xed | 24 ++++++++++++++++++- .../config/dbt/messages_de.properties | 2 ++ .../config/dbt/messages_en.properties | 2 ++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/main/resources/META-INF/resources/editor/editor-dbt.xed b/src/main/resources/META-INF/resources/editor/editor-dbt.xed index 60aab2a6..59c474e9 100644 --- a/src/main/resources/META-INF/resources/editor/editor-dbt.xed +++ b/src/main/resources/META-INF/resources/editor/editor-dbt.xed @@ -69,7 +69,7 @@ @@ -80,4 +80,26 @@ + + +
+ +
+ +
+
+ + + +
+
+
+
+ + + + diff --git a/src/main/resources/config/dbt/messages_de.properties b/src/main/resources/config/dbt/messages_de.properties index a55a5f24..57c15245 100644 --- a/src/main/resources/config/dbt/messages_de.properties +++ b/src/main/resources/config/dbt/messages_de.properties @@ -193,6 +193,8 @@ editor.contract.disagree = Ich lehne ab editor.contract.publish = D\u00FCrfen wir ver\u00F6ffentlichen? editor.contract.text = Ich habe den Ver\u00F6ffentlichungsvertrag gelesen und stimme ihm zu. Insbesondere versichere ich, dass mit der Bereitstellung dieses Werkes keine Rechte Dritter, insbesondere aus dem geltenden Urheberrecht, verletzt werden. editor.contract.validation = Bitte stimmen Sie der Ver\u00F6ffentlichung zu. +editor.diniExclude = Kurzzeit-Dokument "Digitales\u00A0SoSe\u00A02020" +editor.diniExclude.help = Wenn die Auswahlbox gew\u00E4hlt wird, ist dieses Dokument vom urspr\u00FCnglichen Einsender auch im Status "ver\u00F6ffentlicht" noch \u00E4nder- und l\u00F6schbar. Es bekommt keinen persistenten Identifikator und ist nicht \u00FCber OAI sichtbar. editor.oai = OAI Freigabe editor.oai.help = W\u00E4hlen Sie hier aus f\u00FCr wenn das Dokument in der OAI Schnittstelle freigegeben werden soll. diff --git a/src/main/resources/config/dbt/messages_en.properties b/src/main/resources/config/dbt/messages_en.properties index 4f2d3663..e52af530 100644 --- a/src/main/resources/config/dbt/messages_en.properties +++ b/src/main/resources/config/dbt/messages_en.properties @@ -191,6 +191,8 @@ editor.contract.disagree = I disagree editor.contract.publish = May we publish? editor.contract.text = I have read the publication contract (in German only) and I agree. In particular, I assure that the provision of this work does not infringe any rights of third parties, in particular under applicable copyright laws. editor.contract.validation = Please agree to the publication contract. +editor.diniExclude = Short-living document "digital\u00A0summer\u00A0semester\u00A02020" +editor.diniExclude.help = If checkbox is selected the document can still be changed and deleted by the original submitter, if the stat is published. The document will not be visible by OAI and will not get a persistent identifier. editor.oai = OAI enabling editor.oai.help = Chose who can access the document over the OAI interface.