Added wfTransactionalTimeLimit() method and applied it
[lhc/web/wiklou.git] / includes / api / ApiEditPage.php
index 6ab8483..2f1c01c 100644 (file)
@@ -35,6 +35,8 @@
  */
 class ApiEditPage extends ApiBase {
        public function execute() {
+               $this->useTransactionalTimeLimit();
+
                $user = $this->getUser();
                $params = $this->extractRequestParams();
 
@@ -96,9 +98,11 @@ class ApiEditPage extends ApiBase {
                        $contentHandler = ContentHandler::getForModelID( $params['contentmodel'] );
                }
 
+               $name = $titleObj->getPrefixedDBkey();
+               $model = $contentHandler->getModelID();
                if ( $contentHandler->supportsDirectApiEditing() === false ) {
                        $this->dieUsage(
-                               'Direct editing via API is not supported for this content type.',
+                               "Direct editing via API is not supported for content model $model used by $name",
                                'no-direct-editing'
                        );
                }
@@ -110,8 +114,6 @@ class ApiEditPage extends ApiBase {
                $contentFormat = $params['contentformat'];
 
                if ( !$contentHandler->isSupportedFormat( $contentFormat ) ) {
-                       $name = $titleObj->getPrefixedDBkey();
-                       $model = $contentHandler->getModelID();
 
                        $this->dieUsage( "The requested format $contentFormat is not supported for content model " .
                                " $model used by $name", 'badformat' );
@@ -130,7 +132,30 @@ class ApiEditPage extends ApiBase {
                        $errors = array_merge( $errors, $titleObj->getUserPermissionsErrors( 'create', $user ) );
                }
                if ( count( $errors ) ) {
-                       $this->dieUsageMsg( $errors[0] );
+                       if ( is_array( $errors[0] ) ) {
+                               switch ( $errors[0][0] ) {
+                                       case 'blockedtext':
+                                               $this->dieUsage(
+                                                       'You have been blocked from editing',
+                                                       'blocked',
+                                                       0,
+                                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) )
+                                               );
+                                               break;
+                                       case 'autoblockedtext':
+                                               $this->dieUsage(
+                                                       'Your IP address has been blocked automatically, because it was used by a blocked user',
+                                                       'autoblocked',
+                                                       0,
+                                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) )
+                                               );
+                                               break;
+                                       default:
+                                               $this->dieUsageMsg( $errors[0] );
+                               }
+                       } else {
+                               $this->dieUsageMsg( $errors[0] );
+                       }
                }
 
                $toMD5 = $params['text'];
@@ -246,7 +271,7 @@ class ApiEditPage extends ApiBase {
                                $titleObj->getNextRevisionID( $undoafterRev->getID() ) == $params['undo']
                        ) {
                                $params['summary'] = wfMessage( 'undo-summary' )
-                                       ->params ( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
+                                       ->params( $params['undo'], $undoRev->getUserText() )->inContentLanguage()->text();
                        }
                }
 
@@ -281,16 +306,16 @@ class ApiEditPage extends ApiBase {
                        $requestArray['wpUndidRevision'] = $params['undo'];
                }
 
-               // Watch out for basetimestamp == ''
-               // wfTimestamp() treats it as NOW, almost certainly causing an edit conflict
-               if ( !is_null( $params['basetimestamp'] ) && $params['basetimestamp'] != '' ) {
-                       $requestArray['wpEdittime'] = wfTimestamp( TS_MW, $params['basetimestamp'] );
+               // Watch out for basetimestamp == '' or '0'
+               // It gets treated as NOW, almost certainly causing an edit conflict
+               if ( $params['basetimestamp'] !== null && (bool)$this->getMain()->getVal( 'basetimestamp' ) ) {
+                       $requestArray['wpEdittime'] = $params['basetimestamp'];
                } else {
                        $requestArray['wpEdittime'] = $pageObj->getTimestamp();
                }
 
-               if ( !is_null( $params['starttimestamp'] ) && $params['starttimestamp'] != '' ) {
-                       $requestArray['wpStarttime'] = wfTimestamp( TS_MW, $params['starttimestamp'] );
+               if ( $params['starttimestamp'] !== null ) {
+                       $requestArray['wpStarttime'] = $params['starttimestamp'];
                } else {
                        $requestArray['wpStarttime'] = wfTimestampNow(); // Fake wpStartime
                }
@@ -450,7 +475,12 @@ class ApiEditPage extends ApiBase {
                                $this->dieUsageMsg( array( 'spamdetected', $result['spam'] ) );
 
                        case EditPage::AS_BLOCKED_PAGE_FOR_USER:
-                               $this->dieUsageMsg( 'blockedtext' );
+                               $this->dieUsage(
+                                       'You have been blocked from editing',
+                                       'blocked',
+                                       0,
+                                       array( 'blockinfo' => ApiQueryUserInfo::getBlockInfo( $user->getBlock() ) )
+                               );
 
                        case EditPage::AS_MAX_ARTICLE_SIZE_EXCEEDED:
                        case EditPage::AS_CONTENT_TOO_BIG:
@@ -543,7 +573,9 @@ class ApiEditPage extends ApiBase {
                        'sectiontitle' => array(
                                ApiBase::PARAM_TYPE => 'string',
                        ),
-                       'text' => null,
+                       'text' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'summary' => null,
                        'tags' => array(
                                ApiBase::PARAM_TYPE => ChangeTags::listExplicitlyDefinedTags(),
@@ -552,8 +584,12 @@ class ApiEditPage extends ApiBase {
                        'minor' => false,
                        'notminor' => false,
                        'bot' => false,
-                       'basetimestamp' => null,
-                       'starttimestamp' => null,
+                       'basetimestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
+                       'starttimestamp' => array(
+                               ApiBase::PARAM_TYPE => 'timestamp',
+                       ),
                        'recreate' => false,
                        'createonly' => false,
                        'nocreate' => false,
@@ -575,8 +611,12 @@ class ApiEditPage extends ApiBase {
                                ),
                        ),
                        'md5' => null,
-                       'prependtext' => null,
-                       'appendtext' => null,
+                       'prependtext' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
+                       'appendtext' => array(
+                               ApiBase::PARAM_TYPE => 'text',
+                       ),
                        'undo' => array(
                                ApiBase::PARAM_TYPE => 'integer'
                        ),