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