} $data['messages'] = $messages; break; case 'directoryDoDelete': if (!serendipity_checkFormToken() || !serendipity_checkPermission('adminImagesDirectories')) { return; } $data['case_directoryDoDelete'] = true; $new_dir = serendipity_uploadSecure($serendipity['GET']['dir'], true); if (is_dir($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $new_dir)) { if (!is_writable($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $new_dir)) { $data['print_DIRECTORY_WRITE_ERROR'] = sprintf(DIRECTORY_WRITE_ERROR, $new_dir); } else { ob_start(); // Directory exists and is writable. Now dive within subdirectories and kill 'em all. serendipity_killPath($serendipity['serendipityPath'] . $serendipity['uploadPath'], $new_dir, isset($serendipity['POST']['nuke']) ? true : false); $data['ob_serendipity_killPath'] = ob_get_contents(); ob_end_clean(); } } else { $data['print_ERROR_NO_DIRECTORY'] = sprintf(ERROR_NO_DIRECTORY, $new_dir); } serendipity_plugin_api::hook_event('backend_directory_delete', $new_dir); break; case 'directoryEdit': if (!serendipity_checkPermission('adminImagesDirectories')) { return; } $data['case_directoryEdit'] = true; $use_dir = serendipity_uploadSecure($serendipity['GET']['dir']); $checkpath = array(array('relpath' => $use_dir));
/** * Recursively delete a directory tree * * @access public * @param string The originating directory * @param string The subdirectory * @param boolean Force deleting an directory even if there are files left in it? * @return true */ function serendipity_killPath($basedir, $directory = '', $forceDelete = false) { static $n = "<br />\n"; static $serious = true; if ($handle = @opendir($basedir . $directory)) { while (false !== ($file = @readdir($handle))) { if ($file != '.' && $file != '..') { if (is_dir($basedir . $directory . $file)) { serendipity_killPath($basedir, $directory . $file . '/', $forceDelete); } else { $filestack[$file] = $directory . $file; } } } @closedir($handle); printf(CHECKING_DIRECTORY . "<br />\n", $directory); // No, we just don't kill files the easy way. We sort them out properly from the database // and preserve files not entered therein. $files = serendipity_fetchImagesFromDatabase(0, 0, $total, false, false, $directory); if (is_array($files)) { echo "<ul>\n"; foreach ($files as $f => $file) { echo "<li>\n"; if ($serious) { serendipity_deleteImage($file['id']); } else { echo $file['name'] . '.' . $file['extension']; } echo "</li>\n"; unset($filestack[$file['name'] . '.' . $file['extension']]); unset($filestack[$file['name'] . (!empty($file['thumbnail_name']) ? '.' . $file['thumbnail_name'] : '') . '.' . $file['extension']]); } echo "</ul>\n"; } if (count($filestack) > 0) { if ($forceDelete) { echo "<ul>\n"; foreach ($filestack as $f => $file) { if ($serious && @unlink($basedir . $file)) { printf('<li>' . DELETING_FILE . $n . DONE . "</li>\n", $file); } else { printf('<li>' . DELETING_FILE . $n . ERROR . "</li>\n", $file); } } echo "</ul>\n"; } else { echo ERROR_DIRECTORY_NOT_EMPTY . $n; echo "<ul>\n"; foreach ($filestack as $f => $file) { echo '<li>' . $file . "</li>\n"; } echo "</ul>\n"; } } echo '<strong>'; if ($serious && !empty($directory) && !preg_match('@^.?/?$@', $directory) && @rmdir($basedir . $directory)) { printf(DIRECTORY_DELETE_SUCCESS . $n, $directory); } else { printf(DIRECTORY_DELETE_FAILED . $n, $directory); } echo '</strong>'; } return true; }
/** * Recursively delete a directory tree * * @access public * @param string The originating directory * @param string The subdirectory * @param boolean Force deleting an directory even if there are files left in it? * @return true */ function serendipity_killPath($basedir, $directory = '', $forceDelete = false) { static $serious = true; if ($handle = @opendir($basedir . $directory)) { while (false !== ($file = @readdir($handle))) { if ($file != '.' && $file != '..') { if (is_dir($basedir . $directory . $file)) { serendipity_killPath($basedir, $directory . $file . '/', $forceDelete); } else { $filestack[$file] = $directory . $file; } } } @closedir($handle); echo '<span class="msg_notice"><span class="icon-info-circled"></span> '; printf(CHECKING_DIRECTORY, $directory); echo "</span>"; // No, we just don't kill files the easy way. We sort them out properly from the database // and preserve files not entered therein. $files = serendipity_fetchImagesFromDatabase(0, 0, $total, false, false, $directory); if (is_array($files)) { echo "<ul class='plainList'>\n"; foreach ($files as $f => $file) { echo "<li>\n"; if ($serious) { echo serendipity_deleteImage($file['id']); } else { echo $file['name'] . (empty($file['extension']) ? '' : '.' . $file['extension']); } echo "</li>\n"; unset($filestack[$file['name'] . (empty($file['extension']) ? '' : '.' . $file['extension'])]); unset($filestack[$file['name'] . (!empty($file['thumbnail_name']) ? '.' . $file['thumbnail_name'] : '') . (empty($file['extension']) ? '' : '.' . $file['extension'])]); } echo "</ul>\n"; } if (count($filestack) > 0) { if ($forceDelete) { echo "<ul class='plainList'>\n"; foreach ($filestack as $f => $file) { if ($serious && @unlink($basedir . $file)) { printf('<li><span class="msg_success"><span class="icon-ok-circled"></span> ' . DELETING_FILE . ' ' . DONE . "</span></li>\n", $file); } else { printf('<li><span class="msg_error"><span class="icon-attention-circled"></span> ' . DELETING_FILE . ' ' . ERROR . "</span></li>\n", $file); } } echo "</ul>\n"; } else { echo '<span class="msg_error"><span class="icon-attention-circled"></span> ' . ERROR_DIRECTORY_NOT_EMPTY . '</span>'; echo "<ul>\n"; foreach ($filestack as $f => $file) { echo '<li>' . $file . "</li>\n"; } echo "</ul>\n"; } } if ($serious && !empty($directory) && !preg_match('@^.?/?$@', $directory) && @rmdir($basedir . $directory)) { echo '<span class="msg_success"><span class="icon-ok-circled"></span> '; printf(DIRECTORY_DELETE_SUCCESS, $directory); echo "</span>\n"; } else { echo '<span class="msg_error"><span class="icon-attention-circled"></span> '; printf(DIRECTORY_DELETE_FAILED, $directory); echo "</span>\n"; } } return true; }