*/ // must be run within DokuWiki if (!defined('DOKU_INC')) { die(); } if (!defined('DOKU_PLUGIN')) { define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); } require_once(DOKU_PLUGIN . 'preservefilenames/common.php'); require_once(DOKU_PLUGIN . 'preservefilenames/action_anteater.php'); class action_plugin_preservefilenames_angua extends action_plugin_preservefilenames_anteater { /** * Registers event handlers */ function register(&$controller) { $this->common = new PreserveFilenames_Common(); $controller->register_hook('MEDIA_UPLOAD_FINISH', 'AFTER', $this, '_saveMeta'); $controller->register_hook('MEDIA_DELETE_FILE', 'AFTER', $this, '_deleteMeta'); $controller->register_hook('MEDIA_SENDFILE', 'BEFORE', $this, '_sendFile'); $controller->register_hook('PARSER_HANDLER_DONE', 'BEFORE', $this, '_replaceLinkTitle'); $controller->register_hook('RENDERER_CONTENT_POSTPROCESS', 'AFTER', $this, '_replaceLinkURL'); $controller->register_hook('MEDIAMANAGER_CONTENT_OUTPUT', 'BEFORE', $this, '_handleMediaContent'); $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, '_handleMediaFullscreen'); $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, '_handleAjaxMediaList'); $controller->register_hook('ACTION_ACT_PREPROCESS', 'BEFORE', $this, '_replaceSnippetDownload'); } /** * Saves the name of the uploaded media file to a meta file */ function _saveMeta(&$event) { global $conf; $id = $event->data[2]; $filename_tidy = noNS($id); // retrieve original filename if (isset($_GET['qqfile'])) { // via ajax uploader $filename_orig = (string) $_GET['qqfile']; } elseif (isset($_POST['mediaid'])) { if (isset($_FILES['qqfile']['name'])) { // via ajax uploader $filename_orig = (string) $_FILES['qqfile']['name']; } elseif (isset($_FILES['upload']['name'])) { // via old-fashioned upload form $filename_orig = (string) $_FILES['upload']['name']; } else { return; } // check if filename is specified $specified_name = (string) $_POST['mediaid']; if ($specified_name !== '') { $filename_orig = $specified_name; } } else { return; } $filename_safe = $this->common->_sanitizeFileName($filename_orig); // no need to save original filename if ($filename_tidy === $filename_safe) { return; } // fallback if suspicious characters found if ($filename_orig !== $filename_safe) { return; } // save original filename to meta file io_saveFile( mediaMetaFN($id, '.filename'), serialize(array( 'filename' => $filename_safe, )) ); } /** * Deletes a meta file associated with the deleted media file */ function _deleteMeta(&$event) { $id = $event->data['id']; $metaFilePath = mediaMetaFN($id, '.filename'); if (@unlink($metaFilePath)) { io_sweepNS($id, 'mediametadir'); } else { parent::_deleteMeta($event); } } /** * Returns original filename if exists */ function _getOriginalFileName($id) { $metaFilePath = mediaMetaFN($id, '.filename'); $meta = unserialize(io_readFile($metaFilePath, false)); if (empty($meta['filename'])) { // check old meta file (for backward compatibility) $filename = parent::_getOriginalFileName($id); // move old meta file to media_meta directory if ($filename !== false) { $oldMetaFilePath = metaFN($id, '.filename'); io_rename($oldMetaFilePath, $metaFilePath); } return $filename; } else { return $this->common->_sanitizeFileName($meta['filename']); } } /** * Handles media manager content output * * @see tpl_mediaContent */ function _handleMediaContent(&$event) { global $NS; global $AUTH; global $JUMPTO; if ($event->data['do'] !== 'filelist') { return; } $event->preventDefault(); $this->_mod_media_filelist($NS, $AUTH, $JUMPTO); } /** * Handles an action that calls full-screen media manager * * @see tpl_content_core() */ function _handleMediaFullscreen(&$event) { if ($event->data !== 'media') { return; } $event->preventDefault(); $this->_mod_tpl_media(); } /** * Handles a 'medialist' ajax call * * @see ajax_medialist() */ function _handleAjaxMediaList(&$event) { global $NS; if ($event->data !== 'preservefilenames_medialist') { return; } $event->preventDefault(); $NS = cleanID($_POST['ns']); if ($_POST['do'] === 'media') { $this->_mod_tpl_mediaFileList(); } else { tpl_mediaContent('fromAjax'); } } // ------------------------------------------------------- // The following methods whose name starts with '_mod' are // slightly modified versions of existing functions. // ------------------------------------------------------- /** * Prints full-screen media manager * * @see tpl_media() */ function _mod_tpl_media() { global $DEL, $NS, $IMG, $AUTH, $JUMPTO, $REV, $lang, $fullscreen, $conf; $fullscreen = true; require_once DOKU_INC.'lib/exe/mediamanager.php'; if ($_REQUEST['image']) $image = cleanID($_REQUEST['image']); if (isset($IMG)) $image = $IMG; if (isset($JUMPTO)) $image = $JUMPTO; if (isset($REV) && !$JUMPTO) $rev = $REV; echo '
';
// mediamanager button
$link = wl('',array('do'=>'media','image'=>$fakeId,'ns'=>$ns));
echo '
';
// delete button
if($item['writable'] && $auth >= AUTH_DELETE){
$link = DOKU_BASE.'lib/exe/mediamanager.php?delete='.rawurlencode($fakeId).
'§ok='.getSecurityToken();
echo ' '.
'
';
}
echo '{{:'.str_replace(array('{','}'),array('(',')'),$fakeId_escaped).'}}';
echo '