X-Git-Url: http://git.roojs.org/?a=blobdiff_plain;f=webkitpdf.php;h=4c470b51e303e4f487026ab73dc2ef2ada23b8f6;hb=674d7c0892acbf9e8ccf30744537f59014ce59d4;hp=a0758eef5096b32a4c47d3d9d121ac96ec69582d;hpb=645b4fd5a56ef345947ca48ac6e58c9322fcc7f2;p=app.webkitpdf diff --git a/webkitpdf.php b/webkitpdf.php index a0758ee..4c470b5 100644 --- a/webkitpdf.php +++ b/webkitpdf.php @@ -30,21 +30,70 @@ class WebkitPdf require_once 'System.php'; - $xvfb = System::which('xvfb'); + $timeout= System::which('timeout'); + if (empty($timeout)) { + $this->h404("missing timeout"); + } + + $xvfb = System::which('xvfb-run'); if (empty($xvfb)) { $this->h404("missing xvfb"); } - $xvfb = System::which('webkitpdf'); - if (empty($xvfb)) { + $webkitpdf = System::which('webkitpdf'); + if (empty($webkitpdf )) { $this->h404("missing webkitpdf (compile it..)"); } // max delay 20 seconds.? bit generous.. $delay = empty($_REQUEST['delay']) ? 1 : max(20,$_REQUEST['delay']); + //?? allow injections? + // not yet.. + + $outpr = tempnam(ini_get('session.save_path'), 'webkitTMP'); + unlink($outpr); + $out = $outpr .'.pdf'; + + // can take 2-5 minutes... + $cmd = "timeout 300s $xvfb --auto-servernum $webkitpdf " . + " --url " . escapeshellarg($_REQUEST['url']) . ' ' . + " --pdf " . $out . ' '; + + $res = `$cmd`; + if (!file_exists($out)) { + $this->h404("Failed to create file $cmd ==> $res"); + } + + header('Content-type: application/octet-stream'); + + header("Expires: "); + header("Cache-Control: must-revalidate, post-check=0,pre-check=0"); + header("Pragma: public"); + header("Last-Modified: " . gmdate("D, d M Y H:i:s", time()) . " GMT"); + + //header('Content-length: '. filesize($out)); + header('Content-Disposition: attachment; filename="' . htmlspecialchars(basename($out)). '"'); + ini_set('display_errors', 0); + $fh = fopen($out, 'rb'); + fpassthru($fh); + + fclose($fh); + + + unlink($out); + exit; + + + } + + function h404($msg) + { + header("HTTP/1.0 404 Not Found"); + echo htmlspecialchars($msg); + exit; } } \ No newline at end of file