1f62ea8a1Sandi<?php 2f62ea8a1Sandi/** 3f62ea8a1Sandi * DokuWiki media passthrough file 4f62ea8a1Sandi * 5f62ea8a1Sandi * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) 6f62ea8a1Sandi * @author Andreas Gohr <andi@splitbrain.org> 7f62ea8a1Sandi */ 8f62ea8a1Sandi 9e1d9dcc8SAndreas Gohruse dokuwiki\Extension\Event; 10e1d9dcc8SAndreas Gohr 11d0a27cb0SAndreas Gohrif(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../'); 127fb7960fSChristopher Smithif (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1); 13f62ea8a1Sandirequire_once(DOKU_INC.'inc/init.php'); 1436625b96SAndreas Gohrsession_write_close(); //close session 158746e727Sandi 167fb7960fSChristopher Smithrequire_once(DOKU_INC.'inc/fetch.functions.php'); 177fb7960fSChristopher Smith 187fb7960fSChristopher Smithif (defined('SIMPLE_TEST')) { 19ccc4c71cSAndreas Gohr $INPUT = new \dokuwiki\Input\Input(); 207fb7960fSChristopher Smith} 217fb7960fSChristopher Smith 227fb7960fSChristopher Smith// BEGIN main 23f62ea8a1Sandi $mimetypes = getMimeTypes(); 24f62ea8a1Sandi 25f62ea8a1Sandi //get input 2602b0b681SAndreas Gohr $MEDIA = stripctl(getID('media', false)); // no cleaning except control chars - maybe external 27bfd0f597STom N Harris $CACHE = calc_cache($INPUT->str('cache')); 28bfd0f597STom N Harris $WIDTH = $INPUT->int('w'); 29bfd0f597STom N Harris $HEIGHT = $INPUT->int('h'); 30bfd0f597STom N Harris $REV = & $INPUT->ref('rev'); 31fc4aefb9SKate Arzamastseva //sanitize revision 32fc4aefb9SKate Arzamastseva $REV = preg_replace('/[^0-9]/', '', $REV); 33fc4aefb9SKate Arzamastseva 3427bf7924STom N Harris list($EXT, $MIME, $DL) = mimetype($MEDIA, false); 35f62ea8a1Sandi if($EXT === false) { 36f62ea8a1Sandi $EXT = 'unknown'; 37f62ea8a1Sandi $MIME = 'application/octet-stream'; 38ecebf3a8SAndreas Gohr $DL = true; 39f62ea8a1Sandi } 40f62ea8a1Sandi 4103293305SAndreas Gohr // check for permissions, preconditions and cache external files 420f4e0092SChristopher Smith list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT); 4303293305SAndreas Gohr 4403293305SAndreas Gohr // prepare data for plugin events 453b399a1bSAndreas Gohr $data = array( 463b399a1bSAndreas Gohr 'media' => $MEDIA, 47cd98d9c3SGerry Weißbach 'file' => $FILE, 48cd98d9c3SGerry Weißbach 'orig' => $FILE, 49cd98d9c3SGerry Weißbach 'mime' => $MIME, 50cd98d9c3SGerry Weißbach 'download' => $DL, 51cd98d9c3SGerry Weißbach 'cache' => $CACHE, 52cd98d9c3SGerry Weißbach 'ext' => $EXT, 53cd98d9c3SGerry Weißbach 'width' => $WIDTH, 54cd98d9c3SGerry Weißbach 'height' => $HEIGHT, 55cd98d9c3SGerry Weißbach 'status' => $STATUS, 56cd98d9c3SGerry Weißbach 'statusmessage' => $STATUSMESSAGE, 57add8678fSAndreas Gohr 'ispublic' => media_ispublic($MEDIA), 58*6cda96e3SAndreas Gohr 'csp' => [ 59*6cda96e3SAndreas Gohr 'sandbox' => '', 60*6cda96e3SAndreas Gohr 'default-src' => "'none'", 61*6cda96e3SAndreas Gohr 'script-src' => "'none'", 62*6cda96e3SAndreas Gohr 'style-src' => "'unsafe-inline'", 63*6cda96e3SAndreas Gohr 'media-src' => "'self'", 64*6cda96e3SAndreas Gohr 'object-src' => "'self'", 65*6cda96e3SAndreas Gohr 'form-action' => "'none'", 66*6cda96e3SAndreas Gohr ], 67cd98d9c3SGerry Weißbach ); 68f62ea8a1Sandi 6903293305SAndreas Gohr // handle the file status 70e1d9dcc8SAndreas Gohr $evt = new Event('FETCH_MEDIA_STATUS', $data); 71cd98d9c3SGerry Weißbach if($evt->advise_before()) { 7203293305SAndreas Gohr // redirects 7303293305SAndreas Gohr if($data['status'] > 300 && $data['status'] <= 304) { 74d572baf8SKlap-in if (defined('SIMPLE_TEST')) return; //TestResponse doesn't recognize redirects 7503293305SAndreas Gohr send_redirect($data['statusmessage']); 7603293305SAndreas Gohr } 7703293305SAndreas Gohr // send any non 200 status 7803293305SAndreas Gohr if($data['status'] != 200) { 799d2e1be6SAndreas Gohr http_status($data['status'], $data['statusmessage']); 8003293305SAndreas Gohr } 8103293305SAndreas Gohr // die on errors 8203293305SAndreas Gohr if($data['status'] > 203) { 83cd98d9c3SGerry Weißbach print $data['statusmessage']; 847fb7960fSChristopher Smith if (defined('SIMPLE_TEST')) return; 85f62ea8a1Sandi exit; 86f62ea8a1Sandi } 87f62ea8a1Sandi } 8803293305SAndreas Gohr $evt->advise_after(); 8903293305SAndreas Gohr unset($evt); 90f62ea8a1Sandi 9120bc86cfSAndreas Gohr //handle image resizing/cropping 92bfca0246SSam $evt = new Event('MEDIA_RESIZE', $data); 93bfca0246SSam if($evt->advise_before()) { 9477450f40Slisps if((substr($MIME, 0, 5) == 'image') && ($WIDTH || $HEIGHT)) { 95793c31f2SChristopher Smith if($HEIGHT && $WIDTH) { 96cd98d9c3SGerry Weißbach $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT); 9720bc86cfSAndreas Gohr } else { 98cd98d9c3SGerry Weißbach $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT); 99f62ea8a1Sandi } 10020bc86cfSAndreas Gohr } 101bfca0246SSam } 102bfca0246SSam $evt->advise_after(); 103bfca0246SSam unset($evt); 104f62ea8a1Sandi 105e935fb4aSAndreas Gohr // finally send the file to the client 106e1d9dcc8SAndreas Gohr $evt = new Event('MEDIA_SENDFILE', $data); 107b80bedd6SAndreas Gohr if($evt->advise_before()) { 108*6cda96e3SAndreas Gohr sendFile( 109*6cda96e3SAndreas Gohr $data['file'], 110*6cda96e3SAndreas Gohr $data['mime'], 111*6cda96e3SAndreas Gohr $data['download'], 112*6cda96e3SAndreas Gohr $data['cache'], 113*6cda96e3SAndreas Gohr $data['ispublic'], 114*6cda96e3SAndreas Gohr $data['orig'], 115*6cda96e3SAndreas Gohr $data['csp'] 116*6cda96e3SAndreas Gohr ); 117b80bedd6SAndreas Gohr } 118cd98d9c3SGerry Weißbach // Do something after the download finished. 119add8678fSAndreas Gohr $evt->advise_after(); // will not be emitted on 304 or x-sendfile 120f62ea8a1Sandi 1217fb7960fSChristopher Smith// END DO main 122f62ea8a1Sandi 123e3776c06SMichael Hamann//Setup VIM: ex: et ts=2 : 124