Revert r55800 "bug 19646 Localization of img_auth.php - with enhancements"
authorBrion Vibber <brion@users.mediawiki.org>
Tue, 8 Sep 2009 18:07:29 +0000 (18:07 +0000)
committerBrion Vibber <brion@users.mediawiki.org>
Tue, 8 Sep 2009 18:07:29 +0000 (18:07 +0000)
The localization code here is really ugly with weird things like call_user_func_array() all over the place, and there are bugs with escaping for log entries and such.

Tried to rebuild all the localization files, but rebuildLanguage.php doesn't seem to consider the messages as "unknown". Have removed from English and qqq.

img_auth.php
includes/DefaultSettings.php
languages/messages/MessagesEn.php
languages/messages/MessagesQqq.php

index 4764b78..cd8ec43 100644 (file)
 /**
  * Image authorisation script
  *
- * To use this, see http://www.mediawiki.org/wiki/Manual:Image_Authorization
+ * To use this:
  *
  * - Set $wgUploadDirectory to a non-public directory (not web accessible)
  * - Set $wgUploadPath to point to this file
  *
- * Optional Parameters
- *
- * - Set $wgImgAuthDetails = true if you want the reason the access was denied messages to be displayed 
- *       instead of just the 403 error (doesn't work on IE anyway),  otherwise will only appear in error logs
- * - Set $wgImgAuthPublicTest false if you don't want to just check and see if all are public
- *       must be set to false if using specific restrictions such as LockDown or NSFileRepo
- *
- *  For security reasons, you usually don't want your user to know *why* access was denied, just that it was.
- *  If you want to change this, you can set $wgImgAuthDetails to 'true' in localsettings.php and it will give the user the reason
- *  why access was denied.
- *
- * Your server needs to support PATH_INFO; CGI-based configurations usually don't.
+ * Your server needs to support PATH_INFO; CGI-based configurations
+ * usually don't.
  *
  * @file
- *
- **/
-
+ */
 define( 'MW_NO_OUTPUT_COMPRESSION', 1 );
 require_once( dirname( __FILE__ ) . '/includes/WebStart.php' );
 wfProfileIn( 'img_auth.php' );
 require_once( dirname( __FILE__ ) . '/includes/StreamFile.php' );
 
 $perms = User::getGroupPermissions( array( '*' ) );
-
-// See if this is a public Wiki (no protections)
-if ( $wgImgAuthPublicTest && in_array( 'read', $perms, true ) )
-       wfForbidden('img-auth-accessdenied','img-auth-public');
+if ( in_array( 'read', $perms, true ) ) {
+       wfDebugLog( 'img_auth', 'Public wiki' );
+       wfPublicError();
+}
 
 // Extract path and image information
-if( !isset( $_SERVER['PATH_INFO'] ) )
-       wfForbidden('img-auth-accessdenied','img-auth-nopathinfo');
+if( !isset( $_SERVER['PATH_INFO'] ) ) {
+       wfDebugLog( 'img_auth', 'Missing PATH_INFO' );
+       wfForbidden();
+}
 
 $path = $_SERVER['PATH_INFO'];
 $filename = realpath( $wgUploadDirectory . $_SERVER['PATH_INFO'] );
 $realUpload = realpath( $wgUploadDirectory );
+wfDebugLog( 'img_auth', "\$path is {$path}" );
+wfDebugLog( 'img_auth', "\$filename is {$filename}" );
 
 // Basic directory traversal check
-if( substr( $filename, 0, strlen( $realUpload ) ) != $realUpload )
-       wfForbidden('img-auth-accessdenied','img-auth-notindir');
+if( substr( $filename, 0, strlen( $realUpload ) ) != $realUpload ) {
+       wfDebugLog( 'img_auth', 'Requested path not in upload directory' );
+       wfForbidden();
+}
 
 // Extract the file name and chop off the size specifier
 // (e.g. 120px-Foo.png => Foo.png)
 $name = wfBaseName( $path );
 if( preg_match( '!\d+px-(.*)!i', $name, $m ) )
        $name = $m[1];
-
-// Check to see if the file exists
-if( !file_exists( $filename ) )
-       wfForbidden('img-auth-accessdenied','img-auth-nofile',htmlspecialchars($filename));
-
-// Check to see if tried to access a directory
-if( is_dir( $filename ) )
-       wfForbidden('img-auth-accessdenied','img-auth-isdir',htmlspecialchars($filename));
-
+wfDebugLog( 'img_auth', "\$name is {$name}" );
 
 $title = Title::makeTitleSafe( NS_FILE, $name );
+if( !$title instanceof Title ) {
+       wfDebugLog( 'img_auth', "Unable to construct a valid Title from `{$name}`" );
+       wfForbidden();
+}
+if( !$title->userCanRead() ) {
+       wfDebugLog( 'img_auth', "User does not have access to read `{$name}`" );
+       wfForbidden();
+}
+$title = $title->getPrefixedText();
 
-// See if could create the title object
-if( !$title instanceof Title ) 
-       wfForbidden('img-auth-accessdenied','img-auth-badtitle',htmlspecialchars($name));
-
-// Run hook
-if (!wfRunHooks( 'ImgAuthBeforeStream', array( &$title, &$path, &$name, &$result ) ) )
-       call_user_func_array('wfForbidden',merge_array(array($result[0],$result[1]),array_slice($result,2)));
-       
-//  Check user authorization for this title
-//  UserCanRead Checks Whitelist too
-if( !$title->userCanRead() )
-       wfForbidden('img-auth-accessdenied','img-auth-noread',htmlspecialchars($name));
+// Check the whitelist if needed
+if( !$wgUser->getId() && ( !is_array( $wgWhitelistRead ) || !in_array( $title, $wgWhitelistRead ) ) ) {
+       wfDebugLog( 'img_auth', "Not logged in and `{$title}` not in whitelist." );
+       wfForbidden();
+}
 
+if( !file_exists( $filename ) ) {
+       wfDebugLog( 'img_auth', "`{$filename}` does not exist" );
+       wfForbidden();
+}
+if( is_dir( $filename ) ) {
+       wfDebugLog( 'img_auth', "`{$filename}` is a directory" );
+       wfForbidden();
+}
 
 // Stream the requested file
-wfDebugLog( 'img_auth', "Streaming `".htmlspecialchars($filename)."`." );
+wfDebugLog( 'img_auth', "Streaming `{$filename}`" );
 wfStreamFile( $filename, array( 'Cache-Control: private', 'Vary: Cookie' ) );
 wfLogProfilingData();
 
 /**
- * Issue a standard HTTP 403 Forbidden header ($msg1-a message index, not a message) and an
- * error message ($msg2, also a message index), (both required) then end the script
- * subsequent arguments to $msg2 will be passed as parameters only for replacing in $msg2 
+ * Issue a standard HTTP 403 Forbidden header and a basic
+ * error message, then end the script
  */
-function wfForbidden($msg1,$msg2) {
-       global $wgImgAuthDetails;
-       $args = func_get_args();
-       array_shift( $args );
-       array_shift( $args );
-       $MsgHdr = wfMsgHTML($msg1);
-       $detailMsg = call_user_func_array('wfMsgHTML',array_merge(array($wgImgAuthDetails ? $msg2 : 'badaccess-group0'),$args));
-       wfDebugLog('img_auth', "wfForbidden Hdr:".wfMsgExt( $msg1, array('language' => 'en'))." Msg: ".
-                               call_user_func_array('wfMsgExt',array_merge( array($msg2, array('language' => 'en')),$args)));
+function wfForbidden() {
        header( 'HTTP/1.0 403 Forbidden' );
-       header( 'Cache-Control: no-cache' );
+       header( 'Vary: Cookie' );
        header( 'Content-Type: text/html; charset=utf-8' );
        echo <<<ENDS
 <html>
 <body>
-<h1>$MsgHdr</h1>
-<p>$detailMsg</p>
+<h1>Access Denied</h1>
+<p>You need to log in to access files on this server.</p>
 </body>
 </html>
 ENDS;
        wfLogProfilingData();
        exit();
 }
+
+/**
+ * Show a 403 error for use when the wiki is public
+ */
+function wfPublicError() {
+       header( 'HTTP/1.0 403 Forbidden' );
+       header( 'Content-Type: text/html; charset=utf-8' );
+       echo <<<ENDS
+<html>
+<body>
+<h1>Access Denied</h1>
+<p>The function of img_auth.php is to output files from a private wiki. This wiki
+is configured as a public wiki. For optimal security, img_auth.php is disabled in 
+this case.
+</p>
+</body>
+</html>
+ENDS;
+       wfLogProfilingData();
+       exit;
+}
+
index 0ef9de4..e3108ed 100644 (file)
@@ -191,14 +191,6 @@ $wgFileStore['deleted']['directory'] = false;///< Defaults to $wgUploadDirectory
 $wgFileStore['deleted']['url'] = null;       ///< Private
 $wgFileStore['deleted']['hash'] = 3;         ///< 3-level subdirectory split
 
-
-/**
- *  used only for img_auth script - see [[Image Authorization]]
- */
-$wgImgAuthDetails   = false; ///< defaults to false - only set to true if you use img_auth and want the user to see details on why access failed
-$wgImgAuthPublicTest = true; ///< defaults to true - if public read is turned on, no need for img_auth, config error unless other access is used
-
-
 /**@{
  * File repository structures
  *
@@ -290,6 +282,7 @@ $wgForeignFileRepos = array();
 $wgLegalTitleChars = " %!\"$&'()*,\\-.\\/0-9:;=?@A-Z\\\\^_`a-z~\\x80-\\xFF+";
 $wgIllegalFileChars = ":";  // These are additional characters that should be replaced with '-' in file names
 
+
 /**
  * The external URL protocols
  */
index fe447a6..8064a70 100644 (file)
@@ -2148,24 +2148,6 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'upload-unknown-size'       => 'Unknown size',
 'upload-http-error'         => 'An HTTP error occured: $1',
 
-# img_auth script messages
-'img-auth-accessdenied' => 'Access denied',
-'img-auth-nopathinfo'   => 'Missing PATH_INFO.
-Your server is not set up to pass this information.
-It may be CGI-based and cannot support img_auth.
-See http://www.mediawiki.org/wiki/Manual:Image_Authorization.',
-'img-auth-notindir'     => 'Requested path is not in the configured upload directory.',
-'img-auth-badtitle'     => 'Unable to construct a valid title from "$1".',
-'img-auth-nologinnWL'   => 'You are not logged in and "$1" is not in the whitelist.',
-'img-auth-nofile'       => 'File "$1" does not exist.',
-'img-auth-isdir'        => 'You are trying to access a directory "$1".
-Only file access is allowed.',
-'img-auth-streaming'    => 'Streaming "$1".',
-'img-auth-public'       => 'The function of img_auth.php is to output files from a private wiki.
-This wiki is configured as a public wiki.
-For optimal security, img_auth.php is disabled.',
-'img-auth-noread'       => 'User does not have access to read "$1".',
-
 # Some likely curl errors. More could be added from <http://curl.haxx.se/libcurl/c/libcurl-errors.html>
 'upload-curl-error6'       => 'Could not reach URL',
 'upload-curl-error6-text'  => 'The URL provided could not be reached.
index a4e3ec5..c1d1380 100644 (file)
@@ -1523,18 +1523,6 @@ Parameter $1 is a link to the deletion log, with the text in {{msg|deletionlog}}
 
 'upload-file-error' => '{{Identical|Internal error}}',
 
-# img_auth script messages
-'img-auth-accessdenied' => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Access Denied',
-'img-auth-nopathinfo'   => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Missing PATH_INFO - see english description',
-'img-auth-notindir'     => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: When the specified path is not in upload directory.',
-'img-auth-badtitle'     => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Bad title, $1 is the invalid title',
-'img-auth-nologinnWL'   => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Logged in and file not whitelisted. $1 is the file not in whitelist.',
-'img-auth-nofile'       => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Non existent file, $1 is the file that does not exist.',
-'img-auth-isdir'        => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Trying to access a directory instead of a file, $1 is the directory.',
-'img-auth-streaming'    => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: Is now streaming file specified by $1.',
-'img-auth-public'       => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: An error message when the admin has configured the wiki to be a public wiki, but is using img_auth script - normally this is a configuration error, except when special restriction extensions are used',
-'img-auth-noread'       => '[[mw:Manual:Image Authorization|Manual:Image Authorization]]: User does not have access to read file, $1 is the file',
-
 'license'           => 'This appears in the upload form for the license drop-down. The header in the file description page is now at {{msg-mw|License-header}}.',
 'nolicense'         => '{{Identical|None selected}}',
 'license-nopreview' => 'Error message when a certain license does not exist',