Krinkle has uploaded a new change for review.

  https://gerrit.wikimedia.org/r/73189


Change subject: API: Split save action into separate API module
......................................................................

API: Split save action into separate API module

This allows us to make the token no longer a requirement
for non-save actions while still using the built-in system
for token verification.

Change-Id: I7b1b50a43648b1cc40a984340846efdb0ba2ecc9
---
M ApiVisualEditor.php
A ApiVisualEditorEdit.php
2 files changed, 185 insertions(+), 112 deletions(-)


  git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/VisualEditor 
refs/changes/89/73189/1

diff --git a/ApiVisualEditor.php b/ApiVisualEditor.php
index fb83e1f..b4c4179 100644
--- a/ApiVisualEditor.php
+++ b/ApiVisualEditor.php
@@ -101,46 +101,6 @@
                );
        }
 
-       protected function saveWikitext( $title, $wikitext, $params ) {
-               $apiParams = array(
-                       'action' => 'edit',
-                       'title' => $title->getPrefixedDBkey(),
-                       'text' => $wikitext,
-                       'summary' => $params['summary'],
-                       'basetimestamp' => $params['basetimestamp'],
-                       'starttimestamp' => $params['starttimestamp'],
-                       'token' => $params['token'],
-               );
-
-               if ( $params['minor'] ) {
-                       $apiParams['minor'] = true;
-               }
-
-               // FIXME add some way that the user's preferences can be 
respected
-               $apiParams['watchlist'] = $params['watch'] ? 'watch' : 
'unwatch';
-
-               if ( $params['captchaid'] ) {
-                       $apiParams['captchaid'] = $params['captchaid'];
-               }
-
-               if ( $params['captchaword'] ) {
-                       $apiParams['captchaword'] = $params['captchaword'];
-               }
-
-               $api = new ApiMain(
-                       new DerivativeRequest(
-                               $this->getRequest(),
-                               $apiParams,
-                               true // was posted
-                       ),
-                       true // enable write
-               );
-
-               $api->execute();
-
-               return $api->getResultData();
-       }
-
        protected function parseWikitext( $title ) {
                $apiParams = array(
                        'action' => 'parse',
@@ -318,52 +278,6 @@
                                        $result = array( 'result' => 'success', 
'content' => $content );
                                }
                                break;
-                       case 'save':
-                               $wikitext = $this->postHTML( $page, 
$params['html'], $parserParams );
-
-                               if ( $wikitext === false ) {
-                                       $this->dieUsage( 'Error contacting the 
Parsoid server', 'parsoidserver' );
-                               }
-
-                               $saveresult = $this->saveWikitext( $page, 
$wikitext, $params );
-                               $editStatus = $saveresult['edit']['result'];
-
-                               // Error
-                               if ( !isset( $saveresult['edit']['result'] ) || 
$editStatus !== 'Success' ) {
-                                       $result = array(
-                                               'result' => 'error',
-                                               'edit' => $saveresult['edit']
-                                       );
-
-                               // Success
-                               } else {
-                                       if ( isset( 
$saveresult['edit']['newrevid'] ) && $wgVisualEditorUseChangeTagging ) {
-                                               ChangeTags::addTags( 
'visualeditor', null,
-                                                       intval( 
$saveresult['edit']['newrevid'] ),
-                                                       null
-                                               );
-                                               if ( $params['needcheck'] ) {
-                                                       ChangeTags::addTags( 
'visualeditor-needcheck', null,
-                                                               intval( 
$saveresult['edit']['newrevid'] ),
-                                                               null
-                                                       );
-                                               }
-                                       }
-
-                                       // Return result of parseWikitext 
instead of saveWikitext so that the
-                                       // frontend can update the page 
rendering without a refresh.
-                                       $result = $this->parseWikitext( $page );
-                                       if ( $result === false ) {
-                                               $this->dieUsage( 'Error 
contacting the Parsoid server', 'parsoidserver' );
-                                       }
-
-                                       if ( isset( 
$saveresult['edit']['newrevid'] ) ) {
-                                               $result['newrevid'] = intval( 
$saveresult['edit']['newrevid'] );
-                                       }
-
-                                       $result['result'] = 'success';
-                               }
-                               break;
                        case 'diff':
                                $wikitext = $this->postHTML( $page, 
$params['html'], $parserParams );
 
@@ -390,33 +304,18 @@
                        ),
                        'paction' => array(
                                ApiBase::PARAM_REQUIRED => true,
-                               ApiBase::PARAM_TYPE => array( 'parse', 
'parsefragment', 'serialize', 'save', 'diff' ),
-                       ),
-                       'token' => array(
-                               ApiBase::PARAM_REQUIRED => true,
+                               ApiBase::PARAM_TYPE => array( 'parse', 
'parsefragment', 'serialize', 'diff' ),
                        ),
                        'wikitext' => null,
                        'basetimestamp' => null,
                        'starttimestamp' => null,
-                       'needcheck' => array(
-                               ApiBase::PARAM_TYPE => 'boolean'
-                       ),
                        'oldid' => null,
-                       'minor' => null,
-                       'watch' => null,
                        'html' => null,
-                       'summary' => null,
-                       'captchaid' => null,
-                       'captchaword' => null,
                );
        }
 
        public function needsToken() {
-               return true;
-       }
-
-       public function getTokenSalt() {
-               return '';
+               return false;
        }
 
        public function mustBePosted() {
@@ -435,20 +334,12 @@
                return array(
                        'page' => 'The page to perform actions on.',
                        'paction' => 'Action to perform',
-                       'oldid' => 'The revision number to use. For 
paction=save, defauls to latest revision.' +
-                               ' Required for other actions. Use 0 for new 
page.',
-                       'minor' => 'Flag for minor edit.',
+                       'oldid' => 'The revision number to use. Required. Use 0 
for new page.',
                        'html' => 'HTML to send to parsoid in exchange for 
wikitext',
-                       'summary' => 'Edit summary',
                        'basetimestamp' => 'When saving, set this to the 
timestamp of the revision that was'
                                .' edited. Used to detect edit conflicts.',
                        'starttimestamp' => 'When saving, set this to the 
timestamp of when the page was loaded.'
                                .' Used to detect edit conflicts.',
-                       'token' => 'Edit token',
-                       'needcheck' => 'When saving, set this parameter if the 
revision might have roundtrip'
-                               . 'problems. This will result in the edit being 
tagged.',
-                       'captchaid' => 'Captcha id (when saving with a captcha 
response).',
-                       'captchaword' => 'Answer to the captcha (when saving 
with a captcha response).',
                );
        }
 
diff --git a/ApiVisualEditorEdit.php b/ApiVisualEditorEdit.php
new file mode 100644
index 0000000..859c566
--- /dev/null
+++ b/ApiVisualEditorEdit.php
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Parsoid API wrapper.
+ *
+ * @file
+ * @ingroup Extensions
+ * @copyright 2011-2013 VisualEditor Team and others; see AUTHORS.txt
+ * @license The MIT License (MIT); see LICENSE.txt
+ */
+
+class ApiVisualEditorEdit extends ApiVisualEditor {
+
+       protected function saveWikitext( $title, $wikitext, $params ) {
+               $apiParams = array(
+                       'action' => 'edit',
+                       'title' => $title->getPrefixedDBkey(),
+                       'text' => $wikitext,
+                       'summary' => $params['summary'],
+                       'basetimestamp' => $params['basetimestamp'],
+                       'starttimestamp' => $params['starttimestamp'],
+                       'token' => $params['token'],
+               );
+
+               if ( $params['minor'] ) {
+                       $apiParams['minor'] = true;
+               }
+
+               // FIXME add some way that the user's preferences can be 
respected
+               $apiParams['watchlist'] = $params['watch'] ? 'watch' : 
'unwatch';
+
+               if ( $params['captchaid'] ) {
+                       $apiParams['captchaid'] = $params['captchaid'];
+               }
+
+               if ( $params['captchaword'] ) {
+                       $apiParams['captchaword'] = $params['captchaword'];
+               }
+
+               $api = new ApiMain(
+                       new DerivativeRequest(
+                               $this->getRequest(),
+                               $apiParams,
+                               true // was posted
+                       ),
+                       true // enable write
+               );
+
+               $api->execute();
+
+               return $api->getResultData();
+       }
+
+       public function execute() {
+               global $wgVisualEditorNamespaces, 
$wgVisualEditorUseChangeTagging,
+                       $wgVisualEditorEditNotices;
+               $user = $this->getUser();
+               $params = $this->extractRequestParams();
+               $page = Title::newFromText( $params['page'] );
+               if ( !$page ) {
+                       $this->dieUsageMsg( 'invalidtitle', $params['page'] );
+               }
+               if ( !in_array( $page->getNamespace(), 
$wgVisualEditorNamespaces ) ) {
+                       $this->dieUsage( "VisualEditor is not enabled in 
namespace " .
+                               $page->getNamespace(), 'novenamespace' );
+               }
+
+               $parserParams = array();
+               if ( isset( $params['oldid'] ) ) {
+                       $parserParams['oldid'] = $params['oldid'];
+               }
+
+               $wikitext = $this->postHTML( $page, $params['html'], 
$parserParams );
+
+               if ( $wikitext === false ) {
+                       $this->dieUsage( 'Error contacting the Parsoid server', 
'parsoidserver' );
+               }
+
+               $saveresult = $this->saveWikitext( $page, $wikitext, $params );
+               $editStatus = $saveresult['edit']['result'];
+
+               // Error
+               if ( !isset( $saveresult['edit']['result'] ) || $editStatus !== 
'Success' ) {
+                       $result = array(
+                               'result' => 'error',
+                               'edit' => $saveresult['edit']
+                       );
+
+               // Success
+               } else {
+                       if ( isset( $saveresult['edit']['newrevid'] ) && 
$wgVisualEditorUseChangeTagging ) {
+                               ChangeTags::addTags( 'visualeditor', null,
+                                       intval( $saveresult['edit']['newrevid'] 
),
+                                       null
+                               );
+                               if ( $params['needcheck'] ) {
+                                       ChangeTags::addTags( 
'visualeditor-needcheck', null,
+                                               intval( 
$saveresult['edit']['newrevid'] ),
+                                               null
+                                       );
+                               }
+                       }
+
+                       // Return result of parseWikitext instead of 
saveWikitext so that the
+                       // frontend can update the page rendering without a 
refresh.
+                       $result = $this->parseWikitext( $page );
+                       if ( $result === false ) {
+                               $this->dieUsage( 'Error contacting the Parsoid 
server', 'parsoidserver' );
+                       }
+
+                       if ( isset( $saveresult['edit']['newrevid'] ) ) {
+                               $result['newrevid'] = intval( 
$saveresult['edit']['newrevid'] );
+                       }
+
+                       $result['result'] = 'success';
+               }
+
+               $this->getResult()->addValue( null, $this->getModuleName(), 
$result );
+       }
+
+       public function getAllowedParams() {
+               return array(
+                       'page' => array(
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'token' => array(
+                               ApiBase::PARAM_REQUIRED => true,
+                       ),
+                       'wikitext' => null,
+                       'basetimestamp' => null,
+                       'starttimestamp' => null,
+                       'needcheck' => array(
+                               ApiBase::PARAM_TYPE => 'boolean'
+                       ),
+                       'oldid' => null,
+                       'minor' => null,
+                       'watch' => null,
+                       'html' => null,
+                       'summary' => null,
+                       'captchaid' => null,
+                       'captchaword' => null,
+               );
+       }
+
+       public function needsToken() {
+               return true;
+       }
+
+       public function getTokenSalt() {
+               return '';
+       }
+
+       public function mustBePosted() {
+               return true;
+       }
+
+       public function isWriteMode() {
+               return true;
+       }
+
+       public function getParamDescription() {
+               return array(
+                       'page' => 'The page to perform actions on.',
+                       'oldid' => 'The revision number to use. Defauls to 
latest revision. Use 0 for new page.',
+                       'minor' => 'Flag for minor edit.',
+                       'html' => 'HTML to send to parsoid in exchange for 
wikitext',
+                       'summary' => 'Edit summary',
+                       'basetimestamp' => 'When saving, set this to the 
timestamp of the revision that was'
+                               .' edited. Used to detect edit conflicts.',
+                       'starttimestamp' => 'When saving, set this to the 
timestamp of when the page was loaded.'
+                               .' Used to detect edit conflicts.',
+                       'token' => 'Edit token',
+                       'needcheck' => 'When saving, set this parameter if the 
revision might have roundtrip'
+                               . 'problems. This will result in the edit being 
tagged.',
+                       'captchaid' => 'Captcha id (when saving with a captcha 
response).',
+                       'captchaword' => 'Answer to the captcha (when saving 
with a captcha response).',
+               );
+       }
+
+       public function getDescription() {
+               return 'Save an HTML5 page to MediaWiki (converted to wikitext 
via the Parsoid service).';
+       }
+}

-- 
To view, visit https://gerrit.wikimedia.org/r/73189
To unsubscribe, visit https://gerrit.wikimedia.org/r/settings

Gerrit-MessageType: newchange
Gerrit-Change-Id: I7b1b50a43648b1cc40a984340846efdb0ba2ecc9
Gerrit-PatchSet: 1
Gerrit-Project: mediawiki/extensions/VisualEditor
Gerrit-Branch: master
Gerrit-Owner: Krinkle <[email protected]>

_______________________________________________
MediaWiki-commits mailing list
[email protected]
https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits

Reply via email to