From c43deebfd530415b3cf2aacb9d0b114ce867765b Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Tue, 16 Oct 2012 14:57:58 -0700 Subject: [PATCH] Simplified thumb.php for 404 handling. * Made thumb_handler.php "just work" in a way similar to img_auth. It no longer needs any "handlerUrl" setting to be set. Change-Id: I557ba1f94db3cef0f21f5c0e2b60d8e381ea3f96 --- img_auth.php | 2 +- thumb.php | 56 ++++++++++++++++------------------------------------ 2 files changed, 18 insertions(+), 40 deletions(-) diff --git a/img_auth.php b/img_auth.php index b3a34955de..b04974bf82 100644 --- a/img_auth.php +++ b/img_auth.php @@ -48,7 +48,7 @@ if ( isset( $_SERVER['MW_COMPILED'] ) ) { wfProfileIn( 'img_auth.php' ); # Set action base paths so that WebRequest::getPathInfo() -# recognizes the "X" as the 'title' in ../image_auth/X urls. +# recognizes the "X" as the 'title' in ../img_auth.php/X urls. $wgArticlePath = false; # Don't let a "/*" article path clober our action path $wgActionPaths = array( "$wgUploadPath/" ); diff --git a/thumb.php b/thumb.php index aa23335345..15fbf07392 100644 --- a/thumb.php +++ b/thumb.php @@ -38,6 +38,7 @@ if ( defined( 'THUMB_HANDLER' ) ) { // Called directly, use $_REQUEST params wfThumbHandleRequest(); } + wfLogProfilingData(); //-------------------------------------------------------------------------- @@ -61,28 +62,21 @@ function wfThumbHandleRequest() { * @return void */ function wfThumbHandle404() { - # lighttpd puts the original request in REQUEST_URI, while sjs sets - # that to the 404 handler, and puts the original request in REDIRECT_URL. - if ( isset( $_SERVER['REDIRECT_URL'] ) ) { - # The URL is un-encoded, so put it back how it was - $uriPath = str_replace( "%2F", "/", urlencode( $_SERVER['REDIRECT_URL'] ) ); - } else { - $uriPath = $_SERVER['REQUEST_URI']; - } - # Just get the URI path (REDIRECT_URL/REQUEST_URI is either a full URL or a path) - if ( substr( $uriPath, 0, 1 ) !== '/' ) { - $bits = wfParseUrl( $uriPath ); - if ( $bits && isset( $bits['path'] ) ) { - $uriPath = $bits['path']; - } else { - wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' ); - return; - } + global $wgArticlePath; + + # Set action base paths so that WebRequest::getPathInfo() + # recognizes the "X" as the 'title' in ../thumb_handler.php/X urls. + $wgArticlePath = false; # Don't let a "/*" article path clober our action path + + $matches = WebRequest::getPathInfo(); + if ( !isset( $matches['title'] ) ) { + wfThumbError( 404, 'Could not determine the name of the requested thumbnail.' ); + return; } - $params = wfExtractThumbParams( $uriPath ); // basic wiki URL param extracting + $params = wfExtractThumbParams( $matches['title'] ); // basic wiki URL param extracting if ( $params == null ) { - wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' ); + wfThumbError( 400, 'The specified thumbnail parameters are not recognized.' ); return; } @@ -299,44 +293,28 @@ function wfStreamThumb( array $params ) { * Extract the required params for thumb.php from the thumbnail request URI. * At least 'width' and 'f' should be set if the result is an array. * - * @param $uriPath String Thumbnail request URI path + * @param $thumbRel String Thumbnail path relative to the thumb zone * @return Array|null associative params array or null */ -function wfExtractThumbParams( $uriPath ) { +function wfExtractThumbParams( $thumbRel ) { $repo = RepoGroup::singleton()->getLocalRepo(); - $ext = FileBackend::extensionFromPath( $uriPath ); - // Zone URL might be relative ("/images") or protocol-relative ("//lang.site/image") - $zoneUriPath = $repo->getZoneHandlerUrl( 'thumb' ) - ? $repo->getZoneHandlerUrl( 'thumb' ) // custom URL - : $repo->getZoneUrl( 'thumb', $ext ); // default to main URL - $bits = wfParseUrl( wfExpandUrl( $zoneUriPath, PROTO_INTERNAL ) ); - if ( $bits && isset( $bits['path'] ) ) { - $zoneUriPath = $bits['path']; - } else { - return null; // not a valid thumbnail URL - } - $hashDirReg = $subdirReg = ''; for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) { $subdirReg .= '[0-9a-f]'; $hashDirReg .= "$subdirReg/"; } - $zoneReg = preg_quote( $zoneUriPath ); // regex for thumb zone URI // Check if this is a thumbnail of an original in the local file repo - if ( preg_match( "!^$zoneReg/((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) { + if ( preg_match( "!^((archive/)?$hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) { list( /*all*/, $rel, $archOrTemp, $filename, $thumbname ) = $m; // Check if this is a thumbnail of an temp file in the local file repo - } elseif ( preg_match( "!^$zoneReg/(temp/)($hashDirReg([^/]*)/([^/]*))$!", $uriPath, $m ) ) { + } elseif ( preg_match( "!^(temp/)($hashDirReg([^/]*)/([^/]*))$!", $thumbRel, $m ) ) { list( /*all*/, $archOrTemp, $rel, $filename, $thumbname ) = $m; } else { return null; // not a valid looking thumbnail request } - $filename = urldecode( $filename ); - $thumbname = urldecode( $thumbname ); - $params = array( 'f' => $filename, 'rel404' => $rel ); if ( $archOrTemp === 'archive/' ) { $params['archived'] = 1; -- 2.20.1