Dbarratt has uploaded a new change for review. ( https://gerrit.wikimedia.org/r/374871 )
Change subject: Use User Ids instead of User Names for Echo Mute ...................................................................... Use User Ids instead of User Names for Echo Mute The echo mute list uses user names which are not stable. User ids should be used instead. Bug: T173475 Change-Id: I947bcf37a8f85aaa105776d368dbd0ab76823aeb --- M Hooks.php M extension.json M includes/ContainmentSet.php A maintenance/updatePerUserBlacklist.php 4 files changed, 134 insertions(+), 5 deletions(-) git pull ssh://gerrit.wikimedia.org:29418/mediawiki/extensions/Echo refs/changes/71/374871/1 diff --git a/Hooks.php b/Hooks.php index 8e3db35..8c310b0 100644 --- a/Hooks.php +++ b/Hooks.php @@ -490,10 +490,14 @@ } if ( $wgEchoPerUserBlacklist ) { + $lookup = CentralIdLookup::factory(); + $ids = $user->getOption( 'echo-notifications-blacklist', [] ); + $names = $ids ? $lookup->lookupCentralIds( array_flip( $ids ), $user ) : []; $preferences['echo-notifications-blacklist'] = [ 'type' => 'usersmultiselect', 'label-message' => 'echo-pref-notifications-blacklist', 'section' => 'echo/blocknotificationslist', + 'default' => implode( "\n", array_values( $names ) ) ]; } @@ -1252,6 +1256,10 @@ $options['echo-subscriptions-email-edit-user-talk'] = $options['enotifusertalkpages']; } + if ( isset( $options['echo-notifications-blacklist'] ) ) { + $options['echo-notifications-blacklist'] = array_map( 'intval', explode( "\n", $options['echo-notifications-blacklist'] ) ); + } + return true; } @@ -1270,6 +1278,31 @@ unset( $options['echo-subscriptions-email-edit-user-talk'] ); } + // Convert usernames to ids. + if ( isset( $options['echo-notifications-blacklist'] ) ) { + if ( $options['echo-notifications-blacklist'] ) { + $value = $options['echo-notifications-blacklist']; + // Notification Blacklist may be an array of ids or a string of new line + // delimnated user names. + if ( is_array( $value ) ) { + $ids = array_filter( $value, 'is_numeric' ); + } else { + $lookup = CentralIdLookup::factory(); + $names = explode( "\n", $value ); + $nameToId = array_flip( $names ); + $nameToId = array_fill_keys( array_keys( $nameToId ), false ); + $ids = array_filter( $lookup->lookupUserNames( $nameToId, $this ), function ( $id ) { + return $id !== false; + } ); + } + $user->setOption( 'echo-notifications-blacklist', array_unique( array_values( $ids ) ) ); + $options['echo-notifications-blacklist'] = implode( "\n", $user->getOption( 'echo-notifications-blacklist' ) ); + } else { + // If the blacklist is empty, set it to null rather than an empty string. + $options['echo-notifications-blacklist'] = null; + } + } + return true; } diff --git a/extension.json b/extension.json index 39606db..2ae045f 100644 --- a/extension.json +++ b/extension.json @@ -1019,6 +1019,7 @@ "SpecialNotificationsMarkRead": "includes/special/SpecialNotificationsMarkRead.php", "SuppressionMaintenanceTest": "tests/phpunit/maintenance/SupressionMaintenanceTest.php", "TestDiscussionParser": "maintenance/testDiscussionParser.php", - "UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php" + "UpdateEchoSchemaForSuppression": "maintenance/updateEchoSchemaForSuppression.php", + "EchoUpdatePerUserBlocklist": "maintenance/updatePerUserBlocklist.php" } } diff --git a/includes/ContainmentSet.php b/includes/ContainmentSet.php index 4b6ce1f..d5cfff5 100644 --- a/includes/ContainmentSet.php +++ b/includes/ContainmentSet.php @@ -71,12 +71,12 @@ * @param string $preferenceName */ public function addFromUserOption( $preferenceName ) { - $preference = $this->recipient->getOption( $preferenceName ); + $preference = $this->recipient->getOption( $preferenceName, [] ); if ( $preference ) { - $items = explode( "\n", $preference ); - - $this->addArray( $items ); + $lookup = CentralIdLookup::factory(); + $names = $lookup->lookupCentralIds( array_flip( $preference ), $this->recipient ); + $this->addArray( array_values( $names ) ); } } diff --git a/maintenance/updatePerUserBlacklist.php b/maintenance/updatePerUserBlacklist.php new file mode 100644 index 0000000..a7b4d65 --- /dev/null +++ b/maintenance/updatePerUserBlacklist.php @@ -0,0 +1,95 @@ +<?php +/** + * Update the Per User Blocklist from Usernames to User Ids. + * + * @ingroup Maintenance + */ +require_once getenv( 'MW_INSTALL_PATH' ) !== false + ? getenv( 'MW_INSTALL_PATH' ) . '/maintenance/Maintenance.php' + : __DIR__ . '/../../../maintenance/Maintenance.php'; + +/** + * Maintenance script that changes the usernames to ids. + * + * @ingroup Maintenance + */ +class EchoUpdatePerUserBlocklist extends LoggedUpdateMaintenance { + + public function __construct() { + parent::__construct(); + + $this->mDescription = "Update echo-notifications-blacklist User Preference from Usernames to Ids"; + $this->setBatchSize( 100 ); + $this->requireExtension( 'Echo' ); + } + + public function getUpdateKey() { + return __CLASS__; + } + + public function doDBUpdates() { + $dbFactory = MWEchoDbFactory::newFromDefault(); + $dbw = $dbFactory->getEchoDb( DB_MASTER ); + $dbr = $dbFactory->getEchoDb( DB_SLAVE ); + $iterator = new BatchRowIterator( + $dbr, + 'user_properties', + [ 'up_user', 'up_property' ], + $this->mBatchSize + ); + $iterator->setFetchColumns( [ + 'up_user', + 'up_value' + ] ); + $iterator->addConditions( [ + 'up_property' => 'echo-notifications-blacklist' + ] ); + + $this->output( "Updating Echo Notification Blacklist...\n" ); + + $lookup = CentralIdLookup::factory(); + $processed = 0; + foreach ( $iterator as $batch ) { + foreach ( $batch as $row ) { + + if ( !$row->up_value ) { + continue; + } + + $value = explode( "\n", $row->up_value ); + $names = array_filter( $value, function( $item ) { + return !is_numeric( $item ); + } ); + + // If all of the values are numeric then the user has already been + // converted. + if ( !$names ) { + continue; + } + + $user = User::newFromId( $row->up_user ); + $ids = $lookup->lookupUserNames( array_flip( $names ), $user ); + + $dbw->update( + 'user_properties', + [ + 'up_value' => implode( "\n", array_values( $ids ) ), + ], + [ + 'up_user' => $row->up_user, + 'up_property' => 'echo-notifications-blacklist', + ] + ); + $processed += $dbw->affectedRows(); + $dbFactory->waitForSlaves(); + } + + $this->output( "Updated $processed Users\n" ); + } + + return true; + } +} + +$maintClass = 'EchoUpdatePerUserBlocklist'; +require_once RUN_MAINTENANCE_IF_MAIN; -- To view, visit https://gerrit.wikimedia.org/r/374871 To unsubscribe, visit https://gerrit.wikimedia.org/r/settings Gerrit-MessageType: newchange Gerrit-Change-Id: I947bcf37a8f85aaa105776d368dbd0ab76823aeb Gerrit-PatchSet: 1 Gerrit-Project: mediawiki/extensions/Echo Gerrit-Branch: master Gerrit-Owner: Dbarratt <dbarr...@wikimedia.org> _______________________________________________ MediaWiki-commits mailing list MediaWiki-commits@lists.wikimedia.org https://lists.wikimedia.org/mailman/listinfo/mediawiki-commits