Convert many comments to phpdoc style, and document some more functions
[lhc/web/wiklou.git] / includes / SpecialMakesysop.php
1 <?php
2 /**
3 *
4 * @package MediaWiki
5 * @subpackage SpecialPage
6 */
7
8 /**
9 *
10 */
11 require_once( "LinksUpdate.php" );
12
13 /**
14 * Constructor
15 */
16 function wfSpecialMakesysop() {
17 global $wgUser, $wgOut, $wgRequest;
18
19 if ( 0 == $wgUser->getID() or $wgUser->isBlocked() ) {
20 $wgOut->errorpage( "movenologin", "movenologintext" );
21 return;
22 }
23 if (! $wgUser->isBureaucrat() && ! $wgUser->isDeveloper() ){
24 $wgOut->errorpage( "bureaucrattitle", "bureaucrattext" );
25 return;
26 }
27
28 if ( wfReadOnly() ) {
29 $wgOut->readOnlyPage();
30 return;
31 }
32
33 $f = new MakesysopForm( $wgRequest );
34
35 if ( $f->mSubmit ) {
36 $f->doSubmit();
37 } else {
38 $f->showForm( '' );
39 }
40 }
41
42 /**
43 *
44 * @package MediaWiki
45 * @subpackage SpecialPage
46 */
47 class MakesysopForm {
48 var $mTarget, $mAction, $mRights, $mUser, $mSubmit;
49
50 function MakesysopForm( &$request ) {
51 $this->mAction = $request->getText( 'action' );
52 $this->mRights = $request->getVal( 'wpRights' );
53 $this->mUser = $request->getText( 'wpMakesysopUser' );
54 $this->mSubmit = $request->getBool( 'wpMakesysopSubmit' ) && $request->wasPosted();
55 $this->mBuro = $request->getBool( 'wpSetBureaucrat' );
56 }
57
58 function showForm( $err = '') {
59 global $wgOut, $wgUser, $wgLang;
60
61 if ( $wgUser->isDeveloper() ) {
62 $wgOut->setPageTitle( wfMsg( "set_user_rights" ) );
63 } else {
64 $wgOut->setPagetitle( wfMsg( "makesysoptitle" ) );
65 }
66
67 $wgOut->addWikiText( wfMsg( "makesysoptext" ) );
68
69 $titleObj = Title::makeTitle( NS_SPECIAL, "Makesysop" );
70 $action = $titleObj->escapeLocalURL( "action=submit" );
71
72 if ( "" != $err ) {
73 $wgOut->setSubtitle( wfMsg( "formerror" ) );
74 $wgOut->addHTML( "<p class='error'>{$err}</p>\n" );
75 }
76 $namedesc = wfMsg( "makesysopname" );
77 if ( !is_null( $this->mUser ) ) {
78 $encUser = htmlspecialchars( $this->mUser );
79 } else {
80 $encUser = "";
81 }
82
83 $wgOut->addHTML( "
84 <form id=\"makesysop\" method=\"post\" action=\"{$action}\">
85 <table border='0'>
86 <tr>
87 <td align='right'>$namedesc</td>
88 <td align='left'>
89 <input type='text' size='40' name=\"wpMakesysopUser\" value=\"$encUser\" />
90 </td>
91 </tr>"
92 );
93
94 $makeburo = wfMsg( "setbureaucratflag" );
95 $wgOut->addHTML(
96 "<tr>
97 <td>&nbsp;</td><td align=left>
98 <input type=checkbox name=\"wpSetBureaucrat\" value=1>$makeburo
99 </td>
100 </tr>"
101 );
102
103 if ( $wgUser->isDeveloper() ) {
104 $rights = wfMsg( "rights" );
105 if ( !is_null( $this->mRights ) ) {
106 $encRights = htmlspecialchars( $this->mRights );
107 } else {
108 $encRights = "sysop";
109 }
110
111 $wgOut->addHTML( "
112 <tr>
113 <td align='right'>$rights</td>
114 <td align='left'>
115 <input type='text' size='40' name=\"wpRights\" value=\"$encRights\" />
116 </td>
117 </tr>"
118 );
119 }
120
121 if ( $wgUser->isDeveloper() ) {
122 $mss = wfMsg( "set_user_rights" );
123 } else {
124 $mss = wfMsg( "makesysopsubmit" );
125 }
126 $wgOut->addHTML(
127 "<tr>
128 <td>&nbsp;</td><td align='left'>
129 <input type='submit' name=\"wpMakesysopSubmit\" value=\"{$mss}\" />
130 </td></tr></table>
131 </form>\n"
132 );
133
134 }
135
136 function doSubmit() {
137 global $wgOut, $wgUser, $wgLang;
138 global $wgDBname, $wgMemc, $wgLocalDatabases;
139
140 $fname = 'MakesysopForm::doSubmit';
141
142 $dbw =& wfGetDB( DB_MASTER );
143 $parts = explode( '@', $this->mUser );
144 $user_rights = $dbw->tableName( 'user_rights' );
145 $usertable = $dbw->tableName( 'user' );
146
147 if( count( $parts ) == 2 && $wgUser->isDeveloper() && strpos( '.', $user_rights ) === false ){
148 $username = $dbw->strencode( $parts[0] );
149 if ( array_key_exists( $parts[1], $wgLocalDatabases ) ) {
150 $dbName = $wgLocalDatabases[$parts[1]];
151 $user_rights = $dbName . '.' . $user_rights;
152 $usertable = $usertable . '.' . $usertable;
153 } else {
154 $this->showFail();
155 return;
156 }
157 } else {
158 $username = wfStrencode( $this->mUser );
159 $dbName = $wgDBname;
160 }
161 if ( $username{0} == "#" ) {
162 $id = intval( substr( $username, 1 ) );
163 $sql = "SELECT user_id,user_rights FROM $user_rights WHERE user_id=$id FOR UPDATE";
164 } else {
165 $encName = $dbw->strencode( $username );
166 $sql = "SELECT u.user_id, user_rights FROM $usertable u LEFT JOIN $user_rights r ON u.user_id=r.user_id WHERE user_name = '{$username}' FOR UPDATE";
167 }
168
169 $prev = $dbw->ignoreErrors( TRUE );
170 $res = $dbw->query( $sql );
171 $dbw->ignoreErrors( $prev );
172
173 if( $dbw->lastErrno() || ! $username || $dbw->numRows( $res ) == 0 ){
174 $this->showFail();
175 return;
176 }
177
178 $row = $dbw->fetchObject( $res );
179 $id = intval( $row->user_id );
180 $rightsNotation = array();
181
182 if ( $wgUser->isDeveloper() ) {
183 $newrights = (string)$this->mRights;
184 $rightsNotation[] = "=$this->mRights";
185 } else {
186 if( $row->user_rights ){
187 $rights = explode(",", $row->user_rights );
188 if(! in_array("sysop", $rights ) ){
189 $rights[] = "sysop";
190 $rightsNotation[] = "+sysop ";
191 }
192 if ( $this->mBuro && !in_array( "bureaucrat", $rights ) ) {
193 $rights[] = "bureaucrat";
194 $rightsNotation[] = "+bureaucrat ";
195 }
196 $newrights = addslashes( implode( ",", $rights ) );
197 } else {
198 $newrights = "sysop";
199 $rightsNotation[] = "+sysop";
200 if ( $this->mBuro ) {
201 $rightsNotation[] = "+bureaucrat";
202 $newrights .= ",bureaucrat";
203 }
204 }
205 }
206
207 if ( count( $rightsNotation ) == 0 ) {
208 $this->showFail();
209 } else {
210 #$sql = "UPDATE $user_rights SET user_rights = '{$newrights}' WHERE user_id = $id LIMIT 1";
211 #$dbw->query($sql);
212 $dbw->replace( $user_rights, array( array( 'user_id', 'user_rights' )),
213 array( 'user_id' => $id, 'user_rights' => $newrights ) , $fname );
214 $wgMemc->delete( "$dbName:user:id:$id" );
215
216 $log = new LogPage( 'rights' );
217 $log->addEntry( 'rights', Title::makeTitle( NS_USER, $this->mUser ),
218 implode( " ", $rightsNotation ) );
219
220 $this->showSuccess();
221 }
222 }
223
224 function showSuccess() {
225 global $wgOut, $wgUser;
226
227 $wgOut->setPagetitle( wfMsg( "makesysoptitle" ) );
228
229 if ( $wgUser->isDeveloper() ) {
230 $text = wfMsg( "user_rights_set", $this->mUser );
231 } else {
232 $text = wfMsg( "makesysopok", $this->mUser );
233 }
234 $text .= "\n\n";
235 $wgOut->addWikiText( $text );
236 $this->showForm();
237
238 }
239
240 function showFail() {
241 global $wgOut, $wgUser;
242
243 $wgOut->setPagetitle( wfMsg( "makesysoptitle" ) );
244 if ( $wgUser->isDeveloper() ) {
245 $this->showForm( wfMsg( "set_rights_fail", $this->mUser ) );
246 } else {
247 $this->showForm( wfMsg( "makesysopfail", $this->mUser ) );
248 }
249 }
250 }
251 ?>