Merge "User: support setting custom fields + array autocreation in non-existent field"
authorjenkins-bot <jenkins-bot@gerrit.wikimedia.org>
Wed, 10 Jul 2019 20:53:02 +0000 (20:53 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Wed, 10 Jul 2019 20:53:02 +0000 (20:53 +0000)
1  2 
includes/user/User.php

diff --combined includes/user/User.php
@@@ -243,10 -243,19 +243,19 @@@ class User implements IDBAccessObject, 
                return (string)$this->getName();
        }
  
-       public function __get( $name ) {
+       public function &__get( $name ) {
                // A shortcut for $mRights deprecation phase
                if ( $name === 'mRights' ) {
-                       return $this->getRights();
+                       $copy = $this->getRights();
+                       return $copy;
+               } elseif ( !property_exists( $this, $name ) ) {
+                       // T227688 - do not break $u->foo['bar'] = 1
+                       wfLogWarning( 'tried to get non-existent property' );
+                       $this->$name = null;
+                       return $this->$name;
+               } else {
+                       wfLogWarning( 'tried to get non-visible property' );
+                       return null;
                }
        }
  
                                $this,
                                is_null( $value ) ? [] : $value
                        );
+               } elseif ( !property_exists( $this, $name ) ) {
+                       $this->$name = $value;
+               } else {
+                       wfLogWarning( 'tried to set non-visible property' );
                }
        }
  
  
        /**
         * @since 1.27
 -       * @param string $wikiId
 +       * @param string $dbDomain
         * @param int $userId
         */
 -      public static function purge( $wikiId, $userId ) {
 +      public static function purge( $dbDomain, $userId ) {
                $cache = MediaWikiServices::getInstance()->getMainWANObjectCache();
 -              $key = $cache->makeGlobalKey( 'user', 'id', $wikiId, $userId );
 +              $key = $cache->makeGlobalKey( 'user', 'id', $dbDomain, $userId );
                $cache->delete( $key );
        }
  
         * @param int|null $userId User ID, if known
         * @param string|null $userName User name, if known
         * @param int|null $actorId Actor ID, if known
 -       * @param bool|string $wikiId remote wiki to which the User/Actor ID applies, or false if none
 +       * @param bool|string $dbDomain remote wiki to which the User/Actor ID applies, or false if none
         * @return User
         */
 -      public static function newFromAnyId( $userId, $userName, $actorId, $wikiId = false ) {
 +      public static function newFromAnyId( $userId, $userName, $actorId, $dbDomain = false ) {
                global $wgActorTableSchemaMigrationStage;
  
                // Stop-gap solution for the problem described in T222212.
                // Force the User ID and Actor ID to zero for users loaded from the database
                // of another wiki, to prevent subtle data corruption and confusing failure modes.
 -              if ( $wikiId !== false ) {
 +              if ( $dbDomain !== false ) {
                        $userId = 0;
                        $actorId = 0;
                }