From 8f2d3255c30320ab06c2081cd4d7e446e90747cf Mon Sep 17 00:00:00 2001 From: nickw Date: Mon, 23 Nov 2009 19:43:49 +0000 Subject: 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 --- engine/lib/filestore.php | 51 ++++++++++++++++++++++++++++++++++++++ engine/lib/users.php | 1 + engine/tests/objects/filestore.php | 9 +++++-- 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)); } -- cgit v1.2.3