(bug 27757) API method for retrieving tokens
authorKaldari <rkaldari@wikimedia.org>
Wed, 28 Mar 2012 22:02:10 +0000 (15:02 -0700)
committerReedy <reedy@wikimedia.org>
Mon, 2 Apr 2012 17:06:03 +0000 (18:06 +0100)
Change-Id: I58bc5847b996d100712781052f20150f76786ed1

includes/AutoLoader.php
includes/api/ApiMain.php
includes/api/ApiQueryRecentChanges.php
includes/api/ApiTokens.php [new file with mode: 0644]

index 301c024..eaeda49 100644 (file)
@@ -368,6 +368,7 @@ $wgAutoloadLocalClasses = array(
        'ApiResult' => 'includes/api/ApiResult.php',
        'ApiRollback' => 'includes/api/ApiRollback.php',
        'ApiRsd' => 'includes/api/ApiRsd.php',
+       'ApiTokens' => 'includes/api/ApiTokens.php',
        'ApiUnblock' => 'includes/api/ApiUnblock.php',
        'ApiUndelete' => 'includes/api/ApiUndelete.php',
        'ApiUpload' => 'includes/api/ApiUpload.php',
index 15b0861..554e87b 100644 (file)
@@ -61,6 +61,7 @@ class ApiMain extends ApiBase {
                'paraminfo' => 'ApiParamInfo',
                'rsd' => 'ApiRsd',
                'compare' => 'ApiComparePages',
+               'tokens' => 'ApiTokens',
 
                // Write modules
                'purge' => 'ApiPurge',
index 0ce5b37..2d2d9ff 100644 (file)
@@ -70,24 +70,37 @@ class ApiQueryRecentChanges extends ApiQueryGeneratorBase {
        /**
         * @param  $pageid
         * @param  $title
-        * @param $rc RecentChange
+        * @param $rc RecentChange (optional)
         * @return bool|String
         */
-       public static function getPatrolToken( $pageid, $title, $rc ) {
+       public static function getPatrolToken( $pageid, $title, $rc = null ) {
                global $wgUser;
-               if ( !$wgUser->useRCPatrol() && ( !$wgUser->useNPPatrol() ||
-                               $rc->getAttribute( 'rc_type' ) != RC_NEW ) )
-               {
-                       return false;
+
+               $validTokenUser = false;
+
+               if ( $rc ) {
+                       if ( ( $wgUser->useRCPatrol() && $rc->getAttribute( 'rc_type' ) == RC_EDIT ) ||
+                               ( $wgUser->useNPPatrol() && $rc->getAttribute( 'rc_type' ) == RC_NEW ) )
+                       {
+                               $validTokenUser = true;
+                       }
+               } else {
+                       if ( $wgUser->useRCPatrol() || $wgUser->useNPPatrol() ) {
+                               $validTokenUser = true;
+                       }
                }
 
-               // The patrol token is always the same, let's exploit that
-               static $cachedPatrolToken = null;
-               if ( is_null( $cachedPatrolToken ) ) {
-                       $cachedPatrolToken = $wgUser->getEditToken( 'patrol' );
+               if ( $validTokenUser ) {
+                       // The patrol token is always the same, let's exploit that
+                       static $cachedPatrolToken = null;
+                       if ( is_null( $cachedPatrolToken ) ) {
+                               $cachedPatrolToken = $wgUser->getEditToken( 'patrol' );
+                       }
+                       return $cachedPatrolToken;
+               } else {
+                       return false;
                }
 
-               return $cachedPatrolToken;
        }
 
        /**
diff --git a/includes/api/ApiTokens.php b/includes/api/ApiTokens.php
new file mode 100644 (file)
index 0000000..7964095
--- /dev/null
@@ -0,0 +1,94 @@
+<?php
+/**
+ *
+ *
+ * Created on Jul 29, 2011
+ *
+ * Copyright © 2011 John Du Hart john@johnduhart.me
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program; if not, write to the Free Software Foundation, Inc.,
+ * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ * @file
+ */
+
+
+/**
+ * @ingroup API
+ */
+class ApiTokens extends ApiBase {
+
+       public function __construct( $main, $action ) {
+               parent::__construct( $main, $action );
+       }
+
+       public function execute() {
+               $params = $this->extractRequestParams();
+               $res = array();
+
+               foreach ( $params['type'] as $type ) {
+                       $type = strtolower( $type );
+                       $func = 'get' .
+                                       ucfirst( $type ) .
+                                       'Token';
+                       if ( $type === 'patrol' ) {
+                               $val = call_user_func( array( 'ApiQueryRecentChanges', $func ), null, null );
+                       } else {
+                               $val = call_user_func( array( 'ApiQueryInfo', $func ), null, null );
+                       }
+                       if ( $val === false ) {
+                               $this->setWarning( "Action '$type' is not allowed for the current user" );
+                       } else {
+                               $res[$type . 'token'] = $val;
+                       }
+               }
+
+               $this->getResult()->addValue( null, $this->getModuleName(), $res );
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'type' => array(
+                               ApiBase::PARAM_DFLT => 'edit',
+                               ApiBase::PARAM_ISMULTI => true,
+                               ApiBase::PARAM_TYPE => array(
+                                       'edit', 'delete', 'protect', 'move', 'block', 'unblock',
+                                       'email', 'import', 'watch', 'patrol'
+                               )
+                       )
+               );
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'type' => 'Type of token(s) to request'
+               );
+       }
+
+       public function getDescription() {
+               return 'Gets tokens for data-modifying actions';
+       }
+
+       protected function getExamples() {
+               return array(
+                       'api.php?action=tokens' => 'Retrieve an edit token (the default)',
+                       'api.php?action=tokens&type=email|move' => 'Retrieve an email token and a move token'
+               );
+       }
+
+       public function getVersion() {
+               return __CLASS__ . ': $Id$';
+       }
+}