xref: /dokuwiki/lib/exe/fetch.php (revision 36300e604411e5721fdbfbaf626280ace1b88d67)
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),
586cda96e3SAndreas Gohr        'csp' => [
596cda96e3SAndreas Gohr            'default-src' => "'none'",
606cda96e3SAndreas Gohr            'style-src' => "'unsafe-inline'",
616cda96e3SAndreas Gohr            'media-src' => "'self'",
626cda96e3SAndreas Gohr            'object-src' => "'self'",
63*36300e60SAndreas Gohr            'font-src' => "'self' data:",
646cda96e3SAndreas Gohr            'form-action' => "'none'",
6501648efdSAndreas Gohr            'frame-ancestors' => "'self'",
666cda96e3SAndreas 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()) {
948e9d8d55SAndreas Gohr        if(
958e9d8d55SAndreas Gohr            $MIME != 'image/svg+xml' &&
968e9d8d55SAndreas Gohr            (substr($MIME, 0, 5) == 'image') &&
978e9d8d55SAndreas Gohr            ($WIDTH || $HEIGHT)
988e9d8d55SAndreas Gohr        ) {
99793c31f2SChristopher Smith            if($HEIGHT && $WIDTH) {
100cd98d9c3SGerry Weißbach                $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT);
10120bc86cfSAndreas Gohr            } else {
102cd98d9c3SGerry Weißbach                $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT);
103f62ea8a1Sandi            }
10420bc86cfSAndreas Gohr        }
105bfca0246SSam    }
106bfca0246SSam    $evt->advise_after();
107bfca0246SSam    unset($evt);
108f62ea8a1Sandi
109e935fb4aSAndreas Gohr    // finally send the file to the client
110e1d9dcc8SAndreas Gohr    $evt = new Event('MEDIA_SENDFILE', $data);
111b80bedd6SAndreas Gohr    if($evt->advise_before()) {
1126cda96e3SAndreas Gohr        sendFile(
1136cda96e3SAndreas Gohr            $data['file'],
1146cda96e3SAndreas Gohr            $data['mime'],
1156cda96e3SAndreas Gohr            $data['download'],
1166cda96e3SAndreas Gohr            $data['cache'],
1176cda96e3SAndreas Gohr            $data['ispublic'],
1186cda96e3SAndreas Gohr            $data['orig'],
1196cda96e3SAndreas Gohr            $data['csp']
1206cda96e3SAndreas Gohr        );
121b80bedd6SAndreas Gohr    }
122cd98d9c3SGerry Weißbach    // Do something after the download finished.
123add8678fSAndreas Gohr    $evt->advise_after();  // will not be emitted on 304 or x-sendfile
124f62ea8a1Sandi
1257fb7960fSChristopher Smith// END DO main
126f62ea8a1Sandi
127e3776c06SMichael Hamann//Setup VIM: ex: et ts=2 :
128