aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authornickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>2009-11-23 19:43:49 +0000
committernickw <nickw@36083f99-b078-4883-b0ff-0f9b5a30f544>2009-11-23 19:43:49 +0000
commit8f2d3255c30320ab06c2081cd4d7e446e90747cf (patch)
tree04c594a48d5c69a1a04813e7fdfc23c720a10002
parenta13dcbfbd2f47aeae09ec2270d36c1131e28362e (diff)
downloadelgg-8f2d3255c30320ab06c2081cd4d7e446e90747cf.tar.gz
elgg-8f2d3255c30320ab06c2081cd4d7e446e90747cf.tar.bz2
Deleting a user will remove all user files.
Fixes #607 git-svn-id: http://code.elgg.org/elgg/trunk@3700 36083f99-b078-4883-b0ff-0f9b5a30f544
-rw-r--r--engine/lib/filestore.php51
-rw-r--r--engine/lib/users.php1
-rw-r--r--engine/tests/objects/filestore.php9
3 files changed, 59 insertions, 2 deletions
diff --git a/engine/lib/filestore.php b/engine/lib/filestore.php
index 455d011d5..4fa0dc96e 100644
--- a/engine/lib/filestore.php
+++ b/engine/lib/filestore.php
@@ -1296,6 +1296,57 @@ function file_set_page_owner($file) {
}
}
+/**
+ * Recursively delete a directory
+ *
+ * @param str $directory
+ */
+function delete_directory($directory) {
+ // sanity check: must be a directory
+ if (!$handle = opendir($directory)) {
+ return FALSE;
+ }
+
+ // loop through all files
+ while (($file = readdir($handle)) !== FALSE) {
+ if (in_array($file, array('.', '..'))) {
+ continue;
+ }
+
+ $path = "$directory/$file";
+ if (is_dir($path)) {
+ // recurse down through directory
+ if (!delete_directory($path)) {
+ return FALSE;
+ }
+ } else {
+ // delete file
+ unlink($path);
+ }
+ }
+
+ // remove empty directory
+ closedir($handle);
+ return rmdir($directory);
+}
+
+/**
+ * Removes all user files
+ *
+ * @param ElggUser $user
+ * @return void
+ */
+function clear_user_files($user) {
+ global $CONFIG;
+
+ $time_created = date('Y/m/d', $user->time_created);
+ $file_path = "$CONFIG->dataroot$time_created/$user->guid";
+ if (file_exists($file_path)) {
+ delete_directory($file_path);
+ }
+}
+
+
/// Variable holding the default datastore
$DEFAULT_FILE_STORE = NULL;
diff --git a/engine/lib/users.php b/engine/lib/users.php
index 313566dfd..d7d13bdfe 100644
--- a/engine/lib/users.php
+++ b/engine/lib/users.php
@@ -156,6 +156,7 @@ class ElggUser extends ElggEntity
// Delete owned data
clear_annotations_by_owner($this->guid);
clear_metadata_by_owner($this->guid);
+ clear_user_files($this);
// Delete entity
return parent::delete();
diff --git a/engine/tests/objects/filestore.php b/engine/tests/objects/filestore.php
index a262a7c3f..e20137187 100644
--- a/engine/tests/objects/filestore.php
+++ b/engine/tests/objects/filestore.php
@@ -69,18 +69,23 @@ class ElggCoreFilestoreTest extends ElggCoreUnitTest {
$user = $this->createTestUser();
$created = date('Y/m/d', $user->time_created);
- // setup a test file; no need to save
+ // setup a test file
$file = new ElggFile();
$file->owner_guid = $user->guid;
$file->setFilename('testing/filestore.txt');
+ $file->open('write');
+ $file->write('Testing!');
+ $this->assertTrue($file->close());
// ensure filename and path is expected
$filename = $file->getFilenameOnFilestore($file);
$filepath = "$CONFIG->dataroot$created/$user->guid/testing/filestore.txt";
$this->assertIdentical($filename, $filepath);
+ $this->assertTrue(file_exists($filepath));
- // clean up user
+ // ensure file removed on user delete
$user->delete();
+ $this->assertFalse(file_exists($filepath));
}