From c5eb9d4ee13857f1ea74a47d1ff1a8d30355c2d5 Mon Sep 17 00:00:00 2001
From: srosse <none@none>
Date: Fri, 10 May 2013 15:33:26 +0200
Subject: [PATCH] OO-605: add a method in the VFS security callback to allow to
 create folder or not, disallow it for task > assignement

---
 .../collaboration/CollaborationTools.java     |  5 ++++
 .../components/FolderComponentRenderer.java   | 29 ++++++++++++-------
 .../vfs/callbacks/FullAccessCallback.java     |  5 ++++
 .../FullAccessWithQuotaCallback.java          |  5 ++++
 .../util/vfs/callbacks/ReadOnlyCallback.java  |  5 ++++
 .../vfs/callbacks/VFSSecurityCallback.java    |  6 ++++
 .../VFSWebServiceSecurityCallback.java        |  5 ++++
 .../course/nodes/bc/FolderNodeCallback.java   |  5 ++++
 .../ProjectBrokerCourseEditorController.java  |  5 ++++
 ...ectBrokerDropboxScoringViewController.java |  3 ++
 .../ta/DropboxScoringViewController.java      |  4 +++
 .../nodes/ta/TACourseNodeEditController.java  |  5 ++++
 .../SharedFolderSecurityCallback.java         |  5 ++++
 13 files changed, 76 insertions(+), 11 deletions(-)

diff --git a/src/main/java/org/olat/collaboration/CollaborationTools.java b/src/main/java/org/olat/collaboration/CollaborationTools.java
index 069ed53bb32..71ab79f992b 100644
--- a/src/main/java/org/olat/collaboration/CollaborationTools.java
+++ b/src/main/java/org/olat/collaboration/CollaborationTools.java
@@ -856,6 +856,11 @@ public class CollaborationTools implements Serializable {
 			return write;
 		}
 
+		@Override
+		public boolean canCreateFolder() {
+			return write;
+		}
+
 		public boolean canDelete() {
 			return write;
 		}
diff --git a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponentRenderer.java b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponentRenderer.java
index bc1645bcd75..84374fc7c12 100644
--- a/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponentRenderer.java
+++ b/src/main/java/org/olat/core/commons/modules/bc/components/FolderComponentRenderer.java
@@ -94,6 +94,11 @@ public class FolderComponentRenderer implements ComponentRenderer {
 		
 		VFSContainer currentContainer = fc.getCurrentContainer();
 		boolean canWrite = currentContainer.canWrite() == VFSConstants.YES;
+		boolean canCreateFolder = true;
+		if(currentContainer.getLocalSecurityCallback() != null && !currentContainer.getLocalSecurityCallback().canCreateFolder()) {
+			canCreateFolder = false;
+		}
+		
 		boolean canDelete = false;
 		boolean canVersion = FolderConfig.versionsEnabled(fc.getCurrentContainer());
 		boolean canMail = fc.isCanMail();
@@ -167,18 +172,20 @@ public class FolderComponentRenderer implements ComponentRenderer {
 				target.append(translator.translate("ul"));			
 				target.append("</a></li>");
 	
-				// option new folder
-				target.append("<li><a class=\"b_briefcase_newfolder\" href=\"");
-				ubu.buildURI(target, new String[] { VelocityContainer.COMMAND_ID }, new String[] { "cf"  }, iframePostEnabled ? AJAXFlags.MODE_TOBGIFRAME : AJAXFlags.MODE_NORMAL);
-				target.append("\"");
-				if (iframePostEnabled) { // add ajax iframe target
-					StringOutput so = new StringOutput();
-					ubu.appendTarget(so);
-					target.append(so.toString());
+				if(canCreateFolder) {
+					// option new folder
+					target.append("<li><a class=\"b_briefcase_newfolder\" href=\"");
+					ubu.buildURI(target, new String[] { VelocityContainer.COMMAND_ID }, new String[] { "cf"  }, iframePostEnabled ? AJAXFlags.MODE_TOBGIFRAME : AJAXFlags.MODE_NORMAL);
+					target.append("\"");
+					if (iframePostEnabled) { // add ajax iframe target
+						StringOutput so = new StringOutput();
+						ubu.appendTarget(so);
+						target.append(so.toString());
+					}
+					target.append(">");
+					target.append(translator.translate("cf"));
+					target.append("</a></li>");
 				}
-				target.append(">");
-				target.append(translator.translate("cf"));
-				target.append("</a></li>");
 	
 				// option new file
 				target.append("<li><a class=\"b_briefcase_newfile\" href=\"");
diff --git a/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessCallback.java b/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessCallback.java
index 2bd18c21f4e..b97736342a4 100644
--- a/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessCallback.java
+++ b/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessCallback.java
@@ -39,6 +39,11 @@ public class FullAccessCallback implements VFSSecurityCallback {
 		return true;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return true;
+	}
+
 	public boolean canDelete() {
 		return true;
 	}
diff --git a/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessWithQuotaCallback.java b/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessWithQuotaCallback.java
index 5101bc327f1..d4dc2e69dd7 100644
--- a/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessWithQuotaCallback.java
+++ b/src/main/java/org/olat/core/util/vfs/callbacks/FullAccessWithQuotaCallback.java
@@ -51,6 +51,11 @@ public class FullAccessWithQuotaCallback implements VFSSecurityCallback {
 		return true;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return true;
+	}
+
 	public boolean canDelete() {
 		return true;
 	}
diff --git a/src/main/java/org/olat/core/util/vfs/callbacks/ReadOnlyCallback.java b/src/main/java/org/olat/core/util/vfs/callbacks/ReadOnlyCallback.java
index 587b6f5d3a9..ecfca7cfece 100644
--- a/src/main/java/org/olat/core/util/vfs/callbacks/ReadOnlyCallback.java
+++ b/src/main/java/org/olat/core/util/vfs/callbacks/ReadOnlyCallback.java
@@ -52,6 +52,11 @@ public class ReadOnlyCallback implements VFSSecurityCallback {
 		return false;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return false;
+	}
+
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/core/util/vfs/callbacks/VFSSecurityCallback.java b/src/main/java/org/olat/core/util/vfs/callbacks/VFSSecurityCallback.java
index 234fd752a9c..152982f470e 100644
--- a/src/main/java/org/olat/core/util/vfs/callbacks/VFSSecurityCallback.java
+++ b/src/main/java/org/olat/core/util/vfs/callbacks/VFSSecurityCallback.java
@@ -51,6 +51,12 @@ public interface VFSSecurityCallback {
 	 * @return True if writing is allowed.
 	 */
 	public boolean canWrite();
+	
+	/**
+	 * 
+	 * @return True if creating new folders is allowed
+	 */
+	public boolean canCreateFolder();
 
 	/**
 	 * @return True if deleting is allowed.
diff --git a/src/main/java/org/olat/core/util/vfs/restapi/VFSWebServiceSecurityCallback.java b/src/main/java/org/olat/core/util/vfs/restapi/VFSWebServiceSecurityCallback.java
index 671038cad48..f3d43b1b3d3 100644
--- a/src/main/java/org/olat/core/util/vfs/restapi/VFSWebServiceSecurityCallback.java
+++ b/src/main/java/org/olat/core/util/vfs/restapi/VFSWebServiceSecurityCallback.java
@@ -56,6 +56,11 @@ public class VFSWebServiceSecurityCallback implements VFSSecurityCallback {
 		return canWrite;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return canWrite;
+	}
+
 	@Override
 	public boolean canDelete() {
 		return canDelete;
diff --git a/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java b/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
index 22b1fc1ea8e..8db430b9015 100644
--- a/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
+++ b/src/main/java/org/olat/course/nodes/bc/FolderNodeCallback.java
@@ -88,6 +88,11 @@ public class FolderNodeCallback implements VFSSecurityCallback {
 		return ne.isCapabilityAccessible("upload") || isOlatAdmin;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return canWrite();
+	}
+
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
index 7aca8cc362d..7b4da992ba1 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerCourseEditorController.java
@@ -426,6 +426,11 @@ class FolderCallback implements VFSSecurityCallback {
 		return !folderLocked;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return !folderLocked;
+	}
+
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerDropboxScoringViewController.java b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerDropboxScoringViewController.java
index afccb20ca92..7c36b0e2237 100644
--- a/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerDropboxScoringViewController.java
+++ b/src/main/java/org/olat/course/nodes/projectbroker/ProjectBrokerDropboxScoringViewController.java
@@ -125,6 +125,9 @@ class ReturnboxFullAccessCallback implements VFSSecurityCallback {
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canWrite(org.olat.modules.bc.Path)
 	 */
 	public boolean canWrite() { return true; }
+	@Override
+	public boolean canCreateFolder() { return true; }
+
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
index 3439dc73f06..9cf2fbb5a96 100644
--- a/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
+++ b/src/main/java/org/olat/course/nodes/ta/DropboxScoringViewController.java
@@ -373,6 +373,8 @@ class ReadOnlyAndDeleteCallback implements VFSSecurityCallback {
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canWrite(org.olat.modules.bc.Path)
 	 */
 	public boolean canWrite() { return false; }
+	@Override
+	public boolean canCreateFolder() { return false; }
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
@@ -428,6 +430,8 @@ class ReturnboxFullAccessCallback implements VFSSecurityCallback {
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canWrite(org.olat.modules.bc.Path)
 	 */
 	public boolean canWrite() { return true; }
+	@Override
+	public boolean canCreateFolder() { return true; }
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
index bf8fd148110..f25a2095f8e 100644
--- a/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
+++ b/src/main/java/org/olat/course/nodes/ta/TACourseNodeEditController.java
@@ -639,6 +639,11 @@ class TaskFolderCallback implements VFSSecurityCallback {
 		return !folderLocked;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return false;
+	}
+
 	/**
 	 * @see org.olat.modules.bc.callbacks.SecurityCallback#canDelete(org.olat.modules.bc.Path)
 	 */
diff --git a/src/main/java/org/olat/repository/SharedFolderSecurityCallback.java b/src/main/java/org/olat/repository/SharedFolderSecurityCallback.java
index 251b391bfed..768e186a86d 100644
--- a/src/main/java/org/olat/repository/SharedFolderSecurityCallback.java
+++ b/src/main/java/org/olat/repository/SharedFolderSecurityCallback.java
@@ -63,6 +63,11 @@ public class SharedFolderSecurityCallback implements VFSSecurityCallback {
 		return true;
 	}
 
+	@Override
+	public boolean canCreateFolder() {
+		return true;
+	}
+
 	/**
 	 * @return boolean
 	 */
-- 
GitLab