From d22c890890b44a5b16cdc6acc5f59cff0f646b70 Mon Sep 17 00:00:00 2001 From: Aaron Schulz Date: Fri, 31 Aug 2012 21:20:56 -0700 Subject: [PATCH] Fixed and normalized content-disposition for thumbs. * Previously, thumbnails could have a hex tmp file name as the disposition. Change-Id: I495860dc54c02d2b3e053e998a41674cd6d07f2f --- includes/StreamFile.php | 5 ---- includes/filerepo/file/File.php | 15 ++++++++++- thumb.php | 45 +++++++++++++++++++-------------- 3 files changed, 40 insertions(+), 25 deletions(-) diff --git a/includes/StreamFile.php b/includes/StreamFile.php index e7f7811731..95c69a20b6 100644 --- a/includes/StreamFile.php +++ b/includes/StreamFile.php @@ -79,8 +79,6 @@ class StreamFile { public static function prepareForStream( $path, $info, $headers = array(), $sendErrors = true ) { - global $wgLanguageCode; - if ( !is_array( $info ) ) { if ( $sendErrors ) { header( 'HTTP/1.0 404 Not Found' ); @@ -121,9 +119,6 @@ class StreamFile { return false; } - header( "Content-Disposition: inline;filename*=utf-8'$wgLanguageCode'" . - urlencode( basename( $path ) ) ); - // Send additional headers foreach ( $headers as $header ) { header( $header ); diff --git a/includes/filerepo/file/File.php b/includes/filerepo/file/File.php index 4cc47f0041..3aa27ec6a4 100644 --- a/includes/filerepo/file/File.php +++ b/includes/filerepo/file/File.php @@ -943,7 +943,7 @@ abstract class File { } } elseif ( $this->repo && $thumb->hasFile() && !$thumb->fileIsSource() ) { // Copy the thumbnail from the file system into storage... - $disposition = FileBackend::makeContentDisposition( 'inline', $this->name ); + $disposition = $this->getThumbDisposition( $thumbName ); $status = $this->repo->quickImport( $tmpThumbPath, $thumbPath, $disposition ); if ( $status->isOK() ) { $thumb->setStoragePath( $thumbPath ); @@ -968,6 +968,19 @@ abstract class File { return is_object( $thumb ) ? $thumb : false; } + /** + * @param $thumbName string Thumbnail name + * @return string Content-Disposition header value + */ + function getThumbDisposition( $thumbName ) { + $fileName = $this->name; // file name to suggest + $thumbExt = FileBackend::extensionFromPath( $thumbName ); + if ( $thumbExt != '' && $thumbExt !== $this->getExtension() ) { + $fileName .= ".$thumbExt"; + } + return FileBackend::makeContentDisposition( 'inline', $fileName ); + } + /** * Hook into transform() to allow migration of thumbnail files * STUB diff --git a/thumb.php b/thumb.php index 8307b488bf..8fc868d415 100644 --- a/thumb.php +++ b/thumb.php @@ -205,27 +205,34 @@ function wfStreamThumb( array $params ) { } } + $thumbName = $img->thumbName( $params ); + if ( !strlen( $thumbName ) ) { // invalid params? + wfThumbError( 400, 'The specified thumbnail parameters are not valid.' ); + wfProfileOut( __METHOD__ ); + return; + } + + $disposition = $img->getThumbDisposition( $thumbName ); + $headers[] = "Content-Disposition: $disposition"; + // Stream the file if it exists already... try { - $thumbName = $img->thumbName( $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 ( $img->getRepo()->fileExists( $thumbPath ) ) { - $img->getRepo()->streamFile( $thumbPath, $headers ); - wfProfileOut( __METHOD__ ); - return; - } + // 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 ( $img->getRepo()->fileExists( $thumbPath ) ) { + $img->getRepo()->streamFile( $thumbPath, $headers ); + wfProfileOut( __METHOD__ ); + return; } } catch ( MWException $e ) { wfThumbError( 500, $e->getHTML() ); -- 2.20.1