diff options
Diffstat (limited to 'www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/ArticleProtectComplete.php')
-rw-r--r-- | www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/ArticleProtectComplete.php | 134 |
1 files changed, 134 insertions, 0 deletions
diff --git a/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/ArticleProtectComplete.php b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/ArticleProtectComplete.php new file mode 100644 index 00000000..bbd9de18 --- /dev/null +++ b/www/wiki/extensions/SemanticMediaWiki/src/MediaWiki/Hooks/ArticleProtectComplete.php @@ -0,0 +1,134 @@ +<?php + +namespace SMW\MediaWiki\Hooks; + +use SMW\ApplicationFactory; +use SMW\MediaWiki\EditInfoProvider; +use SMW\Message; +use SMW\PropertyAnnotators\EditProtectedPropertyAnnotator; +use Title; + +/** + * Occurs after the protect article request has been processed + * + * @see https://www.mediawiki.org/wiki/Manual:Hooks/ArticleProtectComplete + * + * @license GNU GPL v2+ + * @since 2.5 + * + * @author mwjames + */ +class ArticleProtectComplete extends HookHandler { + + /** + * Whether the update should be restricted or not. Which means that when + * no other change is required then categorize the update as restricted + * to avoid unnecessary cascading updates. + */ + const RESTRICTED_UPDATE = 'articleprotectcomplete.restricted.update'; + + /** + * @var Title + */ + private $title; + + /** + * @var EditInfoProvider + */ + private $editInfoProvider; + + /** + * @since 2.5 + * + * @param Title $title + * @param EditInfoProvider $editInfoProvider + */ + public function __construct( Title $title, EditInfoProvider $editInfoProvider ) { + parent::__construct(); + $this->title = $title; + $this->editInfoProvider = $editInfoProvider; + } + + /** + * @since 2.5 + * + * @param array $protections + * @param string $reason + */ + public function process( $protections, $reason ) { + + if ( Message::get( 'smw-edit-protection-auto-update' ) === $reason ) { + return $this->log( __METHOD__ . ' No changes required, invoked by own process!' ); + } + + $this->editInfoProvider->fetchEditInfo(); + + $output = $this->editInfoProvider->getOutput(); + + if ( $output === null ) { + return $this->log( __METHOD__ . ' Missing ParserOutput!' ); + } + + $parserData = ApplicationFactory::getInstance()->newParserData( + $this->title, + $output + ); + + $this->doPrepareData( $protections, $parserData ); + $parserData->setOrigin( 'ArticleProtectComplete' ); + + $parserData->updateStore( + true + ); + } + + private function doPrepareData( $protections, $parserData ) { + + $isRestrictedUpdate = true; + $isAnnotationBySystem = false; + + $dataItemFactory = ApplicationFactory::getInstance()->getDataItemFactory(); + $property = $dataItemFactory->newDIProperty( '_EDIP' ); + + $dataItems = $parserData->getSemanticData()->getPropertyValues( $property ); + $dataItem = end( $dataItems ); + + if ( $dataItem ) { + $isAnnotationBySystem = $dataItem->getOption( EditProtectedPropertyAnnotator::SYSTEM_ANNOTATION ); + } + + $editProtectionRight = $this->getOption( 'smwgEditProtectionRight', false ); + + // No _EDIP annotation but a selected protection matches the + // `EditProtectionRight` setting + if ( !$dataItem && isset( $protections['edit'] ) && $protections['edit'] === $editProtectionRight ) { + $this->log( 'ArticleProtectComplete addProperty `Is edit protected`' ); + + $isRestrictedUpdate = false; + $parserData->getSemanticData()->addPropertyObjectValue( + $property, + $dataItemFactory->newDIBoolean( true ) + ); + } + + // _EDIP exists and was set by the EditProtectedPropertyAnnotator (which + // means that is has been set by the system and is not a "human" added + // annotation) but since the selected protection doesn't match the + // `EditProtectionRight` setting, remove the annotation + if ( $dataItem && $isAnnotationBySystem && isset( $protections['edit'] ) && $protections['edit'] !== $editProtectionRight ) { + $this->log( 'ArticleProtectComplete removeProperty `Is edit protected`' ); + + $isRestrictedUpdate = false; + $parserData->getSemanticData()->removePropertyObjectValue( + $property, + $dataItemFactory->newDIBoolean( true ) + ); + } + + $parserData->getSemanticData()->setOption( + self::RESTRICTED_UPDATE, + $isRestrictedUpdate + ); + } + +} |