5
* @version $Id: acp_bots.php,v 1.27 2007/10/05 14:36:32 acydburn Exp $
6
* @copyright (c) 2005 phpBB Group
7
* @license http://opensource.org/licenses/gpl-license.php GNU Public License
14
if (!defined('IN_PHPBB'))
26
function main($id, $mode)
28
global $config, $db, $user, $auth, $template, $cache;
29
global $phpbb_root_path, $phpbb_admin_path, $phpEx, $table_prefix;
31
$action = request_var('action', '');
32
$submit = (isset($_POST['submit'])) ? true : false;
33
$mark = request_var('mark', array(0));
34
$bot_id = request_var('id', 0);
36
if (isset($_POST['add']))
43
$user->add_lang('acp/bots');
44
$this->tpl_name = 'acp_bots';
45
$this->page_title = 'ACP_BOTS';
46
$form_key = 'acp_bots';
47
add_form_key($form_key);
49
if ($submit && !check_form_key($form_key))
51
$error[] = $user->lang['FORM_INVALID'];
54
// User wants to do something, how inconsiderate of them!
58
if ($bot_id || sizeof($mark))
60
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
62
$sql = 'UPDATE ' . BOTS_TABLE . "
64
WHERE bot_id $sql_id";
68
$cache->destroy('_bots');
72
if ($bot_id || sizeof($mark))
74
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
76
$sql = 'UPDATE ' . BOTS_TABLE . "
78
WHERE bot_id $sql_id";
82
$cache->destroy('_bots');
86
if ($bot_id || sizeof($mark))
88
if (confirm_box(true))
90
// We need to delete the relevant user, usergroup and bot entries ...
91
$sql_id = ($bot_id) ? " = $bot_id" : ' IN (' . implode(', ', $mark) . ')';
93
$sql = 'SELECT bot_name, user_id
94
FROM ' . BOTS_TABLE . "
95
WHERE bot_id $sql_id";
96
$result = $db->sql_query($sql);
98
$user_id_ary = $bot_name_ary = array();
99
while ($row = $db->sql_fetchrow($result))
101
$user_id_ary[] = (int) $row['user_id'];
102
$bot_name_ary[] = $row['bot_name'];
104
$db->sql_freeresult($result);
106
$db->sql_transaction('begin');
108
$sql = 'DELETE FROM ' . BOTS_TABLE . "
109
WHERE bot_id $sql_id";
110
$db->sql_query($sql);
112
if (sizeof($user_id_ary))
114
$_tables = array(USERS_TABLE, USER_GROUP_TABLE);
115
foreach ($_tables as $table)
117
$sql = "DELETE FROM $table
118
WHERE " . $db->sql_in_set('user_id', $user_id_ary);
119
$db->sql_query($sql);
123
$db->sql_transaction('commit');
125
$cache->destroy('_bots');
127
add_log('admin', 'LOG_BOT_DELETE', implode(', ', $bot_name_ary));
128
trigger_error($user->lang['BOT_DELETED'] . adm_back_link($this->u_action));
132
confirm_box(false, $user->lang['CONFIRM_OPERATION'], build_hidden_fields(array(
136
'action' => $action))
144
include_once($phpbb_root_path . 'includes/functions_user.' . $phpEx);
147
'bot_name' => utf8_normalize_nfc(request_var('bot_name', '', true)),
148
'bot_agent' => request_var('bot_agent', ''),
149
'bot_ip' => request_var('bot_ip', ''),
150
'bot_active' => request_var('bot_active', true),
151
'bot_lang' => request_var('bot_lang', $config['default_lang']),
152
'bot_style' => request_var('bot_style' , $config['default_style']),
157
if (!$bot_row['bot_agent'] && !$bot_row['bot_ip'])
159
$error[] = $user->lang['ERR_BOT_NO_MATCHES'];
162
if ($bot_row['bot_ip'] && !preg_match('#^[\d\.,:]+$#', $bot_row['bot_ip']))
164
if (!$ip_list = gethostbynamel($bot_row['bot_ip']))
166
$error[] = $user->lang['ERR_BOT_NO_IP'];
170
$bot_row['bot_ip'] = implode(',', $ip_list);
173
$bot_row['bot_ip'] = str_replace(' ', '', $bot_row['bot_ip']);
175
// Make sure the admin is not adding a bot with an user agent similar to his one
176
if ($bot_row['bot_agent'] && substr($user->data['session_browser'], 0, 149) === substr($bot_row['bot_agent'], 0, 149))
178
$error[] = $user->lang['ERR_BOT_AGENT_MATCHES_UA'];
184
$sql = 'SELECT u.username_clean
185
FROM ' . BOTS_TABLE . ' b, ' . USERS_TABLE . " u
186
WHERE b.bot_id = $bot_id
187
AND u.user_id = b.user_id";
188
$result = $db->sql_query($sql);
189
$row = $db->sql_fetchrow($result);
190
$db->sql_freeresult($result);
194
$error[] = $user->lang['NO_BOT'];
198
$bot_name = $row['username_clean'];
201
if (!$this->validate_botname($bot_row['bot_name'], $bot_name))
203
$error[] = $user->lang['BOT_NAME_TAKEN'];
208
// New bot? Create a new user and group entry
209
if ($action == 'add')
211
$sql = 'SELECT group_id, group_colour
212
FROM ' . GROUPS_TABLE . "
213
WHERE group_name = 'BOTS'
214
AND group_type = " . GROUP_SPECIAL;
215
$result = $db->sql_query($sql);
216
$group_row = $db->sql_fetchrow($result);
217
$db->sql_freeresult($result);
221
trigger_error($user->lang['NO_BOT_GROUP'] . adm_back_link($this->u_action . "&id=$bot_id&action=$action"), E_USER_WARNING);
225
$user_id = user_add(array(
226
'user_type' => (int) USER_IGNORE,
227
'group_id' => (int) $group_row['group_id'],
228
'username' => (string) $bot_row['bot_name'],
229
'user_regdate' => time(),
230
'user_password' => '',
231
'user_colour' => (string) $group_row['group_colour'],
233
'user_lang' => (string) $bot_row['bot_lang'],
234
'user_style' => (int) $bot_row['bot_style'],
235
'user_allow_massemail' => 0,
238
$sql = 'INSERT INTO ' . BOTS_TABLE . ' ' . $db->sql_build_array('INSERT', array(
239
'user_id' => (int) $user_id,
240
'bot_name' => (string) $bot_row['bot_name'],
241
'bot_active' => (int) $bot_row['bot_active'],
242
'bot_agent' => (string) $bot_row['bot_agent'],
243
'bot_ip' => (string) $bot_row['bot_ip'])
245
$db->sql_query($sql);
251
$sql = 'SELECT user_id, bot_name
252
FROM ' . BOTS_TABLE . "
253
WHERE bot_id = $bot_id";
254
$result = $db->sql_query($sql);
255
$row = $db->sql_fetchrow($result);
256
$db->sql_freeresult($result);
260
trigger_error($user->lang['NO_BOT'] . adm_back_link($this->u_action . "&id=$bot_id&action=$action"), E_USER_WARNING);
264
'user_style' => (int) $bot_row['bot_style'],
265
'user_lang' => (string) $bot_row['bot_lang'],
268
if ($bot_row['bot_name'] !== $row['bot_name'])
270
$sql_ary['username'] = (string) $bot_row['bot_name'];
271
$sql_ary['username_clean'] = (string) utf8_clean_string($bot_row['bot_name']);
274
$sql = 'UPDATE ' . USERS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', $sql_ary) . " WHERE user_id = {$row['user_id']}";
275
$db->sql_query($sql);
277
$sql = 'UPDATE ' . BOTS_TABLE . ' SET ' . $db->sql_build_array('UPDATE', array(
278
'bot_name' => (string) $bot_row['bot_name'],
279
'bot_active' => (int) $bot_row['bot_active'],
280
'bot_agent' => (string) $bot_row['bot_agent'],
281
'bot_ip' => (string) $bot_row['bot_ip'])
282
) . " WHERE bot_id = $bot_id";
283
$db->sql_query($sql);
286
if ($bot_row['bot_name'] !== $row['bot_name'])
288
user_update_name($row['bot_name'], $bot_row['bot_name']);
294
$cache->destroy('_bots');
296
add_log('admin', 'LOG_BOT_' . $log, $bot_row['bot_name']);
297
trigger_error($user->lang['BOT_' . $log] . adm_back_link($this->u_action));
303
$sql = 'SELECT b.*, u.user_lang, u.user_style
304
FROM ' . BOTS_TABLE . ' b, ' . USERS_TABLE . " u
305
WHERE b.bot_id = $bot_id
306
AND u.user_id = b.user_id";
307
$result = $db->sql_query($sql);
308
$bot_row = $db->sql_fetchrow($result);
309
$db->sql_freeresult($result);
313
trigger_error($user->lang['NO_BOT'] . adm_back_link($this->u_action . "&id=$bot_id&action=$action"), E_USER_WARNING);
316
$bot_row['bot_lang'] = $bot_row['user_lang'];
317
$bot_row['bot_style'] = $bot_row['user_style'];
318
unset($bot_row['user_lang'], $bot_row['user_style']);
321
$s_active_options = '';
322
$_options = array('0' => 'NO', '1' => 'YES');
323
foreach ($_options as $value => $lang)
325
$selected = ($bot_row['bot_active'] == $value) ? ' selected="selected"' : '';
326
$s_active_options .= '<option value="' . $value . '"' . $selected . '>' . $user->lang[$lang] . '</option>';
329
$style_select = style_select($bot_row['bot_style'], true);
330
$lang_select = language_select($bot_row['bot_lang']);
332
$l_title = ($action == 'edit') ? 'EDIT' : 'ADD';
334
$template->assign_vars(array(
335
'L_TITLE' => $user->lang['BOT_' . $l_title],
336
'U_ACTION' => $this->u_action . "&id=$bot_id&action=$action",
337
'U_BACK' => $this->u_action,
338
'ERROR_MSG' => (sizeof($error)) ? implode('<br />', $error) : '',
340
'BOT_NAME' => $bot_row['bot_name'],
341
'BOT_IP' => $bot_row['bot_ip'],
342
'BOT_AGENT' => $bot_row['bot_agent'],
344
'S_EDIT_BOT' => true,
345
'S_ACTIVE_OPTIONS' => $s_active_options,
346
'S_STYLE_OPTIONS' => $style_select,
347
'S_LANG_OPTIONS' => $lang_select,
348
'S_ERROR' => (sizeof($error)) ? true : false,
358
$_options = array('activate' => 'BOT_ACTIVATE', 'deactivate' => 'BOT_DEACTIVATE', 'delete' => 'DELETE');
359
foreach ($_options as $value => $lang)
361
$s_options .= '<option value="' . $value . '">' . $user->lang[$lang] . '</option>';
364
$template->assign_vars(array(
365
'U_ACTION' => $this->u_action,
366
'S_BOT_OPTIONS' => $s_options)
369
$sql = 'SELECT b.bot_id, b.bot_name, b.bot_active, u.user_lastvisit
370
FROM ' . BOTS_TABLE . ' b, ' . USERS_TABLE . ' u
371
WHERE u.user_id = b.user_id
372
ORDER BY u.user_lastvisit DESC, b.bot_name ASC';
373
$result = $db->sql_query($sql);
375
while ($row = $db->sql_fetchrow($result))
377
$active_lang = (!$row['bot_active']) ? 'BOT_ACTIVATE' : 'BOT_DEACTIVATE';
378
$active_value = (!$row['bot_active']) ? 'activate' : 'deactivate';
380
$template->assign_block_vars('bots', array(
381
'BOT_NAME' => $row['bot_name'],
382
'BOT_ID' => $row['bot_id'],
383
'LAST_VISIT' => ($row['user_lastvisit']) ? $user->format_date($row['user_lastvisit']) : $user->lang['BOT_NEVER'],
385
'U_ACTIVATE_DEACTIVATE' => $this->u_action . "&id={$row['bot_id']}&action=$active_value",
386
'L_ACTIVATE_DEACTIVATE' => $user->lang[$active_lang],
387
'U_EDIT' => $this->u_action . "&id={$row['bot_id']}&action=edit",
388
'U_DELETE' => $this->u_action . "&id={$row['bot_id']}&action=delete")
391
$db->sql_freeresult($result);
395
* Validate bot name against username table
397
function validate_botname($newname, $oldname = false)
401
if ($oldname && utf8_clean_string($newname) === $oldname)
406
// Admins might want to use names otherwise forbidden, thus we only check for duplicates.
407
$sql = 'SELECT username
408
FROM ' . USERS_TABLE . "
409
WHERE username_clean = '" . $db->sql_escape(utf8_clean_string($newname)) . "'";
410
$result = $db->sql_query($sql);
411
$row = $db->sql_fetchrow($result);
412
$db->sql_freeresult($result);
414
return ($row) ? false : true;
b'\\ No newline at end of file'