X-Git-Url: http://git.cyclocoop.org/%7B%7B%20url_for%28%27admin_vote_del%27%2C%20idvote=vote.voteid%29%20%7D%7D?a=blobdiff_plain;f=thumb.php;h=50d3754da90d993824df7fa0cc9e2200a3cd3030;hb=e476f5f432412f1e94c1dcb7091f1757986457e2;hp=e16d95b4ceebd176d0ecf1aa488e614ec6fd5f52;hpb=dcbe8e7dd3c4d54391d30add214e3c31ce381e34;p=lhc%2Fweb%2Fwiklou.git diff --git a/thumb.php b/thumb.php index e16d95b4ce..50d3754da9 100644 --- a/thumb.php +++ b/thumb.php @@ -1,16 +1,31 @@ getLocalRepo()->newFromArchiveName( $title, $fileName ); + } elseif ( $isTemp ) { + $repo = RepoGroup::singleton()->getLocalRepo()->getTempRepo(); + // Format is ! or just + $bits = explode( '!', $fileName, 2 ); + // Get the name without the timestamp so hash paths are correctly computed + $title = Title::makeTitleSafe( NS_FILE, isset( $bits[1] ) ? $bits[1] : $fileName ); + if ( !$title ) { + wfThumbError( 404, wfMsg( 'badtitletext' ) ); + wfProfileOut( __METHOD__ ); + return; + } + $img = new UnregisteredLocalFile( $title, $repo, + $repo->getZonePath( 'public' ) . '/' . $repo->getTempHashPath( $fileName ) . $fileName + ); } else { $img = wfLocalFile( $fileName ); } // Check permissions if there are read restrictions if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) { - if ( !$img->getTitle()->userCanRead() ) { + if ( !$img->getTitle() || !$img->getTitle()->userCan( 'read' ) ) { wfThumbError( 403, 'Access denied. You do not have permission to access ' . 'the source file.' ); wfProfileOut( __METHOD__ ); @@ -128,6 +167,7 @@ function wfStreamThumb( array $params ) { $headers[] = 'Vary: Cookie'; } + // Check the source file storage path if ( !$img ) { wfThumbError( 404, wfMsg( 'badtitletext' ) ); wfProfileOut( __METHOD__ ); @@ -153,9 +193,9 @@ function wfStreamThumb( array $params ) { // Calculate time wfSuppressWarnings(); $imsUnix = strtotime( $imsString ); - $stat = stat( $sourcePath ); wfRestoreWarnings(); - if ( $stat['mtime'] <= $imsUnix ) { + $sourceTsUnix = wfTimestamp( TS_UNIX, $img->getTimestamp() ); + if ( $sourceTsUnix <= $imsUnix ) { header( 'HTTP/1.1 304 Not Modified' ); wfProfileOut( __METHOD__ ); return; @@ -165,10 +205,21 @@ function wfStreamThumb( array $params ) { // Stream the file if it exists already... try { $thumbName = $img->thumbName( $params ); - if ( $thumbName !== false ) { // valid params? + if ( strlen( $thumbName ) ) { // valid params? + // For 404 handled thumbnails, we only use the the base name of the URI + // for the thumb params and the parent directory for the source file name. + // Check that the zone relative path matches up so squid caches won't pick + // up thumbs that would not be purged on source file deletion (bug 34231). + if ( isset( $params['rel404'] ) // thumbnail was handled via 404 + && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) ) + { + wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' ); + wfProfileOut( __METHOD__ ); + return; + } $thumbPath = $img->getThumbPath( $thumbName ); - if ( is_file( $thumbPath ) ) { - StreamFile::stream( $thumbPath, $headers ); + if ( $img->getRepo()->fileExists( $thumbPath ) ) { + $img->getRepo()->streamFile( $thumbPath, $headers ); wfProfileOut( __METHOD__ ); return; } @@ -182,7 +233,7 @@ function wfStreamThumb( array $params ) { // Thumbnail isn't already there, so create the new thumbnail... try { $thumb = $img->transform( $params, File::RENDER_NOW ); - } catch( Exception $ex ) { + } catch ( Exception $ex ) { // Tried to select a page on a non-paged file? $thumb = false; } @@ -193,18 +244,18 @@ function wfStreamThumb( array $params ) { $errorMsg = wfMsgHtml( 'thumbnail_error', 'File::transform() returned false' ); } elseif ( $thumb->isError() ) { $errorMsg = $thumb->getHtmlMsg(); - } elseif ( !$thumb->getPath() ) { + } elseif ( !$thumb->hasFile() ) { $errorMsg = wfMsgHtml( 'thumbnail_error', 'No path supplied in thumbnail object' ); - } elseif ( $thumb->getPath() == $img->getPath() ) { - $errorMsg = wfMsgHtml( 'thumbnail_error', 'Image was not scaled, ' . - 'is the requested width bigger than the source?' ); + } elseif ( $thumb->fileIsSource() ) { + $errorMsg = wfMsgHtml( 'thumbnail_error', + 'Image was not scaled, is the requested width bigger than the source?' ); } if ( $errorMsg !== false ) { wfThumbError( 500, $errorMsg ); } else { // Stream the file if there were no errors - StreamFile::stream( $thumb->getPath(), $headers ); + $thumb->streamFile( $headers ); } wfProfileOut( __METHOD__ ); @@ -214,34 +265,45 @@ 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 $uri String Thumbnail request URI + * @param $uri String Thumbnail request URI path * @return Array|null associative params array or null */ function wfExtractThumbParams( $uri ) { $repo = RepoGroup::singleton()->getLocalRepo(); + $zoneURI = $repo->getZoneUrl( 'thumb' ); + if ( substr( $zoneURI, 0, 1 ) !== '/' ) { + $bits = wfParseUrl( $zoneURI ); + if ( $bits && isset( $bits['path'] ) ) { + $zoneURI = $bits['path']; + } else { + return null; + } + } + $zoneUrlRegex = preg_quote( $zoneURI ); + $hashDirRegex = $subdirRegex = ''; for ( $i = 0; $i < $repo->getHashLevels(); $i++ ) { $subdirRegex .= '[0-9a-f]'; $hashDirRegex .= "$subdirRegex/"; } - $zoneUrlRegex = preg_quote( $repo->getZoneUrl( 'thumb' ) ); - $thumbUrlRegex = "!^$zoneUrlRegex(/archive|/temp|)/$hashDirRegex([^/]*)/([^/]*)$!"; + $thumbUrlRegex = "!^$zoneUrlRegex/((archive/|temp/)?$hashDirRegex([^/]*)/([^/]*))$!"; // Check if this is a valid looking thumbnail request... if ( preg_match( $thumbUrlRegex, $uri, $matches ) ) { - list( /* all */, $archOrTemp, $filename, $thumbname ) = $matches; + list( /* all */, $rel, $archOrTemp, $filename, $thumbname ) = $matches; + $filename = urldecode( $filename ); + $thumbname = urldecode( $thumbname ); - $params = array( 'f' => $filename ); - if ( $archOrTemp == '/archive' ) { + $params = array( 'f' => $filename, 'rel404' => $rel ); + if ( $archOrTemp == 'archive/' ) { $params['archived'] = 1; - } elseif ( $archOrTemp == '/temp' ) { + } elseif ( $archOrTemp == 'temp/' ) { $params['temp'] = 1; } // Check if the parameters can be extracted from the thumbnail name... - // @TODO: remove 'page' stuff and make ProofreadPage handle it via hook. if ( preg_match( '!^(page(\d*)-)*(\d*)px-[^/]*$!', $thumbname, $matches ) ) { list( /* all */, $pagefull, $pagenum, $size ) = $matches; $params['width'] = $size; @@ -298,4 +360,3 @@ $debug EOT; } -