Merge "Protected function UploadBase->validateName changed to public"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Fri, 5 Apr 2013 21:11:08 +0000 (21:11 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Fri, 5 Apr 2013 21:11:08 +0000 (21:11 +0000)
1  2 
includes/upload/UploadBase.php

@@@ -70,18 -70,17 +70,18 @@@ abstract class UploadBase 
         * @return string
         */
        public function getVerificationErrorCode( $error ) {
 -              $code_to_status = array(self::EMPTY_FILE => 'empty-file',
 -                                                              self::FILE_TOO_LARGE => 'file-too-large',
 -                                                              self::FILETYPE_MISSING => 'filetype-missing',
 -                                                              self::FILETYPE_BADTYPE => 'filetype-banned',
 -                                                              self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
 -                                                              self::ILLEGAL_FILENAME => 'illegal-filename',
 -                                                              self::OVERWRITE_EXISTING_FILE => 'overwrite',
 -                                                              self::VERIFICATION_ERROR => 'verification-error',
 -                                                              self::HOOK_ABORTED => 'hookaborted',
 -                                                              self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
 -                                                              self::FILENAME_TOO_LONG => 'filename-toolong',
 +              $code_to_status = array(
 +                      self::EMPTY_FILE => 'empty-file',
 +                      self::FILE_TOO_LARGE => 'file-too-large',
 +                      self::FILETYPE_MISSING => 'filetype-missing',
 +                      self::FILETYPE_BADTYPE => 'filetype-banned',
 +                      self::MIN_LENGTH_PARTNAME => 'filename-tooshort',
 +                      self::ILLEGAL_FILENAME => 'illegal-filename',
 +                      self::OVERWRITE_EXISTING_FILE => 'overwrite',
 +                      self::VERIFICATION_ERROR => 'verification-error',
 +                      self::HOOK_ABORTED => 'hookaborted',
 +                      self::WINDOWS_NONASCII_FILENAME => 'windows-nonascii-filename',
 +                      self::FILENAME_TOO_LONG => 'filename-toolong',
                );
                if( isset( $code_to_status[$error] ) ) {
                        return $code_to_status[$error];
        /**
         * Returns true if the user can use this upload module or else a string
         * identifying the missing permission.
 -       * Can be overriden by subclasses.
 +       * Can be overridden by subclasses.
         *
         * @param $user User
         * @return bool
  
        /**
         * Initialize the path information
 -       * @param $name string the desired destination name
 -       * @param $tempPath string the temporary path
 -       * @param $fileSize int the file size
 -       * @param $removeTempFile bool (false) remove the temporary file?
 +       * @param string $name the desired destination name
 +       * @param string $tempPath the temporary path
 +       * @param int $fileSize the file size
 +       * @param bool $removeTempFile (false) remove the temporary file?
         * @throws MWException
         */
        public function initializePathInfo( $name, $tempPath, $fileSize, $removeTempFile = false ) {
         * Get the base 36 SHA1 of the file
         * @return string
         */
 -      protected function getTempFileSha1Base36() {
 +      public function getTempFileSha1Base36() {
                return FSFile::getSha1Base36FromPath( $this->mTempPath );
        }
  
        /**
 -       * @param $srcPath String: the source path
 +       * @param string $srcPath the source path
         * @return string the real path if it was a virtual URL
         */
        function getRealPath( $srcPath ) {
                $repo = RepoGroup::singleton()->getLocalRepo();
                if ( $repo->isVirtualUrl( $srcPath ) ) {
                        // @TODO: just make uploads work with storage paths
 -                      // UploadFromStash loads files via virtuals URLs
 +                      // UploadFromStash loads files via virtual URLs
                        $tmpFile = $repo->getLocalCopy( $srcPath );
                        $tmpFile->bind( $this ); // keep alive with $this
                        wfProfileOut( __METHOD__ );
         * @return mixed true if valid, otherwise and array with 'status'
         * and other keys
         **/
-       protected function validateName() {
+       public function validateName() {
                $nt = $this->getTitle();
                if( is_null( $nt ) ) {
                        $result = array( 'status' => $this->mTitleError );
        /**
         * Verify the mime type
         *
 -       * @param $mime string representing the mime
 +       * @param string $mime representing the mime
         * @return mixed true if the file is verified, an array otherwise
         */
        protected function verifyMimeType( $mime ) {
                global $wgVerifyMimeType;
                wfProfileIn( __METHOD__ );
                if ( $wgVerifyMimeType ) {
 -                      wfDebug ( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
 +                      wfDebug( "\n\nmime: <$mime> extension: <{$this->mFinalExtension}>\n\n" );
                        global $wgMimeTypeBlacklist;
                        if ( $this->checkFileExtension( $mime, $wgMimeTypeBlacklist ) ) {
                                wfProfileOut( __METHOD__ );
                }
                $this->mFilteredName = $nt->getDBkey();
  
 -
 -
                /**
                 * We'll want to blacklist against *any* 'extension', and use
                 * only the final one for the whitelist.
                                        $ext = array( $this->mFinalExtension );
                                }
                        }
 -
                }
  
                /* Don't allow users to override the blacklist (check file extension) */
        /**
         * Checks if the mime type of the uploaded file matches the file extension.
         *
 -       * @param $mime String: the mime type of the uploaded file
 -       * @param $extension String: the filename extension that the file is to be served with
 +       * @param string $mime the mime type of the uploaded file
 +       * @param string $extension the filename extension that the file is to be served with
         * @return Boolean
         */
        public static function verifyExtension( $mime, $extension ) {
         * potentially harmful. The present implementation will produce false
         * positives in some situations.
         *
 -       * @param $file String: pathname to the temporary upload file
 -       * @param $mime String: the mime type of the file
 -       * @param $extension String: the extension of the file
 +       * @param string $file pathname to the temporary upload file
 +       * @param string $mime the mime type of the file
 +       * @param string $extension the extension of the file
         * @return Boolean: true if the file contains something looking like embedded scripts
         */
        public static function detectScript( $file, $mime, $extension ) {
  
                $chunk = trim( $chunk );
  
 -              # @todo FIXME: Convert from UTF-16 if necessarry!
 +              # @todo FIXME: Convert from UTF-16 if necessary!
                wfDebug( __METHOD__ . ": checking for embedded scripts and HTML stuff\n" );
  
                # check for HTML doctype
                                return true;
                        }
  
 -                      # href with embeded svg as target
 +                      # href with embedded svg as target
                        if( $stripped == 'href' && preg_match( '!data:[^,]*image/svg[^,]*,!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
                                return true;
                        }
  
 -                      # href with embeded (text/xml) svg as target
 +                      # href with embedded (text/xml) svg as target
                        if( $stripped == 'href' && preg_match( '!data:[^,]*text/xml[^,]*,!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found href to embedded svg \"<$strippedElement '$attrib'='$value'...\" in uploaded file.\n" );
                                return true;
  
                        # use set to add href attribute to parent element
                        if( $strippedElement == 'set' && $stripped == 'attributename' && strpos( $value, 'href' ) !== false ) {
 -                              wfDebug( __METHOD__ . ": Found svg setting href attibute '$value' in uploaded file.\n" );
 +                              wfDebug( __METHOD__ . ": Found svg setting href attribute '$value' in uploaded file.\n" );
                                return true;
                        }
  
                        # use set to add a remote / data / script target to an element
 -                      if( $strippedElement == 'set' && $stripped == 'to' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
 -                              wfDebug( __METHOD__ . ": Found svg setting attibute to '$value' in uploaded file.\n" );
 +                      if( $strippedElement == 'set' && $stripped == 'to' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
 +                              wfDebug( __METHOD__ . ": Found svg setting attribute to '$value' in uploaded file.\n" );
                                return true;
                        }
  
 -
                        # use handler attribute with remote / data / script
 -                      if( $stripped == 'handler' &&  preg_match( '!(http|https|data|script):!sim', $value ) ) {
 +                      if( $stripped == 'handler' && preg_match( '!(http|https|data|script):!sim', $value ) ) {
                                wfDebug( __METHOD__ . ": Found svg setting handler with remote/data/script '$attrib'='$value' in uploaded file.\n" );
                                return true;
                        }
         * This relies on the $wgAntivirus and $wgAntivirusSetup variables.
         * $wgAntivirusRequired may be used to deny upload if the scan fails.
         *
 -       * @param $file String: pathname to the temporary upload file
 +       * @param string $file pathname to the temporary upload file
         * @return mixed false if not virus is found, NULL if the scan fails or is disabled,
         *         or a string containing feedback from the virus scanner if a virus was found.
         *         If textual feedback is missing but a virus was found, this function returns true.
         * Check if a user is the last uploader
         *
         * @param $user User object
 -       * @param $img String: image name
 +       * @param string $img image name
         * @return Boolean
         */
        public static function userCanReUpload( User $user, $img ) {
                        }
                }
  
 +              // Check for files with the same name but a different extension
 +              $similarFiles = RepoGroup::singleton()->getLocalRepo()->findFilesByPrefix(
 +                              "{$partname}.", 1 );
 +              if ( count( $similarFiles ) ) {
 +                      return array(
 +                              'warning' => 'exists-normalized',
 +                              'file' => $file,
 +                              'normalizedFile' => $similarFiles[0],
 +                      );
 +              }
 +
                if ( self::isThumbName( $file->getName() ) ) {
                        # Check for filenames like 50px- or 180px-, these are mostly thumbnails
                        $nt_thb = Title::newFromText( substr( $partname, strpos( $partname, '-' ) + 1 ) . '.' . $extension, NS_FILE );
                        }
                }
  
 -
                foreach( self::getFilenamePrefixBlacklist() as $prefix ) {
                        if ( substr( $partname, 0, strlen( $prefix ) ) == $prefix ) {
                                return array(