MediaWiki REL1_34
UserRightsProxy.php
Go to the documentation of this file.
1<?php
24
31 private $db;
33 private $dbDomain;
35 private $name;
37 private $id;
39 private $newOptions;
40
49 private function __construct( $db, $dbDomain, $name, $id ) {
50 $this->db = $db;
51 $this->dbDomain = $dbDomain;
52 $this->name = $name;
53 $this->id = intval( $id );
54 $this->newOptions = [];
55 }
56
63 public static function validDatabase( $dbDomain ) {
64 global $wgLocalDatabases;
65 return in_array( $dbDomain, $wgLocalDatabases );
66 }
67
76 public static function whoIs( $dbDomain, $id, $ignoreInvalidDB = false ) {
77 $user = self::newFromId( $dbDomain, $id, $ignoreInvalidDB );
78 if ( $user ) {
79 return $user->name;
80 } else {
81 return false;
82 }
83 }
84
93 public static function newFromId( $dbDomain, $id, $ignoreInvalidDB = false ) {
94 return self::newFromLookup( $dbDomain, 'user_id', intval( $id ), $ignoreInvalidDB );
95 }
96
105 public static function newFromName( $dbDomain, $name, $ignoreInvalidDB = false ) {
106 return self::newFromLookup( $dbDomain, 'user_name', $name, $ignoreInvalidDB );
107 }
108
116 private static function newFromLookup( $dbDomain, $field, $value, $ignoreInvalidDB = false ) {
118 // If the user table is shared, perform the user query on it,
119 // but don't pass it to the UserRightsProxy,
120 // as user rights are normally not shared.
121 if ( $wgSharedDB && in_array( 'user', $wgSharedTables ) ) {
122 $userdb = self::getDB( $wgSharedDB, $ignoreInvalidDB );
123 } else {
124 $userdb = self::getDB( $dbDomain, $ignoreInvalidDB );
125 }
126
127 $db = self::getDB( $dbDomain, $ignoreInvalidDB );
128
129 if ( $db && $userdb ) {
130 $row = $userdb->selectRow( 'user',
131 [ 'user_id', 'user_name' ],
132 [ $field => $value ],
133 __METHOD__ );
134
135 if ( $row !== false ) {
136 return new UserRightsProxy(
137 $db, $dbDomain, $row->user_name, intval( $row->user_id ) );
138 }
139 }
140 return null;
141 }
142
151 public static function getDB( $dbDomain, $ignoreInvalidDB = false ) {
152 if ( $ignoreInvalidDB || self::validDatabase( $dbDomain ) ) {
153 if ( WikiMap::isCurrentWikiId( $dbDomain ) ) {
154 // Hmm... this shouldn't happen though. :)
155 return wfGetDB( DB_MASTER );
156 } else {
157 return wfGetDB( DB_MASTER, [], $dbDomain );
158 }
159 }
160 return null;
161 }
162
166 public function getId() {
167 return $this->id;
168 }
169
173 public function isAnon() {
174 return $this->getId() == 0;
175 }
176
182 public function getName() {
183 return $this->name . '@' . $this->dbDomain;
184 }
185
191 public function getUserPage() {
192 return Title::makeTitle( NS_USER, $this->getName() );
193 }
194
199 function getGroups() {
200 return array_keys( self::getGroupMemberships() );
201 }
202
210 return UserGroupMembership::getMembershipsForUser( $this->id, $this->db );
211 }
212
220 function addGroup( $group, $expiry = null ) {
221 if ( $expiry ) {
222 $expiry = wfTimestamp( TS_MW, $expiry );
223 }
224
225 $ugm = new UserGroupMembership( $this->id, $group, $expiry );
226 return $ugm->insert( true, $this->db );
227 }
228
235 function removeGroup( $group ) {
236 $ugm = UserGroupMembership::getMembership( $this->id, $group, $this->db );
237 if ( !$ugm ) {
238 return false;
239 }
240 return $ugm->delete( $this->db );
241 }
242
248 public function setOption( $option, $value ) {
249 $this->newOptions[$option] = $value;
250 }
251
252 public function saveSettings() {
253 $rows = [];
254 foreach ( $this->newOptions as $option => $value ) {
255 $rows[] = [
256 'up_user' => $this->id,
257 'up_property' => $option,
258 'up_value' => $value,
259 ];
260 }
261 $this->db->replace( 'user_properties',
262 [ [ 'up_user', 'up_property' ] ],
263 $rows, __METHOD__
264 );
265 $this->invalidateCache();
266 }
267
271 function invalidateCache() {
272 $this->db->update(
273 'user',
274 [ 'user_touched' => $this->db->timestamp() ],
275 [ 'user_id' => $this->id ],
276 __METHOD__
277 );
278
279 $domainId = $this->db->getDomainID();
280 $userId = $this->id;
281 $this->db->onTransactionPreCommitOrIdle(
282 function () use ( $domainId, $userId ) {
283 User::purge( $domainId, $userId );
284 },
285 __METHOD__
286 );
287 }
288}
getDB()
$wgSharedTables
$wgSharedDB
Shared database for multiple wikis.
string[] $wgLocalDatabases
Other wikis on this site, can be administered from a single developer account.
wfGetDB( $db, $groups=[], $wiki=false)
Get a Database object.
wfTimestamp( $outputtype=TS_UNIX, $ts=0)
Get a timestamp string in one of various formats.
Represents a "user group membership" – a specific instance of a user belonging to a group.
Cut-down copy of User interface for local-interwiki-database user rights manipulation.
static newFromId( $dbDomain, $id, $ignoreInvalidDB=false)
Factory function; get a remote user entry by ID number.
getName()
Same as User::getName()
getGroupMemberships()
Replaces User::getGroupMemberships()
static whoIs( $dbDomain, $id, $ignoreInvalidDB=false)
Same as User::whoIs()
removeGroup( $group)
Replaces User::removeGroup()
static newFromName( $dbDomain, $name, $ignoreInvalidDB=false)
Factory function; get a remote user entry by name.
static validDatabase( $dbDomain)
Confirm the selected database name is a valid local interwiki database name.
static newFromLookup( $dbDomain, $field, $value, $ignoreInvalidDB=false)
getGroups()
Replaces User::getUserGroups()
setOption( $option, $value)
Replaces User::setOption()
__construct( $db, $dbDomain, $name, $id)
invalidateCache()
Replaces User::touchUser()
static getDB( $dbDomain, $ignoreInvalidDB=false)
Open a database connection to work on for the requested user.
addGroup( $group, $expiry=null)
Replaces User::addGroup()
getUserPage()
Same as User::getUserPage()
static purge( $dbDomain, $userId)
Definition User.php:421
const NS_USER
Definition Defines.php:71
Basic database interface for live and lazy-loaded relation database handles.
Definition IDatabase.php:38
const DB_MASTER
Definition defines.php:26