From c1f257952ec92a28ba55c293ee53976459941f94 Mon Sep 17 00:00:00 2001 From: Skylar Ittner Date: Sat, 5 May 2018 20:10:08 -0600 Subject: [PATCH] Add file/folder deletion --- action.php | 25 ++++++++++++++++++++++++- lang/en_us.php | 5 +++++ lang/messages.php | 20 ++++++++++++++++++++ pages/files.php | 17 +++++++++++++---- public/files/test/logo.png | Bin 17280 -> 0 bytes 5 files changed, 62 insertions(+), 5 deletions(-) delete mode 100755 public/files/test/logo.png diff --git a/action.php b/action.php index 16e6337..f638d53 100644 --- a/action.php +++ b/action.php @@ -236,7 +236,7 @@ switch ($VARS['action']) { $errors[] = htmlspecialchars($f['name']) . " $err"; continue; } - + $filename = basename($f['name']); $filename = preg_replace("/[^a-z0-9\._\-]/", "_", strtolower($filename)); $n = 1; @@ -262,6 +262,29 @@ switch ($VARS['action']) { returnToSender("upload_success", "&path=" . $VARS['path']); break; + case "filedelete": + $file = FILE_UPLOAD_PATH . $VARS['file']; + if (strpos(realpath($file), FILE_UPLOAD_PATH) !== 0) { + returnToSender("file_security_error"); + } + if (!file_exists($file)) { + // Either way the file is gone + returnToSender("file_deleted"); + } + if (!is_writable($file) || realpath($file) == realpath(FILE_UPLOAD_PATH)) { + returnToSender("undeletable_file"); + } + if (is_dir($file)) { + if (!rmdir($file)) { + returnToSender("folder_not_empty"); + } + } else { + if (!unlink($file)) { + returnToSender("file_not_deleted"); + } + } + returnToSender("file_deleted"); + break; case "signout": session_destroy(); header('Location: index.php'); diff --git a/lang/en_us.php b/lang/en_us.php index 491bd84..dd7e771 100644 --- a/lang/en_us.php +++ b/lang/en_us.php @@ -109,4 +109,9 @@ define("STRINGS", [ "destination folder does not exist" => "Destination folder does not exist.", "destination folder does not allow uploads" => "Destination folder does not allow uploads.", "uploaded data too large" => "Uploaded data too large.", + "undeletable file" => "The file could not be deleted.", + "folder not empty" => "Folder must be empty to be deleted.", + "file not deleted" => "The file could not be deleted.", + "file deleted" => "File deleted.", + "folder deleted" => "Folder deleted.", ]); \ No newline at end of file diff --git a/lang/messages.php b/lang/messages.php index 7e8a789..115010a 100644 --- a/lang/messages.php +++ b/lang/messages.php @@ -57,4 +57,24 @@ define("MESSAGES", [ "string" => "uploaded data too large", "type" => "danger" ], + "undeletable_file" => [ + "string" => "undeletable file", + "type" => "danger" + ], + "folder_not_empty" => [ + "string" => "folder not empty", + "type" => "danger" + ], + "file_not_deleted" => [ + "string" => "file not deleted", + "type" => "danger" + ], + "file_deleted" => [ + "string" => "file deleted", + "type" => "success" + ], + "folder_deleted" => [ + "string" => "folder deleted", + "type" => "success" + ], ]); diff --git a/pages/files.php b/pages/files.php index 4097c09..38d86cd 100644 --- a/pages/files.php +++ b/pages/files.php @@ -73,7 +73,6 @@ $fullpath = $base . $folder; $files = scandir($fullpath); foreach ($files as $f) { if (strpos($f, '.') !== 0) { - echo "
\n"; $link = "$folder/$f"; $target = "_BLANK"; $isdir = false; @@ -105,9 +104,19 @@ $fullpath = $base . $folder; } } } - echo "\t"; - echo " "; - echo $f . "\n
\n"; + ?> +
+ + + +
+ + + " /> + +
+
+ diff --git a/public/files/test/logo.png b/public/files/test/logo.png deleted file mode 100755 index 445b7713c6a30f9e66ebcf1db3c18a024d806b05..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 17280 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