diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java b/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java index c81a818eba8c01d11f0136a75d933cee9485f545..629f55307208271ecd9b38cb82a7051a2eb087d1 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java +++ b/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallback.java @@ -27,6 +27,8 @@ package org.olat.core.commons.services.vfs; */ public interface VFSLeafEditorSecurityCallback { - boolean canClose(); + boolean canEdit(); + boolean canClose(); + } diff --git a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java b/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java index 8ee811317a05e3943ce02a19ce21f41389a55598..2743ff8f2f8cdb7698e152aa173694dd1e0ee8e1 100644 --- a/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java +++ b/src/main/java/org/olat/core/commons/services/vfs/VFSLeafEditorSecurityCallbackBuilder.java @@ -27,8 +27,20 @@ package org.olat.core.commons.services.vfs; */ public class VFSLeafEditorSecurityCallbackBuilder { + private boolean canEdit = true; private boolean canClose = true; + /** + * Default: true + * + * @param canEdit + * @return + */ + public VFSLeafEditorSecurityCallbackBuilder canEdit(boolean canEdit) { + this.canEdit = canEdit; + return this; + } + /** * Default: true * @@ -42,6 +54,7 @@ public class VFSLeafEditorSecurityCallbackBuilder { public VFSLeafEditorSecurityCallback build() { VFSLeafEditorSecurityCallbackImpl secCallback = new VFSLeafEditorSecurityCallbackImpl(); + secCallback.setCanEdit(this.canEdit); secCallback.setCanClose(this.canClose); return secCallback; } @@ -55,8 +68,18 @@ public class VFSLeafEditorSecurityCallbackBuilder { private static class VFSLeafEditorSecurityCallbackImpl implements VFSLeafEditorSecurityCallback { + private boolean canEdit; private boolean canClose; + @Override + public boolean canEdit() { + return canEdit; + } + + private void setCanEdit(boolean canEdit) { + this.canEdit = canEdit; + } + @Override public boolean canClose() { return canClose; diff --git a/src/main/java/org/olat/modules/wopi/Access.java b/src/main/java/org/olat/modules/wopi/Access.java index 9abdae909b86fa096b8fbedd7143b8ccb6e816f0..5fd9fcdc3495547ad5f6a91c50eec5c46d2b551d 100644 --- a/src/main/java/org/olat/modules/wopi/Access.java +++ b/src/main/java/org/olat/modules/wopi/Access.java @@ -38,6 +38,8 @@ public interface Access { VFSMetadata getVfsMetadata(); + boolean canEdit(); + boolean canClose(); } diff --git a/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java b/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java index 99b62241d539d097e1f093fbfc6421e9634e5f17..0d4a8745c9a3d59a0cf0d131f199e858f4b92bc2 100644 --- a/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java +++ b/src/main/java/org/olat/modules/wopi/collabora/restapi/FilesWebService.java @@ -111,7 +111,7 @@ public class FilesWebService { .withUserFriendlyName(userManager.getUserDisplayName(access.getIdentity())) .withVersion(UUID.randomUUID().toString()) .withLastModifiedTime(getAsIso6801(metadata.getLastModified())) - .withUserCanWrite(Boolean.TRUE) + .withUserCanWrite(access.canEdit()) .withDisablePrint(Boolean.FALSE) .withUserCanNotWriteRelative(Boolean.TRUE) .build(); diff --git a/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java b/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java index 72410926553c1625f849ca02c2d94b85f986c6df..d9074cd0fa0aa34b8af2c8175dbf2f8525271606 100644 --- a/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java +++ b/src/main/java/org/olat/modules/wopi/manager/WopiServiceImpl.java @@ -105,6 +105,7 @@ public class WopiServiceImpl implements WopiService { access.setToken(token); access.setFileId(fileId); access.setIdentity(identity); + access.setCanEdit(secCallback.canEdit()); access.setCanClose(secCallback.canClose()); accessCache.put(token, access); return access; diff --git a/src/main/java/org/olat/modules/wopi/model/AccessImpl.java b/src/main/java/org/olat/modules/wopi/model/AccessImpl.java index bcab568e8ff1a3dacb1b76725747965f57f9a72d..db13cba570f0f46d2cf97ff2ff8ac6a47f830d8f 100644 --- a/src/main/java/org/olat/modules/wopi/model/AccessImpl.java +++ b/src/main/java/org/olat/modules/wopi/model/AccessImpl.java @@ -34,6 +34,7 @@ public class AccessImpl implements Access { private String fileId; private String token; private Identity identity; + private boolean canEdit; private boolean canClose; private VFSMetadata vfsMetadata; @@ -64,6 +65,15 @@ public class AccessImpl implements Access { this.identity = identity; } + @Override + public boolean canEdit() { + return canEdit; + } + + public void setCanEdit(boolean canEdit) { + this.canEdit = canEdit; + } + @Override public boolean canClose() { return canClose; diff --git a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java index 0c33500ff7bd2a91c06f07a6570c9415a0c8e538..9b4165cf8069cd22326ab42adf79023518c15e86 100644 --- a/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java +++ b/src/main/java/org/olat/repository/handlers/WebDocumentHandler.java @@ -249,7 +249,7 @@ public class WebDocumentHandler extends FileHandler { RepositoryEntry entry, RepositoryEntrySecurity rereSecurity, AssessmentMode assessmentMode) { CoreSpringFactory.getImpl(UserCourseInformationsManager.class) .updateUserCourseInformations(entry.getOlatResource(), uureq.getIdentity()); - return new WebDocumentRunController(uureq, wwControl, entry); + return new WebDocumentRunController(uureq, wwControl, entry, reSecurity); } }); } @@ -264,6 +264,7 @@ public class WebDocumentHandler extends FileHandler { return null; } + @Override protected String getDeletedFilePrefix() { return "del_webdoc_"; } diff --git a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java index b044ea53198a27dea067c8d446e6d857a58e8dc4..c084aab2f57e235e03d69f9ed876a9f0e225eb62 100644 --- a/src/main/java/org/olat/repository/ui/WebDocumentRunController.java +++ b/src/main/java/org/olat/repository/ui/WebDocumentRunController.java @@ -51,6 +51,7 @@ import org.olat.core.util.vfs.VFSMediaResource; import org.olat.core.util.vfs.filters.VFSSystemItemFilter; import org.olat.fileresource.FileResourceManager; import org.olat.repository.RepositoryEntry; +import org.olat.repository.model.RepositoryEntrySecurity; import org.olat.resource.OLATResource; import org.springframework.beans.factory.annotation.Autowired; @@ -67,7 +68,8 @@ public class WebDocumentRunController extends BasicController { @Autowired private MovieService movieService; - public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry) { + public WebDocumentRunController(UserRequest ureq, WindowControl wControl, RepositoryEntry entry, + RepositoryEntrySecurity reSecurity) { super(ureq, wControl); VelocityContainer mainVC = createVelocityContainer("web_content"); @@ -100,10 +102,12 @@ public class WebDocumentRunController extends BasicController { mainVC.contextPut("width", 640); } } else if (vfsService.hasEditor(extension)) { + VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder() + .canEdit(reSecurity.isOwner() || reSecurity.isCoach()) + .build(); List<VFSLeafEditor> editors = vfsService.getEditors(document); if (editors.size() >= 1) { VFSLeafEditor editor = editors.get(0); - VFSLeafEditorSecurityCallback secCallback = VFSLeafEditorSecurityCallbackBuilder.builder().build(); // FolderComponent should be initialized to be safe. As of today the internal // editor does not support these file types. Controller editCtrl = editor.getRunController(ureq, wControl, document, null, getIdentity(), secCallback);