From 066834ea588266f3984d391629df583aac3bac8f Mon Sep 17 00:00:00 2001 From: Brion Vibber Date: Fri, 3 Sep 2004 07:12:46 +0000 Subject: [PATCH] Normalize Unicode in uploaded filenames. In particular this is a fix for a problem with non-ascii filenames uploaded with Safari, which encodes the file with HTML character references *with combining characters decomposed*. * Fix for http://bugzilla.wikipedia.org/show_bug.cgi?id=215 --- includes/SpecialUpload.php | 6 +++--- includes/WebRequest.php | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+), 3 deletions(-) diff --git a/includes/SpecialUpload.php b/includes/SpecialUpload.php index 101cd4bd90..cb2a81bbad 100644 --- a/includes/SpecialUpload.php +++ b/includes/SpecialUpload.php @@ -44,12 +44,12 @@ class UploadForm { $this->mSessionKey = $request->getVal( 'wpSessionKey' ); if ( ! $this->mUploadTempName ) { - $this->mUploadTempName = @$_FILES['wpUploadFile']['tmp_name']; + $this->mUploadTempName = $request->getFileTempName( 'wpUploadFile' ); } if ( ! $this->mUploadSize ) { - $this->mUploadSize = @$_FILES['wpUploadFile']['size']; + $this->mUploadSize = $request->getFileSize( 'wpUploadFile' ); } - $this->mOname = $request->getGPCVal( $_FILES['wpUploadFile'], 'name', "" ); + $this->mOname = $request->getFileName( 'wpUploadFile' ); } diff --git a/includes/WebRequest.php b/includes/WebRequest.php index 1cf69280e1..3f49e8b88f 100644 --- a/includes/WebRequest.php +++ b/includes/WebRequest.php @@ -186,6 +186,44 @@ class WebRequest { return array( $limit, $offset ); } + + /** + * Get information on uploaded files + */ + function getFileTempname( $key ) { + if( !isset( $_FILES[$key] ) ) { + return NULL; + } + return $_FILES[$key]['tmp_name']; + } + + function getFileSize( $key ) { + if( !isset( $_FILES[$key] ) ) { + return 0; + } + return $_FILES[$key]['size']; + } + + function getFileName( $key ) { + if( !isset( $_FILES[$key] ) ) { + return NULL; + } + $name = $_FILES[$key]['name']; + + # Safari sends filenames in HTML-encoded Unicode form D... + # Horrid and evil! Let's try to make some kind of sense of it. + global $wgUseLatin1; + if( $wgUseLatin1 ) { + $name = utf8_encode( $name ); + } + $name = wfMungeToUtf8( $name ); + $name = UtfNormal::cleanUp( $name ); + if( $wgUseLatin1 ) { + $name = utf8_decode( $name ); + } + wfDebug( "WebRequest::getFileName() '" . $_FILES[$key]['name'] . "' normalized to '$name'\n" ); + return $name; + } } /** -- 2.20.1