diff --git a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java index dcaaa49a19d1ea99f9fc7e6e0a78ea5cb579d9ed..158c13ada874be8b571f5a0e7d138b05f4ca38c7 100644 --- a/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java +++ b/src/main/java/org/olat/core/commons/editor/fileeditor/FileEditor.java @@ -31,6 +31,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSLeaf; import org.olat.core.util.vfs.VFSLockApplicationType; @@ -74,6 +75,11 @@ public class FileEditor implements DocEditor { return false; } + @Override + public boolean isEnabledFor(Identity identity, Roles roles) { + return true; + } + @Override public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { // Both the HTML editor and the text editor supports view and edit diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java index a092b8770562219b4aeccaff168b991d44f95f45..1fb3f85cf19d8901a07f5342c76fd3a20b9c2c89 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdCreateFile.java @@ -48,6 +48,7 @@ import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.control.generic.closablewrapper.CloseableModalController; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; import org.olat.core.logging.AssertException; import org.olat.core.util.FileUtils; import org.olat.core.util.WebappHelper; @@ -102,7 +103,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand { } boolean hasMeta = folderComponent.getCurrentContainer().canMeta() == VFSConstants.YES; - DocTemplates docTemplates = DocTemplates.editables(getLocale(), hasMeta).build(); + Identity identity = getIdentity(); + DocTemplates docTemplates = DocTemplates.editables(identity, ureq.getUserSession().getRoles(), getLocale(), hasMeta).build(); createCtrl = new CreateDocumentController(ureq, wControl, folderComponent.getCurrentContainer(), docTemplates); listenTo(createCtrl); @@ -157,7 +159,8 @@ public class CmdCreateFile extends BasicController implements FolderCommand { boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES; String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); - List<DocEditor> editors = docEditorService.getEditors(suffix, DocEditor.Mode.EDIT, hasMeta); + List<DocEditor> editors = docEditorService.getEditors(getIdentity(), ureq.getUserSession().getRoles(), suffix, + DocEditor.Mode.EDIT, hasMeta); // Not able to decide which editor to use -> show the folder list if (editors.size() != 1) { fireEvent(ureq, new FolderEvent(FolderEvent.NEW_FILE_EVENT, fileName)); diff --git a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java index 07158e2dc571320520d827c4a8cd43d4491fac15..0cb04de0d3a081b48ed530c2903ce41763b6f085 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java +++ b/src/main/java/org/olat/core/commons/modules/bc/commands/CmdOpenContent.java @@ -107,7 +107,7 @@ public class CmdOpenContent extends BasicController implements FolderCommand { VFSLeaf vfsLeaf = (VFSLeaf) currentItem; - DocEditorSecurityCallback secCallback = getDocEditorSecCallback(vfsLeaf); + DocEditorSecurityCallback secCallback = getDocEditorSecCallback(ureq, vfsLeaf); HTMLEditorConfig htmlEditorConfig = getHtmlEditorConfig(vfsLeaf); DocEditorConfigs configs = DocEditorConfigs.builder() .addConfig(htmlEditorConfig) @@ -122,7 +122,7 @@ public class CmdOpenContent extends BasicController implements FolderCommand { return this; } - private DocEditorSecurityCallback getDocEditorSecCallback(VFSLeaf vfsLeaf) { + private DocEditorSecurityCallback getDocEditorSecCallback(UserRequest ureq, VFSLeaf vfsLeaf) { VFSContainer currentContainer = folderComponent.getCurrentContainer(); boolean hasMeta = currentContainer.canMeta() == VFSConstants.YES; VFSContainer container = VFSManager.findInheritingSecurityCallbackContainer(currentContainer); @@ -131,15 +131,15 @@ public class CmdOpenContent extends BasicController implements FolderCommand { DocEditorSecurityCallbackBuilder secCallbackBuilder = DocEditorSecurityCallbackBuilder.builder() .withVersionControlled(true) .withHasMeta(hasMeta); - DocEditor.Mode mode = getMode(vfsLeaf, canWrite, secCallbackBuilder); + DocEditor.Mode mode = getMode(ureq, vfsLeaf, canWrite, secCallbackBuilder); secCallbackBuilder.withMode(mode); return secCallbackBuilder.build(); } - private DocEditor.Mode getMode(VFSLeaf vfsLeaf, boolean canWrite, DocEditorSecurityCallbackBuilder secCallbackBuilder) { + private DocEditor.Mode getMode(UserRequest ureq, VFSLeaf vfsLeaf, boolean canWrite, DocEditorSecurityCallbackBuilder secCallbackBuilder) { if (canWrite) { DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(DocEditor.Mode.EDIT).build(); - if (docEditorService.hasEditor(vfsLeaf, getIdentity(), editSecCallback)) { + if (docEditorService.hasEditor(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, editSecCallback)) { return DocEditor.Mode.EDIT; } } diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java index 601a38412857d4beaea52a608ae73c8ef5628c19..82acd484c3c06267ad4f277ce419acb54046ec35 100644 --- a/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java +++ b/src/main/java/org/olat/core/commons/modules/bc/components/ListRenderer.java @@ -33,6 +33,7 @@ import java.util.List; import java.util.Map; import java.util.stream.Collectors; +import org.apache.logging.log4j.Logger; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.modules.bc.FileSelection; import org.olat.core.commons.modules.bc.FolderLicenseHandler; @@ -55,7 +56,7 @@ import org.olat.core.gui.render.URLBuilder; import org.olat.core.gui.translator.Translator; import org.olat.core.gui.util.CSSHelper; import org.olat.core.id.Identity; -import org.apache.logging.log4j.Logger; +import org.olat.core.id.Roles; import org.olat.core.logging.Tracing; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; @@ -449,7 +450,8 @@ public class ListRenderer { // open if (!xssErrors) { Identity identity = fc.getIdentityEnvironnement().getIdentity(); - String openIcon = getOpenIconCss(child, canWrite, identity); + Roles roles = fc.getIdentityEnvironnement().getRoles(); + String openIcon = getOpenIconCss(child, canWrite, identity, roles); if (openIcon != null) { sb.append("<a "); ubu.buildHrefAndOnclick(sb, null, iframePostEnabled, false, false, @@ -512,7 +514,7 @@ public class ListRenderer { sb.append("</td></tr>"); } - private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity) { + private String getOpenIconCss(VFSItem child, boolean canWrite, Identity identity, Roles roles) { if (child instanceof VFSLeaf) { VFSLeaf vfsLeaf = (VFSLeaf) child; boolean hasMeta = vfsLeaf.canMeta() == VFSConstants.YES; @@ -521,9 +523,9 @@ public class ListRenderer { .withHasMeta(hasMeta); DocEditorSecurityCallback editSecCallback = secCallbackBuilder.withMode(Mode.EDIT).build(); DocEditorSecurityCallback viewSecCallback = secCallbackBuilder.withMode(Mode.VIEW).build(); - if (canWrite && docEditorService.hasEditor(vfsLeaf, identity, editSecCallback)) { + if (canWrite && docEditorService.hasEditor(identity, roles, vfsLeaf, editSecCallback)) { return "o_icon_edit"; - } else if (docEditorService.hasEditor(vfsLeaf, identity, viewSecCallback)) { + } else if (docEditorService.hasEditor(identity, roles, vfsLeaf, viewSecCallback)) { return "o_icon_preview"; } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java index 7da27a52bade8253e2a0f2a1c7c92a5848dc27de..59784e083c947eeb5eca98b6170eaf2d59e7b806 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditor.java @@ -25,6 +25,7 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.vfs.VFSLeaf; /** @@ -45,6 +46,15 @@ public interface DocEditor { boolean isDataTransferConfirmationEnabled(); + /** + * Indicates whether a specific identity with specific roles is permitted to use the editor. + * + * @param identity + * @param roles + * @return + */ + boolean isEnabledFor(Identity identity, Roles roles); + /** * Indicates whether the editor supports the format with that suffix in the appropriate mode. * @@ -68,5 +78,4 @@ public interface DocEditor { Controller getRunController(UserRequest ureq, WindowControl wControl, Identity identity, VFSLeaf vfsLeaf, DocEditorSecurityCallback securityCallback, DocEditorConfigs configs); - } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java index 73436de8f8cb61525191b6a8918fc6312bc6e828..7fb17ef2f1c847e37ffd0c8c199ac0b1271f1080 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocEditorIdentityService.java @@ -48,4 +48,6 @@ public interface DocEditorIdentityService { public String getUserDisplayName(Identity identity); + public boolean isCoach(Identity identity); + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java index be40c55a462ccf6f6ee6e421da06dd380a39ab8a..72f953243ad7e010b26c71d7c232fda4552669f0 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocTemplates.java @@ -32,6 +32,8 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.doceditor.ui.CreateDocumentController; import org.olat.core.gui.translator.Translator; +import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.Util; /** @@ -56,27 +58,27 @@ public class DocTemplates { return docTemplates.isEmpty(); } - public static Builder editables(Locale locale, boolean hasMeta) { + public static Builder editables(Identity identity, Roles roles, Locale locale, boolean hasMeta) { Builder builder = new Builder(locale); DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); - if (docEditorService.hasEditor("txt", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "txt", EDIT, hasMeta)) { builder.addTxt(); } - if (docEditorService.hasEditor("html", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "html", EDIT, hasMeta)) { builder.addHtml(); } - if (docEditorService.hasEditor("css", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "css", EDIT, hasMeta)) { builder.addCss(); } - if (docEditorService.hasEditor("docx", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "docx", EDIT, hasMeta)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, hasMeta)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT, hasMeta)) { + if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, hasMeta)) { builder.addPptx(); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java index 0780c89a4c63d02a11df264b34ac4544460d134e..9ab921c30f7cdacc1f7ecb2f5c663df439752ec8 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/DocumentEditorService.java @@ -24,6 +24,7 @@ import java.util.Optional; import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.vfs.VFSLeaf; /** @@ -36,23 +37,26 @@ public interface DocumentEditorService { /** * Check if file with a specific suffix is supported by any enabled editor. - * + * @param identity + * @param roles * @param suffix * @param mode * @param hasMeta * @return */ - public boolean hasEditor(String suffix, Mode mode, boolean hasMeta); + public boolean hasEditor(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta); /** * Get all enabled editors which support a file with a specific suffix. - * + * @param identity + * @param roles * @param suffix * @param mode * @param hasMeta + * * @return */ - public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta); + public List<DocEditor> getEditors(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta); /** * Get the editor of a specific type. @@ -66,12 +70,14 @@ public interface DocumentEditorService { * Checks whether a vfsLeaf can be opened in any editor by a user and in a * specific mode. This method checks not only if a file format is supported but * also e.g. if the vfsLeaf is not locked by an other editor or user. - * - * @param vfsLeaf + * * @param identity + * @param roles + * @param vfsLeaf * @param secCallback + * * @return */ - public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, DocEditorSecurityCallback secCallback); + public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback); } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java index 77234b93123e837c886fae68cd31e1415c6734e7..6650938c40e7afe4bf6ae384f1d957c62fea3b74 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraEditor.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditorConfigs; +import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.collabora.ui.CollaboraEditorController; import org.olat.core.gui.UserRequest; @@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSLeaf; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +50,8 @@ public class CollaboraEditor implements DocEditor { private CollaboraModule collaboraModule; @Autowired private CollaboraService collaboraService; + @Autowired + private DocEditorIdentityService identityService; @Override public boolean isEnable() { @@ -70,6 +74,18 @@ public class CollaboraEditor implements DocEditor { return collaboraModule.isDataTransferConfirmationEnabled(); } + @Override + public boolean isEnabledFor(Identity identity, Roles roles) { + if (collaboraModule.isUsageRestricted()) { + if (roles.isAdministrator()) return true; + if (collaboraModule.isUsageRestrictedToAuthors() && roles.isAuthor()) return true; + if (collaboraModule.isUsageRestrictedToManagers() && roles.isManager()) return true; + if (collaboraModule.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true; + return false; + } + return true; + } + @Override public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { return hasMeta && collaboraService.accepts(suffix, mode); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java index 6f479fc88ed0c66a61bab069a6f7f5df978dacc0..3553e7e4cb7afdec7489ed533b8255413a3758d4 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/CollaboraModule.java @@ -39,6 +39,10 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff private static final String COLLABORA_ENABLED = "collabora.enabled"; private static final String COLLABORA_BASE_URL = "collabora.baseUrl"; private static final String COLLABORA_DATA_TRANSER_CONFIRMATION_ENABLED = "collabora.data.transfer.confirmation.enabled"; + private static final String COLLABORA_USAGE_RESTRICTED = "collabora.usage.restricted"; + private static final String COLLABORA_USAGE_AUTHORS = "collabora.usage.authors"; + private static final String COLLABORA_USAGE_COACHES = "collabora.usage.coaches"; + private static final String COLLABORA_USAGE_MANAGERS = "collabora.usage.managers"; @Value("${collabora.enabled:false}") private boolean enabled; @@ -46,6 +50,14 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff private String baseUrl; @Value("${collabora.data.transfer.confirmation.enabled:false}") private boolean dataTransferConfirmationEnabled; + @Value("${collabora.usage.restricted:false}") + private boolean usageRestricted; + @Value("${collabora.usage.restricted.authors:false}") + private boolean usageRestrictedToAuthors; + @Value("${collabora.usage.restricted.coaches:false}") + private boolean usageRestrictedToCoaches; + @Value("${collabora.usage.restricted.managers:false}") + private boolean usageRestrictedToManagers; @Autowired private CollaboraModule(CoordinatorManager coordinateManager) { @@ -77,6 +89,26 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) { dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj); } + + String usageRestrictedObj = getStringPropertyValue(COLLABORA_USAGE_RESTRICTED, true); + if(StringHelper.containsNonWhitespace(usageRestrictedObj)) { + usageRestricted = "true".equals(usageRestrictedObj); + } + + String usageRestrictedToAuthorsObj = getStringPropertyValue(COLLABORA_USAGE_AUTHORS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) { + usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj); + } + + String usageRestrictedToCoachesObj = getStringPropertyValue(COLLABORA_USAGE_COACHES, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) { + usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj); + } + + String usageRestrictedToManagersObj = getStringPropertyValue(COLLABORA_USAGE_MANAGERS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) { + usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj); + } } @Override @@ -106,4 +138,41 @@ public class CollaboraModule extends AbstractSpringModule implements ConfigOnOff this.dataTransferConfirmationEnabled = dataTransferConfirmationEnabled; setStringProperty(COLLABORA_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true); } + + public boolean isUsageRestricted() { + return usageRestricted; + } + + public void setUsageRestricted(boolean usageRestricted) { + this.usageRestricted = usageRestricted; + setStringProperty(COLLABORA_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true); + } + + public boolean isUsageRestrictedToAuthors() { + return usageRestrictedToAuthors; + } + + public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) { + this.usageRestrictedToAuthors = usageRestrictedToAuthors; + setStringProperty(COLLABORA_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true); + } + + public boolean isUsageRestrictedToCoaches() { + return usageRestrictedToCoaches; + } + + public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) { + this.usageRestrictedToCoaches = usageRestrictedToCoaches; + setStringProperty(COLLABORA_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true); + } + + public boolean isUsageRestrictedToManagers() { + return usageRestrictedToManagers; + } + + public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) { + this.usageRestrictedToManagers = usageRestrictedToManagers; + setStringProperty(COLLABORA_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true); + } + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java index fbd34b6a18eb7f39aa2e7b3589d80a2ca1910b09..9ac9bbaa41c7a6f2bfa8429ffe80aa00d544ee0c 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/collabora/ui/CollaboraAdminController.java @@ -21,8 +21,11 @@ package org.olat.core.commons.services.doceditor.collabora.ui; import static org.olat.core.commons.services.doceditor.collabora.CollaboraService.REFRESH_EVENT_ORES; import static org.olat.core.commons.services.doceditor.collabora.ui.CollaboraUIFactory.validateIsMandatory; +import static org.olat.core.gui.components.util.KeyValues.entry; import static org.olat.core.gui.translator.TranslatorHelper.translateAll; +import java.util.Collection; + import org.apache.logging.log4j.Logger; import org.olat.core.commons.services.doceditor.collabora.CollaboraModule; import org.olat.core.commons.services.doceditor.collabora.CollaboraRefreshDiscoveryEvent; @@ -39,6 +42,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.util.KeyValues; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.helpers.Settings; @@ -58,12 +62,17 @@ public class CollaboraAdminController extends FormBasicController { private static final Logger log = Tracing.createLoggerFor(CollaboraAdminController.class); private static final String[] ENABLED_KEYS = new String[]{"on"}; + private static final String USAGE_AUTHOR = "author"; + private static final String USAGE_COACH = "coach"; + private static final String USAGE_MANAGERS = "managers"; private MultipleSelectionElement enabledEl; private TextElement baseUrlEl; private FormLink refreshDiscoveryLink; private FormLink testLink; private MultipleSelectionElement dataTransferConfirmationEnabledEl; + private MultipleSelectionElement usageRestrictedEl; + private MultipleSelectionElement usageRolesEl; @Autowired private CollaboraModule collaboraModule; @@ -96,6 +105,22 @@ public class CollaboraAdminController extends FormBasicController { translateAll(getTranslator(), ENABLED_KEYS)); dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], collaboraModule.isDataTransferConfirmationEnabled()); + usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS, + translateAll(getTranslator(), ENABLED_KEYS)); + usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null); + usageRestrictedEl.select(ENABLED_KEYS[0], collaboraModule.isUsageRestricted()); + usageRestrictedEl.addActionListener(FormEvent.ONCHANGE); + + KeyValues usageRolesKV = new KeyValues(); + usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author"))); + usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach"))); + usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers"))); + usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1); + usageRolesEl.select(USAGE_AUTHOR, collaboraModule.isUsageRestrictedToAuthors()); + usageRolesEl.select(USAGE_COACH, collaboraModule.isUsageRestrictedToCoaches()); + usageRolesEl.select(USAGE_MANAGERS, collaboraModule.isUsageRestrictedToManagers()); + updateUsageUI(); + if (Settings.isDebuging()) { testLink = uifactory.addFormLink("admin.test", formLayout, Link.BUTTON); } @@ -109,12 +134,19 @@ public class CollaboraAdminController extends FormBasicController { protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == refreshDiscoveryLink) { doRefreshDiscovery(); + } else if (source == usageRestrictedEl) { + updateUsageUI(); } else if (source == testLink) { doTest(); } super.formInnerEvent(ureq, source, event); } + private void updateUsageUI() { + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + usageRolesEl.setVisible(usageRestricted); + } + @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; @@ -141,6 +173,14 @@ public class CollaboraAdminController extends FormBasicController { boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1); collaboraModule.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled); + + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + collaboraModule.setUsageRestricted(usageRestricted); + + Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys(); + collaboraModule.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR)); + collaboraModule.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH)); + collaboraModule.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS)); } @Override diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java index 5535c39e60da1d8334ba986c6169a00508168155..fad7a80c216783c022929842ab2de66e4d947f75 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocEditorIdentityServiceImpl.java @@ -19,8 +19,13 @@ */ package org.olat.core.commons.services.doceditor.manager; +import java.util.Collections; +import java.util.List; + import org.apache.logging.log4j.Logger; import org.olat.basesecurity.BaseSecurityManager; +import org.olat.basesecurity.GroupRoles; +import org.olat.basesecurity.SearchIdentityParams; import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.id.Identity; import org.olat.core.logging.Tracing; @@ -70,4 +75,13 @@ public class DocEditorIdentityServiceImpl implements DocEditorIdentityService { return userManager.getUserDisplayName(identity); } + @Override + public boolean isCoach(Identity identity) { + SearchIdentityParams params = new SearchIdentityParams(); + params.setIdentityKeys(Collections.singletonList(identity.getKey())); + params.setRepositoryEntryRole(GroupRoles.coach); + List<Identity> identities = securityManager.getIdentitiesByPowerSearch(params , 0, 1); + return !identities.isEmpty(); + } + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java index 2078998887a292470146799df80f617450a3969d..9d6664523ee7104254834e379592c3632d00fbf6 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/manager/DocumentEditorServiceImpl.java @@ -28,6 +28,7 @@ import org.olat.core.commons.services.doceditor.DocEditor.Mode; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.FileUtils; import org.olat.core.util.vfs.VFSLeaf; import org.springframework.beans.factory.annotation.Autowired; @@ -46,20 +47,22 @@ public class DocumentEditorServiceImpl implements DocumentEditorService { private List<DocEditor> editors; @Override - public boolean hasEditor(String suffix, Mode mode, boolean hasMeta) { + public boolean hasEditor(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta) { if (mode == null) return false; return editors.stream() .filter(DocEditor::isEnable) + .filter(editor -> editor.isEnabledFor(identity, roles)) .filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta)) .findFirst() .isPresent(); } @Override - public List<DocEditor> getEditors(String suffix, Mode mode, boolean hasMeta) { + public List<DocEditor> getEditors(Identity identity, Roles roles, String suffix, Mode mode, boolean hasMeta) { return editors.stream() .filter(DocEditor::isEnable) + .filter(editor -> editor.isEnabledFor(identity, roles)) .filter(editor -> editor.isSupportingFormat(suffix, mode, hasMeta)) .collect(Collectors.toList()); } @@ -73,14 +76,17 @@ public class DocumentEditorServiceImpl implements DocumentEditorService { } @Override - public boolean hasEditor(VFSLeaf vfsLeaf, Identity identity, DocEditorSecurityCallback secCallback) { + public boolean hasEditor(Identity identity, Roles roles, VFSLeaf vfsLeaf, DocEditorSecurityCallback secCallback) { String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); return editors.stream() .filter(DocEditor::isEnable) + .filter(editor -> editor.isEnabledFor(identity, roles)) .filter(editor -> editor.isSupportingFormat(suffix, secCallback.getMode(), secCallback.hasMeta())) .filter(editor -> !editor.isLockedForMe(vfsLeaf, identity, secCallback.getMode())) .findFirst() .isPresent(); } + + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java index 56adbb767f7b4f66323e52980c44d87086683e96..69c031678be952bdceb794ea5c217bdea909b494 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Editor.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditorConfigs; +import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.office365.ui.Office365EditorController; import org.olat.core.gui.UserRequest; @@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSLeaf; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +50,8 @@ public class Office365Editor implements DocEditor { private Office365Module office365Module; @Autowired private Office365Service office365Service; + @Autowired + private DocEditorIdentityService identityService; @Override public boolean isEnable() { @@ -70,6 +74,18 @@ public class Office365Editor implements DocEditor { return office365Module.isDataTransferConfirmationEnabled(); } + @Override + public boolean isEnabledFor(Identity identity, Roles roles) { + if (office365Module.isUsageRestricted()) { + if (roles.isAdministrator()) return true; + if (office365Module.isUsageRestrictedToAuthors() && roles.isAuthor()) return true; + if (office365Module.isUsageRestrictedToManagers() && roles.isManager()) return true; + if (office365Module.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true; + return false; + } + return true; + } + @Override public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { return hasMeta && office365Service.isSupportingFormat(suffix, mode); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java index ff547027a9b540d1adc737f097a4535f0af081d8..bb62ef740c29ac96ca307404c6500b55e6678df5 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/Office365Module.java @@ -39,6 +39,10 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff private static final String OFFICE365_ENABLED = "office365.enabled"; private static final String OFFICE365_BASE_URL = "office365.baseUrl"; private static final String OFFICE365_DATA_TRANSER_CONFIRMATION_ENABLED = "office365.data.transfer.confirmation.enabled"; + private static final String OFFICE365_USAGE_RESTRICTED = "office365.usage.restricted"; + private static final String OFFICE365_USAGE_AUTHORS = "office365.usage.authors"; + private static final String OFFICE365_USAGE_COACHES = "office365.usage.coaches"; + private static final String OFFICE365_USAGE_MANAGERS = "office365.usage.managers"; @Value("${office365.enabled:false}") private boolean enabled; @@ -46,6 +50,14 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff private String baseUrl; @Value("${office365.data.transfer.confirmation.enabled:false}") private boolean dataTransferConfirmationEnabled; + @Value("${office365.usage.restricted:false}") + private boolean usageRestricted; + @Value("${office365.usage.restricted.authors:false}") + private boolean usageRestrictedToAuthors; + @Value("${office365.usage.restricted.coaches:false}") + private boolean usageRestrictedToCoaches; + @Value("${office365.usage.restricted.managers:false}") + private boolean usageRestrictedToManagers; @Autowired private Office365Module(CoordinatorManager coordinateManager) { @@ -77,6 +89,26 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) { dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj); } + + String usageRestrictedObj = getStringPropertyValue(OFFICE365_USAGE_RESTRICTED, true); + if(StringHelper.containsNonWhitespace(usageRestrictedObj)) { + usageRestricted = "true".equals(usageRestrictedObj); + } + + String usageRestrictedToAuthorsObj = getStringPropertyValue(OFFICE365_USAGE_AUTHORS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) { + usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj); + } + + String usageRestrictedToCoachesObj = getStringPropertyValue(OFFICE365_USAGE_COACHES, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) { + usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj); + } + + String usageRestrictedToManagersObj = getStringPropertyValue(OFFICE365_USAGE_MANAGERS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) { + usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj); + } } @Override @@ -106,4 +138,40 @@ public class Office365Module extends AbstractSpringModule implements ConfigOnOff this.dataTransferConfirmationEnabled = dataTransferConfirmationEnabled; setStringProperty(OFFICE365_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true); } + + public boolean isUsageRestricted() { + return usageRestricted; + } + + public void setUsageRestricted(boolean usageRestricted) { + this.usageRestricted = usageRestricted; + setStringProperty(OFFICE365_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true); + } + + public boolean isUsageRestrictedToAuthors() { + return usageRestrictedToAuthors; + } + + public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) { + this.usageRestrictedToAuthors = usageRestrictedToAuthors; + setStringProperty(OFFICE365_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true); + } + + public boolean isUsageRestrictedToCoaches() { + return usageRestrictedToCoaches; + } + + public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) { + this.usageRestrictedToCoaches = usageRestrictedToCoaches; + setStringProperty(OFFICE365_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true); + } + + public boolean isUsageRestrictedToManagers() { + return usageRestrictedToManagers; + } + + public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) { + this.usageRestrictedToManagers = usageRestrictedToManagers; + setStringProperty(OFFICE365_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true); + } } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java index 2be352fe89a0016ecea5273f607f66e83ed12129..856d349baa51f246bf6493dda950f8ee54a16131 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/Office365AdminController.java @@ -21,8 +21,11 @@ package org.olat.core.commons.services.doceditor.office365.ui; import static org.olat.core.commons.services.doceditor.office365.Office365Service.REFRESH_EVENT_ORES; import static org.olat.core.commons.services.doceditor.office365.ui.Office365UIFactory.validateIsMandatory; +import static org.olat.core.gui.components.util.KeyValues.entry; import static org.olat.core.gui.translator.TranslatorHelper.translateAll; +import java.util.Collection; + import org.olat.core.commons.services.doceditor.office365.Office365Module; import org.olat.core.commons.services.doceditor.office365.Office365RefreshDiscoveryEvent; import org.olat.core.commons.services.doceditor.ui.DocEditorController; @@ -36,6 +39,7 @@ import org.olat.core.gui.components.form.flexible.impl.FormBasicController; import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; import org.olat.core.gui.components.link.Link; +import org.olat.core.gui.components.util.KeyValues; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; @@ -51,11 +55,16 @@ import org.springframework.beans.factory.annotation.Autowired; public class Office365AdminController extends FormBasicController { private static final String[] ENABLED_KEYS = new String[]{"on"}; + private static final String USAGE_AUTHOR = "author"; + private static final String USAGE_COACH = "coach"; + private static final String USAGE_MANAGERS = "managers"; private MultipleSelectionElement enabledEl; private TextElement baseUrlEl; private FormLink refreshDiscoveryLink; private MultipleSelectionElement dataTransferConfirmationEnabledEl; + private MultipleSelectionElement usageRestrictedEl; + private MultipleSelectionElement usageRolesEl; @Autowired private Office365Module office365Module; @@ -86,6 +95,22 @@ public class Office365AdminController extends FormBasicController { translateAll(getTranslator(), ENABLED_KEYS)); dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], office365Module.isDataTransferConfirmationEnabled()); + usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS, + translateAll(getTranslator(), ENABLED_KEYS)); + usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null); + usageRestrictedEl.select(ENABLED_KEYS[0], office365Module.isUsageRestricted()); + usageRestrictedEl.addActionListener(FormEvent.ONCHANGE); + + KeyValues usageRolesKV = new KeyValues(); + usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author"))); + usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach"))); + usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers"))); + usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1); + usageRolesEl.select(USAGE_AUTHOR, office365Module.isUsageRestrictedToAuthors()); + usageRolesEl.select(USAGE_COACH, office365Module.isUsageRestrictedToCoaches()); + usageRolesEl.select(USAGE_MANAGERS, office365Module.isUsageRestrictedToManagers()); + updateUsageUI(); + FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add("buttons", buttonLayout); uifactory.addFormSubmitButton("save", buttonLayout); @@ -95,10 +120,17 @@ public class Office365AdminController extends FormBasicController { protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { if (source == refreshDiscoveryLink) { doRefreshDiscovery(); + } else if (source == usageRestrictedEl) { + updateUsageUI(); } super.formInnerEvent(ureq, source, event); } + private void updateUsageUI() { + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + usageRolesEl.setVisible(usageRestricted); + } + @Override protected boolean validateFormLogic(UserRequest ureq) { boolean allOk = true; @@ -125,6 +157,14 @@ public class Office365AdminController extends FormBasicController { boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1); office365Module.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled); + + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + office365Module.setUsageRestricted(usageRestricted); + + Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys(); + office365Module.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR)); + office365Module.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH)); + office365Module.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS)); } @Override diff --git a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties index ebee7f02985ebedb86e766c67e68d5dc0e9b6538..43355a5a3ad23b408a5c70f4545540556ce5f9a2 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/services/doceditor/office365/ui/_i18n/LocalStrings_de.properties @@ -1,4 +1,4 @@ -dmin.desc=Office 365 erm\u00F6glicht es Ihren Benutzern, Excel-, PowerPoint- und Word-Dateien direkt im Browser anzuzeigen und zu bearbeiten. Weitere Informationen sind auf der <a href\="http\://www.office.com/" target\=_blank>Webseite</a> von Microsoft zu finden. +admin.desc=Office 365 erm\u00F6glicht es Ihren Benutzern, Excel-, PowerPoint- und Word-Dateien direkt im Browser anzuzeigen und zu bearbeiten. Weitere Informationen sind auf der <a href\="http\://www.office.com/" target\=_blank>Webseite</a> von Microsoft zu finden. admin.enabled=Modul "Office 365" admin.title=Office 365 admin.refresh.discovery.label=WOPI Discovery aktualisieren diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java index 8b8f3e867bb88b246c055aefba7b0e58d274857a..2e8ea713429e616d18591560683e62dd9e7fa03b 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeEditor.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.commons.services.doceditor.DocEditor; import org.olat.core.commons.services.doceditor.DocEditorConfigs; +import org.olat.core.commons.services.doceditor.DocEditorIdentityService; import org.olat.core.commons.services.doceditor.DocEditorSecurityCallback; import org.olat.core.commons.services.doceditor.onlyoffice.ui.OnlyOfficeEditorController; import org.olat.core.gui.UserRequest; @@ -30,6 +31,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.Util; import org.olat.core.util.vfs.VFSLeaf; import org.springframework.beans.factory.annotation.Autowired; @@ -48,6 +50,8 @@ public class OnlyOfficeEditor implements DocEditor { private OnlyOfficeModule onlyOfficeModule; @Autowired private OnlyOfficeService onlyOfficeService; + @Autowired + private DocEditorIdentityService identityService; @Override public boolean isEnable() { @@ -70,6 +74,18 @@ public class OnlyOfficeEditor implements DocEditor { return onlyOfficeModule.isDataTransferConfirmationEnabled(); } + @Override + public boolean isEnabledFor(Identity identity, Roles roles) { + if (onlyOfficeModule.isUsageRestricted()) { + if (roles.isAdministrator()) return true; + if (onlyOfficeModule.isUsageRestrictedToAuthors() && roles.isAuthor()) return true; + if (onlyOfficeModule.isUsageRestrictedToManagers() && roles.isManager()) return true; + if (onlyOfficeModule.isUsageRestrictedToCoaches() && identityService.isCoach(identity)) return true; + return false; + } + return true; + } + @Override public boolean isSupportingFormat(String suffix, Mode mode, boolean hasMeta) { return hasMeta && onlyOfficeService.isSupportedFormat(suffix, mode); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java index 5813d7a1f7a39d98f22dd0de95f154ae6f8d5cf3..a74644db2fb9d639091475baf14ee71ef996aca2 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/OnlyOfficeModule.java @@ -21,9 +21,9 @@ package org.olat.core.commons.services.doceditor.onlyoffice; import java.security.Key; +import org.apache.logging.log4j.Logger; import org.olat.core.configuration.AbstractSpringModule; import org.olat.core.configuration.ConfigOnOff; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.StringHelper; import org.olat.core.util.coordinate.CoordinatorManager; @@ -48,6 +48,10 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf private static final String ONLYOFFICE_BASE_URL = "onlyoffice.baseUrl"; private static final String ONLYOFFICE_JWT_SECRET = "onlyoffice.jwt.secret"; private static final String ONLYOFFICE_DATA_TRANSER_CONFIRMATION_ENABLED = "onlyoffice.data.transfer.confirmation.enabled"; + private static final String ONLYOFFICE_USAGE_RESTRICTED = "onlyoffice.usage.restricted"; + private static final String ONLYOFFICE_USAGE_AUTHORS = "onlyoffice.usage.authors"; + private static final String ONLYOFFICE_USAGE_COACHES = "onlyoffice.usage.coaches"; + private static final String ONLYOFFICE_USAGE_MANAGERS = "onlyoffice.usage.managers"; @Value("${onlyoffice.enabled:false}") private boolean enabled; @@ -60,6 +64,14 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf private Key jwtSignKey; @Value("${onlyoffice.data.transfer.confirmation.enabled:false}") private boolean dataTransferConfirmationEnabled; + @Value("${onlyoffice.usage.restricted:false}") + private boolean usageRestricted; + @Value("${onlyoffice.usage.restricted.authors:false}") + private boolean usageRestrictedToAuthors; + @Value("${onlyoffice.usage.restricted.coaches:false}") + private boolean usageRestrictedToCoaches; + @Value("${onlyoffice.usage.restricted.managers:false}") + private boolean usageRestrictedToManagers; @Autowired private OnlyOfficeModule(CoordinatorManager coordinateManager) { @@ -97,6 +109,26 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf if(StringHelper.containsNonWhitespace(dataTransferConfirmationEnabledObj)) { dataTransferConfirmationEnabled = "true".equals(dataTransferConfirmationEnabledObj); } + + String usageRestrictedObj = getStringPropertyValue(ONLYOFFICE_USAGE_RESTRICTED, true); + if(StringHelper.containsNonWhitespace(usageRestrictedObj)) { + usageRestricted = "true".equals(usageRestrictedObj); + } + + String usageRestrictedToAuthorsObj = getStringPropertyValue(ONLYOFFICE_USAGE_AUTHORS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToAuthorsObj)) { + usageRestrictedToAuthors = "true".equals(usageRestrictedToAuthorsObj); + } + + String usageRestrictedToCoachesObj = getStringPropertyValue(ONLYOFFICE_USAGE_COACHES, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToCoachesObj)) { + usageRestrictedToCoaches = "true".equals(usageRestrictedToCoachesObj); + } + + String usageRestrictedToManagersObj = getStringPropertyValue(ONLYOFFICE_USAGE_MANAGERS, true); + if(StringHelper.containsNonWhitespace(usageRestrictedToManagersObj)) { + usageRestrictedToManagers = "true".equals(usageRestrictedToManagersObj); + } } @Override @@ -157,4 +189,40 @@ public class OnlyOfficeModule extends AbstractSpringModule implements ConfigOnOf setStringProperty(ONLYOFFICE_DATA_TRANSER_CONFIRMATION_ENABLED, Boolean.toString(dataTransferConfirmationEnabled), true); } + public boolean isUsageRestricted() { + return usageRestricted; + } + + public void setUsageRestricted(boolean usageRestricted) { + this.usageRestricted = usageRestricted; + setStringProperty(ONLYOFFICE_USAGE_RESTRICTED, Boolean.toString(usageRestricted), true); + } + + public boolean isUsageRestrictedToAuthors() { + return usageRestrictedToAuthors; + } + + public void setUsageRestrictedToAuthors(boolean usageRestrictedToAuthors) { + this.usageRestrictedToAuthors = usageRestrictedToAuthors; + setStringProperty(ONLYOFFICE_USAGE_AUTHORS, Boolean.toString(usageRestrictedToAuthors), true); + } + + public boolean isUsageRestrictedToCoaches() { + return usageRestrictedToCoaches; + } + + public void setUsageRestrictedToCoaches(boolean usageRestrictedToCoaches) { + this.usageRestrictedToCoaches = usageRestrictedToCoaches; + setStringProperty(ONLYOFFICE_USAGE_COACHES, Boolean.toString(usageRestrictedToCoaches), true); + } + + public boolean isUsageRestrictedToManagers() { + return usageRestrictedToManagers; + } + + public void setUsageRestrictedToManagers(boolean usageRestrictedToManagers) { + this.usageRestrictedToManagers = usageRestrictedToManagers; + setStringProperty(ONLYOFFICE_USAGE_MANAGERS, Boolean.toString(usageRestrictedToManagers), true); + } + } diff --git a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java index 27d3febc159033aeae4a89ca48f3a5c0660af700..3978b065c3817f754e214908b839845afc3da712 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/onlyoffice/ui/OnlyOfficeAdminController.java @@ -20,17 +20,23 @@ package org.olat.core.commons.services.doceditor.onlyoffice.ui; import static org.olat.core.commons.services.doceditor.onlyoffice.ui.OnlyOfficeUIFactory.validateIsMandatory; +import static org.olat.core.gui.components.util.KeyValues.entry; import static org.olat.core.gui.translator.TranslatorHelper.translateAll; +import java.util.Collection; + import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeModule; import org.olat.core.commons.services.doceditor.onlyoffice.OnlyOfficeSecurityService; import org.olat.core.commons.services.doceditor.ui.DocEditorController; import org.olat.core.gui.UserRequest; +import org.olat.core.gui.components.form.flexible.FormItem; import org.olat.core.gui.components.form.flexible.FormItemContainer; import org.olat.core.gui.components.form.flexible.elements.MultipleSelectionElement; import org.olat.core.gui.components.form.flexible.elements.TextElement; import org.olat.core.gui.components.form.flexible.impl.FormBasicController; +import org.olat.core.gui.components.form.flexible.impl.FormEvent; import org.olat.core.gui.components.form.flexible.impl.FormLayoutContainer; +import org.olat.core.gui.components.util.KeyValues; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.util.Util; @@ -45,11 +51,16 @@ import org.springframework.beans.factory.annotation.Autowired; public class OnlyOfficeAdminController extends FormBasicController { private static final String[] ENABLED_KEYS = new String[]{"on"}; + private static final String USAGE_AUTHOR = "author"; + private static final String USAGE_COACH = "coach"; + private static final String USAGE_MANAGERS = "managers"; private MultipleSelectionElement enabledEl; private TextElement baseUrlEl; private TextElement jwtSecretEl; private MultipleSelectionElement dataTransferConfirmationEnabledEl; + private MultipleSelectionElement usageRestrictedEl; + private MultipleSelectionElement usageRolesEl; @Autowired private OnlyOfficeModule onlyOfficeModule; @@ -83,10 +94,38 @@ public class OnlyOfficeAdminController extends FormBasicController { translateAll(getTranslator(), ENABLED_KEYS)); dataTransferConfirmationEnabledEl.select(ENABLED_KEYS[0], onlyOfficeModule.isDataTransferConfirmationEnabled()); + usageRestrictedEl = uifactory.addCheckboxesHorizontal("admin.usage.restricted", formLayout, ENABLED_KEYS, + translateAll(getTranslator(), ENABLED_KEYS)); + usageRestrictedEl.setHelpTextKey("admin.usage.restricted.help", null); + usageRestrictedEl.select(ENABLED_KEYS[0], onlyOfficeModule.isUsageRestricted()); + usageRestrictedEl.addActionListener(FormEvent.ONCHANGE); + + KeyValues usageRolesKV = new KeyValues(); + usageRolesKV.add(entry(USAGE_AUTHOR, translate("admin.usage.roles.author"))); + usageRolesKV.add(entry(USAGE_COACH, translate("admin.usage.roles.coach"))); + usageRolesKV.add(entry(USAGE_MANAGERS, translate("admin.usage.roles.managers"))); + usageRolesEl = uifactory.addCheckboxesVertical("admin.usage.roles", formLayout, usageRolesKV.keys(), usageRolesKV.values(), 1); + usageRolesEl.select(USAGE_AUTHOR, onlyOfficeModule.isUsageRestrictedToAuthors()); + usageRolesEl.select(USAGE_COACH, onlyOfficeModule.isUsageRestrictedToCoaches()); + usageRolesEl.select(USAGE_MANAGERS, onlyOfficeModule.isUsageRestrictedToManagers()); + updateUsageUI(); + FormLayoutContainer buttonLayout = FormLayoutContainer.createButtonLayout("buttons", getTranslator()); formLayout.add("buttons", buttonLayout); uifactory.addFormSubmitButton("save", buttonLayout); } + @Override + protected void formInnerEvent(UserRequest ureq, FormItem source, FormEvent event) { + if (source == usageRestrictedEl) { + updateUsageUI(); + } + super.formInnerEvent(ureq, source, event); + } + + private void updateUsageUI() { + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + usageRolesEl.setVisible(usageRestricted); + } @Override protected boolean validateFormLogic(UserRequest ureq) { @@ -120,6 +159,14 @@ public class OnlyOfficeAdminController extends FormBasicController { boolean dataTransferConfirmationEnabled = dataTransferConfirmationEnabledEl.isAtLeastSelected(1); onlyOfficeModule.setDataTransferConfirmationEnabled(dataTransferConfirmationEnabled); + + boolean usageRestricted = usageRestrictedEl.isAtLeastSelected(1); + onlyOfficeModule.setUsageRestricted(usageRestricted); + + Collection<String> restrictionKeys = usageRolesEl.getSelectedKeys(); + onlyOfficeModule.setUsageRestrictedToAuthors(restrictionKeys.contains(USAGE_AUTHOR)); + onlyOfficeModule.setUsageRestrictedToCoaches(restrictionKeys.contains(USAGE_COACH)); + onlyOfficeModule.setUsageRestrictedToManagers(restrictionKeys.contains(USAGE_MANAGERS)); } @Override diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java index c34c132099ab3af46d95b365e89d20580545d7db..6e91e28ccc31670ce4ebd7effa2aa6e8b3b941f6 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java +++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/DocEditorConfigController.java @@ -67,7 +67,8 @@ public class DocEditorConfigController extends BasicController implements Activa super(ureq, wControl); this.guiEditorKey = getGuiPrefixKey(vfsLeaf); String suffix = FileUtils.getFileSuffix(vfsLeaf.getName()); - editors = editorService.getEditors(suffix, secCallback.getMode(), secCallback.hasMeta()); + editors = editorService.getEditors(getIdentity(), ureq.getUserSession().getRoles(), suffix, + secCallback.getMode(), secCallback.hasMeta()); VelocityContainer mainVC = createVelocityContainer("editor_config"); diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties index 03f637b7ab71460bd27bfface00b0c276d584efc..65b5767a63494a668244041a4c2ccdfa59f23506 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties +++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_de.properties @@ -4,6 +4,12 @@ admin.menu.title.alt=Dokumenteneditoren admin.menu.title=Dokumenteneditoren admin.office365=$org.olat.core.commons.services.doceditor.office365.ui\:editor.display.name admin.onlyoffice=$org.olat.core.commons.services.doceditor.onlyoffice.ui\:editor.display.name +admin.usage.restricted.help=Wenn Sie diese Option einschalten, kann niemand ausser den explizit angegebenen Benutzerrollen den Editor verwenden. Nur Administratoren k\u00F6nnen den Editor immer verwenden. +admin.usage.restricted=Verwendung einschr\u00E4nken +admin.usage.roles.author=Autoren +admin.usage.roles.coach=Betreuer +admin.usage.roles.managers=Manager +admin.usage.roles=auf create.doc.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists create.doc.button=Dokument erstellen create.doc.name.notvalid=$org.olat.core.commons.modules.bc\:cfile.name.notvalid diff --git a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties index 144dedd26bebb40c1e057e7943475b9f08051af5..d1cf9fa9ca92dae52258ef951af0ae19e3debb55 100644 --- a/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties +++ b/src/main/java/org/olat/core/commons/services/doceditor/ui/_i18n/LocalStrings_en.properties @@ -2,6 +2,12 @@ admin.collabora=$org.olat.core.commons.services.doceditor.collabora.ui\:editor.d admin.data.transfer.confirmation.enabled=Confirmation of data transfer admin.menu.title.alt=Document editors admin.menu.title=Document editors +admin.usage.restricted.help=If you enable this option, nobody but the explicitly specified user roles can use the editor. Only administrators can always use the editor. +admin.usage.restricted=Restrict usage +admin.usage.roles=to +admin.usage.roles.author=Authors +admin.usage.roles.coach=Coaches +admin.usage.roles.managers=Manager admin.office365=$org.olat.core.commons.services.doceditor.office365.ui\:editor.display.name admin.onlyoffice=$org.olat.core.commons.services.doceditor.onlyoffice.ui\:editor.display.name create.doc.already.exists=$org.olat.core.commons.modules.bc\:cfile.already.exists diff --git a/src/main/java/org/olat/core/id/Roles.java b/src/main/java/org/olat/core/id/Roles.java index 39bd4e77c63968191392d64e2f70405590581d5d..8d36672a28cd50fbb1dddd7938575dd6ab7f251d 100644 --- a/src/main/java/org/olat/core/id/Roles.java +++ b/src/main/java/org/olat/core/id/Roles.java @@ -265,6 +265,18 @@ public class Roles implements Serializable { public boolean isLineManager() { return hasRole(OrganisationRoles.linemanager); } + + public boolean isManager() { + return isCurriculumManager() + || isGroupManager() + || isLearnResourceManager() + || isLectureManager() + || isLineManager() + || isPoolManager() + || isQualityManager() + || isRolesManager() + || isUserManager(); + } public boolean isInvitee() { return isInvitee; diff --git a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java index 58933d1748d420b8197fc6c3b3602ce147782cc9..dfa5fcc6afd197d98c50d5a2a3afaf991436200c 100644 --- a/src/main/java/org/olat/course/nodes/CourseNodeFactory.java +++ b/src/main/java/org/olat/course/nodes/CourseNodeFactory.java @@ -147,7 +147,7 @@ public class CourseNodeFactory implements PreWarm { } RepositoryHandler typeToEdit = RepositoryHandlerFactory.getInstance().getRepositoryHandler(repositoryEntry); - if (typeToEdit.supportsEdit(repositoryEntry.getOlatResource()) == EditionSupport.no){ + if (typeToEdit.supportsEdit(repositoryEntry.getOlatResource(), ureq.getIdentity(), ureq.getUserSession().getRoles()) == EditionSupport.no){ log.error("Trying to edit repository entry which has no associated editor: "+ typeToEdit); return false; } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java index 1aac1f09580c78dbaf23f60583b5e817d56adac6..69f4f4f86545965d53e60602eddaf3a068e4cb47 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/AbstractAssignmentEditController.java @@ -152,10 +152,10 @@ abstract class AbstractAssignmentEditController extends FormBasicController { taskModel = new TaskDefinitionTableModel(columnsModel); taskDefTableEl = uifactory.addTableElement(getWindowControl(), "taskTable", taskModel, getTranslator(), tasksCont); taskDefTableEl.setExportEnabled(true); - updateModel(); + updateModel(ureq); } - protected void updateModel() { + protected void updateModel(UserRequest ureq) { fileExistsRenderer.setFilenames(tasksFolder.list()); List<TaskDefinition> taskDefinitions = gtaManager.getTaskDefinitions(courseEnv, gtaNode); List<TaskDefinitionRow> rows = new ArrayList<>(taskDefinitions.size()); @@ -167,7 +167,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController { VFSLeaf vfsLeaf = (VFSLeaf)item; downloadLink = uifactory .addDownloadLink("file_" + (++linkCounter), def.getFilename(), null, vfsLeaf, taskDefTableEl); - mode = getOpenMode(vfsLeaf, getIdentity(), readOnly); + mode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly); } TaskDefinitionRow row = new TaskDefinitionRow(def, downloadLink, mode); @@ -189,7 +189,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController { TaskDefinition newTask = addTaskCtrl.getTask(); gtaManager.addTaskDefinition(newTask, courseEnv, gtaNode); fireEvent(ureq, Event.DONE_EVENT); - updateModel(); + updateModel(ureq); gtaManager.markNews(courseEnv, gtaNode); } cmc.deactivate(); @@ -198,7 +198,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController { } else if(editTaskCtrl == source) { if(event == Event.DONE_EVENT) { doFinishReplacementOfTask(editTaskCtrl.getFilenameToReplace(), editTaskCtrl.getTask()); - updateModel(); + updateModel(ureq); //fireEvent(ureq, Event.DONE_EVENT); gtaManager.markNews(courseEnv, gtaNode); } @@ -212,12 +212,12 @@ abstract class AbstractAssignmentEditController extends FormBasicController { if(event == Event.DONE_EVENT) { gtaManager.addTaskDefinition(newTask, courseEnv, gtaNode); doOpen(ureq, newTask, EDIT); - updateModel(); + updateModel(ureq); } } else if (source == docEditorCtrl) { if(event == Event.DONE_EVENT) { gtaManager.markNews(courseEnv, gtaNode); - updateModel(); + updateModel(ureq); cleanUp(); } } else if(confirmDeleteCtrl == source) { @@ -302,7 +302,8 @@ abstract class AbstractAssignmentEditController extends FormBasicController { } private void doCreateTask(UserRequest ureq) { - newTaskCtrl = new NewTaskController(ureq, getWindowControl(), tasksContainer, htmlOffice(getLocale())); + newTaskCtrl = new NewTaskController(ureq, getWindowControl(), tasksContainer, + htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale())); listenTo(newTaskCtrl); String title = translate("create.task"); @@ -334,7 +335,7 @@ abstract class AbstractAssignmentEditController extends FormBasicController { private void doDelete(UserRequest ureq, TaskDefinition taskDef) { gtaManager.removeTaskDefinition(taskDef, courseEnv, gtaNode); - updateModel(); + updateModel(ureq); fireEvent(ureq, Event.DONE_EVENT); } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java index 6131d7d75d5f8f29d07988f8c8f207ae88bb19f3..33d99ce850ed68928ae0786da81b7d920f5f97b4 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTASampleSolutionsEditController.java @@ -134,10 +134,10 @@ public class GTASampleSolutionsEditController extends FormBasicController { solutionModel = new SolutionTableModel(columnsModel); solutionTable = uifactory.addTableElement(getWindowControl(), "table", solutionModel, getTranslator(), formLayout); solutionTable.setExportEnabled(true); - updateModel(); + updateModel(ureq); } - private void updateModel() { + private void updateModel(UserRequest ureq) { List<Solution> solutionList = gtaManager.getSolutions(courseEnv, gtaNode); List<SolutionRow> rows = new ArrayList<>(solutionList.size()); for(Solution solution:solutionList) { @@ -158,7 +158,7 @@ public class GTASampleSolutionsEditController extends FormBasicController { VFSLeaf vfsLeaf = (VFSLeaf)item; downloadLink = uifactory .addDownloadLink("file_" + (++linkCounter), filename, null, vfsLeaf, solutionTable); - openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly); + openMode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly); } rows.add(new SolutionRow(solution, author, downloadLink, openMode)); @@ -179,7 +179,7 @@ public class GTASampleSolutionsEditController extends FormBasicController { Solution newSolution = addSolutionCtrl.getSolution(); gtaManager.addSolution(newSolution, courseEnv, gtaNode); fireEvent(ureq, Event.DONE_EVENT); - updateModel(); + updateModel(ureq); gtaManager.markNews(courseEnv, gtaNode); } cmc.deactivate(); @@ -188,7 +188,7 @@ public class GTASampleSolutionsEditController extends FormBasicController { if(event == Event.DONE_EVENT) { gtaManager.updateSolution(editSolutionCtrl.getFilenameToReplace(), editSolutionCtrl.getSolution(), courseEnv, gtaNode); fireEvent(ureq, Event.DONE_EVENT); - updateModel(); + updateModel(ureq); gtaManager.markNews(courseEnv, gtaNode); } cmc.deactivate(); @@ -201,13 +201,13 @@ public class GTASampleSolutionsEditController extends FormBasicController { if(event == Event.DONE_EVENT) { gtaManager.addSolution(newSolution, courseEnv, gtaNode); doOpen(ureq, newSolution, Mode.EDIT); - updateModel(); + updateModel(ureq); gtaManager.markNews(courseEnv, gtaNode); } } else if (source == docEditorCtrl) { if(event == Event.DONE_EVENT) { gtaManager.markNews(courseEnv, gtaNode); - updateModel(); + updateModel(ureq); cleanUp(); } } else if(cmc == source) { @@ -289,7 +289,8 @@ public class GTASampleSolutionsEditController extends FormBasicController { } private void doCreateSolution(UserRequest ureq) { - newSolutionCtrl = new NewSolutionController(ureq, getWindowControl(), solutionContainer, htmlOffice(getLocale())); + newSolutionCtrl = new NewSolutionController(ureq, getWindowControl(), solutionContainer, + htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale())); listenTo(newSolutionCtrl); cmc = new CloseableModalController(getWindowControl(), "close", newSolutionCtrl.getInitialComponent()); @@ -305,6 +306,6 @@ public class GTASampleSolutionsEditController extends FormBasicController { } gtaManager.removeSolution(solution.getSolution(), courseEnv, gtaNode); fireEvent(ureq, Event.DONE_EVENT); - updateModel(); + updateModel(ureq); } } diff --git a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java index 104e9f7643cf10105d61b7eefffc550b6aff9722..e49fe7146980e7f49881d8496d609bb35b2fc44b 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/GTAUIFactory.java @@ -33,6 +33,7 @@ import org.olat.core.commons.services.doceditor.DocTemplates; import org.olat.core.commons.services.doceditor.DocTemplates.Builder; import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.core.util.vfs.VFSContainer; import org.olat.core.util.vfs.VFSLeaf; import org.olat.modules.edusharing.VFSEdusharingProvider; @@ -46,13 +47,13 @@ import org.olat.repository.ui.settings.LazyRepositoryEdusharingProvider; */ class GTAUIFactory { - static Mode getOpenMode(VFSLeaf vfsLeaf, Identity identity, boolean readOnly) { + static Mode getOpenMode(Identity identity, Roles roles, VFSLeaf vfsLeaf, boolean readOnly) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); DocEditorSecurityCallback editSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.EDIT).build(); DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build(); - if (!readOnly && docEditorService.hasEditor(vfsLeaf, identity, editSC)) { + if (!readOnly && docEditorService.hasEditor(identity, roles, vfsLeaf, editSC)) { return Mode.EDIT; - } else if (docEditorService.hasEditor(vfsLeaf, identity, viewSC)) { + } else if (docEditorService.hasEditor(identity, roles, vfsLeaf, viewSC)) { return Mode.VIEW; } return null; @@ -73,19 +74,19 @@ class GTAUIFactory { .build(); } - static DocTemplates htmlOffice(Locale locale) { + static DocTemplates htmlOffice(Identity identity, Roles roles, Locale locale) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); Builder builder = DocTemplates.builder(locale); - if (docEditorService.hasEditor("html", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "html", EDIT, true)) { builder.addHtml(); } - if (docEditorService.hasEditor("docx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "docx", EDIT, true)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, true)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, true)) { builder.addPptx(); } return builder.build(); diff --git a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java index be6fa0afc1063250dec992a64e72c00522730b7c..ce130ea66911c6159afec6b5f7b5572e97116856 100644 --- a/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java +++ b/src/main/java/org/olat/course/nodes/gta/ui/SubmitDocumentsController.java @@ -130,7 +130,7 @@ class SubmitDocumentsController extends FormBasicController { this.gtaNode = cNode; this.courseEnv = courseEnv; initForm(ureq); - updateModel(); + updateModel(ureq); } public Task getAssignedTask() { @@ -182,7 +182,7 @@ class SubmitDocumentsController extends FormBasicController { tableEl.setElementCssClass("o_table_no_margin"); } - private void updateModel() { + private void updateModel(UserRequest ureq) { File[] documents = documentsDir.listFiles(SystemFileFilter.FILES_ONLY); if(documents == null) { documents = new File[0]; @@ -211,7 +211,7 @@ class SubmitDocumentsController extends FormBasicController { if(item instanceof VFSLeaf) { VFSLeaf vfsLeaf = (VFSLeaf)item; - openMode = getOpenMode(vfsLeaf, getIdentity(), readOnly); + openMode = getOpenMode(getIdentity(), ureq.getUserSession().getRoles(), vfsLeaf, readOnly); } docList.add(new SubmittedSolution(document, uploadedBy, download, openMode)); } @@ -251,7 +251,7 @@ class SubmitDocumentsController extends FormBasicController { if(DialogBoxUIFactory.isYesEvent(event) || DialogBoxUIFactory.isOkEvent(event)) { SubmittedSolution document = (SubmittedSolution)confirmDeleteCtrl.getUserObject(); String filename = document.getFile().getName(); - doDelete(document); + doDelete(ureq, document); fireEvent(ureq, new SubmitEvent(SubmitEvent.DELETE, filename)); gtaManager.markNews(courseEnv, gtaNode); } @@ -287,7 +287,7 @@ class SubmitDocumentsController extends FormBasicController { fireEvent(ureq, new SubmitEvent(SubmitEvent.CREATE, filename)); gtaManager.markNews(courseEnv, gtaNode); doOpen(ureq, filename, EDIT); - updateModel(); + updateModel(ureq); } checkDeadline(ureq); } else if (source == docEditorCtrl) { @@ -295,7 +295,7 @@ class SubmitDocumentsController extends FormBasicController { fireEvent(ureq, new SubmitEvent(SubmitEvent.UPDATE, docEditorCtrl.getVfsLeaf().getName())); gtaManager.markNews(courseEnv, gtaNode); } - updateModel(); + updateModel(ureq); cleanUp(); checkDeadline(ureq); } else if(cmc == source) { @@ -389,12 +389,12 @@ class SubmitDocumentsController extends FormBasicController { confirmDeleteCtrl.setUserObject(solution); } - private void doDelete(SubmittedSolution solution) { + private void doDelete(UserRequest ureq, SubmittedSolution solution) { File document = solution.getFile(); if(document.exists()) { document.delete(); } - updateModel(); + updateModel(ureq); } private void doOpen(UserRequest ureq, String filename, Mode mode) { @@ -444,7 +444,7 @@ class SubmitDocumentsController extends FormBasicController { logError("", e); showError(""); } - updateModel(); + updateModel(ureq); } private void doOpenDocumentUpload(UserRequest ureq) { @@ -469,7 +469,8 @@ class SubmitDocumentsController extends FormBasicController { if(maxDocs > 0 && maxDocs <= model.getRowCount()) { showWarning("error.max.documents"); } else { - newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer, htmlOffice(getLocale())); + newDocCtrl = new NewDocumentController(ureq, getWindowControl(), documentsContainer, + htmlOffice(getIdentity(), ureq.getUserSession().getRoles(), getLocale())); listenTo(newDocCtrl); cmc = new CloseableModalController(getWindowControl(), "close", newDocCtrl.getInitialComponent()); diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java index 5df01f893405a934d857b1321c2e161106531fb8..fe80a809f27f21c9f843e8a427361f1762032aff 100644 --- a/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java +++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTISurveyHandler.java @@ -42,6 +42,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.util.Util; import org.olat.course.assessment.AssessmentMode; @@ -79,7 +80,7 @@ import org.olat.resource.references.ReferenceManager; public class QTISurveyHandler extends QTIHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return CoreSpringFactory.getImpl(QTIModule.class).isCreateSurveyResourcesEnabled(); } @@ -143,7 +144,7 @@ public class QTISurveyHandler extends QTIHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { if(resource != null && QTIResourceTypeModule.isOnyxTest(resource)) { return EditionSupport.no; } diff --git a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java index fc68e0f9cb585621a74faae6059d4e6c1f86e516..cf5c7c4eac00727540e00219c9095aa0846bb8e2 100644 --- a/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java +++ b/src/main/java/org/olat/ims/qti/repository/handlers/QTITestHandler.java @@ -42,6 +42,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.util.Util; import org.olat.course.assessment.AssessmentMode; @@ -80,7 +81,7 @@ import org.olat.resource.references.ReferenceManager; public class QTITestHandler extends QTIHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return CoreSpringFactory.getImpl(QTIModule.class).isCreateResourcesEnabled(); } @@ -144,7 +145,7 @@ public class QTITestHandler extends QTIHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { if(resource != null && QTIResourceTypeModule.isOnyxTest(resource)) { return EditionSupport.no; } diff --git a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java index 71c029c6bdc007202bb5b7ce556a5baf55a6d829..a29e5f50a4f3713eaae7ac6eb043bab68a46345c 100644 --- a/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java +++ b/src/main/java/org/olat/ims/qti21/repository/handlers/QTI21AssessmentTestHandler.java @@ -127,7 +127,7 @@ public class QTI21AssessmentTestHandler extends FileHandler { } @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -363,7 +363,7 @@ public class QTI21AssessmentTestHandler extends FileHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.yes; } diff --git a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java index 80e7e7e08ad11355be978ec1bdc407ea41719c2e..582f6e4f2632c75f676381a0bd996bd95cf51aaa 100644 --- a/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java +++ b/src/main/java/org/olat/modules/forms/handler/EvaluationFormHandler.java @@ -114,7 +114,7 @@ public class EvaluationFormHandler implements RepositoryHandler { private EvaluationFormManager evaluationFormManager; @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return formsModule.isEnabled(); } @@ -224,7 +224,7 @@ public class EvaluationFormHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.yes; } diff --git a/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java b/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java index 3fb79f7189ac1a4cae30bb13eecad59171f57373..b61113c6b64a7007e2a1a5fdd84f81d6d6cae19a 100644 --- a/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java +++ b/src/main/java/org/olat/modules/portfolio/handler/BinderTemplateHandler.java @@ -88,7 +88,7 @@ public class BinderTemplateHandler implements RepositoryHandler { private static final Logger log = Tracing.createLoggerFor(BinderTemplateHandler.class); @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return CoreSpringFactory.getImpl(PortfolioV2Module.class).isEnabled(); } @@ -196,7 +196,7 @@ public class BinderTemplateHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java index f2a58e3c0cd98d00b9d1adf9679ef0d35e3d3b9a..f7c1a978c641b725b79ee28aa8101f75bff63f78 100644 --- a/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java +++ b/src/main/java/org/olat/modules/portfolio/handler/CreateFileHandler.java @@ -25,10 +25,12 @@ import java.util.Locale; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.services.doceditor.DocTemplates; -import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.commons.services.doceditor.DocTemplates.Builder; +import org.olat.core.commons.services.doceditor.DocumentEditorService; import org.olat.core.gui.UserRequest; import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.modules.ceditor.PageElementAddController; import org.olat.modules.portfolio.ui.media.CreateFileMediaController; @@ -40,16 +42,16 @@ import org.olat.modules.portfolio.ui.media.CreateFileMediaController; */ public class CreateFileHandler extends FileHandler { - public static DocTemplates getEditableTemplates(Locale locale) { + public static DocTemplates getEditableTemplates(Identity identity, Roles roles, Locale locale) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); Builder builder = DocTemplates.builder(locale); - if (docEditorService.hasEditor("docx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "docx", EDIT, true)) { builder.addDocx(); } - if (docEditorService.hasEditor("xlsx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "xlsx", EDIT, true)) { builder.addXlsx(); } - if (docEditorService.hasEditor("pptx", EDIT, true)) { + if (docEditorService.hasEditor(identity, roles, "pptx", EDIT, true)) { builder.addPptx(); } return builder.build(); @@ -62,7 +64,8 @@ public class CreateFileHandler extends FileHandler { @Override public PageElementAddController getAddPageElementController(UserRequest ureq, WindowControl wControl) { - return new CreateFileMediaController(ureq, wControl, getEditableTemplates(ureq.getLocale())); + return new CreateFileMediaController(ureq, wControl, + getEditableTemplates(ureq.getIdentity(), ureq.getUserSession().getRoles(), ureq.getLocale())); } } diff --git a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java index fbdf57e61ac65f12a13e2436e4f83b4cea49b3c8..815d3a7f7181ae50a10c1c811033c35d234bcead 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/MediaCenterController.java @@ -144,7 +144,7 @@ public class MediaCenterController extends FormBasicController super(ureq, wControl, "medias"); this.stackPanel = null; this.select = true; - this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale()); + this.editableFileTypes = CreateFileHandler.getEditableTemplates(getIdentity(), ureq.getUserSession().getRoles(), getLocale()); initForm(ureq); loadModel(); @@ -154,7 +154,7 @@ public class MediaCenterController extends FormBasicController super(ureq, wControl, "medias"); this.stackPanel = stackPanel; this.select = false; - this.editableFileTypes = CreateFileHandler.getEditableTemplates(getLocale()); + this.editableFileTypes = CreateFileHandler.getEditableTemplates(getIdentity(), ureq.getUserSession().getRoles(), getLocale()); initForm(ureq); loadModel(); diff --git a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java index c2f72f736151e46a25bbd2cbf4c32e205d47db94..8427905cb00a83fa37b82778049772d89a6aaf40 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/PageRunController.java @@ -53,6 +53,7 @@ import org.olat.core.gui.control.generic.modal.DialogBoxUIFactory; import org.olat.core.gui.media.MediaResource; import org.olat.core.gui.util.SyntheticUserRequest; import org.olat.core.id.OLATResourceable; +import org.olat.core.id.Roles; import org.olat.core.id.context.ContextEntry; import org.olat.core.id.context.StateEntry; import org.olat.core.util.StringHelper; @@ -199,8 +200,9 @@ public class PageRunController extends BasicController implements TooledControll putInitialPanel(mainVC); if(openInEditMode) { - pageEditCtrl = new PageEditorController(ureq, getWindowControl(), new PortfolioPageEditorProvider(), - new FullEditorSecurityCallback(), getTranslator()); + pageEditCtrl = new PageEditorController(ureq, getWindowControl(), + new PortfolioPageEditorProvider(ureq.getUserSession().getRoles()), new FullEditorSecurityCallback(), + getTranslator()); listenTo(pageEditCtrl); mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder())); mainVC.put("page", pageEditCtrl.getInitialComponent()); @@ -649,7 +651,8 @@ public class PageRunController extends BasicController implements TooledControll } else { lockEntry = coordinator.getCoordinator().getLocker().acquireLock(lockOres, getIdentity(), ""); if(lockEntry.isSuccess()) { - pageEditCtrl = new PageEditorController(ureq, getWindowControl(), new PortfolioPageEditorProvider(), + pageEditCtrl = new PageEditorController(ureq, getWindowControl(), + new PortfolioPageEditorProvider(ureq.getUserSession().getRoles()), new FullEditorSecurityCallback(), getTranslator()); listenTo(pageEditCtrl); mainVC.contextPut("isPersonalBinder", (!secCallback.canNewAssignment() && secCallback.canEditMetadataBinder())); @@ -753,7 +756,7 @@ public class PageRunController extends BasicController implements TooledControll private final List<PageElementHandler> handlers = new ArrayList<>(); private final List<PageElementHandler> creationHandlers = new ArrayList<>(); - public PortfolioPageEditorProvider() { + public PortfolioPageEditorProvider(Roles roles) { //handler for title TitlePageElementHandler titleRawHandler = new TitlePageElementHandler(); handlers.add(titleRawHandler); @@ -768,7 +771,7 @@ public class PageRunController extends BasicController implements TooledControll creationHandlers.add(tableHandler); // Handler only to create files - if (isCreateFilePossible()) { + if (isCreateFilePossible(roles)) { CreateFileHandler createFileHandler = new CreateFileHandler(); creationHandlers.add(createFileHandler); } @@ -803,10 +806,10 @@ public class PageRunController extends BasicController implements TooledControll creationHandlers.add(htlmRawHandler);// at the end, legacy } - private boolean isCreateFilePossible() { - List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getLocale()).getTemplates(); + private boolean isCreateFilePossible(Roles roles) { + List<DocTemplate> editableTemplates = CreateFileHandler.getEditableTemplates(getIdentity(), roles, getLocale()).getTemplates(); for (DocTemplate docTemplate: editableTemplates) { - if (vfsRepositoryService.hasEditor(docTemplate.getSuffix(), Mode.EDIT, true)) { + if (vfsRepositoryService.hasEditor(getIdentity(), roles, docTemplate.getSuffix(), Mode.EDIT, true)) { return true; } } diff --git a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java index 4790429ac0c20a52caec42779695d40466286930..efa51654f14eb26c3110f1d031983ab9bbb095ae 100644 --- a/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java +++ b/src/main/java/org/olat/modules/portfolio/ui/media/FileMediaController.java @@ -38,6 +38,7 @@ import org.olat.core.gui.control.Event; import org.olat.core.gui.control.WindowControl; import org.olat.core.gui.control.controller.BasicController; import org.olat.core.gui.util.CSSHelper; +import org.olat.core.id.Roles; import org.olat.core.util.FileUtils; import org.olat.core.util.Formatter; import org.olat.core.util.StringHelper; @@ -72,6 +73,7 @@ public class FileMediaController extends BasicController implements PageElementE private DocEditorFullscreenController docEditorCtrl; + private final Roles roles; private final Media media; private final MediaRenderingHints hints; private VFSLeaf vfsLeaf; @@ -87,6 +89,7 @@ public class FileMediaController extends BasicController implements PageElementE public FileMediaController(UserRequest ureq, WindowControl wControl, Media media, MediaRenderingHints hints) { super(ureq, wControl); + this.roles = ureq.getUserSession().getRoles(); this.media = media; this.hints = hints; setTranslator(Util.createPackageTranslator(PortfolioHomeController.class, getLocale(), getTranslator())); @@ -167,9 +170,9 @@ public class FileMediaController extends BasicController implements PageElementE DocEditorSecurityCallback viewSC = DocEditorSecurityCallbackBuilder.builder().withMode(Mode.VIEW).build(); if (isEditingExcluded()) { return null; - } else if (editMode && docEditorService.hasEditor(vfsLeaf, getIdentity(), editSC)) { + } else if (editMode && docEditorService.hasEditor(getIdentity(), roles, vfsLeaf, editSC)) { return editSC; - } else if (docEditorService.hasEditor(vfsLeaf, getIdentity(), viewSC)) { + } else if (docEditorService.hasEditor(getIdentity(), roles, vfsLeaf, viewSC)) { return viewSC; } return null; diff --git a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java index dc923330c2504f3f7546292e9cb959232f828686..192663b1c699ca4eba01a480f73a4302a08bdef5 100644 --- a/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java +++ b/src/main/java/org/olat/repository/controllers/ReferencableEntriesSearchController.java @@ -147,7 +147,7 @@ public class ReferencableEntriesSearchController extends BasicController { List<String> creatorTypes = new ArrayList<>(limitTypes.length); for(String limitType:limitTypes) { RepositoryHandler handler = repositoryHandlerFactory.getRepositoryHandler(limitType); - if(handler.supportCreate()) { + if(handler.supportCreate(getIdentity(), ureq.getUserSession().getRoles())) { creatorTypes.add(limitType); } } diff --git a/src/main/java/org/olat/repository/handlers/BlogHandler.java b/src/main/java/org/olat/repository/handlers/BlogHandler.java index fa84d3e3ed80afef1c908d97a56c926065d3b082..79f5bf3265e532491e440a225f05ae4c5db0581d 100644 --- a/src/main/java/org/olat/repository/handlers/BlogHandler.java +++ b/src/main/java/org/olat/repository/handlers/BlogHandler.java @@ -79,7 +79,7 @@ import org.olat.resource.references.ReferenceManager; public class BlogHandler implements RepositoryHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -251,7 +251,7 @@ public class BlogHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/handlers/CourseHandler.java b/src/main/java/org/olat/repository/handlers/CourseHandler.java index bc25227b001c56091c0f834799ec391851adeb4a..4deba24665c3d081c69513d7f4e9eda60836d8e0 100644 --- a/src/main/java/org/olat/repository/handlers/CourseHandler.java +++ b/src/main/java/org/olat/repository/handlers/CourseHandler.java @@ -135,7 +135,7 @@ public class CourseHandler implements RepositoryHandler { private static final Logger log = Tracing.createLoggerFor(CourseHandler.class); @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -521,7 +521,7 @@ public class CourseHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.yes; } diff --git a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java index 8860b59066c181f382937fa14035b3b9eab0f907..5d6b1689a0e888e4208c48743881c0f8600adc60 100644 --- a/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java +++ b/src/main/java/org/olat/repository/handlers/DocumentEditorDelegate.java @@ -37,6 +37,7 @@ import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; import org.olat.core.id.Identity; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.util.FileUtils; import org.olat.core.util.vfs.LocalFileImpl; @@ -73,13 +74,13 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc } @Override - public boolean supportCreate() { - return canEdit(); + public boolean supportCreate(Identity identity, Roles roles) { + return canEdit(identity, roles); } - private boolean canEdit() { + private boolean canEdit(Identity identity, Roles roles) { DocumentEditorService docEditorService = CoreSpringFactory.getImpl(DocumentEditorService.class); - return docEditorService.hasEditor(type.getSuffix(), Mode.EDIT, true); + return docEditorService.hasEditor(identity, roles, type.getSuffix(), Mode.EDIT, true); } @Override @@ -100,8 +101,8 @@ public class DocumentEditorDelegate implements WebDocumentCreateDelegate, WebDoc } @Override - public EditionSupport supportsEdit() { - return canEdit()? EditionSupport.yes: EditionSupport.no; + public EditionSupport supportsEdit(Identity identity, Roles roles) { + return canEdit(identity, roles)? EditionSupport.yes: EditionSupport.no; } @Override diff --git a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java index c3ec77c6c48818444a227e216a650e335548e9c8..a106206acbd786ce6105bff9e37a6681bd2263df 100644 --- a/src/main/java/org/olat/repository/handlers/GlossaryHandler.java +++ b/src/main/java/org/olat/repository/handlers/GlossaryHandler.java @@ -87,7 +87,7 @@ public class GlossaryHandler implements RepositoryHandler { public static final String PROCESS_UPLOAD = "pu"; @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -177,7 +177,7 @@ public class GlossaryHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java index f8f4ea5896f51fceb1ce00b01065d64b2ed8d3b3..5934f00048886968773c077b8fd96e6f8fea4990 100644 --- a/src/main/java/org/olat/repository/handlers/ImsCPHandler.java +++ b/src/main/java/org/olat/repository/handlers/ImsCPHandler.java @@ -45,6 +45,7 @@ import org.olat.core.gui.translator.Translator; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.util.FileUtils; import org.olat.core.util.Util; @@ -87,7 +88,7 @@ import org.olat.resource.OLATResourceManager; public class ImsCPHandler extends FileHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -201,7 +202,7 @@ public class ImsCPHandler extends FileHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.yes; } diff --git a/src/main/java/org/olat/repository/handlers/PodcastHandler.java b/src/main/java/org/olat/repository/handlers/PodcastHandler.java index 158d1aeb5b5a0e2b031989673836314a29043ee0..807ef8123af795be1b6a4ff6191172bc2705667d 100644 --- a/src/main/java/org/olat/repository/handlers/PodcastHandler.java +++ b/src/main/java/org/olat/repository/handlers/PodcastHandler.java @@ -79,7 +79,7 @@ import org.olat.resource.references.ReferenceManager; public class PodcastHandler implements RepositoryHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -251,7 +251,7 @@ public class PodcastHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java index bd3b68814cd2c4dd2cbc6d38774290562e0724c4..a7b681ea3c6f1a3f6e434b049c95e7dac033854f 100644 --- a/src/main/java/org/olat/repository/handlers/PortfolioHandler.java +++ b/src/main/java/org/olat/repository/handlers/PortfolioHandler.java @@ -84,7 +84,7 @@ public class PortfolioHandler implements RepositoryHandler { private static final Logger log = Tracing.createLoggerFor(PortfolioHandler.class); @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return false; } @@ -182,7 +182,7 @@ public class PortfolioHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java index 390995eea7cdbf637077525d457447b67e0750f7..647852f3d30a617f4f2a0b2e20735192c0b1315f 100644 --- a/src/main/java/org/olat/repository/handlers/RepositoryHandler.java +++ b/src/main/java/org/olat/repository/handlers/RepositoryHandler.java @@ -48,13 +48,12 @@ import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.repository.ui.author.CreateEntryController; import org.olat.repository.ui.author.CreateRepositoryEntryController; - /** - * Initial Date: Apr 5, 2004 + * Initial Date: Apr 5, 2004 * * @author Mike Stock * - * Comment: + * Comment: * */ public interface RepositoryHandler { @@ -63,30 +62,35 @@ public interface RepositoryHandler { * @return Return the typeNames of OLATResourceable this Handler can handle. */ public String getSupportedType(); - + /** * This resource support creation within OpenOLAT. + * + * @param identity Identity who wants to create the the resource + * @param roles Roles of the identity who wants to create the the resource * @return */ - public boolean supportCreate(); - + public boolean supportCreate(Identity identity, Roles roles); + public String getCreateLabelI18nKey(); - - public RepositoryEntry createResource(Identity initialAuthor, String displayname, String description, Object createObject, Organisation organisation, Locale locale); - + + public RepositoryEntry createResource(Identity initialAuthor, String displayname, String description, + Object createObject, Organisation organisation, Locale locale); + /** * Typically for course wizard + * * @return */ public boolean isPostCreateWizardAvailable(); - + /** * This resource support import of files. * * @return */ public boolean supportImport(); - + /** * * @param file @@ -94,30 +98,32 @@ public interface RepositoryHandler { * @return */ public ResourceEvaluation acceptImport(File file, String filename); - + /** * This resource support import with an URL. + * * @return */ public boolean supportImportUrl(); - + public ResourceEvaluation acceptImport(String url); - + /** * * @param initialAuthor - * @param initialAuthorAlt + * @param initialAuthorAlt * @param displayname * @param description - * @param withReferences if true import references + * @param withReferences if true import references * @param locale * @param file * @param filename * @return */ public RepositoryEntry importResource(Identity initialAuthor, String initialAuthorAlt, String displayname, - String description, boolean withReferences, Organisation organisation, Locale locale, File file, String filename); - + String description, boolean withReferences, Organisation organisation, Locale locale, File file, + String filename); + public RepositoryEntry importResource(Identity initialAuthor, String initialAuthorAlt, String displayname, String description, Organisation organisation, Locale locale, String url); @@ -128,27 +134,33 @@ public interface RepositoryHandler { * @return The target repository entry */ public RepositoryEntry copy(Identity author, RepositoryEntry source, RepositoryEntry target); - + /** * @return true if this handler supports donwloading Resourceables of its type. */ public boolean supportsDownload(); /** - * @return true if this handler supports an editor for Resourceables of its type. + * @param resource the reource to edit + * @param identity Identity who wants to edit the the resource + * @param roles Roles of the identity who wants to edit the the resource + * @return true if this handler supports an editor for Resourceables of its + * type. */ - public EditionSupport supportsEdit(OLATResourceable resource); - + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles); + /** - * If the resource handler can deliver an assessment details controller, - * it returns true. + * If the resource handler can deliver an assessment details controller, it + * returns true. + * * @return */ public boolean supportsAssessmentDetails(); - + /** - * Return the container where image and files can be saved for the description field. - * the folder MUST be under the root folder has its name "media". + * Return the container where image and files can be saved for the description + * field. the folder MUST be under the root folder has its name "media". + * * @param repoEntry * @return */ @@ -156,38 +168,48 @@ public interface RepositoryHandler { /** * Called if a user launches a Resourceable that this handler can handle. - * @param reSecurity The permissions wrapper + * + * @param reSecurity The permissions wrapper * @param ureq * @param wControl * @param res - * @param initialViewIdentifier if null the default view will be started, otherwise a controllerfactory type dependant view will be activated (subscription subtype) + * @param initialViewIdentifier if null the default view will be started, + * otherwise a controllerfactory type dependant + * view will be activated (subscription subtype) * @return Controller able to launch resourceable. */ - public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, UserRequest ureq, WindowControl wControl); - + public MainLayoutController createLaunchController(RepositoryEntry re, RepositoryEntrySecurity reSecurity, + UserRequest ureq, WindowControl wControl); + /** - * Called if a user wants to edit a Resourceable that this handler can provide an editor for. - * (it is given here that this method - * can only be called when the current user is either olat admin or in the owning group of this resource + * Called if a user wants to edit a Resourceable that this handler can provide + * an editor for. (it is given here that this method can only be called when the + * current user is either olat admin or in the owning group of this resource + * * @param ureq * @param wControl * @param toolbar * @param res * @return Controler able to edit resourceable. */ - public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar); - + public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, + TooledStackedPanel toolbar); + /** * Called if a user wants to create a Resourceable via wizard. + * * @param res * @param ureq * @param wControl * @return Controller that guides trough the creation workflow via wizard. */ - public StepsMainRunController createWizardController(OLATResourceable res, UserRequest ureq, WindowControl wControl); - + public StepsMainRunController createWizardController(OLATResourceable res, UserRequest ureq, + WindowControl wControl); + /** - * Called if a user wants to open the create repository entry dialog for a Resourceable + * Called if a user wants to open the create repository entry dialog for a + * Resourceable + * * @param ureq * @param wControl * @return Controller able to create resourceable. @@ -195,7 +217,7 @@ public interface RepositoryHandler { default CreateEntryController createCreateRepositoryEntryController(UserRequest ureq, WindowControl wControl) { return new CreateRepositoryEntryController(ureq, wControl, this); } - + /** * Return the details controller for the assessed identity. * @@ -206,19 +228,23 @@ public interface RepositoryHandler { * @param assessedIdentity * @return */ - public Controller createAssessmentDetailsController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar, Identity assessedIdentity); - + public Controller createAssessmentDetailsController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, + TooledStackedPanel toolbar, Identity assessedIdentity); + /** * Called if a user downloads a Resourceable that this handler can handle. + * * @param res The OLAT resource * @return MediaResource delivering resourceable. */ public MediaResource getAsMediaResource(OLATResourceable res); - + /** - * Called if the repository entry referencing the given Resourceable will be deleted - * from the repository. Do any necessary cleanup work specific to this handler's type. - * The handler is responsible for deleting the resourceable as well. + * Called if the repository entry referencing the given Resourceable will be + * deleted from the repository. Do any necessary cleanup work specific to this + * handler's type. The handler is responsible for deleting the resourceable as + * well. + * * @param res * @param ureq * @param wControl @@ -227,9 +253,10 @@ public interface RepositoryHandler { public boolean cleanupOnDelete(RepositoryEntry entry, OLATResourceable res); /** - * Called if the repository entry referencing the given Resourceable will be deleted - * from the repository. Return status whether to proceed with the delete action. If - * this method returns false, the entry will not be deleted. + * Called if the repository entry referencing the given Resourceable will be + * deleted from the repository. Return status whether to proceed with the delete + * action. If this method returns false, the entry will not be deleted. + * * @param res * @param identity * @param roles @@ -237,36 +264,39 @@ public interface RepositoryHandler { * @param errors * @return true if ressource is ready to delete, false if not. */ - public boolean readyToDelete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale, ErrorList errors); - + public boolean readyToDelete(RepositoryEntry entry, Identity identity, Roles roles, Locale locale, + ErrorList errors); + /** * Acquires lock for the input ores and identity. + * * @param ores * @param identity * @return the LockResult or null if no locking supported. */ public LockResult acquireLock(OLATResourceable ores, Identity identity); - + /** * Releases the lock. * * @param lockResult the LockResult received when locking */ public void releaseLock(LockResult lockResult); - + /** * * @param ores * @return */ - public boolean isLocked(OLATResourceable ores); - + public boolean isLocked(OLATResourceable ores); + /** * Called when the repository entry of that Resourceable changed. - * @param entry + * + * @param entry */ default public void onDescriptionChanged(RepositoryEntry entry) { // nothing to do } - + } diff --git a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java index 5deb3ade6982e195424176597e4f19e23c1a41a4..30670d0d3e82577f99c59691710a9658c25be4bf 100644 --- a/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java +++ b/src/main/java/org/olat/repository/handlers/SCORMCPHandler.java @@ -41,6 +41,7 @@ import org.olat.core.gui.media.ZippedDirectoryMediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.logging.activity.ThreadLocalUserActivityLogger; import org.olat.core.util.FileUtils; @@ -73,7 +74,7 @@ import org.olat.util.logging.activity.LoggingResourceable; public class SCORMCPHandler extends FileHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return false; } @@ -175,7 +176,7 @@ public class SCORMCPHandler extends FileHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.no; } diff --git a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java index 4757dc43463400ea1c4a6ad4cf3c85cc5465d15a..9b3bc1adfdd212d459b35fdcffe4db93b1afcc7e 100644 --- a/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java +++ b/src/main/java/org/olat/repository/handlers/SharedFolderHandler.java @@ -77,7 +77,7 @@ import org.olat.resource.references.ReferenceManager; public class SharedFolderHandler implements RepositoryHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return true; } @@ -156,7 +156,7 @@ public class SharedFolderHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/handlers/VideoHandler.java b/src/main/java/org/olat/repository/handlers/VideoHandler.java index 3decc1c7eaae25f74ab7d8f4c4090f57478ef2ca..f627e55aafac08cacaabcf9877a395ba613cc4e2 100644 --- a/src/main/java/org/olat/repository/handlers/VideoHandler.java +++ b/src/main/java/org/olat/repository/handlers/VideoHandler.java @@ -40,6 +40,7 @@ import org.olat.core.gui.media.NotFoundMediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; @@ -88,7 +89,7 @@ public class VideoHandler extends FileHandler { private RepositoryService repositoryService; @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return false; } @@ -227,7 +228,7 @@ public class VideoHandler extends FileHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.no; } diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java b/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java index 3ff2ee0bc8b1857c9278e882f974a4d2aacd4e90..767d8e0ba76d7382846fc2f18791b710e26f7ac1 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentCreateDelegate.java @@ -23,6 +23,7 @@ import java.util.Locale; import org.olat.core.id.Identity; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.repository.RepositoryEntry; /** @@ -33,7 +34,7 @@ import org.olat.repository.RepositoryEntry; */ public interface WebDocumentCreateDelegate { - public boolean supportCreate(); + public boolean supportCreate(Identity identity, Roles roles); public String getCreateLabelI18nKey(); diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java b/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java index 1d54e89301886f9db39a6c4324206f2488a45908..81596c29b4684dd0bae7d5f99b48809618a80c76 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentEditDelegate.java @@ -23,6 +23,8 @@ import org.olat.core.gui.UserRequest; import org.olat.core.gui.components.stack.TooledStackedPanel; import org.olat.core.gui.control.Controller; import org.olat.core.gui.control.WindowControl; +import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.repository.RepositoryEntry; /** @@ -33,7 +35,7 @@ import org.olat.repository.RepositoryEntry; */ public interface WebDocumentEditDelegate { - public EditionSupport supportsEdit(); + public EditionSupport supportsEdit(Identity identity, Roles roles); public Controller createEditorController(RepositoryEntry re, UserRequest ureq, WindowControl wControl, TooledStackedPanel toolbar); diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java index 75a98cfde5c1d7620b88f7f52fb9ea5acdb49833..ecdac318ca43adaf7f7668859470bec68daf2fd9 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java @@ -31,6 +31,7 @@ import java.nio.file.Files; import java.nio.file.StandardCopyOption; import java.util.Locale; +import org.apache.logging.log4j.Logger; import org.olat.core.CoreSpringFactory; import org.olat.core.commons.persistence.DBFactory; import org.olat.core.gui.UserRequest; @@ -43,8 +44,8 @@ import org.olat.core.gui.media.MediaResource; import org.olat.core.id.Identity; import org.olat.core.id.OLATResourceable; import org.olat.core.id.Organisation; +import org.olat.core.id.Roles; import org.olat.core.logging.AssertException; -import org.apache.logging.log4j.Logger; import org.olat.core.logging.Tracing; import org.olat.core.util.FileUtils; import org.olat.core.util.StringHelper; @@ -97,8 +98,8 @@ public class WebDocumentHandler extends FileHandler { } @Override - public boolean supportCreate() { - return createDelegate.supportCreate(); + public boolean supportCreate(Identity identity, Roles roles) { + return createDelegate.supportCreate(identity, roles); } @Override @@ -235,8 +236,8 @@ public class WebDocumentHandler extends FileHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { - return editDelegate.supportsEdit(); + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { + return editDelegate.supportsEdit(identity, roles); } @Override @@ -304,7 +305,7 @@ public class WebDocumentHandler extends FileHandler { private static class NullCreateDelegate implements WebDocumentCreateDelegate { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return false; } @@ -324,7 +325,7 @@ public class WebDocumentHandler extends FileHandler { private static class NullEditDelegate implements WebDocumentEditDelegate { @Override - public EditionSupport supportsEdit() { + public EditionSupport supportsEdit(Identity identity, Roles roles) { return EditionSupport.no; } diff --git a/src/main/java/org/olat/repository/handlers/WikiHandler.java b/src/main/java/org/olat/repository/handlers/WikiHandler.java index cea1e1cf5a67c975d40575af403994d13552e679..37930e695c3c85830b0cc05a61c983f2cd016ac0 100644 --- a/src/main/java/org/olat/repository/handlers/WikiHandler.java +++ b/src/main/java/org/olat/repository/handlers/WikiHandler.java @@ -91,7 +91,7 @@ import org.olat.resource.references.ReferenceManager; public class WikiHandler implements RepositoryHandler { @Override - public boolean supportCreate() { + public boolean supportCreate(Identity identity, Roles roles) { return CoreSpringFactory.getImpl(WikiModule.class).isWikiEnabled(); } @@ -178,7 +178,7 @@ public class WikiHandler implements RepositoryHandler { } @Override - public EditionSupport supportsEdit(OLATResourceable resource) { + public EditionSupport supportsEdit(OLATResourceable resource, Identity identity, Roles roles) { return EditionSupport.embedded; } diff --git a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java index 78bbb656f9fa730c6af63addd5cc01cba8d718ea..1006254e1c75c476a9f8083f2f2cad30aabd64e1 100644 --- a/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java +++ b/src/main/java/org/olat/repository/ui/RepositoryEntryRuntimeController.java @@ -405,7 +405,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController } protected void initToolsMenuEditor(Dropdown toolsDropdown) { - if (reSecurity.isEntryAdmin() && handler.supportsEdit(re.getOlatResource()) == EditionSupport.yes) { + if (reSecurity.isEntryAdmin() && handler.supportsEdit(re.getOlatResource(), getIdentity(), roles) == EditionSupport.yes) { toolsDropdown.addComponent(new Spacer("editors-tools")); boolean managed = RepositoryEntryManagedFlag.isManaged(getRepositoryEntry(), RepositoryEntryManagedFlag.editcontent); @@ -496,7 +496,7 @@ public class RepositoryEntryRuntimeController extends MainLayoutBasicController if(entries != null && !entries.isEmpty()) { String type = entries.get(0).getOLATResourceable().getResourceableTypeName(); if("Editor".equalsIgnoreCase(type)) { - if(handler.supportsEdit(re) == EditionSupport.yes + if(handler.supportsEdit(re, ureq.getIdentity(), ureq.getUserSession().getRoles()) == EditionSupport.yes && re.getEntryStatus() != RepositoryEntryStatusEnum.closed) { doEdit(ureq); } diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java index 46ca748a839d12997d2d61e7648bb1d260dc4627..17bc1fc539a89c81a155a6f187dd693fa46af2da 100644 --- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -102,7 +102,7 @@ public class WebDocumentRunController extends BasicController { mainVC.contextPut("height", 480); mainVC.contextPut("width", 640); } - } else if (docEditorService.hasEditor(extension, Mode.VIEW, true)) { + } else if (docEditorService.hasEditor(getIdentity(), ureq.getUserSession().getRoles(), extension, Mode.VIEW, true)) { DocEditorSecurityCallback secCallback = DocEditorSecurityCallbackBuilder.builder() .withMode(Mode.VIEW) .canClose(false) diff --git a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java index 7ba5f4c28c34044e6451ea25f57824c037650aaf..67cb8c728eb6c5f6296471d81bab7712e93c4e9a 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorDeletedListController.java @@ -74,7 +74,7 @@ public class AuthorDeletedListController extends AuthorListController { } @Override - protected void initTools() { + protected void initTools(UserRequest ureq) { // } diff --git a/src/main/java/org/olat/repository/ui/author/AuthorListController.java b/src/main/java/org/olat/repository/ui/author/AuthorListController.java index 243f37ad9640c8f5c7a01b05f4eaa6a927533233..7a1d59d61567d3233261f7887f415099bf310be3 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthorListController.java +++ b/src/main/java/org/olat/repository/ui/author/AuthorListController.java @@ -212,10 +212,10 @@ public class AuthorListController extends FormBasicController implements Activat stackPanel = new TooledStackedPanel(i18nName, getTranslator(), this); stackPanel.pushController(translate(i18nName), this); - initTools(); + initTools(ureq); } - protected void initTools() { + protected void initTools(UserRequest ureq) { if(!withSearch && hasAuthorRight) { importLink = LinkFactory.createLink("cmd.import.ressource", getTranslator(), this); importLink.setDomReplacementWrapperRequired(false); @@ -237,7 +237,7 @@ public class AuthorListController extends FormBasicController implements Activat for(OrderedRepositoryHandler orderedHandler:handlers) { RepositoryHandler handler = orderedHandler.getHandler(); - if(handler != null && handler.supportCreate()) { + if(handler != null && handler.supportCreate(getIdentity(), ureq.getUserSession().getRoles())) { // for each 10-group, create a separator int group = orderedHandler.getOrder() / 10; if (group > lastGroup) { @@ -350,7 +350,7 @@ public class AuthorListController extends FormBasicController implements Activat initActionsColumns(columnsModel); - model = new AuthoringEntryDataModel(dataSource, columnsModel); + model = new AuthoringEntryDataModel(dataSource, columnsModel, getIdentity(), ureq.getUserSession().getRoles()); tableEl = uifactory.addTableElement(getWindowControl(), "table", model, 20, false, getTranslator(), formLayout); tableEl.setSearchEnabled(withSearch); tableEl.setCssDelegate(this); diff --git a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java index 5b37e2dcf8c56c916e249bc805bc904cc6c8e53c..38e467ed8feedccacc98af64812404c808c61450 100644 --- a/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java +++ b/src/main/java/org/olat/repository/ui/author/AuthoringEntryDataModel.java @@ -25,6 +25,8 @@ import java.util.List; import org.olat.core.CoreSpringFactory; import org.olat.core.gui.components.form.flexible.impl.elements.table.DefaultFlexiTableDataSourceModel; import org.olat.core.gui.components.form.flexible.impl.elements.table.FlexiTableColumnModel; +import org.olat.core.id.Identity; +import org.olat.core.id.Roles; import org.olat.repository.RepositoryEntryStatusEnum; import org.olat.repository.handlers.EditionSupport; import org.olat.repository.handlers.RepositoryHandler; @@ -39,15 +41,20 @@ import org.olat.repository.handlers.RepositoryHandlerFactory; class AuthoringEntryDataModel extends DefaultFlexiTableDataSourceModel<AuthoringEntryRow> { private final RepositoryHandlerFactory handlerFactory; + private Identity identity; + private Roles roles; - public AuthoringEntryDataModel(AuthoringEntryDataSource source, FlexiTableColumnModel columnModel) { + public AuthoringEntryDataModel(AuthoringEntryDataSource source, FlexiTableColumnModel columnModel, + Identity identity, Roles roles) { super(source, columnModel); + this.identity = identity; + this.roles = roles; handlerFactory = CoreSpringFactory.getImpl(RepositoryHandlerFactory.class); } @Override public DefaultFlexiTableDataSourceModel<AuthoringEntryRow> createCopyWithEmptyList() { - return new AuthoringEntryDataModel(getSourceDelegate(), getTableColumnModel()); + return new AuthoringEntryDataModel(getSourceDelegate(), getTableColumnModel(), identity, roles); } public boolean isAuthoringEntryRowLoaded(List<Long> repoEntryKeys) { @@ -126,7 +133,7 @@ class AuthoringEntryDataModel extends DefaultFlexiTableDataSourceModel<Authoring if(handler == null) { return Boolean.FALSE; } - if(handler.supportsEdit(item.getOLATResourceable()) == EditionSupport.no) { + if(handler.supportsEdit(item.getOLATResourceable(), identity, roles) == EditionSupport.no) { return Boolean.FALSE; } RepositoryEntryStatusEnum status = item.getEntryStatus(); diff --git a/src/main/resources/serviceconfig/olat.properties b/src/main/resources/serviceconfig/olat.properties index b5c6b99120347bb88a844cb338fc8bdb18527c93..0e7e02f7e4322bc8517c04fd4f071284cc07e8ca 100644 --- a/src/main/resources/serviceconfig/olat.properties +++ b/src/main/resources/serviceconfig/olat.properties @@ -1476,6 +1476,10 @@ edusharing.auth.affiliation.name=${instance.id} collabora.enabled=false collabora.baseUrl=https://collabora.example.org/ collabora.data.transfer.confirmation.enabled=false +collabora.usage.restricted=false +collabora.usage.restricted.authors=false +collabora.usage.restricted.coaches=false +collabora.usage.restricted.managers=false ######################################## @@ -1485,6 +1489,10 @@ onlyoffice.enabled=false onlyoffice.baseUrl=https://onlyoffice.example.org/ onlyoffice.api.path=web-apps/apps/api/documents/api.js onlyoffice.data.transfer.confirmation.enabled=false +onlyoffice.usage.restricted=false +onlyoffice.usage.restricted.authors=false +onlyofficeusage.restricted.coaches=false +onlyoffice.usage.restricted.managers=false ######################################## @@ -1493,6 +1501,10 @@ onlyoffice.data.transfer.confirmation.enabled=false office365.enabled=false office365.baseUrl=https://office365.example.org/ office365.data.transfer.confirmation.enabled=false +office365.usage.restricted=false +office365.usage.restricted.authors=false +office365.usage.restricted.coaches=false +office365.usage.restricted.managers=false ########################################