From 7447d2addda2957692420a40feaa108fd4f54685 Mon Sep 17 00:00:00 2001
From: srosse <stephane.rosse@frentix.com>
Date: Fri, 15 Feb 2019 19:05:12 +0100
Subject: [PATCH] OO-3881: delete drop participant folders and tasks of deleted
 users

---
 .../delete/service/DeleteUserDataTask.java    | 51 +++++++++++++++++--
 1 file changed, 48 insertions(+), 3 deletions(-)

diff --git a/src/main/java/org/olat/admin/user/delete/service/DeleteUserDataTask.java b/src/main/java/org/olat/admin/user/delete/service/DeleteUserDataTask.java
index c7329c9b709..f344b6f8648 100644
--- a/src/main/java/org/olat/admin/user/delete/service/DeleteUserDataTask.java
+++ b/src/main/java/org/olat/admin/user/delete/service/DeleteUserDataTask.java
@@ -35,12 +35,14 @@ import org.olat.core.logging.OLog;
 import org.olat.core.logging.Tracing;
 import org.olat.core.util.FileUtils;
 import org.olat.core.util.StringHelper;
+import org.olat.core.util.io.SystemFileFilter;
 import org.olat.course.CourseFactory;
 import org.olat.course.ICourse;
 import org.olat.course.PersistingCourseImpl;
 import org.olat.course.assessment.manager.CourseAssessmentManagerImpl;
 import org.olat.course.nodes.ProjectBrokerCourseNode;
 import org.olat.course.nodes.TACourseNode;
+import org.olat.course.nodes.pf.manager.PFManager;
 import org.olat.course.nodes.ta.DropboxController;
 import org.olat.course.nodes.ta.ReturnboxController;
 import org.olat.resource.OLATResource;
@@ -91,6 +93,49 @@ public class DeleteUserDataTask implements LowPriorityRunnable {
 			if (courseDir.isDirectory()) {
 				deleteAssessmentDocuments(identity, courseDir);
 				deleteDropboxReturnbox(identity, courseDir);
+				deleteParticipantFolder(identity, courseDir);
+				deleteGTasks(identity, courseDir);
+			}
+		}
+	}
+	
+	/**
+	 * /coursedir/participantfolder/{node}/{identityKey}
+	 * @param identity
+	 * @param courseDir
+	 */
+	private void deleteParticipantFolder(Identity identity, File courseDir) {
+		File participantFoldersDir = new File(courseDir, PFManager.FILENAME_PARTICIPANTFOLDER);
+		if(participantFoldersDir.exists()) {
+			File[] nodeDirs = participantFoldersDir.listFiles(new SystemFileFilter(false, true));
+			for(File nodeDir:nodeDirs) {
+				File userDir = new File(nodeDir, identity.getKey().toString());
+				if(userDir.exists()) {
+					FileUtils.deleteDirsAndFiles(userDir, true, true); 
+					log.audit("User-Deletion: identity=" + identity.getKey() +" : User file data deleted under dir=" + userDir.getAbsolutePath());
+				}
+			}
+		}
+	}
+	
+	/**
+	 * /coursedir/gtasks/{nodeId}/revisions/person_{identityKey}
+	 * @param identity
+	 * @param courseDir
+	 */
+	private void deleteGTasks(Identity identity, File courseDir) {
+		File gtasksDir = new File(courseDir, "gtasks");
+		if(gtasksDir.exists()) {
+			File[] nodeDirs = gtasksDir.listFiles(new SystemFileFilter(false, true));
+			for(File nodeDir:nodeDirs) {
+				File[] boxes = nodeDir.listFiles(new SystemFileFilter(false, true));
+				for(File box:boxes) {
+					File userDir = new File(box, "person_" + identity.getKey());
+					if(userDir.exists()) {
+						FileUtils.deleteDirsAndFiles(userDir, true, true); 
+						log.audit("User-Deletion: identity=" + identity.getKey() +" : User file data deleted under dir=" + userDir.getAbsolutePath());
+					}
+				}
 			}
 		}
 	}
@@ -98,7 +143,7 @@ public class DeleteUserDataTask implements LowPriorityRunnable {
 	private void deleteAssessmentDocuments(Identity identity, File courseDir) {
 		File assessmentDocsDir = new File(courseDir, CourseAssessmentManagerImpl.ASSESSMENT_DOCS_DIR);
 		if(assessmentDocsDir.exists()) {
-			File[] nodeDirs = assessmentDocsDir.listFiles();
+			File[] nodeDirs = assessmentDocsDir.listFiles(new SystemFileFilter(false, true));
 			for(File nodeDir:nodeDirs) {
 				File userDir = new File(nodeDir, "person_" + identity.getKey());
 				if(userDir.exists()) {
@@ -118,7 +163,7 @@ public class DeleteUserDataTask implements LowPriorityRunnable {
 			for (File dropboxReturnboxDir: dropboxReturnboxDirs) {
 				if(!dropboxReturnboxDir.exists()) continue;
 				
-				File[] nodeDirs = dropboxReturnboxDir.listFiles();
+				File[] nodeDirs = dropboxReturnboxDir.listFiles(new SystemFileFilter(false, true));
 				// 3. loop over all node-id e.g. 78933379704296
 				for (File nodeDir:nodeDirs) {
 					String currentNodeId = nodeDir.getName();
@@ -132,7 +177,7 @@ public class DeleteUserDataTask implements LowPriorityRunnable {
 						deleteUserDirectory(identity, nodeDir);
 					} else if (isProjectBrokerNode(currentCourse, currentNodeId)) {
 						// additional loop over project-id
-						File[] projectDirs = nodeDir.listFiles();
+						File[] projectDirs = nodeDir.listFiles(new SystemFileFilter(false, true));
 						for (File projectDir:projectDirs) {
 							deleteUserDirectory(identity, projectDir);
 						}
-- 
GitLab