*/ use dokuwiki\Input\Input; use dokuwiki\Extension\Event; if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1); require_once(DOKU_INC . 'inc/init.php'); session_write_close(); //close session require_once(DOKU_INC . 'inc/fetch.functions.php'); if (defined('SIMPLE_TEST')) { $INPUT = new Input(); } // BEGIN main $mimetypes = getMimeTypes(); //get input $MEDIA = stripctl(getID('media', false)); // no cleaning except control chars - maybe external $CACHE = calc_cache($INPUT->str('cache')); $WIDTH = $INPUT->int('w'); $HEIGHT = $INPUT->int('h'); $REV = &$INPUT->ref('rev'); //sanitize revision $REV = preg_replace('/[^0-9]/', '', $REV); [$EXT, $MIME, $DL] = mimetype($MEDIA, false); if ($EXT === false) { $EXT = 'unknown'; $MIME = 'application/octet-stream'; $DL = true; } // check for permissions, preconditions and cache external files [$STATUS, $STATUSMESSAGE] = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT); // prepare data for plugin events $data = [ 'media' => $MEDIA, 'file' => $FILE, 'orig' => $FILE, 'mime' => $MIME, 'download' => $DL, 'cache' => $CACHE, 'ext' => $EXT, 'width' => $WIDTH, 'height' => $HEIGHT, 'status' => $STATUS, 'statusmessage' => $STATUSMESSAGE, 'ispublic' => media_ispublic($MEDIA), 'csp' => [ 'default-src' => "'none'", 'style-src' => "'unsafe-inline'", 'media-src' => "'self'", 'object-src' => "'self'", 'font-src' => "'self' data:", 'form-action' => "'none'", 'frame-ancestors' => "'self'", ] ]; // handle the file status $evt = new Event('FETCH_MEDIA_STATUS', $data); if ($evt->advise_before()) { // redirects if ($data['status'] > 300 && $data['status'] <= 304) { if (defined('SIMPLE_TEST')) return; //TestResponse doesn't recognize redirects send_redirect($data['statusmessage']); } // send any non 200 status if ($data['status'] != 200) { http_status($data['status'], $data['statusmessage']); } // die on errors if ($data['status'] > 203) { echo $data['statusmessage']; if (defined('SIMPLE_TEST')) return; exit; } } $evt->advise_after(); unset($evt); //handle image resizing/cropping $evt = new Event('MEDIA_RESIZE', $data); if ($evt->advise_before()) { if ( $MIME != 'image/svg+xml' && str_starts_with($MIME, 'image') && ($WIDTH || $HEIGHT) ) { if ($HEIGHT && $WIDTH) { $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT); } else { $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT); } } } $evt->advise_after(); unset($evt); // finally send the file to the client $evt = new Event('MEDIA_SENDFILE', $data); if ($evt->advise_before()) { sendFile( $data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig'], $data['csp'] ); } // Do something after the download finished. $evt->advise_after(); // will not be emitted on 304 or x-sendfile // END DO main