} elseif ( !$wgUser->isAllowed( 'editcontentmodel' ) ) {
$status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL );
return $status;
-
}
+ // Make sure the user can edit the page under the new content model too
+ $titleWithNewContentModel = clone $this->mTitle;
+ $titleWithNewContentModel->setContentModel( $this->contentModel );
+ if ( !$titleWithNewContentModel->userCan( 'editcontentmodel', $wgUser )
+ || !$titleWithNewContentModel->userCan( 'edit', $wgUser )
+ ) {
+ $status->setResult( false, self::AS_NO_CHANGE_CONTENT_MODEL );
+ return $status;
+ }
+
$changingContentModel = true;
$oldContentModel = $this->mTitle->getContentModel();
}
* @var bool|string ID of the page's content model, i.e. one of the
* CONTENT_MODEL_XXX constants
*/
- public $mContentModel = false;
+ private $mContentModel = false;
+
+ /**
+ * @var bool If a content model was forced via setContentModel()
+ * this will be true to avoid having other code paths reset it
+ */
+ private $mForcedContentModel = false;
/** @var int Estimated number of revisions; null of not loaded */
private $mEstimateRevisions;
if ( isset( $row->page_latest ) ) {
$this->mLatestID = (int)$row->page_latest;
}
- if ( isset( $row->page_content_model ) ) {
+ if ( !$this->mForcedContentModel && isset( $row->page_content_model ) ) {
$this->mContentModel = strval( $row->page_content_model );
- } else {
+ } elseif ( !$this->mForcedContentModel ) {
$this->mContentModel = false; # initialized lazily in getContentModel()
}
if ( isset( $row->page_lang ) ) {
$this->mLength = 0;
$this->mRedirect = false;
$this->mLatestID = 0;
- $this->mContentModel = false; # initialized lazily in getContentModel()
+ if ( !$this->mForcedContentModel ) {
+ $this->mContentModel = false; # initialized lazily in getContentModel()
+ }
}
}
* @return string Content model id
*/
public function getContentModel( $flags = 0 ) {
- if ( ( !$this->mContentModel || $flags === Title::GAID_FOR_UPDATE ) &&
- $this->getArticleID( $flags )
+ if ( !$this->mForcedContentModel
+ && ( !$this->mContentModel || $flags === Title::GAID_FOR_UPDATE )
+ && $this->getArticleID( $flags )
) {
$linkCache = LinkCache::singleton();
$linkCache->addLinkObj( $this ); # in case we already had an article ID
return $this->getContentModel() == $id;
}
+ /**
+ * Set a proposed content model for the page for permissions
+ * checking. This does not actually change the content model
+ * of a title!
+ *
+ * Additionally, you should make sure you've checked
+ * ContentHandler::canBeUsedOn() first.
+ *
+ * @since 1.28
+ * @param string $model CONTENT_MODEL_XXX constant
+ */
+ public function setContentModel( $model ) {
+ $this->mContentModel = $model;
+ $this->mForcedContentModel = true;
+ }
+
/**
* Get the namespace text
*
}
$this->title = Title::newFromText( $data['pagetitle'] );
+ $titleWithNewContentModel = clone $this->title;
+ $titleWithNewContentModel->setContentModel( $data['model'] );
$user = $this->getUser();
- // Check permissions and make sure the user has permission to edit the specific page
- $errors = $this->title->getUserPermissionsErrors( 'editcontentmodel', $user );
- $errors = wfMergeErrorArrays( $errors, $this->title->getUserPermissionsErrors( 'edit', $user ) );
+ // Check permissions and make sure the user has permission to:
+ $errors = wfMergeErrorArrays(
+ // edit the contentmodel of the page
+ $this->title->getUserPermissionsErrors( 'editcontentmodel', $user ),
+ // edit the page under the old content model
+ $this->title->getUserPermissionsErrors( 'edit', $user ),
+ // edit the contentmodel under the new content model
+ $titleWithNewContentModel->getUserPermissionsErrors( 'editcontentmodel', $user ),
+ // edit the page under the new content model
+ $titleWithNewContentModel->getUserPermissionsErrors( 'edit', $user )
+ );
if ( $errors ) {
$out = $this->getOutput();
$wikitext = $out->formatPermissionsErrorMessage( $errors );