API: Include ApiMain construction in api.php try-catch block
authorBrad Jorsch <bjorsch@wikimedia.org>
Wed, 22 Oct 2014 21:26:40 +0000 (17:26 -0400)
committerReedy <reedy@wikimedia.org>
Thu, 23 Oct 2014 14:39:50 +0000 (14:39 +0000)
If the User language is accessed from ApiMain::__construct on a request
via OAuth and the authorization headers weren't valid, the
UsageException was not being handled.

Further, the code setting $wgLang in that constructor should be using
the language just set on the local context, not the main request
context.

Bug: 72384
Change-Id: I90900dc4a8aea22c67c0c05b38128d5dbb044f07

api.php
includes/api/ApiMain.php

diff --git a/api.php b/api.php
index 2a6a095..7974f15 100644 (file)
--- a/api.php
+++ b/api.php
@@ -62,14 +62,14 @@ if ( !$wgEnableAPI ) {
 // In a perfect world this wouldn't be necessary
 $wgTitle = Title::makeTitle( NS_MAIN, 'API' );
 
-/* Construct an ApiMain with the arguments passed via the URL. What we get back
- * is some form of an ApiMain, possibly even one that produces an error message,
- * but we don't care here, as that is handled by the ctor.
- */
-$processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
-
-// Last chance hook before executing the API
 try {
+       /* Construct an ApiMain with the arguments passed via the URL. What we get back
+        * is some form of an ApiMain, possibly even one that produces an error message,
+        * but we don't care here, as that is handled by the ctor.
+        */
+       $processor = new ApiMain( RequestContext::getMain(), $wgEnableWriteAPI );
+
+       // Last chance hook before executing the API
        wfRunHooks( 'ApiBeforeMain', array( &$processor ) );
        if ( !$processor instanceof ApiMain ) {
                throw new MWException( 'ApiBeforMain hook set $processor to a non-ApiMain class' );
index c9e898c..bf26eee 100644 (file)
@@ -197,7 +197,8 @@ class ApiMain extends ApiBase {
                $this->getContext()->setLanguage( $code );
                if ( !$this->mInternalMode ) {
                        global $wgLang;
-                       $wgLang = RequestContext::getMain()->getLanguage();
+                       $wgLang = $this->getContext()->getLanguage();
+                       RequestContext::getMain()->setLanguage( $wgLang );
                }
 
                $config = $this->getConfig();