From 33afb8c71f8517d1fa4ee536b1c82368e54e915e Mon Sep 17 00:00:00 2001
From: uhensler <urs.hensler@frentix.com>
Date: Mon, 25 Mar 2019 10:31:00 +0100
Subject: [PATCH] OO-3940: Show documents in read-only modus for participants

---
 .../vfs/VFSLeafEditorSecurityCallback.java    |  4 +++-
 .../VFSLeafEditorSecurityCallbackBuilder.java | 23 +++++++++++++++++++
 .../java/org/olat/modules/wopi/Access.java    |  2 ++
 .../collabora/restapi/FilesWebService.java    |  2 +-
 .../modules/wopi/manager/WopiServiceImpl.java |  1 +
 .../olat/modules/wopi/model/AccessImpl.java   | 10 ++++++++
 .../handlers/WebDocumentHandler.java          |  3 ++-
 .../ui/WebDocumentRunController.java          |  8 +++++--
 8 files changed, 48 insertions(+), 5 deletions(-)

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 c81a818eba8..629f5530720 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 8ee811317a0..2743ff8f2f8 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 9abdae909b8..5fd9fcdc349 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 99b62241d53..0d4a8745c9a 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 72410926553..d9074cd0fa0 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 bcab568e8ff..db13cba570f 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 0c33500ff7b..9b4165cf806 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 b044ea53198..c084aab2f57 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);
-- 
GitLab