* (bug 32341) Add upload by URL domain limitation.
authorSam Reed <reedy@users.mediawiki.org>
Thu, 9 Feb 2012 23:22:38 +0000 (23:22 +0000)
committerSam Reed <reedy@users.mediawiki.org>
Thu, 9 Feb 2012 23:22:38 +0000 (23:22 +0000)
Essentially reverts r109741  live again

Which was r109562, r109564, r109570

RELEASE-NOTES-1.20
includes/DefaultSettings.php
includes/api/ApiBase.php
includes/api/ApiUpload.php
includes/upload/UploadFromUrl.php
languages/messages/MessagesEn.php
maintenance/language/messages.inc

index 7736262..37f0068 100644 (file)
@@ -14,6 +14,7 @@ production.
 
 === New features in 1.20 ===
 * Added TitleIsKnown hook which gets called when determining if a page exists.
+* (bug 32341) Add upload by URL domain limitation.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
index ffd2612..2375c99 100644 (file)
@@ -453,6 +453,10 @@ $wgAllowCopyUploads = false;
  * This feature is experimental and broken as of r81612.
  */
 $wgAllowAsyncCopyUploads = false;
+/**
+ * A list of domains copy uploads can come from
+ */
+$wgCopyUploadsDomains = array();
 
 /**
  * Max size for uploads, in bytes. If not set to an array, applies to all
index 5a7ae26..9a62780 100644 (file)
@@ -1231,6 +1231,7 @@ abstract class ApiBase extends ContextSource {
                'nouploadmodule' => array( 'code' => 'nouploadmodule', 'info' => 'No upload module set' ),
                'uploaddisabled' => array( 'code' => 'uploaddisabled', 'info' => 'Uploads are not enabled.  Make sure $wgEnableUploads is set to true in LocalSettings.php and the PHP ini setting file_uploads is true' ),
                'copyuploaddisabled' => array( 'code' => 'copyuploaddisabled', 'info' => 'Uploads by URL is not enabled.  Make sure $wgAllowCopyUploads is set to true in LocalSettings.php.' ),
+               'copyuploadbaddomain' => array( 'code' => 'copyuploadbaddomain', 'info' => 'Uploads by URL are not allowed from this domain.' ),
 
                'filename-tooshort' => array( 'code' => 'filename-tooshort', 'info' => 'The filename is too short' ),
                'filename-toolong' => array( 'code' => 'filename-toolong', 'info' => 'The filename is too long' ),
index 9136e8c..67165b9 100644 (file)
@@ -322,6 +322,10 @@ class ApiUpload extends ApiBase {
                                $this->dieUsageMsg( 'copyuploaddisabled' );
                        }
 
+                       if ( !UploadFromUrl::isAllowedHost( $this->mParams['url'] ) ) {
+                               $this->dieUsageMsg( 'copyuploadbaddomain' );
+                       }
+
                        $async = false;
                        if ( $this->mParams['asyncdownload'] ) {
                                $this->checkAsyncDownloadEnabled();
index 252cbc8..13b0e14 100644 (file)
@@ -36,6 +36,28 @@ class UploadFromUrl extends UploadBase {
                return $wgAllowCopyUploads && parent::isEnabled();
        }
 
+       /**
+        * Checks whether the URL is for an allowed host
+        *
+        * @param $url string
+        * @return bool
+        */
+       public static function isAllowedHost( $url ) {
+               global $wgCopyUploadsDomains;
+               if ( !count( $wgCopyUploadsDomains ) ) {
+                       return true;
+               }
+               $valid = false;
+               $parsedUrl = wfParseUrl( $url );
+               foreach( $wgCopyUploadsDomains as $domain ) {
+                       if ( $parsedUrl['host'] === $domain ) {
+                               $valid = true;
+                               break;
+                       }
+               }
+               return $valid;
+       }
+
        /**
         * Entry point for API upload
         *
@@ -101,6 +123,9 @@ class UploadFromUrl extends UploadBase {
                        return Status::newFatal( 'http-invalid-url' );
                }
 
+               if( !self::isAllowedHost( $this->mUrl ) ) {
+                       return Status::newFatal( 'upload-copy-upload-invalid-domain' );
+               }
                if ( !$this->mAsync ) {
                        return $this->reallyFetchFile();
                }
index 153cdd3..039eec2 100644 (file)
@@ -2236,6 +2236,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'upload-too-many-redirects' => 'The URL contained too many redirects',
 'upload-unknown-size'       => 'Unknown size',
 'upload-http-error'         => 'An HTTP error occured: $1',
+'upload-copy-upload-invalid-domain' => 'Copy uploads are not available from this domain.',
 
 # File backend
 'backend-fail-stream'        => 'Could not stream file $1.',
index bdd4d39..7c86165 100644 (file)
@@ -1345,6 +1345,7 @@ $wgMessageStructure = array(
                'upload-too-many-redirects',
                'upload-unknown-size',
                'upload-http-error',
+               'upload-copy-upload-invalid-domain',
        ),
 
        'filebackend-errors' => array(