14df872e4SAndreas Gohr<?php 24df872e4SAndreas Gohr/** 34df872e4SAndreas Gohr * DokuWiki Plugin imgpaste (Action Component) 44df872e4SAndreas Gohr * 54df872e4SAndreas Gohr * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html 64df872e4SAndreas Gohr * @author Andreas Gohr <gohr@cosmocode.de> 74df872e4SAndreas Gohr */ 84df872e4SAndreas Gohr 94df872e4SAndreas Gohr// must be run within Dokuwiki 104df872e4SAndreas Gohrif(!defined('DOKU_INC')) die(); 114df872e4SAndreas Gohr 124df872e4SAndreas Gohrif(!defined('DOKU_LF')) define('DOKU_LF', "\n"); 134df872e4SAndreas Gohrif(!defined('DOKU_TAB')) define('DOKU_TAB', "\t"); 144df872e4SAndreas Gohrif(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN', DOKU_INC . 'lib/plugins/'); 154df872e4SAndreas Gohr 164df872e4SAndreas Gohrrequire_once DOKU_PLUGIN . 'action.php'; 174df872e4SAndreas Gohr 184df872e4SAndreas Gohrclass action_plugin_imgpaste extends DokuWiki_Action_Plugin { 194df872e4SAndreas Gohr 204df872e4SAndreas Gohr private $tempdir = ''; 214df872e4SAndreas Gohr private $tempfile = ''; 224df872e4SAndreas Gohr 233250b209SAndreas Gohr public function register(Doku_Event_Handler $controller) { 244df872e4SAndreas Gohr 254df872e4SAndreas Gohr $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown'); 264df872e4SAndreas Gohr 274df872e4SAndreas Gohr } 284df872e4SAndreas Gohr 294df872e4SAndreas Gohr public function handle_ajax_call_unknown(Doku_Event &$event, $param) { 304df872e4SAndreas Gohr if($event->data != 'plugin_imgpaste') return; 314df872e4SAndreas Gohr global $lang; 324df872e4SAndreas Gohr 334df872e4SAndreas Gohr // get data 344df872e4SAndreas Gohr global $INPUT; 354df872e4SAndreas Gohr $data = $INPUT->post->str('data'); 364df872e4SAndreas Gohr list($type, $data) = explode(';', $data); 374df872e4SAndreas Gohr if(!$data) $this->fail(400, $this->getLang('e_nodata')); 384df872e4SAndreas Gohr 394df872e4SAndreas Gohr // process data encoding 404df872e4SAndreas Gohr $type = strtolower(substr($type, 5)); // strip 'data:' prefix 414df872e4SAndreas Gohr $data = substr($data, 7); // strip 'base64,' prefix 424df872e4SAndreas Gohr $data = base64_decode($data); 434df872e4SAndreas Gohr 444df872e4SAndreas Gohr // check for supported mime type 454df872e4SAndreas Gohr $mimetypes = array_flip(getMimeTypes()); 464df872e4SAndreas Gohr if(!isset($mimetypes[$type])) $this->fail(415, $lang['uploadwrong']); 474df872e4SAndreas Gohr 484df872e4SAndreas Gohr // prepare file names 494df872e4SAndreas Gohr $tempname = $this->storetemp($data); 504df872e4SAndreas Gohr $filename = $this->getConf('filename'); 514df872e4SAndreas Gohr $filename = str_replace( 524df872e4SAndreas Gohr array( 534df872e4SAndreas Gohr '@NS@', 544df872e4SAndreas Gohr '@ID@', 55*252b10e0Sfstorck '@USER@', 56*252b10e0Sfstorck '@PAGE@' 574df872e4SAndreas Gohr ), 584df872e4SAndreas Gohr array( 594df872e4SAndreas Gohr getNS($INPUT->post->str('id')), 604df872e4SAndreas Gohr $INPUT->post->str('id'), 61*252b10e0Sfstorck $_SERVER['REMOTE_USER'], 62*252b10e0Sfstorck noNS($INPUT->post->str('id') 634df872e4SAndreas Gohr ), 644df872e4SAndreas Gohr $filename 654df872e4SAndreas Gohr ); 664df872e4SAndreas Gohr $filename = strftime($filename); 674df872e4SAndreas Gohr $filename .= '.'.$mimetypes[$type]; 684df872e4SAndreas Gohr $filename = cleanID($filename); 694df872e4SAndreas Gohr 704df872e4SAndreas Gohr // check ACLs 714df872e4SAndreas Gohr $auth = auth_quickaclcheck($filename); 724df872e4SAndreas Gohr if($auth < AUTH_UPLOAD) $this->fail(403, $lang['uploadfail']); 734df872e4SAndreas Gohr 744df872e4SAndreas Gohr // do the actual saving 754df872e4SAndreas Gohr $result = media_save( 764df872e4SAndreas Gohr array( 774df872e4SAndreas Gohr 'name' => $tempname, 784df872e4SAndreas Gohr 'mime' => $type, 794df872e4SAndreas Gohr 'ext' => $mimetypes[$type] 804df872e4SAndreas Gohr ), 814df872e4SAndreas Gohr $filename, 824df872e4SAndreas Gohr false, 834df872e4SAndreas Gohr $auth, 844df872e4SAndreas Gohr 'copy' 854df872e4SAndreas Gohr ); 864df872e4SAndreas Gohr if(is_array($result)) $this->fail(500, $result[0]); 874df872e4SAndreas Gohr 884df872e4SAndreas Gohr //Still here? We had a successful upload 894df872e4SAndreas Gohr $this->clean(); 904df872e4SAndreas Gohr header('Content-Type: application/json'); 914df872e4SAndreas Gohr $json = new JSON(); 924df872e4SAndreas Gohr echo $json->encode( 934df872e4SAndreas Gohr array( 944df872e4SAndreas Gohr 'message' => $lang['uploadsucc'], 954df872e4SAndreas Gohr 'id' => $result 964df872e4SAndreas Gohr ) 974df872e4SAndreas Gohr ); 984df872e4SAndreas Gohr 994df872e4SAndreas Gohr $event->preventDefault(); 1004df872e4SAndreas Gohr $event->stopPropagation(); 1014df872e4SAndreas Gohr } 1024df872e4SAndreas Gohr 1034df872e4SAndreas Gohr /** 1044df872e4SAndreas Gohr * Create a temporary file from the given data 1054df872e4SAndreas Gohr * 1064df872e4SAndreas Gohr * exits if an error occurs 1074df872e4SAndreas Gohr * 1084df872e4SAndreas Gohr * @param $data 1094df872e4SAndreas Gohr * @return string 1104df872e4SAndreas Gohr */ 1114df872e4SAndreas Gohr private function storetemp($data){ 1124df872e4SAndreas Gohr // store in temporary file 1134df872e4SAndreas Gohr $this->tempdir = io_mktmpdir(); 1144df872e4SAndreas Gohr if(!$this->tempdir) $this->fail(500); 1154df872e4SAndreas Gohr $this->tempfile = $this->tempdir.'/'.md5($data); 1164df872e4SAndreas Gohr if(!io_saveFile($this->tempfile, $data)) $this->fail(500); 1174df872e4SAndreas Gohr return $this->tempfile; 1184df872e4SAndreas Gohr } 1194df872e4SAndreas Gohr 1204df872e4SAndreas Gohr /** 1214df872e4SAndreas Gohr * remove temporary file and directory 1224df872e4SAndreas Gohr */ 1234df872e4SAndreas Gohr private function clean(){ 1244df872e4SAndreas Gohr if($this->tempfile && file_exists($this->tempfile)) @unlink($this->tempfile); 1254df872e4SAndreas Gohr if($this->tempdir && is_dir($this->tempdir)) @rmdir($this->tempdir); 1264df872e4SAndreas Gohr $this->tempfile = ''; 1274df872e4SAndreas Gohr $this->tempdir = ''; 1284df872e4SAndreas Gohr } 1294df872e4SAndreas Gohr 1304df872e4SAndreas Gohr /** 1314df872e4SAndreas Gohr * End the execution with a HTTP error code 1324df872e4SAndreas Gohr * 1334df872e4SAndreas Gohr * Calls clean 1344df872e4SAndreas Gohr * 1354df872e4SAndreas Gohr * @param int $status HTTP status code 1364df872e4SAndreas Gohr * @param string $text 1374df872e4SAndreas Gohr */ 1384df872e4SAndreas Gohr private function fail($status, $text=''){ 1394df872e4SAndreas Gohr $this->clean(); 1404df872e4SAndreas Gohr http_status($status, $text); 1414df872e4SAndreas Gohr exit; 1424df872e4SAndreas Gohr } 1434df872e4SAndreas Gohr} 1444df872e4SAndreas Gohr 1454df872e4SAndreas Gohr// vim:ts=4:sw=4:et: 146