about summary refs log tree commit diff stats
path: root/wiki/lib/exe/fetch.php
diff options
context:
space:
mode:
Diffstat (limited to 'wiki/lib/exe/fetch.php')
-rw-r--r--wiki/lib/exe/fetch.php99
1 files changed, 99 insertions, 0 deletions
diff --git a/wiki/lib/exe/fetch.php b/wiki/lib/exe/fetch.php
new file mode 100644
index 0000000..933367e
--- /dev/null
+++ b/wiki/lib/exe/fetch.php
@@ -0,0 +1,99 @@
+<?php
+/**
+ * DokuWiki media passthrough file
+ *
+ * @license    GPL 2 (http://www.gnu.org/licenses/gpl.html)
+ * @author     Andreas Gohr <andi@splitbrain.org>
+ */
+
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/../../');
+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);
+
+    list($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
+    list($STATUS, $STATUSMESSAGE) = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT);
+
+    // prepare data for plugin events
+    $data = array(
+        '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),
+    );
+
+    // handle the file status
+    $evt = new Doku_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) {
+            print $data['statusmessage'];
+            if (defined('SIMPLE_TEST')) return;
+            exit;
+        }
+    }
+    $evt->advise_after();
+    unset($evt);
+
+    //handle image resizing/cropping
+    if((substr($MIME, 0, 5) == '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);
+        }
+    }
+
+    // finally send the file to the client
+    $evt = new Doku_Event('MEDIA_SENDFILE', $data);
+    if($evt->advise_before()) {
+        sendFile($data['file'], $data['mime'], $data['download'], $data['cache'], $data['ispublic'], $data['orig']);
+    }
+    // Do something after the download finished.
+    $evt->advise_after();  // will not be emitted on 304 or x-sendfile
+
+// END DO main
+
+//Setup VIM: ex: et ts=2 :