break;
case 'rename':
+ $serendipity['GET']['fid'] = (int)$serendipity['GET']['fid'];
$file = serendipity_fetchImageFromDatabase($serendipity['GET']['fid']);
$serendipity['GET']['newname'] = serendipity_uploadSecure($serendipity['GET']['newname'], true);
return;
}
- if (serendipity_isActiveFile(basename($serendipity['GET']['newname']))) {
- printf(ERROR_FILE_FORBIDDEN, htmlspecialchars($serendipity['GET']['newname']));
- return;
- }
-
- if ($file['hotlink']) {
- serendipity_updateImageInDatabase(array('name' => $serendipity['GET']['newname']), $serendipity['GET']['fid']);
- } else {
- $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $serendipity['GET']['newname'] . '.' . $file['extension'];
- $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . '.'. $file['extension'];
- if ($serendipity['GET']['newname'] != '' && file_exists($oldfile) && !file_exists($newfile)) {
- $renameValues = array(array(
- 'from' => $oldfile,
- 'to' => $newfile,
- 'thumb' => $serendipity['thumbSuffix'],
- 'fthumb' => $file['thumbnail_name']
- ));
-
- serendipity_plugin_api::hook_event('backend_media_rename', $renameValues);
-
- // Rename file
- rename($renameValues[0]['from'], $renameValues[0]['to']);
-
- foreach($renameValues as $renameData) {
- // Rename thumbnail
- rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $file['extension'],
- $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $serendipity['GET']['newname'] . '.' . $renameData['thumb'] . '.' . $file['extension']);
- }
-
- serendipity_updateImageInDatabase(array('thumbnail_name' => $renameValues[0]['thumb'], 'name' => $serendipity['GET']['newname']), $serendipity['GET']['fid']);
-
- // Forward user to overview (we don't want the user's back button to rename things again)
- } else {
- if (!file_exists($oldfile)) {
- echo ERROR_FILE_NOT_EXISTS;
- } elseif (file_exists($newfile)) {
- echo ERROR_FILE_EXISTS;
- } else {
- echo ERROR_SOMETHING;
- }
+ if (!serendipity_moveMediaDirectory(null, $serendipity['GET']['newname'], 'file', $serendipity['GET']['fid'], $file)) {
?>
<br />
<input type="button" onclick="history.go(-1);" value="<?php echo BACK; ?>" class="serendipityPrettyButton" />
<?php
break;
- }
}
// if we successfully rename
}
if (!empty($serendipity['POST']['save'])) {
+ $newDir = serendipity_uploadSecure($serendipity['POST']['newDir']);
+ $oldDir = serendipity_uploadSecure($serendipity['POST']['oldDir']);
+
+ if ($oldDir != $newDir) {
+ serendipity_moveMediaDirectory($oldDir, $newDir);
+ $use_dir = $newDir;
+ }
serendipity_ACLGrant(0, 'directory', 'read', $serendipity['POST']['read_authors'], $use_dir);
serendipity_ACLGrant(0, 'directory', 'write', $serendipity['POST']['write_authors'], $use_dir);
echo '<div>' . sprintf(SETTINGS_SAVED_AT, serendipity_strftime('%H:%M:%S')) . '</div>';
<br />
<table id="image_directory_listing" border="0" cellspacing="0" cellpadding="4" width="100%">
<tr>
- <td colspan="3"><strong><?php echo BASE_DIRECTORY ?></strong></td>
+ <td colspan="4"><strong><?php echo BASE_DIRECTORY ?></strong></td>
</tr>
<?php foreach ($folders as $folder) { ?>
<tr>
'keywords' => $keywords,
'dprops' => $dprops
);
+
return serendipity_showMedia(
$show,
$mirror,
'authorid' => $serendipity['authorid']
);
serendipity_insertMediaProperty('base_hidden', '', $media['image_id'], $s9y_img['hidden']);
+
+ if ($serendipity['POST']['oldDir'][$id] != $serendipity['POST']['newDir'][$id]) {
+ serendipity_moveMediaDirectory(
+ serendipity_uploadSecure($serendipity['POST']['oldDir'][$id]),
+ serendipity_uploadSecure($serendipity['POST']['newDir'][$id]),
+ 'filedir',
+ $media['image_id']);
+ }
}
foreach($serendipity['POST']['mediaKeywords'] AS $id => $keywords) {
$media = array_merge($media, $smarty_vars);
$media['files'] =& $file;
- $media['paths'] =& $paths;
+ if (count($paths) > 0) {
+ $media['paths'] =& $paths;
+ } else {
+ $media['paths'] =& serendipity_getMediaPaths();
+ }
$serendipity['smarty']->assign('media', $media);
}
return true;
+}
+
+/**
+ * Moves a media directory
+ *
+ * @param string The old directory
+ * @param string The new directory
+ * @param string The type of what to remove (dir|file|filedir)
+ * @param string An item id of a file
+ * @return boolean
+ *
+ */
+function serendipity_moveMediaDirectory($oldDir, $newDir, $type = 'dir', $item_id = null, $file = null) {
+ global $serendipity;
+
+ $real_oldDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir;
+ $real_newDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir;
+
+ if ($type == 'dir') {
+ if (!is_dir($real_oldDir)) {
+ printf(ERROR_FILE_NOT_EXISTS . '<br />', $oldDir);
+ return false;
+ }
+
+ if (is_dir($real_newDir)) {
+ printf(ERROR_FILE_EXISTS . '<br />', $newDir);
+ return false;
+ }
+
+ if (!rename($real_oldDir, $real_newDir)) {
+ printf(MEDIA_DIRECTORY_MOVE_ERROR . '<br />', $newDir);
+ return false;
+ }
+
+ printf(MEDIA_DIRECTORY_MOVED . '<br />', $newDir);
+
+ $dirs = serendipity_db_query("SELECT id, path
+ FROM {$serendipity['dbPrefix']}images
+ WHERE path LIKE '" . serendipity_db_escape_string($oldDir) . "%'", false, 'assoc');
+ if (is_array($dirs)) {
+ foreach($dirs AS $dir) {
+ $old = $dir['path'];
+ $new = preg_replace('@^(' . preg_quote($oldDir) . ')@i', $newDir, $old);
+ serendipity_db_query("UPDATE {$serendipity['dbPrefix']}images
+ SET path = '" . serendipity_db_escape_string($new) . "'
+ WHERE id = {$dir['id']}");
+ }
+ }
+
+ $dirs = serendipity_db_query("SELECT groupid, artifact_id, artifact_type, artifact_mode, artifact_index
+ FROM {$serendipity['dbPrefix']}access
+ WHERE artifact_type = 'directory'
+ AND artifact_index LIKE '" . serendipity_db_escape_string($oldDir) . "%'", false, 'assoc');
+ if (is_array($dirs)) {
+ foreach($dirs AS $dir) {
+ $old = $dir['artifact_index'];
+ $new = preg_replace('@^(' . preg_quote($oldDir) . ')@i', $newDir, $old);
+ serendipity_db_query("UPDATE {$serendipity['dbPrefix']}access
+ SET artifact_index = '" . serendipity_db_escape_string($new) . "'
+ WHERE groupid = '" . serendipity_db_escape_string($dir['groupid']) . "'
+ AND artifact_id = '" . serendipity_db_escape_string($dir['artifact_id']) . "'
+ AND artifact_type = '" . serendipity_db_escape_string($dir['artifact_type']) . "'
+ AND artifact_mode = '" . serendipity_db_escape_string($dir['artifact_mode']) . "'
+ AND artifact_index = '" . serendipity_db_escape_string($dir['artifact_index']) . "'");
+ }
+ }
+ }
+
+ if ($type == 'file') {
+ if (serendipity_isActiveFile(basename($newDir))) {
+ printf(ERROR_FILE_FORBIDDEN, htmlspecialchars($newDir));
+ return false;
+ }
+
+ if ($file['hotlink']) {
+ serendipity_updateImageInDatabase(array('name' => $newDir), $item_id);
+ } else {
+ $file_new = $file['path'] . $newDir . '.';
+ $file_old = $file['path'] . $file['name'] . '.';
+
+ $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file_new . $file['extension'];
+ $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file_old . $file['extension'];
+ if ($newDir != '' && file_exists($oldfile) && !file_exists($newfile)) {
+ $renameValues = array(array(
+ 'from' => $oldfile,
+ 'to' => $newfile,
+ 'thumb' => $serendipity['thumbSuffix'],
+ 'fthumb' => $file['thumbnail_name']
+ ));
+
+ serendipity_plugin_api::hook_event('backend_media_rename', $renameValues);
+
+ // Rename file
+ rename($renameValues[0]['from'], $renameValues[0]['to']);
+
+ foreach($renameValues as $renameData) {
+ // Rename thumbnail
+ rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $file['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $file['extension'],
+ $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $file['path'] . $newDir . '.' . $renameData['thumb'] . '.' . $file['extension']);
+ }
+
+ serendipity_updateImageInDatabase(array('thumbnail_name' => $renameValues[0]['thumb'], 'name' => $newDir), $item_id);
+ $oldDir = $file_old;
+ $newDir = $file_new;
+ $real_oldDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir;
+ $real_newDir = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir;
+ // Forward user to overview (we don't want the user's back button to rename things again)
+ } else {
+ if (!file_exists($oldfile)) {
+ echo ERROR_FILE_NOT_EXISTS;
+ } elseif (file_exists($newfile)) {
+ echo ERROR_FILE_EXISTS;
+ } else {
+ echo ERROR_SOMETHING;
+ }
+
+ return false;
+ }
+ }
+ }
+
+ if ($type == 'filedir') {
+ serendipity_db_query("UPDATE {$serendipity['dbPrefix']}images
+ SET path = '" . serendipity_db_escape_string($newDir) . "'
+ WHERE id = " . (int)$item_id);
+ $pick = serendipity_db_query("SELECT * FROM {$serendipity['dbPrefix']}images
+ WHERE id = " . (int)$item_id, true, 'assoc');
+
+ // Move thumbs
+ $oldfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir . $pick['name'] . '.' . $pick['extension'];
+ $newfile = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir . $pick['name'] . '.' . $pick['extension'];
+
+ $renameValues = array(array(
+ 'from' => $oldfile,
+ 'to' => $newfile,
+ 'thumb' => $serendipity['thumbSuffix'],
+ 'fthumb' => $pick['thumbnail_name']
+ ));
+
+ serendipity_plugin_api::hook_event('backend_media_rename', $renameValues);
+
+ // Rename file
+ rename($renameValues[0]['from'], $renameValues[0]['to']);
+
+ foreach($renameValues as $renameData) {
+ // Rename thumbnail
+ rename($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $oldDir . $pick['name'] . (!empty($renameData['fthumb']) ? '.' . $renameData['fthumb'] : '') . '.' . $pick['extension'],
+ $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $newDir . $pick['name'] . '.' . $renameData['thumb'] . '.' . $pick['extension']);
+ }
+
+ $oldDir .= $pick['name'];
+ $newDir .= $pick['name'];
+ }
+
+ // Only MySQL supported, since I don't know how to use REGEXPs differently.
+ if ($serendipity['dbType'] != 'mysql' && $serendipity['dbType'] != 'mysqli') {
+ echo MEDIA_DIRECTORY_MOVE_ENTRY . '<br />';
+ return true;
+ }
+
+ $q = "SELECT id, body, extended
+ FROM {$serendipity['dbPrefix']}entries
+ WHERE body REGEXP '(src|href)=(\'|\")" . serendipity_db_escape_string($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . "'
+ OR extended REGEXP '(src|href)=(\'|\")" . serendipity_db_escape_string($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . "'
+ ";
+
+ $dirs = serendipity_db_query($q);
+ if (is_array($dirs)) {
+ foreach($dirs AS $dir) {
+ $dir['body'] = preg_replace('@(src|href)=(\'|")' . preg_quote($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . '@', '\1=\2' . $serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $newDir, $dir['body']);
+ $dir['extended'] = preg_replace('@(src|href)=(\'|")' . preg_quote($serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $oldDir) . '@', '\1=\2' . $serendipity['serendipityHTTPPath'] . $serendipity['uploadHTTPPath'] . $newDir, $dir['extended']);
+
+ $uq = "UPDATE {$serendipity['dbPrefix']}entries
+ SET body = '" . serendipity_db_escape_string($dir['body']) . "' ,
+ extended = '" . serendipity_db_escape_string($dir['extended']) . "'
+ WHERE id = " . serendipity_db_escape_string($dir['id']);
+ serendipity_db_query($uq);
+ }
+
+ printf(MEDIA_DIRECTORY_MOVE_ENTRIES . '<br />', count($dirs));
+ }
+
+ return true;
+}
+
+/**
+ * Gets all available media directories
+ *
+ * @return array
+ *
+ */
+function &serendipity_getMediaPaths() {
+ global $serendipity;
+
+ $aExclude = array("CVS" => true, ".svn" => true);
+ serendipity_plugin_api::hook_event('backend_media_path_exclude_directories', $aExclude);
+ $paths = array();
+
+ $aResultSet = serendipity_traversePath(
+ $serendipity['serendipityPath'] . $serendipity['uploadPath'],
+ '',
+ false,
+ NULL,
+ 1,
+ NULL,
+ FALSE,
+ $aExclude
+ );
+
+ foreach ($aResultSet AS $sKey => $sFile) {
+ if ($sFile['directory']) {
+ array_push($paths, $sFile);
+ }
+ unset($aResultSet[$sKey]);
+ }
+ serendipity_directoryACL($paths, 'read');
+ return $paths;
}
\ No newline at end of file