summaryrefslogtreecommitdiff
path: root/includes/UserRightsProxy.php
blob: 8a65a01a66eda045afcf7c55e058faebac499efb (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
<?php


/**
 * Cut-down copy of User interface for local-interwiki-database
 * user rights manipulation.
 */
class UserRightsProxy {
	private function __construct( $db, $database, $name, $id ) {
		$this->db = $db;
		$this->database = $database;
		$this->name = $name;
		$this->id = intval( $id );
	}

	/**
	 * Confirm the selected database name is a valid local interwiki database name.
	 * @return bool
	 */
	public static function validDatabase( $database ) {
		global $wgLocalDatabases;
		return in_array( $database, $wgLocalDatabases );
	}

	public static function whoIs( $database, $id ) {
		$user = self::newFromId( $database, $id );
		if( $user ) {
			return $user->name;
		} else {
			return false;
		}
	}

	/**
	 * Factory function; get a remote user entry by ID number.
	 * @return UserRightsProxy or null if doesn't exist
	 */
	public static function newFromId( $database, $id ) {
		return self::newFromLookup( $database, 'user_id', intval( $id ) );
	}

	public static function newFromName( $database, $name ) {
		return self::newFromLookup( $database, 'user_name', $name );
	}

	private static function newFromLookup( $database, $field, $value ) {
		$db = self::getDB( $database );
		if( $db ) {
			$row = $db->selectRow( 'user',
				array( 'user_id', 'user_name' ),
				array( $field => $value ),
				__METHOD__ );
			if( $row !== false ) {
				return new UserRightsProxy( $db, $database,
					$row->user_name,
					intval( $row->user_id ) );
			}
		}
		return null;
	}

	/**
	 * Open a database connection to work on for the requested user.
	 * This may be a new connection to another database for remote users.
	 * @param $database string
	 * @return Database or null if invalid selection
	 */
	public static function getDB( $database ) {
		global $wgLocalDatabases, $wgDBname;
		if( self::validDatabase( $database ) ) {
			if( $database == $wgDBname ) {
				// Hmm... this shouldn't happen though. :)
				return wfGetDB( DB_MASTER );
			} else {
				return wfGetDB( DB_MASTER, array(), $database );
			}
		}
		return null;
	}

	public function getId() {
		return $this->id;
	}

	public function isAnon() {
		return $this->getId() == 0;
	}

	public function getName() {
		return $this->name . '@' . $this->database;
	}

	public function getUserPage() {
		return Title::makeTitle( NS_USER, $this->getName() );
	}

	// Replaces getUserGroups()
	function getGroups() {
		$res = $this->db->select( 'user_groups',
			array( 'ug_group' ),
			array( 'ug_user' => $this->id ),
			__METHOD__ );
		$groups = array();
		while( $row = $this->db->fetchObject( $res ) ) {
			$groups[] = $row->ug_group;
		}
		return $groups;
	}

	// replaces addUserGroup
	function addGroup( $group ) {
		$this->db->insert( 'user_groups',
			array(
				'ug_user' => $this->id,
				'ug_group' => $group,
			),
			__METHOD__,
			array( 'IGNORE' ) );
	}

	// replaces removeUserGroup
	function removeGroup( $group ) {
		$this->db->delete( 'user_groups',
			array(
				'ug_user' => $this->id,
				'ug_group' => $group,
			),
			__METHOD__ );
	}

	// replaces touchUser
	function invalidateCache() {
		$this->db->update( 'user',
			array( 'user_touched' => $this->db->timestamp() ),
			array( 'user_id' => $this->id ),
			__METHOD__ );

		global $wgMemc;
		if ( function_exists( 'wfForeignMemcKey' ) ) {
			$key = wfForeignMemcKey( $this->database, false, 'user', 'id', $this->id );
		} else {
			$key = "$this->database:user:id:" . $this->id;
		}
		$wgMemc->delete( $key );
	}
}