diff --git a/docs/NEWS b/docs/NEWS index d8dd72c3..83e443d6 100644 --- a/docs/NEWS +++ b/docs/NEWS @@ -1,6 +1,11 @@ Version 2.1 () ------------------------------------------------------------------------ + * Added new bulk image move ability to MediaLibrary. This fixes + several issues with rename AND remove and allows to automatically + check and set MediaLibrary item entry paths on MOVE. + Staticpages from v.4.52 are modified to support this too. + * Fix MediaLibrary objects not pass through into entryproperties CustomFields diff --git a/include/admin/entries.inc.php b/include/admin/entries.inc.php index c997d911..10d40030 100644 --- a/include/admin/entries.inc.php +++ b/include/admin/entries.inc.php @@ -396,7 +396,11 @@ switch($serendipity['GET']['adminAction']) { break; case 'multidelete': - if (!serendipity_checkFormToken() || !is_array($serendipity['POST']['multiDelete'])) { + if (!serendipity_checkFormToken()) { + return; // blank content page, but default token check parameter is presenting a XSRF message when false + } + if (!is_array($serendipity['POST']['multiDelete'])) { + echo '
' . sprintf(MULTICHECK_NO_ITEM, $_SERVER['HTTP_REFERER']) . '
'."\n"; break; } diff --git a/include/admin/images.inc.php b/include/admin/images.inc.php index 97aaf903..fe627c8b 100644 --- a/include/admin/images.inc.php +++ b/include/admin/images.inc.php @@ -60,7 +60,7 @@ switch ($serendipity['GET']['adminAction']) { $messages = array(); $data['case_do_delete'] = true; $messages[] = serendipity_deleteImage($serendipity['GET']['fid']); - $messages[] = sprintf(' ' . RIP_ENTRY . '', $serendipity['GET']['fid']); + $messages[] = sprintf(' ' . RIP_ENTRY . "\n", $serendipity['GET']['fid']); $data['showML'] = showMediaLibrary(); $data['messages'] = $messages; @@ -81,7 +81,7 @@ switch ($serendipity['GET']['adminAction']) { if ($id > 0) { $image = serendipity_fetchImageFromDatabase($id); $messages[] = serendipity_deleteImage((int)$id); - $messages[] = sprintf(' ' . RIP_ENTRY . '', $image['id'] . ' - ' . serendipity_specialchars($image['realname'])); + $messages[] = sprintf(' ' . RIP_ENTRY . "\n", $image['id'] . ' - ' . serendipity_specialchars($image['realname'])); } } $data['showML'] = showMediaLibrary(); @@ -108,33 +108,41 @@ switch ($serendipity['GET']['adminAction']) { break; case 'multidelete': - if (!serendipity_checkFormToken() || !is_array($serendipity['POST']['multiDelete'])) { + if (!serendipity_checkFormToken()) { + return; // blank content page, but default token check parameter is presenting a XSRF message when false + } + if (!is_array($serendipity['POST']['multiDelete'])) { + echo '
' . sprintf(MULTICHECK_NO_ITEM, $_SERVER['HTTP_REFERER']) . '
'."\n"; + break; + } + if (is_array($serendipity['POST']['multiDelete']) && isset($serendipity['POST']['oldDir']) && empty($serendipity['POST']['newDir'])) { + echo '
' . sprintf(MULTICHECK_NO_DIR, $_SERVER['HTTP_REFERER']) . '
'."\n"; break; } // case bulk multimove (leave the fake oldDir being send as an empty dir) if (isset($serendipity['POST']['oldDir']) && !empty($serendipity['POST']['newDir'])) { $messages = array(); - $multiMoveImages = $serendipity['POST']['multiDelete']; + $multiMoveImages = $serendipity['POST']['multiDelete']; // The 'multiDelete' key name should better be renamed to 'multiCheck', but this would need to change 2k11/admin/serendipity_editor.js, images.inc.tpl, media_items.tpl, media_pane.tpl and this file unset($serendipity['POST']['multiDelete']); - $oDir = ''; // oldDir is relative to Uploads/, since we can not specify a directory of a ML bulk move - $nDir = serendipity_specialchars((string)$serendipity['POST']['newDir']); + $oDir = ''; // oldDir is relative to Uploads/, since we can not specify a directory of a ML bulk move directly + $nDir = serendipity_specialchars((string)$serendipity['POST']['newDir']); // relative to Uploads/ if ($oDir != $nDir) { foreach($multiMoveImages AS $mkey => $move_id) { $file = serendipity_fetchImageFromDatabase((int)$move_id); $oDir = $file['path']; // this now is the exact oldDir path of this ID if (serendipity_moveMediaDirectory($oDir, $nDir, 'file', (int)$move_id, $file)) { - $messages[] = sprintf(' ' . MEDIA_DIRECTORY_MOVED . '', $nDir); + $messages[] = sprintf(' ' . MEDIA_DIRECTORY_MOVED . "\n", $nDir); } else { - $messages[] = sprintf(' ' . MEDIA_DIRECTORY_MOVE_ERROR . '', $nDir); + $messages[] = sprintf(' ' . MEDIA_DIRECTORY_MOVE_ERROR . "\n", $nDir); } } } $data['messages'] = $messages; + unset($messages); // fall back $data['case_default'] = true; $data['showML'] = showMediaLibrary(); - unset($messages); break; } @@ -168,7 +176,6 @@ switch ($serendipity['GET']['adminAction']) { } if (!serendipity_moveMediaDirectory(null, $serendipity['GET']['newname'], 'file', $serendipity['GET']['fid'], $file)) { $data['go_back'] = true; - break; } break; @@ -218,7 +225,7 @@ switch ($serendipity['GET']['adminAction']) { $tfile = serendipity_uploadSecure(basename($tfile)); if (serendipity_isActiveFile($tfile)) { - $messages[] = sprintf(' ' . ERROR_FILE_FORBIDDEN . '', $tfile); + $messages[] = sprintf(' ' . ERROR_FILE_FORBIDDEN . "\n", $tfile); break; } @@ -226,13 +233,13 @@ switch ($serendipity['GET']['adminAction']) { $target = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$tindex] . $tfile; if (!serendipity_checkDirUpload($serendipity['POST']['target_directory'][$tindex])) { - $messages[] = ' ' . PERM_DENIED . ''; + $messages[] = ' ' . PERM_DENIED . "\n"; return; } $realname = $tfile; if (file_exists($target)) { - $messages[] = ' ' . $target . ' - ' . ERROR_FILE_EXISTS_ALREADY . ''; + $messages[] = ' ' . $target . ' - ' . ERROR_FILE_EXISTS_ALREADY . "\n"; $realname = serendipity_imageAppend($tfile, $target, $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$tindex]); } @@ -244,7 +251,7 @@ switch ($serendipity['GET']['adminAction']) { // Try to get the URL if (PEAR::isError($req->sendRequest()) || $req->getResponseCode() != '200') { - $messages[] = sprintf(' ' . REMOTE_FILE_NOT_FOUND . '', $serendipity['POST']['imageurl']); + $messages[] = sprintf(' ' . REMOTE_FILE_NOT_FOUND . "\n", $serendipity['POST']['imageurl']); } else { // Fetch file $fContent = $req->getResponseBody(); @@ -256,14 +263,14 @@ switch ($serendipity['GET']['adminAction']) { fclose($fp); $image_id = @serendipity_insertHotlinkedImageInDatabase($tfile, $serendipity['POST']['imageurl'], $authorid, null, $tempfile); - $messages[] = sprintf(' ' . HOTLINK_DONE . '', $serendipity['POST']['imageurl'] , $tfile .''); + $messages[] = sprintf(' ' . HOTLINK_DONE . "\n", $serendipity['POST']['imageurl'] , $tfile .''); serendipity_plugin_api::hook_event('backend_image_addHotlink', $tempfile); } else { $fp = fopen($target, 'w'); fwrite($fp, $fContent); fclose($fp); - $messages[] = sprintf(' ' . FILE_FETCHED . '', $serendipity['POST']['imageurl'] , $tfile . ''); + $messages[] = sprintf(' ' . FILE_FETCHED . "\n", $serendipity['POST']['imageurl'] , $tfile . ''); if (serendipity_checkMediaSize($target)) { $thumbs = array(array( @@ -275,7 +282,7 @@ switch ($serendipity['GET']['adminAction']) { foreach($thumbs as $thumb) { // Create thumbnail if ( $created_thumbnail = serendipity_makeThumbnail($tfile, $serendipity['POST']['target_directory'][$tindex], $thumb['thumbSize'], $thumb['thumb']) ) { - $messages[] = ' ' . THUMB_CREATED_DONE . ''; + $messages[] = ' ' . THUMB_CREATED_DONE . "\n"; } } @@ -320,14 +327,14 @@ switch ($serendipity['GET']['adminAction']) { $tfile = serendipity_uploadSecure(basename($tfile)); if (serendipity_isActiveFile($tfile)) { - $messages[] = ' ' . ERROR_FILE_FORBIDDEN .' '. $tfile . ''; + $messages[] = ' ' . ERROR_FILE_FORBIDDEN .' '. $tfile . "\n"; continue; } $serendipity['POST']['target_directory'][$idx] = serendipity_uploadSecure($serendipity['POST']['target_directory'][$idx], true, true); if (!serendipity_checkDirUpload($serendipity['POST']['target_directory'][$idx])) { - $messages[] = ' ' . PERM_DENIED . ''; + $messages[] = ' ' . PERM_DENIED . "\n"; continue; } @@ -335,13 +342,13 @@ switch ($serendipity['GET']['adminAction']) { $realname = $tfile; if (file_exists($target)) { - $messages[] = ' ' . $target . ' - ' . ERROR_FILE_EXISTS_ALREADY . ''; + $messages[] = ' ' . $target . ' - ' . ERROR_FILE_EXISTS_ALREADY . "\n"; $realname = serendipity_imageAppend($tfile, $target, $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $serendipity['POST']['target_directory'][$idx]); } // Accept file if (is_uploaded_file($uploadtmp) && serendipity_checkMediaSize($uploadtmp) && move_uploaded_file($uploadtmp, $target)) { - $messages[] = sprintf(' ' . FILE_UPLOADED . '', $uploadfile , $target); + $messages[] = sprintf(' ' . FILE_UPLOADED . "\n", $uploadfile , $target); @umask(0000); @chmod($target, 0664); @@ -354,7 +361,7 @@ switch ($serendipity['GET']['adminAction']) { foreach($thumbs as $thumb) { // Create thumbnail if ( $created_thumbnail = serendipity_makeThumbnail($tfile, $serendipity['POST']['target_directory'][$idx], $thumb['thumbSize'], $thumb['thumb']) ) { - $messages[] = ' ' . THUMB_CREATED_DONE . ''; + $messages[] = ' ' . THUMB_CREATED_DONE . "\n"; } } @@ -369,7 +376,7 @@ switch ($serendipity['GET']['adminAction']) { } else { // necessary for the ajax-uplaoder to show upload errors header("Internal Server Error", true, 500); - $messages[] = ' ' . ERROR_UNKNOWN_NOUPLOAD . ''; + $messages[] = ' ' . ERROR_UNKNOWN_NOUPLOAD . "\n"; } } } @@ -422,6 +429,7 @@ switch ($serendipity['GET']['adminAction']) { } $data['case_directoryEdit'] = true; + $use_dir = serendipity_uploadSecure($serendipity['GET']['dir']); $checkpath = array( array( @@ -434,17 +442,23 @@ switch ($serendipity['GET']['adminAction']) { } if (!empty($serendipity['POST']['save'])) { - $newDir = serendipity_uploadSecure(serendipity_makeFilename($serendipity['POST']['newDir'])); - $oldDir = serendipity_uploadSecure($serendipity['POST']['oldDir']); + // preserve directory slashes, eg for dir/subdir/ + $_newDir = str_replace('/', '_DS_', $serendipity['POST']['newDir']); + $_oldDir = str_replace('/', '_DS_', $serendipity['POST']['oldDir']); + $_newDir = serendipity_uploadSecure(serendipity_makeFilename($_newDir)); + $_oldDir = serendipity_uploadSecure($_oldDir); + $newDir = str_replace('_DS_', '/', $_newDir); + $oldDir = str_replace('_DS_', '/', $_oldDir); if ($oldDir != $newDir) { - //is this possible? + //is this possible? Ian: YES! Change an already set directory. ob_start(); serendipity_moveMediaDirectory($oldDir, $newDir); - $data['ob_serendipity_moveMediaDirectory'] = ob_get_contents(); + $data['messages'] = ob_get_contents(); ob_end_clean(); $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); $data['print_SETTINGS_SAVED_AT'] = sprintf(SETTINGS_SAVED_AT, serendipity_strftime('%H:%M:%S')); @@ -488,6 +502,7 @@ switch ($serendipity['GET']['adminAction']) { } $data['case_directoryDoCreate'] = true; + $new_dir = serendipity_uploadSecure($serendipity['POST']['parent'] . '/' . serendipity_makeFilename($serendipity['POST']['name']), true); $new_dir = str_replace(array('..', '//'), array('', '/'), $new_dir); diff --git a/include/functions_images.inc.php b/include/functions_images.inc.php index d2475f1a..fc01f800 100644 --- a/include/functions_images.inc.php +++ b/include/functions_images.inc.php @@ -322,7 +322,7 @@ function serendipity_deleteImage($id) { $file = serendipity_fetchImageFromDatabase($id); if (!is_array($file)) { - $messages .= sprintf(' ' . FILE_NOT_FOUND . '', $id); + $messages .= sprintf(' ' . FILE_NOT_FOUND . "\n", $id); //return false; } else { @@ -344,9 +344,9 @@ function serendipity_deleteImage($id) { if (!$file['hotlink']) { if (file_exists($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $dFile)) { if (@unlink($serendipity['serendipityPath'] . $serendipity['uploadPath'] . $dFile)) { - $messages .= sprintf(' ' . DELETE_FILE . '', $dFile); + $messages .= sprintf(' ' . DELETE_FILE . "\n", $dFile); } else { - $messages .= sprintf(' ' . DELETE_FILE_FAIL . '', $dFile); + $messages .= sprintf(' ' . DELETE_FILE_FAIL . "\n", $dFile); } serendipity_plugin_api::hook_event('backend_media_delete', $dThumb); @@ -355,14 +355,14 @@ function serendipity_deleteImage($id) { $dfThumb = $serendipity['serendipityPath'] . $serendipity['uploadPath'] . $dfnThumb; if (@unlink($dfThumb)) { - $messages .= sprintf(' ' . DELETE_THUMBNAIL . '', $dfnThumb); + $messages .= sprintf(' ' . DELETE_THUMBNAIL . "\n", $dfnThumb); } } } else { - $messages .= sprintf(' ' . FILE_NOT_FOUND . '', $dFile); + $messages .= sprintf(' ' . FILE_NOT_FOUND . "\n", $dFile); } } else { - $messages .= sprintf(' ' . DELETE_HOTLINK_FILE . '', $file['name']); + $messages .= sprintf(' ' . DELETE_HOTLINK_FILE . "\n", $file['name']); } serendipity_db_query("DELETE FROM {$serendipity['dbPrefix']}images WHERE id = ". (int)$id); @@ -494,8 +494,8 @@ function serendipity_insertHotlinkedImageInDatabase($filename, $url, $authorid = $sql = serendipity_db_query($query); if (is_string($sql)) { - echo '' . $query . ''; - echo '' . $sql . ''; + echo '' . $query . "\n"; + echo '' . $sql . "\n"; } $image_id = serendipity_db_insert_id('images', 'id'); @@ -581,8 +581,8 @@ function serendipity_insertImageInDatabase($filename, $directory, $authorid = 0, $sql = serendipity_db_query($query); if (is_string($sql)) { - echo '' . $query . ''; - echo '' . $sql . ''; + echo '' . $query . "\n"; + echo '' . $sql . "\n"; } $image_id = serendipity_db_insert_id('images', 'id'); @@ -675,7 +675,7 @@ function serendipity_makeThumbnail($file, $directory = '', $size = false, $thumb } exec($cmd, $output, $result); if ($result != 0) { - echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) .''; + echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) ."\n"; $r = false; // return failure } else { touch($outfile); @@ -718,7 +718,7 @@ function serendipity_scaleImg($id, $width, $height) { $cmd = escapeshellcmd($serendipity['convert']) . ' -scale ' . serendipity_escapeshellarg($width . 'x' . $height) . ' ' . serendipity_escapeshellarg($infile) . ' ' . serendipity_escapeshellarg($outfile); exec($cmd, $output, $result); if ( $result != 0 ) { - echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) .''; + echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) ."\n"; } unset($output, $result); } @@ -765,7 +765,7 @@ function serendipity_rotateImg($id, $degrees) { $cmd = escapeshellcmd($serendipity['convert']) . ' -rotate ' . serendipity_escapeshellarg($degrees) . ' ' . serendipity_escapeshellarg($infile) . ' ' . serendipity_escapeshellarg($outfile); exec($cmd, $output, $result); if ( $result != 0 ) { - echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) .''; + echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) ."\n"; } unset($output, $result); @@ -773,7 +773,7 @@ function serendipity_rotateImg($id, $degrees) { $cmd = escapeshellcmd($serendipity['convert']) . ' -rotate ' . serendipity_escapeshellarg($degrees) . ' ' . serendipity_escapeshellarg($infileThumb) . ' ' . serendipity_escapeshellarg($outfileThumb); exec($cmd, $output, $result); if ( $result != 0 ) { - echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) .''; + echo ' ' . sprintf(IMAGICK_EXEC_ERROR, $cmd, $output[0], $result) ."\n"; } unset($output, $result); @@ -826,7 +826,7 @@ function serendipity_generateThumbs() { if ($returnsize !== false ) { // Only print the resize message the first time if (!$msg_printed) { - printf(' ' . RESIZE_BLAHBLAH, THUMBNAIL_SHORT . ''); + printf(' ' . RESIZE_BLAHBLAH, THUMBNAIL_SHORT . "\n"); echo "\n" . '