Commit | Line | Data |
---|---|---|
c495c100 P |
1 | <?php |
2 | /*********************************************************************** | |
3 | ||
4 | Copyright (C) 2002-2005 Rickard Andersson (rickard@punbb.org) | |
5 | ||
6 | This file is part of PunBB. | |
7 | ||
8 | PunBB is free software; you can redistribute it and/or modify it | |
9 | under the terms of the GNU General Public License as published | |
10 | by the Free Software Foundation; either version 2 of the License, | |
11 | or (at your option) any later version. | |
12 | ||
13 | PunBB is distributed in the hope that it will be useful, but | |
14 | WITHOUT ANY WARRANTY; without even the implied warranty of | |
15 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
16 | GNU General Public License for more details. | |
17 | ||
18 | You should have received a copy of the GNU General Public License | |
19 | along with this program; if not, write to the Free Software | |
20 | Foundation, Inc., 59 Temple Place, Suite 330, Boston, | |
21 | MA 02111-1307 USA | |
22 | ||
23 | ************************************************************************/ | |
24 | ||
25 | ||
26 | // Tell header.php to use the admin template | |
27 | define('PUN_ADMIN_CONSOLE', 1); | |
28 | ||
29 | define('PUN_ROOT', './'); | |
30 | require PUN_ROOT.'include/common.php'; | |
31 | require PUN_ROOT.'include/common_admin.php'; | |
32 | ||
33 | ||
34 | if ($pun_user['g_id'] > PUN_MOD || ($pun_user['g_id'] == PUN_MOD && $pun_config['p_mod_ban_users'] == '0')) | |
35 | message($lang_common['No permission']); | |
36 | ||
37 | ||
38 | // Add/edit a ban (stage 1) | |
39 | if (isset($_REQUEST['add_ban']) || isset($_GET['edit_ban'])) | |
40 | { | |
41 | if (isset($_GET['add_ban']) || isset($_POST['add_ban'])) | |
42 | { | |
43 | // If the id of the user to ban was provided through GET (a link from profile.php) | |
44 | if (isset($_GET['add_ban'])) | |
45 | { | |
46 | $add_ban = intval($_GET['add_ban']); | |
47 | if ($add_ban < 2) | |
48 | message($lang_common['Bad request']); | |
49 | ||
50 | $user_id = $add_ban; | |
51 | ||
52 | $result = $db->query('SELECT group_id, username, email FROM '.$db->prefix.'users WHERE id='.$user_id) or error('Unable to fetch user info', __FILE__, __LINE__, $db->error()); | |
53 | if ($db->num_rows($result)) | |
54 | list($group_id, $ban_user, $ban_email) = $db->fetch_row($result); | |
55 | else | |
56 | message('Aucun utilisateur enregistré sous cet identifiant (ID).'); | |
57 | } | |
58 | else // Otherwise the username is in POST | |
59 | { | |
60 | $ban_user = trim($_POST['new_ban_user']); | |
61 | ||
62 | if ($ban_user != '') | |
63 | { | |
64 | $result = $db->query('SELECT id, group_id, username, email FROM '.$db->prefix.'users WHERE username=\''.$db->escape($ban_user).'\' AND id>1') or error('Unable to fetch user info', __FILE__, __LINE__, $db->error()); | |
65 | if ($db->num_rows($result)) | |
66 | list($user_id, $group_id, $ban_user, $ban_email) = $db->fetch_row($result); | |
67 | else | |
68 | message('Aucun utilisateur enregistré sous ce nom d\'utilisateur. Si vous souhaitez ajouter un bannissement qui ne soit pas lié à un nom d\'utilisateur particulier, laissez la case vide.'); | |
69 | } | |
70 | } | |
71 | ||
72 | // Make sure we're not banning an admin | |
73 | if (isset($group_id) && $group_id == PUN_ADMIN) | |
74 | message('L\'utilisateur '.pun_htmlspecialchars($ban_user).' est un administrateur, il ne peut être bannis. Si vous souhaitez bannir un administrateur, vous devez d\'abord le rétrograder soit modérateur soit utilisateur.'); | |
75 | ||
76 | // If we have a $user_id, we can try to find the last known IP of that user | |
77 | if (isset($user_id)) | |
78 | { | |
79 | $result = $db->query('SELECT poster_ip FROM '.$db->prefix.'posts WHERE poster_id='.$user_id.' ORDER BY posted DESC LIMIT 1') or error('Unable to fetch post info', __FILE__, __LINE__, $db->error()); | |
80 | $ban_ip = ($db->num_rows($result)) ? $db->result($result) : ''; | |
81 | } | |
82 | ||
83 | $mode = 'add'; | |
84 | } | |
85 | else // We are editing a ban | |
86 | { | |
87 | $ban_id = intval($_GET['edit_ban']); | |
88 | if ($ban_id < 1) | |
89 | message($lang_common['Bad request']); | |
90 | ||
91 | $result = $db->query('SELECT username, ip, email, message, expire FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Unable to fetch ban info', __FILE__, __LINE__, $db->error()); | |
92 | if ($db->num_rows($result)) | |
93 | list($ban_user, $ban_ip, $ban_email, $ban_message, $ban_expire) = $db->fetch_row($result); | |
94 | else | |
95 | message($lang_common['Bad request']); | |
96 | ||
97 | $ban_expire = ($ban_expire != '') ? date('Y-m-d', $ban_expire) : ''; | |
98 | ||
99 | $mode = 'edit'; | |
100 | } | |
101 | ||
102 | $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Bannissements'; | |
103 | $focus_element = array('bans2', 'ban_user'); | |
104 | require PUN_ROOT.'header.php'; | |
105 | ||
106 | generate_admin_menu('bans'); | |
107 | ||
108 | ||
109 | ?> | |
110 | <div class="blockform"> | |
111 | <h2><span>Réglages de bannissement avancés</span></h2> | |
112 | <div class="box"> | |
113 | <form id="bans2" method="post" action="admin_bans.php"> | |
114 | <div class="inform"> | |
115 | <input type="hidden" name="mode" value="<?php echo $mode ?>" /> | |
116 | <?php if ($mode == 'edit'): ?> <input type="hidden" name="ban_id" value="<?php echo $ban_id ?>" /> | |
117 | <?php endif; ?> <fieldset> | |
118 | <legend>Bannissement supplémentaire avec <acronym title="Internet Protocol" lang="en">IP</acronym> est adresse e-mail</legend> | |
119 | <div class="infldset"> | |
120 | <table class="aligntop" cellspacing="0"> | |
121 | <tr> | |
122 | <th scope="row">Nom d'utilisateur</th> | |
123 | <td> | |
124 | <input type="text" name="ban_user" size="25" maxlength="25" value="<?php if (isset($ban_user)) echo pun_htmlspecialchars($ban_user); ?>" tabindex="1" /> | |
125 | <span>Le nom d'utilisateur à bannir.</span> | |
126 | </td> | |
127 | </tr> | |
128 | <tr> | |
129 | <th scope="row">Adresses <acronym title="Internet Protocol" lang="en">IP</acronym></th> | |
130 | <td> | |
131 | <input type="text" name="ban_ip" size="45" maxlength="255" value="<?php if (isset($ban_ip)) echo $ban_ip; ?>" tabindex="2" /> | |
132 | <span>Une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> ou une plage d'adresses <acronym title="Internet Protocol" lang="en">IP</acronym> que vous souhaitez bannir (<abbr title="exemple">ex.</abbr> 150.11.110.1 ou 150.11.110). Séparez les adresses par des espaces. Si une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> apparaît déjà, il s'agit de la dernière adresse IP connue de l'utilisateur dans la base de données.<?php if ($ban_user != '' && isset($user_id)) echo ' <a href="admin_users.php?ip_stats='.$user_id.'">Cliquez ici</a> pour voir les statistiques <acronym title="Internet Protocol" lang="en">IP</acronym> de cet utilisateur.' ?></span> | |
133 | </td> | |
134 | </tr> | |
135 | <tr> | |
136 | <th scope="row">E-mail/domaine</th> | |
137 | <td> | |
138 | <input type="text" name="ban_email" size="40" maxlength="50" value="<?php if (isset($ban_email)) echo strtolower($ban_email); ?>" tabindex="3" /> | |
139 | <span>L'adresse e-mail ou le domaine e-mail que vous souhaitez bannir (<abbr title="exemple">ex.</abbr> utilisateur@domaine.com ou domaine.com). Pour plus d'informations, voir "Autoriser les adresses e-mail bannies" à la page des Permissions.</span> | |
140 | </td> | |
141 | </tr> | |
142 | </table> | |
143 | <p class="topspace"><strong class="warntext">Vous devez êtres très vigilant lorsque vous bannissez une plage d'<acronym title="Internet Protocol" lang="en">IP</acronym> car il y a fort probablement plusieurs utilisateurs qui correspondent à la même <acronym title="Internet Protocol" lang="en">IP</acronym> partielle.</strong></p> | |
144 | </div> | |
145 | </fieldset> | |
146 | </div> | |
147 | <div class="inform"> | |
148 | <fieldset> | |
149 | <legend>Message et échéance d'interdiction</legend> | |
150 | <div class="infldset"> | |
151 | <table class="aligntop" cellspacing="0"> | |
152 | <tr> | |
153 | <th scope="row">Message d'interdiction</th> | |
154 | <td> | |
155 | <input type="text" name="ban_message" size="50" maxlength="255" value="<?php if (isset($ban_message)) echo pun_htmlspecialchars($ban_message); ?>" tabindex="4" /> | |
156 | <span>Le message qui sera affiché à l'utilisateur banni lorsqu'il visitera les forums.</span> | |
157 | </td> | |
158 | </tr> | |
159 | <tr> | |
160 | <th scope="row">Échéance d'interdiction</th> | |
161 | <td> | |
162 | <input type="text" name="ban_expire" size="17" maxlength="10" value="<?php if (isset($ban_expire)) echo $ban_expire; ?>" tabindex="5" /> | |
163 | <span>La date à laquelle ce bannissement sera automatiquement supprimé (format: AAAA-MM-JJ). Pour supprimer manuellement, laissez ce champ vide.</span> | |
164 | </td> | |
165 | </tr> | |
166 | </table> | |
167 | </div> | |
168 | </fieldset> | |
169 | </div> | |
170 | <p class="submitend"><input type="submit" name="add_edit_ban" value=" Enregistrer " tabindex="6" /></p> | |
171 | </form> | |
172 | </div> | |
173 | </div> | |
174 | <div class="clearer"></div> | |
175 | </div> | |
176 | <?php | |
177 | ||
178 | require PUN_ROOT.'footer.php'; | |
179 | } | |
180 | ||
181 | ||
182 | // Add/edit a ban (stage 2) | |
183 | else if (isset($_POST['add_edit_ban'])) | |
184 | { | |
185 | confirm_referrer('admin_bans.php'); | |
186 | ||
187 | $ban_user = trim($_POST['ban_user']); | |
188 | $ban_ip = trim($_POST['ban_ip']); | |
189 | $ban_email = strtolower(trim($_POST['ban_email'])); | |
190 | $ban_message = trim($_POST['ban_message']); | |
191 | $ban_expire = trim($_POST['ban_expire']); | |
192 | ||
193 | if ($ban_user == '' && $ban_ip == '' && $ban_email == '') | |
194 | message('Vous devez saisir au moins soit un nom d\'utilisateur, soit une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> ou une adresse e-mail.'); | |
195 | else if (strtolower($ban_user) == 'guest' || strtolower($ban_user) == 'invité') | |
196 | message('Vous ne pouvez pas bannir l\'utilisateur "invité"'); | |
197 | ||
198 | // Validate IP/IP range (it's overkill, I know) | |
199 | if ($ban_ip != '') | |
200 | { | |
201 | $ban_ip = preg_replace('/[\s]{2,}/', ' ', $ban_ip); | |
202 | $addresses = explode(' ', $ban_ip); | |
203 | $addresses = array_map('trim', $addresses); | |
204 | ||
205 | for ($i = 0; $i < count($addresses); ++$i) | |
206 | { | |
207 | $octets = explode('.', $addresses[$i]); | |
208 | ||
209 | for ($c = 0; $c < count($octets); ++$c) | |
210 | { | |
211 | $octets[$c] = (strlen($octets[$c]) > 1) ? ltrim($octets[$c], "0") : $octets[$c]; | |
212 | ||
213 | if ($c > 3 || preg_match('/[^0-9]/', $octets[$c]) || intval($octets[$c]) > 255) | |
214 | message('Vous avez saisi une <acronym title="Internet Protocol" lang="en">IP</acronym>/plage d\'<acronym title="Internet Protocol" lang="en">IP</acronym> incorrecte.'); | |
215 | } | |
216 | ||
217 | $cur_address = implode('.', $octets); | |
218 | $addresses[$i] = $cur_address; | |
219 | } | |
220 | ||
221 | $ban_ip = implode(' ', $addresses); | |
222 | } | |
223 | ||
224 | require PUN_ROOT.'include/email.php'; | |
225 | if ($ban_email != '' && !is_valid_email($ban_email)) | |
226 | { | |
227 | if (!preg_match('/^[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/', $ban_email)) | |
228 | message('L\'adresse e-mail (<abbr title="exemple">ex.</abbr> utilisateur@domaine.com) ou le domaine d\'adresse e-mail (<abbr title="exemple">ex.</abbr> domaine.com) que vous avez saisi est incorrect.'); | |
229 | } | |
230 | ||
231 | if ($ban_expire != '' && $ban_expire != 'Never') | |
232 | { | |
233 | $ban_expire = strtotime($ban_expire); | |
234 | ||
235 | if ($ban_expire == -1 || $ban_expire <= time()) | |
236 | message('Vous avez saisi une date d\'échéance incorrecte. Le format doit être AAAA-MM-JJ et la date doit-être d\'au moins un jour dans le futur.'); | |
237 | } | |
238 | else | |
239 | $ban_expire = 'NULL'; | |
240 | ||
241 | $ban_user = ($ban_user != '') ? '\''.$db->escape($ban_user).'\'' : 'NULL'; | |
242 | $ban_ip = ($ban_ip != '') ? '\''.$db->escape($ban_ip).'\'' : 'NULL'; | |
243 | $ban_email = ($ban_email != '') ? '\''.$db->escape($ban_email).'\'' : 'NULL'; | |
244 | $ban_message = ($ban_message != '') ? '\''.$db->escape($ban_message).'\'' : 'NULL'; | |
245 | ||
246 | if ($_POST['mode'] == 'add') | |
247 | $db->query('INSERT INTO '.$db->prefix.'bans (username, ip, email, message, expire) VALUES('.$ban_user.', '.$ban_ip.', '.$ban_email.', '.$ban_message.', '.$ban_expire.')') or error('Unable to add ban', __FILE__, __LINE__, $db->error()); | |
248 | else | |
249 | $db->query('UPDATE '.$db->prefix.'bans SET username='.$ban_user.', ip='.$ban_ip.', email='.$ban_email.', message='.$ban_message.', expire='.$ban_expire.' WHERE id='.intval($_POST['ban_id'])) or error('Unable to update ban', __FILE__, __LINE__, $db->error()); | |
250 | ||
251 | // Regenerate the bans cache | |
252 | require_once PUN_ROOT.'include/cache.php'; | |
253 | generate_bans_cache(); | |
254 | ||
255 | redirect('admin_bans.php', 'Bannissement '.(($_POST['mode'] == 'edit') ? 'modifié' : 'ajouté').'. Redirection ...'); | |
256 | } | |
257 | ||
258 | ||
259 | // Remove a ban | |
260 | else if (isset($_GET['del_ban'])) | |
261 | { | |
262 | confirm_referrer('admin_bans.php'); | |
263 | ||
264 | $ban_id = intval($_GET['del_ban']); | |
265 | if ($ban_id < 1) | |
266 | message($lang_common['Bad request']); | |
267 | ||
268 | $db->query('DELETE FROM '.$db->prefix.'bans WHERE id='.$ban_id) or error('Unable to delete ban', __FILE__, __LINE__, $db->error()); | |
269 | ||
270 | // Regenerate the bans cache | |
271 | require_once PUN_ROOT.'include/cache.php'; | |
272 | generate_bans_cache(); | |
273 | ||
274 | redirect('admin_bans.php', 'Bannissement supprimé. Redirection ...'); | |
275 | } | |
276 | ||
277 | ||
278 | $page_title = pun_htmlspecialchars($pun_config['o_board_title']).' / Admin / Bannissement'; | |
279 | $focus_element = array('bans', 'new_ban_user'); | |
280 | require PUN_ROOT.'header.php'; | |
281 | ||
282 | generate_admin_menu('bans'); | |
283 | ||
284 | ?> | |
285 | <div class="blockform"> | |
286 | <h2><span>Nouveau bannissement</span></h2> | |
287 | <div class="box"> | |
288 | <form id="bans" method="post" action="admin_bans.php?action=more"> | |
289 | <div class="inform"> | |
290 | <fieldset> | |
291 | <legend>Ajouter un bannissement</legend> | |
292 | <div class="infldset"> | |
293 | <table class="aligntop" cellspacing="0"> | |
294 | <tr> | |
295 | <th scope="row">Nom d'utilisateur<div><input type="submit" name="add_ban" value=" Ajouter " tabindex="2" /></div></th> | |
296 | <td> | |
297 | <input type="text" name="new_ban_user" size="25" maxlength="25" tabindex="1" /> | |
298 | <span>Le nom d'utilisateur à bannir (insensible à la casse). La page suivante vous permettra d'entrer une adresse <acronym title="Internet Protocol" lang="en">IP</acronym> et/ou une adresse e-mail de votre choix. Si vous souhaitez bannir une adresse <acronym title="Internet Protocol" lang="en">IP</acronym>, une plage d'adresses <acronym title="Internet Protocol" lang="en">IP</acronym> ou une adresse e-mail, laissez simplement ce champ vide.</span> | |
299 | </td> | |
300 | </tr> | |
301 | </table> | |
302 | </div> | |
303 | </fieldset> | |
304 | </div> | |
305 | </form> | |
306 | </div> | |
307 | ||
308 | <h2 class="block2"><span>Bannissements actuels</span></h2> | |
309 | <div class="box"> | |
310 | <div class="fakeform"> | |
311 | <?php | |
312 | ||
313 | $result = $db->query('SELECT id, username, ip, email, message, expire FROM '.$db->prefix.'bans ORDER BY id') or error('Unable to fetch ban list', __FILE__, __LINE__, $db->error()); | |
314 | if ($db->num_rows($result)) | |
315 | { | |
316 | while ($cur_ban = $db->fetch_assoc($result)) | |
317 | { | |
318 | $expire = format_time($cur_ban['expire'], true); | |
319 | ||
320 | ?> | |
321 | <div class="inform"> | |
322 | <fieldset> | |
323 | <legend>Date d'échéance : <?php echo $expire ?></legend> | |
324 | <div class="infldset"> | |
325 | <table cellspacing="0"> | |
326 | <?php if ($cur_ban['username'] != ''): ?> <tr> | |
327 | <th>Nom d'utilisateur</th> | |
328 | <td><?php echo pun_htmlspecialchars($cur_ban['username']) ?></td> | |
329 | </tr> | |
330 | <?php endif; ?><?php if ($cur_ban['email'] != ''): ?> <tr> | |
331 | <th>E-mail</th> | |
332 | <td><?php echo $cur_ban['email'] ?></td> | |
333 | </tr> | |
334 | <?php endif; ?><?php if ($cur_ban['ip'] != ''): ?> <tr> | |
335 | <th><acronym title="Internet Protocol" lang="en">IP</acronym>/plage d'<acronym title="Internet Protocol" lang="en">IP</acronym></th> | |
336 | <td><?php echo $cur_ban['ip'] ?></td> | |
337 | </tr> | |
338 | <?php endif; ?><?php if ($cur_ban['message'] != ''): ?> <tr> | |
339 | <th>Motif</th> | |
340 | <td><?php echo pun_htmlspecialchars($cur_ban['message']) ?></td> | |
341 | </tr> | |
342 | <?php endif; ?> </table> | |
343 | <p class="linkactions"><a href="admin_bans.php?edit_ban=<?php echo $cur_ban['id'] ?>">Modifier</a> - <a href="admin_bans.php?del_ban=<?php echo $cur_ban['id'] ?>">Supprimer</a></p> | |
344 | </div> | |
345 | </fieldset> | |
346 | </div> | |
347 | <?php | |
348 | ||
349 | } | |
350 | } | |
351 | else | |
352 | echo "\t\t\t\t".'<p>Aucun bannissement à lister.</p>'."\n"; | |
353 | ||
354 | ?> | |
355 | </div> | |
356 | </div> | |
357 | </div> | |
358 | <div class="clearer"></div> | |
359 | </div> | |
360 | <?php | |
361 | ||
362 | require PUN_ROOT.'footer.php'; |