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

Reply via email to