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