Please make sure IN_MYBB is defined.");
}
require_once MYBB_ROOT."inc/functions_upload.php";
$page->add_breadcrumb_item($lang->users, "index.php?module=user-users");
if($mybb->input['action'] == "add" || $mybb->input['action'] == "merge" || $mybb->input['action'] == "search" || !$mybb->input['action'])
{
$sub_tabs['browse_users'] = array(
'title' => $lang->browse_users,
'link' => "index.php?module=user-users",
'description' => $lang->browse_users_desc
);
$sub_tabs['find_users'] = array(
'title' => $lang->find_users,
'link' => "index.php?module=user-users&action=search",
'description' => $lang->find_users_desc
);
$sub_tabs['create_user'] = array(
'title' => $lang->create_user,
'link' => "index.php?module=user-users&action=add",
'description' => $lang->create_user_desc
);
$sub_tabs['merge_users'] = array(
'title' => $lang->merge_users,
'link' => "index.php?module=user-users&action=merge",
'description' => $lang->merge_users_desc
);
}
$user_view_fields = array(
"avatar" => array(
"title" => $lang->avatar,
"width" => "24",
"align" => ""
),
"username" => array(
"title" => $lang->username,
"width" => "",
"align" => ""
),
"email" => array(
"title" => $lang->email,
"width" => "",
"align" => "center"
),
"usergroup" => array(
"title" => $lang->primary_group,
"width" => "",
"align" => "center"
),
"additionalgroups" => array(
"title" => $lang->additional_groups,
"width" => "",
"align" => "center"
),
"regdate" => array(
"title" => $lang->registered,
"width" => "",
"align" => "center"
),
"lastactive" => array(
"title" => $lang->last_active,
"width" => "",
"align" => "center"
),
"postnum" => array(
"title" => $lang->post_count,
"width" => "",
"align" => "center"
),
"threadnum" => array(
"title" => $lang->thread_count,
"width" => "",
"align" => "center"
),
"reputation" => array(
"title" => $lang->reputation,
"width" => "",
"align" => "center"
),
"warninglevel" => array(
"title" => $lang->warning_level,
"width" => "",
"align" => "center"
),
"regip" => array(
"title" => $lang->registration_ip,
"width" => "",
"align" => "center"
),
"lastip" => array(
"title" => $lang->last_known_ip,
"width" => "",
"align" => "center"
),
"controls" => array(
"title" => $lang->controls,
"width" => "",
"align" => "center"
)
);
$sort_options = array(
"username" => $lang->username,
"regdate" => $lang->registration_date,
"lastactive" => $lang->last_active,
"numposts" => $lang->post_count,
"reputation" => $lang->reputation,
"warninglevel" => $lang->warning_level
);
$plugins->run_hooks("admin_user_users_begin");
// Initialise the views manager for user based views
require MYBB_ADMIN_DIR."inc/functions_view_manager.php";
if($mybb->input['action'] == "views")
{
view_manager("index.php?module=user-users", "user", $user_view_fields, $sort_options, "user_search_conditions");
}
if($mybb->input['action'] == 'iplookup')
{
$mybb->input['ipaddress'] = $mybb->get_input('ipaddress');
$lang->ipaddress_misc_info = $lang->sprintf($lang->ipaddress_misc_info, htmlspecialchars_uni($mybb->input['ipaddress']));
$ipaddress_location = $lang->na;
$ipaddress_host_name = $lang->na;
$modcp_ipsearch_misc_info = '';
if(!strstr($mybb->input['ipaddress'], "*"))
{
// Return GeoIP information if it is available to us
if(function_exists('geoip_record_by_name'))
{
$ip_record = @geoip_record_by_name($mybb->input['ipaddress']);
if($ip_record)
{
$ipaddress_location = htmlspecialchars_uni(utf8_encode($ip_record['country_name']));
if($ip_record['city'])
{
$ipaddress_location .= $lang->comma.htmlspecialchars_uni(utf8_encode($ip_record['city']));
}
}
}
if(filter_var($mybb->input['ipaddress'], FILTER_VALIDATE_IP))
{
$ipaddress_host_name = htmlspecialchars_uni(@gethostbyaddr($mybb->input['ipaddress']));
// gethostbyaddr returns the same ip on failure
if($ipaddress_host_name == $mybb->input['ipaddress'])
{
$ipaddress_host_name = $lang->na;
}
}
}
?>
construct_cell($lang->ipaddress_host_name.":");
$table->construct_cell($ipaddress_host_name);
$table->construct_row();
$table->construct_cell($lang->ipaddress_location.":");
$table->construct_cell($ipaddress_location);
$table->construct_row();
$table->output($lang->ipaddress_misc_info);
?>
input['action'] == "activate_user")
{
if(!verify_post_check($mybb->get_input('my_post_key')))
{
flash_message($lang->invalid_post_verify_key2, 'error');
admin_redirect("index.php?module=user-users");
}
$user = get_user($mybb->input['uid']);
// Does the user not exist?
if(!$user || $user['usergroup'] != 5)
{
flash_message($lang->error_invalid_user, 'error');
admin_redirect("index.php?module=user-users");
}
$plugins->run_hooks("admin_user_users_coppa_activate");
$updated_user['usergroup'] = $user['usergroup'];
// Update
if($user['coppauser'])
{
$updated_user = array(
"coppauser" => 0
);
}
else
{
$db->delete_query("awaitingactivation", "uid='{$user['uid']}'");
}
// Move out of awaiting activation if they're in it.
if($user['usergroup'] == 5)
{
$updated_user['usergroup'] = 2;
}
$plugins->run_hooks("admin_user_users_coppa_activate_commit");
$db->update_query("users", $updated_user, "uid='{$user['uid']}'");
$cache->update_awaitingactivation();
$message = $lang->sprintf($lang->email_adminactivateaccount, $user['username'], $mybb->settings['bbname'], $mybb->settings['bburl']);
my_mail($user['email'], $lang->sprintf($lang->emailsubject_activateaccount, $mybb->settings['bbname']), $message);
// Log admin action
log_admin_action($user['uid'], $user['username']);
if($mybb->input['from'] == "home")
{
if($user['coppauser'])
{
$message = $lang->success_coppa_activated;
}
else
{
$message = $lang->success_activated;
}
update_admin_session('flash_message2', array('message' => $message, 'type' => 'success'));
}
else
{
if($user['coppauser'])
{
flash_message($lang->success_coppa_activated, 'success');
}
else
{
flash_message($lang->success_activated, 'success');
}
}
if($admin_session['data']['last_users_url'])
{
$url = $admin_session['data']['last_users_url'];
update_admin_session('last_users_url', '');
if($mybb->input['from'] == "home")
{
update_admin_session('from', 'home');
}
}
else
{
$url = "index.php?module=user-users&action=edit&uid={$user['uid']}";
}
$plugins->run_hooks("admin_user_users_coppa_end");
admin_redirect($url);
}
if($mybb->input['action'] == "add")
{
$plugins->run_hooks("admin_user_users_add");
if($mybb->request_method == "post")
{
// Determine the usergroup stuff
if(!empty($mybb->input['additionalgroups']) && is_array($mybb->input['additionalgroups']))
{
foreach($mybb->input['additionalgroups'] as $key => $gid)
{
if($gid == $mybb->input['usergroup'])
{
unset($mybb->input['additionalgroups'][$key]);
}
}
$additionalgroups = implode(",", array_map('intval', $mybb->input['additionalgroups']));
}
else
{
$additionalgroups = '';
}
// Set up user handler.
require_once MYBB_ROOT."inc/datahandlers/user.php";
$userhandler = new UserDataHandler('insert');
// Set the data for the new user.
$new_user = array(
"uid" => $mybb->get_input('uid'),
"username" => $mybb->get_input('username'),
"password" => $mybb->get_input('password'),
"password2" => $mybb->get_input('confirm_password'),
"email" => $mybb->get_input('email'),
"email2" => $mybb->get_input('email'),
"usergroup" => $mybb->get_input('usergroup'),
"additionalgroups" => $additionalgroups,
"displaygroup" => $mybb->get_input('displaygroup'),
"profile_fields" => $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY),
"profile_fields_editable" => true,
);
// Set the data of the user in the datahandler.
$userhandler->set_data($new_user);
$errors = '';
// Validate the user and get any errors that might have occurred.
if(!$userhandler->validate_user())
{
$errors = $userhandler->get_friendly_errors();
}
else
{
$user_info = $userhandler->insert_user();
$plugins->run_hooks("admin_user_users_add_commit");
// Log admin action
log_admin_action($user_info['uid'], $user_info['username']);
flash_message($lang->success_user_created, 'success');
admin_redirect("index.php?module=user-users&action=edit&uid={$user_info['uid']}");
}
}
// Fetch custom profile fields - only need required profile fields here
$query = $db->simple_select("profilefields", "*", "required=1", array('order_by' => 'disporder'));
$profile_fields = array(
'required' => array(),
'optional' => array(),
);
while($profile_field = $db->fetch_array($query))
{
$profile_fields['required'][] = $profile_field;
}
$page->add_breadcrumb_item($lang->create_user);
$page->output_header($lang->create_user);
$form = new Form("index.php?module=user-users&action=add", "post");
$page->output_nav_tabs($sub_tabs, 'create_user');
// If we have any error messages, show them
if($errors)
{
$page->output_inline_error($errors);
}
else
{
$mybb->input = array_merge($mybb->input, array('usergroup' => 2));
}
$mybb->input['profile_fields'] = $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY);
$form_container = new FormContainer($lang->required_profile_info);
$form_container->output_row($lang->username." *", "", $form->generate_text_box('username', htmlspecialchars_uni($mybb->get_input('username')), array('id' => 'username')), 'username');
$form_container->output_row($lang->password." *", "", $form->generate_password_box('password', $mybb->get_input('password'), array('id' => 'password', 'autocomplete' => 'off')), 'password');
$form_container->output_row($lang->confirm_password." *", "", $form->generate_password_box('confirm_password', $mybb->get_input('confirm_password'), array('id' => 'confirm_new_password')), 'confirm_new_password');
$form_container->output_row($lang->email_address." *", "", $form->generate_text_box('email', $mybb->get_input('email'), array('id' => 'email')), 'email');
$display_group_options[0] = $lang->use_primary_user_group;
$options = array();
$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
while($usergroup = $db->fetch_array($query))
{
$options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
$display_group_options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
}
$form_container->output_row($lang->primary_user_group." *", "", $form->generate_select_box('usergroup', $options, $mybb->get_input('usergroup'), array('id' => 'usergroup')), 'usergroup');
$form_container->output_row($lang->additional_user_groups, $lang->additional_user_groups_desc, $form->generate_select_box('additionalgroups[]', $options, $mybb->get_input('additionalgroups', MyBB::INPUT_ARRAY), array('id' => 'additionalgroups', 'multiple' => true, 'size' => 5)), 'additionalgroups');
$form_container->output_row($lang->display_user_group." *", "", $form->generate_select_box('displaygroup', $display_group_options, $mybb->get_input('displaygroup'), array('id' => 'displaygroup')), 'displaygroup');
// Output custom profile fields - required
output_custom_profile_fields($profile_fields['required'], $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY), $form_container, $form);
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->save_user);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
if($mybb->input['action'] == "edit")
{
$user = get_user($mybb->input['uid']);
// Does the user not exist?
if(!$user)
{
flash_message($lang->error_invalid_user, 'error');
admin_redirect("index.php?module=user-users");
}
$plugins->run_hooks("admin_user_users_edit");
if($mybb->request_method == "post")
{
$plugins->run_hooks("admin_user_users_edit_start");
if(is_super_admin($mybb->input['uid']) && $mybb->user['uid'] != $mybb->input['uid'] && !is_super_admin($mybb->user['uid']))
{
flash_message($lang->error_no_perms_super_admin, 'error');
admin_redirect("index.php?module=user-users");
}
// Determine the usergroup stuff
if(!empty($mybb->input['additionalgroups']) && is_array($mybb->input['additionalgroups']))
{
foreach($mybb->input['additionalgroups'] as $key => $gid)
{
if($gid == $mybb->input['usergroup'])
{
unset($mybb->input['additionalgroups'][$key]);
}
}
$additionalgroups = implode(",", array_map('intval', $mybb->input['additionalgroups']));
}
else
{
$additionalgroups = '';
}
$returndate = "";
if(!empty($mybb->input['away_day']))
{
$awaydate = TIME_NOW;
// If the user has indicated that they will return on a specific day, but not month or year, assume it is current month and year
if(!$mybb->input['away_month'])
{
$mybb->input['away_month'] = my_date('n', $awaydate);
}
if(!$mybb->input['away_year'])
{
$mybb->input['away_year'] = my_date('Y', $awaydate);
}
$return_month = (int)substr($mybb->input['away_month'], 0, 2);
$return_day = (int)substr($mybb->input['away_day'], 0, 2);
$return_year = min($mybb->get_input('away_year', MyBB::INPUT_INT), 9999);
// Check if return date is after the away date.
$returntimestamp = gmmktime(0, 0, 0, $return_month, $return_day, $return_year);
$awaytimestamp = gmmktime(0, 0, 0, my_date('n', $awaydate), my_date('j', $awaydate), my_date('Y', $awaydate));
if($return_year < my_date('Y', $awaydate) || ($returntimestamp < $awaytimestamp && $return_year == my_date('Y', $awaydate)))
{
$away_in_past = true;
}
$returndate = "{$return_day}-{$return_month}-{$return_year}";
}
// Set up user handler.
require_once MYBB_ROOT."inc/datahandlers/user.php";
$userhandler = new UserDataHandler('update');
// Set the data for the new user.
$updated_user = array(
"uid" => $mybb->get_input('uid'),
"username" => $mybb->get_input('username'),
"email" => $mybb->get_input('email'),
"email2" => $mybb->get_input('email'),
"usergroup" => $mybb->get_input('usergroup'),
"additionalgroups" => $additionalgroups,
"displaygroup" => $mybb->get_input('displaygroup'),
"postnum" => $mybb->get_input('postnum'),
"threadnum" => $mybb->get_input('threadnum'),
"usertitle" => $mybb->get_input('usertitle'),
"timezone" => $mybb->get_input('timezone'),
"language" => $mybb->get_input('language'),
"profile_fields" => $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY),
"profile_fields_editable" => true,
"website" => $mybb->get_input('website'),
"icq" => $mybb->get_input('icq'),
"skype" => $mybb->get_input('skype'),
"google" => $mybb->get_input('google'),
"birthday" => array(
"day" => $mybb->get_input('bday1'),
"month" => $mybb->get_input('bday2'),
"year" => $mybb->get_input('bday3')
),
"style" => $mybb->get_input('style'),
"signature" => $mybb->get_input('signature'),
"dateformat" => $mybb->get_input('dateformat', MyBB::INPUT_INT),
"timeformat" => $mybb->get_input('timeformat', MyBB::INPUT_INT),
"usernotes" => $mybb->get_input('usernotes'),
"away" => array(
"away" => $mybb->get_input('away'),
"date" => TIME_NOW,
"returndate" => $returndate,
"awayreason" => $mybb->get_input('awayreason')
)
);
if($user['usergroup'] == 5 && $mybb->get_input('usergroup') != 5)
{
if($user['coppauser'] == 1)
{
$updated_user['coppa_user'] = 0;
}
}
if($mybb->get_input('new_password'))
{
$updated_user['password'] = $mybb->get_input('new_password');
$updated_user['password2'] = $mybb->get_input('confirm_new_password');
}
$updated_user['options'] = array(
"allownotices" => $mybb->get_input('allownotices'),
"hideemail" => $mybb->get_input('hideemail'),
"subscriptionmethod" => $mybb->get_input('subscriptionmethod'),
"invisible" => $mybb->get_input('invisible'),
"dstcorrection" => $mybb->get_input('dstcorrection'),
"threadmode" => $mybb->get_input('threadmode'),
"classicpostbit" => $mybb->get_input('classicpostbit'),
"showimages" => $mybb->get_input('showimages'),
"showvideos" => $mybb->get_input('showvideos'),
"showsigs" => $mybb->get_input('showsigs'),
"showavatars" => $mybb->get_input('showavatars'),
"showquickreply" => $mybb->get_input('showquickreply'),
"receivepms" => $mybb->get_input('receivepms'),
"receivefrombuddy" => $mybb->get_input('receivefrombuddy'),
"pmnotice" => $mybb->get_input('pmnotice'),
"daysprune" => $mybb->get_input('daysprune'),
"showcodebuttons" => $mybb->get_input('showcodebuttons'),
"sourceeditor" => $mybb->get_input('sourceeditor'),
"pmnotify" => $mybb->get_input('pmnotify'),
"buddyrequestspm" => $mybb->get_input('buddyrequestspm'),
"buddyrequestsauto" => $mybb->get_input('buddyrequestsauto'),
"showredirect" => $mybb->get_input('showredirect')
);
if($mybb->settings['usertppoptions'])
{
$updated_user['options']['tpp'] = $mybb->get_input('tpp', MyBB::INPUT_INT);
}
if($mybb->settings['userpppoptions'])
{
$updated_user['options']['ppp'] = $mybb->get_input('ppp', MyBB::INPUT_INT);
}
// Set the data of the user in the datahandler.
$userhandler->set_data($updated_user);
$errors = '';
// Validate the user and get any errors that might have occurred.
if(!$userhandler->validate_user())
{
$errors = $userhandler->get_friendly_errors();
}
else
{
// Are we removing an avatar from this user?
if($mybb->get_input('remove_avatar'))
{
$extra_user_updates = array(
"avatar" => "",
"avatardimensions" => "",
"avatartype" => ""
);
remove_avatars($user['uid']);
}
// Are we uploading a new avatar?
if($_FILES['avatar_upload']['name'])
{
$avatar = upload_avatar($_FILES['avatar_upload'], $user['uid']);
if($avatar['error'])
{
$errors = array($avatar['error']);
}
else
{
if($avatar['width'] > 0 && $avatar['height'] > 0)
{
$avatar_dimensions = $avatar['width']."|".$avatar['height'];
}
$extra_user_updates = array(
"avatar" => $avatar['avatar'].'?dateline='.TIME_NOW,
"avatardimensions" => $avatar_dimensions,
"avatartype" => "upload"
);
}
}
// Are we setting a new avatar from a URL?
else if($mybb->input['avatar_url'] && $mybb->input['avatar_url'] != $user['avatar'])
{
if(!$mybb->settings['allowremoteavatars'])
{
$errors = array($lang->error_remote_avatar_not_allowed);
}
else
{
if(filter_var($mybb->input['avatar_url'], FILTER_VALIDATE_EMAIL) !== false)
{
// Gravatar
$email = md5(strtolower(trim($mybb->input['avatar_url'])));
$s = '';
if(!$mybb->settings['maxavatardims'])
{
$mybb->settings['maxavatardims'] = '100x100'; // Hard limit of 100 if there are no limits
}
// Because Gravatars are square, hijack the width
list($maxwidth, $maxheight) = preg_split('/[|x]/', my_strtolower($mybb->settings['maxavatardims']));
$s = "?s={$maxwidth}";
$maxheight = (int)$maxwidth;
$extra_user_updates = array(
"avatar" => "https://www.gravatar.com/avatar/{$email}{$s}",
"avatardimensions" => "{$maxheight}|{$maxheight}",
"avatartype" => "gravatar"
);
}
else
{
$mybb->input['avatar_url'] = preg_replace("#script:#i", "", $mybb->input['avatar_url']);
$ext = get_extension($mybb->input['avatar_url']);
// Copy the avatar to the local server (work around remote URL access disabled for getimagesize)
$file = fetch_remote_file($mybb->input['avatar_url']);
if(!$file)
{
$avatar_error = $lang->error_invalidavatarurl;
}
else
{
$tmp_name = "../".$mybb->settings['avataruploadpath']."/remote_".md5(random_str());
$fp = @fopen($tmp_name, "wb");
if(!$fp)
{
$avatar_error = $lang->error_invalidavatarurl;
}
else
{
fwrite($fp, $file);
fclose($fp);
list($width, $height, $type) = @getimagesize($tmp_name);
@unlink($tmp_name);
echo $type;
if(!$type)
{
$avatar_error = $lang->error_invalidavatarurl;
}
}
}
if(empty($avatar_error))
{
if($width && $height && $mybb->settings['maxavatardims'] != "")
{
list($maxwidth, $maxheight) = preg_split('/[|x]/', my_strtolower($mybb->settings['maxavatardims']));
if(($maxwidth && $width > $maxwidth) || ($maxheight && $height > $maxheight))
{
$lang->error_avatartoobig = $lang->sprintf($lang->error_avatartoobig, $maxwidth, $maxheight);
$avatar_error = $lang->error_avatartoobig;
}
}
}
if(empty($avatar_error))
{
if($width > 0 && $height > 0)
{
$avatar_dimensions = (int)$width."|".(int)$height;
}
$extra_user_updates = array(
"avatar" => $db->escape_string($mybb->input['avatar_url'].'?dateline='.TIME_NOW),
"avatardimensions" => $avatar_dimensions,
"avatartype" => "remote"
);
remove_avatars($user['uid']);
}
else
{
$errors = array($avatar_error);
}
}
}
}
// Moderator "Options" (suspend signature, suspend/moderate posting)
$moderator_options = array(
1 => array(
"action" => "suspendsignature", // The moderator action we're performing
"period" => "action_period", // The time period we've selected from the dropdown box
"time" => "action_time", // The time we've entered
"update_field" => "suspendsignature", // The field in the database to update if true
"update_length" => "suspendsigtime" // The length of suspension field in the database
),
2 => array(
"action" => "moderateposting",
"period" => "modpost_period",
"time" => "modpost_time",
"update_field" => "moderateposts",
"update_length" => "moderationtime"
),
3 => array(
"action" => "suspendposting",
"period" => "suspost_period",
"time" => "suspost_time",
"update_field" => "suspendposting",
"update_length" => "suspensiontime"
)
);
require_once MYBB_ROOT."inc/functions_warnings.php";
foreach($moderator_options as $option)
{
if(empty($mybb->input[$option['action']]))
{
if($user[$option['update_field']] == 1)
{
// We're revoking the suspension
$extra_user_updates[$option['update_field']] = 0;
$extra_user_updates[$option['update_length']] = 0;
}
// Skip this option if we haven't selected it
continue;
}
else
{
if((int)$mybb->input[$option['time']] == 0 && $mybb->input[$option['period']] != "never" && $user[$option['update_field']] != 1)
{
// User has selected a type of ban, but not entered a valid time frame
$string = $option['action']."_error";
$errors[] = $lang->$string;
}
if(!is_array($errors))
{
$suspend_length = fetch_time_length((int)$mybb->input[$option['time']], $mybb->input[$option['period']]);
if($user[$option['update_field']] == 1 && ($mybb->input[$option['time']] || $mybb->input[$option['period']] == "never"))
{
// We already have a suspension, but entered a new time
if($suspend_length == "-1")
{
// Permanent ban on action
$extra_user_updates[$option['update_length']] = 0;
}
elseif($suspend_length && $suspend_length != "-1")
{
// Temporary ban on action
$extra_user_updates[$option['update_length']] = TIME_NOW + $suspend_length;
}
}
elseif(!$user[$option['update_field']])
{
// New suspension for this user... bad user!
$extra_user_updates[$option['update_field']] = 1;
if($suspend_length == "-1")
{
$extra_user_updates[$option['update_length']] = 0;
}
else
{
$extra_user_updates[$option['update_length']] = TIME_NOW + $suspend_length;
}
}
}
}
}
if(!empty($extra_user_updates['moderateposts']) && !empty($extra_user_updates['suspendposting']))
{
$errors[] = $lang->suspendmoderate_error;
}
if(isset($away_in_past))
{
$errors[] = $lang->error_acp_return_date_past;
}
if(!$errors)
{
$user_info = $userhandler->update_user();
$plugins->run_hooks("admin_user_users_edit_commit_start");
if(!empty($extra_user_updates))
{
$db->update_query("users", $extra_user_updates, "uid='{$user['uid']}'");
}
// if we're updating the user's signature preferences, do so now
if($mybb->input['update_posts'] == 'enable' || $mybb->input['update_posts'] == 'disable')
{
$update_signature = array(
'includesig' => ($mybb->input['update_posts'] == 'enable' ? 1 : 0)
);
$db->update_query("posts", $update_signature, "uid='{$user['uid']}'");
}
$plugins->run_hooks("admin_user_users_edit_commit");
if($user['usergroup'] == 5 && $mybb->input['usergroup'] != 5)
{
$cache->update_awaitingactivation();
}
// Log admin action
log_admin_action($user['uid'], $mybb->input['username']);
flash_message($lang->success_user_updated, 'success');
admin_redirect("index.php?module=user-users");
}
$plugins->run_hooks("admin_user_users_edit_end");
}
}
if(!$errors)
{
$user['usertitle'] = htmlspecialchars_decode($user['usertitle']);
$mybb->input = array_merge($mybb->input, $user);
$options = array(
'bday1', 'bday2', 'bday3',
'new_password', 'confirm_new_password',
'action_time', 'action_period',
'modpost_period', 'moderateposting', 'modpost_time', 'suspost_period', 'suspost_time'
);
foreach($options as $option)
{
if(!isset($input_user[$option]))
{
$mybb->input[$option] = '';
}
}
// We need to fetch this users profile field values
$query = $db->simple_select("userfields", "*", "ufid='{$user['uid']}'");
$mybb->input['profile_fields'] = $db->fetch_array($query);
}
if($mybb->input['bday1'] || $mybb->input['bday2'] || $mybb->input['bday3'])
{
$mybb->input['bday'][0] = $mybb->input['bday1'];
$mybb->input['bday'][1] = $mybb->input['bday2'];
$mybb->input['bday'][2] = $mybb->get_input('bday3', MyBB::INPUT_INT);
}
else
{
$mybb->input['bday'] = array(0, 0, '');
if($user['birthday'])
{
$mybb->input['bday'] = explode('-', $user['birthday']);
}
}
if($mybb->get_input('away_day') || $mybb->get_input('away_month') || $mybb->get_input('away_year'))
{
$mybb->input['away_year'] = $mybb->get_input('away_year', MyBB::INPUT_INT);
}
else
{
$mybb->input['away_day'] = 0;
$mybb->input['away_month'] = 0;
$mybb->input['away_year'] = '';
if($user['returndate'])
{
list($mybb->input['away_day'], $mybb->input['away_month'], $mybb->input['away_year']) = explode('-', $user['returndate']);
}
}
// Fetch custom profile fields
$query = $db->simple_select("profilefields", "*", "", array('order_by' => 'disporder'));
$profile_fields = array(
'required' => array(),
'optional' => array(),
);
while($profile_field = $db->fetch_array($query))
{
if($profile_field['required'] == 1)
{
$profile_fields['required'][] = $profile_field;
}
else
{
$profile_fields['optional'][] = $profile_field;
}
}
$page->add_breadcrumb_item($lang->edit_user.": ".htmlspecialchars_uni($user['username']));
$page->extra_header .= <<
EOF;
$page->output_header($lang->edit_user);
$sub_tabs['edit_user'] = array(
'title' => $lang->edit_user,
'description' => $lang->edit_user_desc
);
$form = new Form("index.php?module=user-users&action=edit&uid={$user['uid']}", "post", "", 1);
$page->output_nav_tabs($sub_tabs, 'edit_user');
// If we have any error messages, show them
if($errors)
{
$page->output_inline_error($errors);
}
// Is this user a COPPA user? We show a warning & activate link
if($user['coppauser'])
{
echo $lang->sprintf($lang->warning_coppa_user, $user['uid'], $mybb->post_code);
}
$tabs = array(
"overview" => $lang->overview,
"profile" => $lang->profile,
"settings" => $lang->account_settings,
"signature" => $lang->signature,
"avatar" => $lang->avatar,
"modoptions" => $lang->mod_options
);
$tabs = $plugins->run_hooks("admin_user_users_edit_graph_tabs", $tabs);
$page->output_tab_control($tabs);
//
// OVERVIEW
//
echo "\n";
$table = new Table;
$table->construct_header($lang->avatar, array('class' => 'align_center'));
$table->construct_header($lang->general_account_stats, array('colspan' => '2', 'class' => 'align_center'));
// Avatar
$avatar_dimensions = preg_split('/[|x]/', $user['avatardimensions']);
if($user['avatardimensions'])
{
require_once MYBB_ROOT."inc/functions_image.php";
list($width, $height) = preg_split('/[|x]/', $user['avatardimensions']);
$scaled_dimensions = scale_image($width, $height, 120, 120);
}
else
{
$scaled_dimensions = array(
"width" => 120,
"height" => 120
);
}
if($user['avatar'] && (my_strpos($user['avatar'], '://') === false || $mybb->settings['allowremoteavatars']))
{
if(!my_validate_url($user['avatar']))
{
$avatar = format_avatar($user['avatar'], $user['avatardimensions']);
$user['avatar'] = $avatar['image'];
}
}
else
{
if(my_validate_url($mybb->settings['useravatar']))
{
$user['avatar'] = str_replace('{theme}', 'images', $mybb->settings['useravatar']);
}
else
{
$user['avatar'] = "../".str_replace('{theme}', 'images', $mybb->settings['useravatar']);
}
}
$avatar_top = ceil((126-$scaled_dimensions['height'])/2);
$last_seen = max(array($user['lastactive'], $user['lastvisit']));
if(!empty($last_seen))
{
$last_active = my_date('relative', $last_seen);
}
else
{
$last_active = $lang->never;
}
$reg_date = my_date('relative', $user['regdate']);
if($user['dst'] == 1)
{
$timezone = (float)$user['timezone']+1;
}
else
{
$timezone = (float)$user['timezone'];
}
$local_date = gmdate($mybb->settings['dateformat'], TIME_NOW + ($timezone * 3600));
$local_time = gmdate($mybb->settings['timeformat'], TIME_NOW + ($timezone * 3600));
$localtime = $lang->sprintf($lang->local_time_format, $local_date, $local_time);
$days_registered = (TIME_NOW - $user['regdate']) / (24*3600);
$posts_per_day = 0;
if($days_registered > 0)
{
$posts_per_day = round($user['postnum'] / $days_registered, 2);
if($posts_per_day > $user['postnum'])
{
$posts_per_day = $user['postnum'];
}
}
$posts_per_day = my_number_format($posts_per_day);
$stats = $cache->read("stats");
$posts = $stats['numposts'];
if($posts == 0)
{
$percent_posts = "0";
}
else
{
$percent_posts = round($user['postnum']*100/$posts, 2);
}
$user_permissions = user_permissions($user['uid']);
// Fetch the reputation for this user
if($user_permissions['usereputationsystem'] == 1 && $mybb->settings['enablereputation'] == 1)
{
$reputation = get_reputation($user['reputation']);
}
else
{
$reputation = "-";
}
if($mybb->settings['enablewarningsystem'] != 0 && $user_permissions['canreceivewarnings'] != 0)
{
if($mybb->settings['maxwarningpoints'] < 1)
{
$mybb->settings['maxwarningpoints'] = 10;
}
$warning_level = round($user['warningpoints']/$mybb->settings['maxwarningpoints']*100);
if($warning_level > 100)
{
$warning_level = 100;
}
$warning_level = get_colored_warning_level($warning_level);
}
else
{
$warning_level = "-";
}
$age = $lang->na;
if($user['birthday'])
{
$age = get_age($user['birthday']);
}
$postnum = my_number_format($user['postnum']);
$table->construct_cell("
", array('rowspan' => 6, 'width' => 1));
$table->construct_cell("
{$lang->email_address}: ".htmlspecialchars_uni($user['email'])."");
$table->construct_cell("
{$lang->last_active}: {$last_active}");
$table->construct_row();
$table->construct_cell("
{$lang->registration_date}: {$reg_date}");
$table->construct_cell("
{$lang->local_time}: {$localtime}");
$table->construct_row();
$table->construct_cell("
{$lang->posts}: {$postnum}");
$table->construct_cell("
{$lang->age}: {$age}");
$table->construct_row();
$table->construct_cell("
{$lang->posts_per_day}: {$posts_per_day}");
$table->construct_cell("
{$lang->reputation}: {$reputation}");
$table->construct_row();
$table->construct_cell("
{$lang->percent_of_total_posts}: {$percent_posts}");
$table->construct_cell("
{$lang->warning_level}: {$warning_level}");
$table->construct_row();
$table->construct_cell("
{$lang->registration_ip}: ".my_inet_ntop($db->unescape_binary($user['regip'])));
$table->construct_cell("
{$lang->last_known_ip}: ".my_inet_ntop($db->unescape_binary($user['lastip'])));
$table->construct_row();
$username = htmlspecialchars_uni($user['username']);
$table->output("{$lang->user_overview}: {$username}");
$plugins->run_hooks("admin_user_users_edit_overview");
echo "
\n";
//
// PROFILE
//
echo "\n";
$form_container = new FormContainer($lang->required_profile_info.": ".htmlspecialchars_uni($user['username']));
$form_container->output_row($lang->username." *", "", $form->generate_text_box('username', $mybb->input['username'], array('id' => 'username')), 'username');
$form_container->output_row($lang->new_password, $lang->new_password_desc, $form->generate_password_box('new_password', $mybb->input['new_password'], array('id' => 'new_password', 'autocomplete' => 'off')), 'new_password');
$form_container->output_row($lang->confirm_new_password, $lang->new_password_desc, $form->generate_password_box('confirm_new_password', $mybb->input['confirm_new_password'], array('id' => 'confirm_new_password')), 'confirm_new_password');
$form_container->output_row($lang->email_address." *", "", $form->generate_text_box('email', $mybb->input['email'], array('id' => 'email')), 'email');
$display_group_options[0] = $lang->use_primary_user_group;
$options = array();
$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
while($usergroup = $db->fetch_array($query))
{
$options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
$display_group_options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
}
if(isset($mybb->input['additionalgroups']) && !is_array($mybb->input['additionalgroups']))
{
$mybb->input['additionalgroups'] = explode(',', $mybb->input['additionalgroups']);
}
$form_container->output_row($lang->primary_user_group." *", "", $form->generate_select_box('usergroup', $options, $mybb->get_input('usergroup'), array('id' => 'usergroup')), 'usergroup');
$form_container->output_row($lang->additional_user_groups, $lang->additional_user_groups_desc, $form->generate_select_box('additionalgroups[]', $options, $mybb->get_input('additionalgroups', MyBB::INPUT_ARRAY), array('id' => 'additionalgroups', 'multiple' => true, 'size' => 5)), 'additionalgroups');
$form_container->output_row($lang->display_user_group." *", "", $form->generate_select_box('displaygroup', $display_group_options, $mybb->get_input('displaygroup'), array('id' => 'displaygroup')), 'displaygroup');
$form_container->output_row($lang->post_count." *", "", $form->generate_numeric_field('postnum', $mybb->get_input('postnum'), array('id' => 'postnum', 'min' => 0)), 'postnum');
$form_container->output_row($lang->thread_count." *", "", $form->generate_numeric_field('threadnum', $mybb->get_input('threadnum'), array('id' => 'threadnum', 'min' => 0)), 'threadnum');
// Output custom profile fields - required
if(!isset($profile_fields['required']))
{
$profile_fields['required'] = array();
}
output_custom_profile_fields($profile_fields['required'], $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY), $form_container, $form);
$form_container->end();
$form_container = new FormContainer($lang->optional_profile_info.': '.htmlspecialchars_uni($user['username']));
$form_container->output_row($lang->custom_user_title, $lang->custom_user_title_desc, $form->generate_text_box('usertitle', $mybb->get_input('usertitle'), array('id' => 'usertitle')), 'usertitle');
$form_container->output_row($lang->website, "", $form->generate_text_box('website', $mybb->get_input('website'), array('id' => 'website')), 'website');
$form_container->output_row($lang->icq_number, "", $form->generate_numeric_field('icq', $mybb->get_input('icq'), array('id' => 'icq', 'min' => 0)), 'icq');
$form_container->output_row($lang->skype_handle, "", $form->generate_text_box('skype', $mybb->get_input('skype'), array('id' => 'skype')), 'skype');
$form_container->output_row($lang->google_handle, "", $form->generate_text_box('google', $mybb->get_input('google'), array('id' => 'google')), 'google');
// Birthday
$birthday_days = array(0 => '');
for($i = 1; $i <= 31; $i++)
{
$birthday_days[$i] = $i;
}
$birthday_months = array(
0 => '',
1 => $lang->january,
2 => $lang->february,
3 => $lang->march,
4 => $lang->april,
5 => $lang->may,
6 => $lang->june,
7 => $lang->july,
8 => $lang->august,
9 => $lang->september,
10 => $lang->october,
11 => $lang->november,
12 => $lang->december
);
$birthday_row = $form->generate_select_box('bday1', $birthday_days, $mybb->input['bday'][0], array('id' => 'bday_day'));
$birthday_row .= ' '.$form->generate_select_box('bday2', $birthday_months, $mybb->input['bday'][1], array('id' => 'bday_month'));
$birthday_row .= ' '.$form->generate_numeric_field('bday3', $mybb->input['bday'][2], array('id' => 'bday_year', 'style' => 'width: 4em;', 'min' => 0));
$form_container->output_row($lang->birthday, "", $birthday_row, 'birthday');
// Output custom profile fields - optional
output_custom_profile_fields($profile_fields['optional'], $mybb->input['profile_fields'], $form_container, $form);
$form_container->end();
if($mybb->settings['allowaway'] != 0)
{
$form_container = new FormContainer($lang->away_information.': '.htmlspecialchars_uni($user['username']));
$awaycheck = array(false, true);
if($mybb->input['away'] == 1)
{
$awaycheck = array(true, false);
}
$form_container->output_row($lang->away_status, $lang->away_status_desc, $form->generate_radio_button('away', 1, $lang->im_away, array('id' => 'away', "checked" => $awaycheck[0]))." ".$form->generate_radio_button('away', 0, $lang->im_here, array('id' => 'away2', "checked" => $awaycheck[1])), 'away');
$form_container->output_row($lang->away_reason, $lang->away_reason_desc, $form->generate_text_box('awayreason', $mybb->input['awayreason'], array('id' => 'awayreason')), 'awayreason');
//Return date (we can use the arrays from birthday)
$return_row = $form->generate_select_box('away_day', $birthday_days, $mybb->input['away_day'], array('id' => 'away_day'));
$return_row .= ' '.$form->generate_select_box('away_month', $birthday_months, $mybb->input['away_month'], array('id' => 'away_month'));
$return_row .= ' '.$form->generate_numeric_field('away_year', $mybb->input['away_year'], array('id' => 'away_year', 'style' => 'width: 4em;', 'min' => 0));
$form_container->output_row($lang->return_date, $lang->return_date_desc, $return_row, 'away_date');
$form_container->end();
}
$plugins->run_hooks("admin_user_users_edit_profile");
echo "
\n";
//
// ACCOUNT SETTINGS
//
echo "\n";
$form_container = new FormContainer($lang->account_settings.': '.htmlspecialchars_uni($user['username']));
$login_options = array(
$form->generate_check_box("invisible", 1, $lang->hide_from_whos_online, array("checked" => $mybb->get_input('invisible'))),
);
$form_container->output_row($lang->login_cookies_privacy, "", "
".implode("
", $login_options)."
");
if($mybb->get_input('pmnotice') > 1)
{
$mybb->input['pmnotice'] = 1;
}
$messaging_options = array(
$form->generate_check_box("allownotices", 1, $lang->recieve_admin_emails, array("checked" => $mybb->get_input('allownotices'))),
$form->generate_check_box("hideemail", 1, $lang->hide_email_from_others, array("checked" => $mybb->get_input('hideemail'))),
$form->generate_check_box("receivepms", 1, $lang->recieve_pms_from_others, array("checked" => $mybb->get_input('receivepms'))),
$form->generate_check_box("receivefrombuddy", 1, $lang->recieve_pms_from_buddy, array("checked" => $mybb->get_input('receivefrombuddy'))),
$form->generate_check_box("pmnotice", 1, $lang->alert_new_pms, array("checked" => $mybb->get_input('pmnotice'))),
$form->generate_check_box("pmnotify", 1, $lang->email_notify_new_pms, array("checked" => $mybb->get_input('pmnotify'))),
$form->generate_check_box("buddyrequestspm", 1, $lang->buddy_requests_pm, array("checked" => $mybb->get_input('buddyrequestspm'))),
$form->generate_check_box("buddyrequestsauto", 1, $lang->buddy_requests_auto, array("checked" => $mybb->get_input('buddyrequestsauto'))),
"
".$form->generate_select_box("subscriptionmethod", array($lang->do_not_subscribe, $lang->no_notification, $lang->instant_email_notification, $lang->instant_pm_notification), $mybb->get_input('subscriptionmethod'), array('id' => 'subscriptionmethod'))
);
// Allow plugins to add messaging options
$messaging_options = $plugins->run_hooks('admin_user_users_edit_messaging_options', $messaging_options);
// Output messaging options
$form_container->output_row($lang->messaging_and_notification, "", "
".implode("
", $messaging_options)."
");
$date_format_options = array($lang->use_default);
foreach($date_formats as $key => $format)
{
$date_format_options[$key] = my_date($format, TIME_NOW, "", 0);
}
$time_format_options = array($lang->use_default);
foreach($time_formats as $key => $format)
{
$time_format_options[$key] = my_date($format, TIME_NOW, "", 0);
}
$date_options = array(
"
".$form->generate_select_box("dateformat", $date_format_options, $mybb->get_input('dateformat'), array('id' => 'dateformat')),
"
".$form->generate_select_box("timeformat", $time_format_options, $mybb->get_input('timeformat'), array('id' => 'timeformat')),
"
".build_timezone_select("timezone", $mybb->get_input('timezone')),
"
".$form->generate_select_box("dstcorrection", array(2 => $lang->automatically_detect, 1 => $lang->always_use_dst_correction, 0 => $lang->never_use_dst_correction), $mybb->get_input('dstcorrection'), array('id' => 'dstcorrection'))
);
// Allow plugins to add date options
$date_options = $plugins->run_hooks('admin_user_users_edit_date_options', $date_options);
// Output date options
$form_container->output_row($lang->date_and_time_options, "", "
".implode("
", $date_options)."
");
$tpp_options = array($lang->use_default);
if($mybb->settings['usertppoptions'])
{
$explodedtpp = explode(",", $mybb->settings['usertppoptions']);
if(is_array($explodedtpp))
{
foreach($explodedtpp as $tpp)
{
if($tpp <= 0) continue;
$tpp_options[$tpp] = $tpp;
}
}
}
$thread_age_options = array(
0 => $lang->use_default,
1 => $lang->show_threads_last_day,
5 => $lang->show_threads_last_5_days,
10 => $lang->show_threads_last_10_days,
20 => $lang->show_threads_last_20_days,
50 => $lang->show_threads_last_50_days,
75 => $lang->show_threads_last_75_days,
100 => $lang->show_threads_last_100_days,
365 => $lang->show_threads_last_year,
9999 => $lang->show_all_threads
);
$forum_options = array(
"
".$form->generate_select_box("tpp", $tpp_options, $mybb->get_input('tpp'), array('id' => 'tpp')),
"
".$form->generate_select_box("daysprune", $thread_age_options, $mybb->get_input('daysprune'), array('id' => 'daysprune'))
);
// Allow plugins to add forum options
$forum_options = $plugins->run_hooks('admin_user_users_edit_forum_options', $forum_options);
// Output forum options
$form_container->output_row($lang->forum_display_options, "", "
".implode("
", $forum_options)."
");
$ppp_options = array($lang->use_default);
if($mybb->settings['userpppoptions'])
{
$explodedppp = explode(",", $mybb->settings['userpppoptions']);
if(is_array($explodedppp))
{
foreach($explodedppp as $ppp)
{
if($ppp <= 0) continue;
$ppp_options[$ppp] = $ppp;
}
}
}
$thread_options = array(
$form->generate_check_box("classicpostbit", 1, $lang->show_classic_postbit, array("checked" => $mybb->get_input('classicpostbit'))),
$form->generate_check_box("showimages", 1, $lang->display_images, array("checked" => $mybb->get_input('showimages'))),
$form->generate_check_box("showvideos", 1, $lang->display_videos, array("checked" => $mybb->get_input('showvideos'))),
$form->generate_check_box("showsigs", 1, $lang->display_users_sigs, array("checked" => $mybb->get_input('showsigs'))),
$form->generate_check_box("showavatars", 1, $lang->display_users_avatars, array("checked" => $mybb->get_input('showavatars'))),
$form->generate_check_box("showquickreply", 1, $lang->show_quick_reply, array("checked" => $mybb->get_input('showquickreply'))),
"
".$form->generate_select_box("ppp", $ppp_options, $mybb->get_input('ppp'), array('id' => 'ppp')),
"
".$form->generate_select_box("threadmode", array("" => $lang->use_default, "linear" => $lang->linear_mode, "threaded" => $lang->threaded_mode), $mybb->input['threadmode'], array('id' => 'threadmode'))
);
// Allow plugins to add thread options
$thread_options = $plugins->run_hooks('admin_user_users_edit_thread_options', $thread_options);
// Output thread options
$form_container->output_row($lang->thread_view_options, "", "
".implode("
", $thread_options)."
");
$languages = array_merge(array('' => $lang->use_default), $lang->get_languages());
$other_options = array(
$form->generate_check_box("showredirect", 1, $lang->show_redirect, array("checked" => $mybb->get_input('showredirect'))),
$form->generate_check_box("showcodebuttons", "1", $lang->show_code_buttons, array("checked" => $mybb->get_input('showcodebuttons'))),
$form->generate_check_box("sourceeditor", "1", $lang->source_editor, array("checked" => $mybb->get_input('sourceeditor'))),
"
".build_theme_select("style", $mybb->get_input('style'), 0, "", true, false, true),
"
".$form->generate_select_box("language", $languages, $mybb->get_input('language'), array('id' => 'language'))
);
// Allow plugins to add other options
$other_options = $plugins->run_hooks('admin_user_users_edit_other_options', $other_options);
// Output other options
$form_container->output_row($lang->other_options, "", "
".implode("
", $other_options)."
");
$form_container->end();
$plugins->run_hooks("admin_user_users_edit_settings");
echo "
\n";
//
// SIGNATURE EDITOR
//
$signature_editor = $form->generate_text_area("signature", $mybb->get_input('signature'), array('id' => 'signature', 'rows' => 15, 'cols' => '70', 'style' => 'height: 250px; width: 95%'));
$sig_smilies = $lang->off;
if($mybb->settings['sigsmilies'] == 1)
{
$sig_smilies = $lang->on;
}
$sig_mycode = $lang->off;
if($mybb->settings['sigmycode'] == 1)
{
$sig_mycode = $lang->on;
$signature_editor .= build_mycode_inserter("signature");
}
$sig_html = $lang->off;
if($mybb->settings['sightml'] == 1)
{
$sig_html = $lang->on;
}
$sig_imgcode = $lang->off;
if($mybb->settings['sigimgcode'] == 1)
{
$sig_imgcode = $lang->on;
}
echo "\n";
$form_container = new FormContainer($lang->signature.': '.htmlspecialchars_uni($user['username']));
$form_container->output_row($lang->signature, $lang->sprintf($lang->signature_desc, $sig_mycode, $sig_smilies, $sig_imgcode, $sig_html), $signature_editor, 'signature');
$periods = array(
"hours" => $lang->expire_hours,
"days" => $lang->expire_days,
"weeks" => $lang->expire_weeks,
"months" => $lang->expire_months,
"never" => $lang->expire_permanent
);
// Are we already suspending the signature?
if($mybb->get_input('suspendsignature'))
{
$sig_checked = 1;
// Display how much time is left on the ban for the user to extend it
if($user['suspendsigtime'] == "0")
{
// Permanent
$lang->suspend_expire_info = $lang->suspend_sig_perm;
}
else
{
// There's a limit to the suspension!
$remaining = $user['suspendsigtime']-TIME_NOW;
$expired = nice_time($remaining, array('seconds' => false));
$color = 'inherit';
if($remaining < 3600)
{
$color = 'red';
}
elseif($remaining < 86400)
{
$color = 'maroon';
}
elseif($remaining < 604800)
{
$color = 'green';
}
$lang->suspend_expire_info = $lang->sprintf($lang->suspend_expire_info, $expired, $color);
}
$user_suspend_info = '
'.$lang->suspend_expire_info.' '.$lang->suspend_sig_extend.' |
';
}
else
{
$sig_checked = 0;
$user_suspend_info = '';
}
$actions = '
- '.$form->generate_check_box("suspendsignature", 1, $lang->suspend_sig_box, array('checked' => $sig_checked, 'onclick' => 'toggleAction();')).'
-
'.$user_suspend_info.'
'.$lang->expire_length.' |
'.$form->generate_numeric_field('action_time', $mybb->input['action_time'], array('style' => 'width: 3em;', 'min' => 0)).' '.$form->generate_select_box('action_period', $periods, $mybb->input['action_period']).' |
';
$form_container->output_row($lang->suspend_sig, $lang->suspend_sig_info, $actions);
$signature_options = array(
$form->generate_radio_button("update_posts", "enable", $lang->enable_sig_in_all_posts, array("checked" => 0)),
$form->generate_radio_button("update_posts", "disable", $lang->disable_sig_in_all_posts, array("checked" => 0)),
$form->generate_radio_button("update_posts", "no", $lang->do_nothing, array("checked" => 1))
);
$form_container->output_row($lang->signature_preferences, "", implode("
", $signature_options));
$form_container->end();
$plugins->run_hooks("admin_user_users_edit_signatur");
echo "
\n";
//
// AVATAR MANAGER
//
echo "\n";
$table = new Table;
$table->construct_header($lang->current_avatar, array('colspan' => 2));
$table->construct_cell("
", array('width' => 1));
$avatar_url = '';
if($user['avatartype'] == "upload" || stristr($user['avatar'], $mybb->settings['avataruploadpath']))
{
$current_avatar_msg = "
{$lang->user_current_using_uploaded_avatar}";
}
elseif($user['avatartype'] == "remote" || my_validate_url($user['avatar']))
{
$current_avatar_msg = "
{$lang->user_current_using_remote_avatar}";
$avatar_url = $user['avatar'];
}
if($errors)
{
$avatar_url = htmlspecialchars_uni($mybb->input['avatar_url']);
}
if($mybb->settings['maxavatardims'] != "")
{
list($max_width, $max_height) = preg_split('/[|x]/', my_strtolower($mybb->settings['maxavatardims']));
$max_size = "
{$lang->max_dimensions_are} {$max_width}x{$max_height}";
}
if($mybb->settings['avatarsize'])
{
$maximum_size = get_friendly_size($mybb->settings['avatarsize']*1024);
$max_size .= "
{$lang->avatar_max_size} {$maximum_size}";
}
if($user['avatar'])
{
$remove_avatar = "
".$form->generate_check_box("remove_avatar", 1, "
{$lang->remove_avatar}");
}
$table->construct_cell($lang->avatar_desc."{$remove_avatar}
{$max_size}");
$table->construct_row();
$table->output($lang->avatar.': '.htmlspecialchars_uni($user['username']));
// Custom avatar
if($mybb->settings['avatarresizing'] == "auto")
{
$auto_resize = $lang->avatar_auto_resize;
}
else if($mybb->settings['avatarresizing'] == "user")
{
$auto_resize = "
";
}
$form_container = new FormContainer($lang->specify_custom_avatar);
$form_container->output_row($lang->upload_avatar, $auto_resize, $form->generate_file_upload_box('avatar_upload', array('id' => 'avatar_upload')), 'avatar_upload');
if($mybb->settings['allowremoteavatars'])
{
$form_container->output_row($lang->or_specify_avatar_url, "", $form->generate_text_box('avatar_url', $avatar_url, array('id' => 'avatar_url')), 'avatar_url');
}
$form_container->end();
$plugins->run_hooks("admin_user_users_edit_avatar");
echo "
\n";
//
// MODERATOR OPTIONS
//
$periods = array(
"hours" => $lang->expire_hours,
"days" => $lang->expire_days,
"weeks" => $lang->expire_weeks,
"months" => $lang->expire_months,
"never" => $lang->expire_permanent
);
echo "\n";
$form_container = new FormContainer($lang->mod_options.': '.htmlspecialchars_uni($user['username']));
$form_container->output_row($lang->user_notes, '', $form->generate_text_area('usernotes', $mybb->input['usernotes'], array('id' => 'usernotes')), 'usernotes');
// Mod posts
// Generate check box
$modpost_options = $form->generate_select_box('modpost_period', $periods, $mybb->input['modpost_period'], array('id' => 'modpost_period'));
// Do we have any existing suspensions here?
$existing_info = '';
if($user['moderateposts'] || ($mybb->get_input('moderateposting') && !empty($errors)))
{
$mybb->input['moderateposting'] = 1;
if($user['moderationtime'] != 0)
{
$remaining = $user['moderationtime']-TIME_NOW;
$expired = nice_time($remaining, array('seconds' => false));
$color = 'inherit';
if($remaining < 3600)
{
$color = 'red';
}
elseif($remaining < 86400)
{
$color = 'maroon';
}
elseif($remaining < 604800)
{
$color = 'green';
}
$existing_info = $lang->sprintf($lang->moderate_length, $expired, $color);
}
else
{
$existing_info = $lang->moderated_perm;
}
}
$modpost_div = '
'.$existing_info.''.$lang->moderate_for.' '.$form->generate_numeric_field("modpost_time", $mybb->get_input('modpost_time'), array('style' => 'width: 3em;', 'min' => 0)).' '.$modpost_options.'
';
$lang->moderate_posts_info = $lang->sprintf($lang->moderate_posts_info, htmlspecialchars_uni($user['username']));
$form_container->output_row($form->generate_check_box("moderateposting", 1, $lang->moderate_posts, array("id" => "moderateposting", "onclick" => "toggleBox('modpost');", "checked" => $mybb->get_input('moderateposting'))), $lang->moderate_posts_info, $modpost_div);
// Suspend posts
// Generate check box
$suspost_options = $form->generate_select_box('suspost_period', $periods, $mybb->get_input('suspost_period'), array('id' => 'suspost_period'));
// Do we have any existing suspensions here?
if($user['suspendposting'] || ($mybb->get_input('suspendposting') && !empty($errors)))
{
$mybb->input['suspendposting'] = 1;
if($user['suspensiontime'] == 0 || $mybb->get_input('suspost_period') == "never")
{
$existing_info = $lang->suspended_perm;
}
else
{
$remaining = $user['suspensiontime']-TIME_NOW;
$suspost_date = nice_time($remaining, array('seconds' => false));
$color = 'inherit';
if($remaining < 3600)
{
$color = 'red';
}
elseif($remaining < 86400)
{
$color = 'maroon';
}
elseif($remaining < 604800)
{
$color = 'green';
}
$existing_info = $lang->sprintf($lang->suspend_length, $suspost_date, $color);
}
}
$suspost_div = '
'.$existing_info.''.$lang->suspend_for.' '.$form->generate_numeric_field("suspost_time", $mybb->get_input('suspost_time'), array('style' => 'width: 3em;', 'min' => 0)).' '.$suspost_options.'
';
$lang->suspend_posts_info = $lang->sprintf($lang->suspend_posts_info, htmlspecialchars_uni($user['username']));
$form_container->output_row($form->generate_check_box("suspendposting", 1, $lang->suspend_posts, array("id" => "suspendposting", "onclick" => "toggleBox('suspost');", "checked" => $mybb->get_input('suspendposting'))), $lang->suspend_posts_info, $suspost_div);
$form_container->end();
$plugins->run_hooks("admin_user_users_edit_moderator_options");
echo "
\n";
$plugins->run_hooks("admin_user_users_edit_graph");
$buttons[] = $form->generate_submit_button($lang->save_user);
$form->output_submit_wrapper($buttons);
$form->end();
echo '';
$page->output_footer();
}
if($mybb->input['action'] == "delete")
{
$user = get_user($mybb->input['uid']);
// Does the user not exist?
if(!$user)
{
flash_message($lang->error_invalid_user, 'error');
admin_redirect("index.php?module=user-users");
}
if(is_super_admin($mybb->input['uid']) && $mybb->user['uid'] != $mybb->input['uid'] && !is_super_admin($mybb->user['uid']))
{
flash_message($lang->error_no_perms_super_admin, 'error');
admin_redirect("index.php?module=user-users");
}
// User clicked no
if($mybb->get_input('no'))
{
admin_redirect("index.php?module=user-users");
}
$plugins->run_hooks("admin_user_users_delete");
if($mybb->request_method == "post")
{
$plugins->run_hooks("admin_user_users_delete_commit");
// Set up user handler.
require_once MYBB_ROOT.'inc/datahandlers/user.php';
$userhandler = new UserDataHandler('delete');
// Delete the user
if(!$userhandler->delete_user($user['uid']))
{
flash_message($lang->error_cannot_delete_user, 'error');
admin_redirect("index.php?module=user-users");
}
$cache->update_awaitingactivation();
$plugins->run_hooks("admin_user_users_delete_commit_end");
log_admin_action($user['uid'], $user['username']);
flash_message($lang->success_user_deleted, 'success');
admin_redirect("index.php?module=user-users");
}
else
{
$page->output_confirm_action("index.php?module=user-users&action=delete&uid={$user['uid']}", $lang->user_deletion_confirmation);
}
}
if($mybb->input['action'] == "referrers")
{
$page->add_breadcrumb_item($lang->show_referrers);
$page->output_header($lang->show_referrers);
$sub_tabs['referrers'] = array(
'title' => $lang->show_referrers,
'link' => "index.php?module=user-users&action=referrers&uid={$mybb->input['uid']}",
'description' => $lang->show_referrers_desc
);
$plugins->run_hooks("admin_user_users_referrers");
$page->output_nav_tabs($sub_tabs, 'referrers');
// Fetch default admin view
$default_view = fetch_default_view("user");
if(!$default_view)
{
$default_view = "0";
}
$query = $db->simple_select("adminviews", "*", "type='user' AND (vid='{$default_view}' OR uid=0)", array("order_by" => "uid", "order_dir" => "desc"));
$admin_view = $db->fetch_array($query);
if($mybb->input['type'])
{
$admin_view['view_type'] = $mybb->input['type'];
}
$admin_view['conditions'] = my_unserialize($admin_view['conditions']);
$admin_view['conditions']['referrer'] = $mybb->input['uid'];
$view = build_users_view($admin_view);
// No referred users
if(!$view)
{
$table = new Table;
$table->construct_cell($lang->error_no_referred_users);
$table->construct_row();
$table->output($lang->show_referrers);
}
else
{
echo $view;
}
$page->output_footer();
}
if($mybb->input['action'] == "ipaddresses")
{
$page->add_breadcrumb_item($lang->ip_addresses);
$page->output_header($lang->ip_addresses);
$sub_tabs['ipaddresses'] = array(
'title' => $lang->show_ip_addresses,
'link' => "index.php?module=user-users&action=ipaddresses&uid={$mybb->input['uid']}",
'description' => $lang->show_ip_addresses_desc
);
$plugins->run_hooks("admin_user_users_ipaddresses");
$page->output_nav_tabs($sub_tabs, 'ipaddresses');
$query = $db->simple_select("users", "uid, regip, username, lastip", "uid='{$mybb->input['uid']}'", array('limit' => 1));
$user = $db->fetch_array($query);
// Log admin action
log_admin_action($user['uid'], $user['username']);
$table = new Table;
$table->construct_header($lang->ip_address);
$table->construct_header($lang->controls, array('width' => 200, 'class' => "align_center"));
if(empty($user['lastip']))
{
$user['lastip'] = $lang->unknown;
$controls = '';
}
else
{
$user['lastip'] = my_inet_ntop($db->unescape_binary($user['lastip']));
$popup = new PopupMenu("user_last", $lang->options);
$popup->add_item($lang->show_users_regged_with_ip, "index.php?module=user-users&action=search&results=1&conditions[regip]=".$user['lastip']);
$popup->add_item($lang->show_users_posted_with_ip, "index.php?module=user-users&results=1&action=search&conditions[postip]=".$user['lastip']);
$popup->add_item($lang->info_on_ip, "index.php?module=user-users&action=iplookup&ipaddress={$user['lastip']}", "MyBB.popupWindow('index.php?module=user-users&action=iplookup&ipaddress={$user['lastip']}', null, true); return false;");
$popup->add_item($lang->ban_ip, "index.php?module=config-banning&filter={$user['lastip']}");
$controls = $popup->fetch();
}
$table->construct_cell("{$lang->last_known_ip}: ".$user['lastip']);
$table->construct_cell($controls, array('class' => "align_center"));
$table->construct_row();
if(empty($user['regip']))
{
$user['regip'] = $lang->unknown;
$controls = '';
}
else
{
$user['regip'] = my_inet_ntop($db->unescape_binary($user['regip']));
$popup = new PopupMenu("user_reg", $lang->options);
$popup->add_item($lang->show_users_regged_with_ip, "index.php?module=user-users&results=1&action=search&conditions[regip]=".$user['regip']);
$popup->add_item($lang->show_users_posted_with_ip, "index.php?module=user-users&results=1&action=search&conditions[postip]=".$user['regip']);
$popup->add_item($lang->info_on_ip, "index.php?module=user-users&action=iplookup&ipaddress={$user['regip']}", "MyBB.popupWindow('index.php?module=user-users&action=iplookup&ipaddress={$user['regip']}', null, true); return false;");
$popup->add_item($lang->ban_ip, "index.php?module=config-banning&filter={$user['regip']}");
$controls = $popup->fetch();
}
$table->construct_cell("{$lang->registration_ip}: ".$user['regip']);
$table->construct_cell($controls, array('class' => "align_center"));
$table->construct_row();
$counter = 0;
$query = $db->simple_select("posts", "DISTINCT ipaddress", "uid='{$mybb->input['uid']}'");
while($ip = $db->fetch_array($query))
{
++$counter;
$ip['ipaddress'] = my_inet_ntop($db->unescape_binary($ip['ipaddress']));
$popup = new PopupMenu("id_{$counter}", $lang->options);
$popup->add_item($lang->show_users_regged_with_ip, "index.php?module=user-users&results=1&action=search&conditions[regip]=".$ip['ipaddress']);
$popup->add_item($lang->show_users_posted_with_ip, "index.php?module=user-users&results=1&action=search&conditions[postip]=".$ip['ipaddress']);
$popup->add_item($lang->info_on_ip, "index.php?module=user-users&action=iplookup&ipaddress={$ip['ipaddress']}", "MyBB.popupWindow('index.php?module=user-users&action=iplookup&ipaddress={$ip['ipaddress']}', null, true); return false;");
$popup->add_item($lang->ban_ip, "index.php?module=config-banning&filter={$ip['ipaddress']}");
$controls = $popup->fetch();
$table->construct_cell($ip['ipaddress']);
$table->construct_cell($controls, array('class' => "align_center"));
$table->construct_row();
}
$table->output($lang->ip_address_for.' '.htmlspecialchars_uni($user['username']));
$page->output_footer();
}
if($mybb->input['action'] == "merge")
{
$plugins->run_hooks("admin_user_users_merge");
if($mybb->request_method == "post")
{
foreach(array('source', 'destination') as $target)
{
${$target.'_user'} = get_user_by_username($mybb->input[$target.'_username'], array('fields' => '*'));
if(empty(${$target.'_user'}['uid']))
{
$errors[] = $lang->{'error_invalid_user_'.$target};
}
}
// If we're not a super admin and we're merging a source super admin or a destination super admin then dissallow this action
if(!is_super_admin($mybb->user['uid']) && (is_super_admin($source_user['uid']) || is_super_admin($destination_user['uid'])))
{
flash_message($lang->error_no_perms_super_admin, 'error');
admin_redirect("index.php?module=user-users");
}
if((!empty($source_user)) && !empty($destination_user) && $source_user['uid'] == $destination_user['uid'] && !empty($source_user['uid']))
{
$errors[] = $lang->error_cannot_merge_same_account;
}
if(empty($errors))
{
// Begin to merge the accounts
$uid_update = array(
"uid" => $destination_user['uid']
);
$query = $db->simple_select("adminoptions", "uid", "uid='{$destination_user['uid']}'");
$existing_admin_options = $db->fetch_field($query, "uid");
// Only carry over admin options/permissions if we don't already have them
if(!$existing_admin_options)
{
$db->update_query("adminoptions", $uid_update, "uid='{$source_user['uid']}'");
}
$db->update_query("adminlog", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("announcements", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("events", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("threadsubscriptions", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("forumsubscriptions", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("joinrequests", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("moderatorlog", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("pollvotes", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("posts", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("privatemessages", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("reportedcontent", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("threads", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("warnings", $uid_update, "uid='{$source_user['uid']}'");
$db->update_query("warnings", array("revokedby" => $destination_user['uid']), "revokedby='{$source_user['uid']}'");
$db->update_query("warnings", array("issuedby" => $destination_user['uid']), "issuedby='{$source_user['uid']}'");
// Thread ratings
merge_thread_ratings($source_user['uid'], $destination_user['uid']);
// Banning
switch($db->type)
{
case 'mysql':
case 'mysqli':
$where = "`admin` = '{$source_user['uid']}'";
break;
default:
$where = "admin = '{$source_user['uid']}'";
break;
}
$db->update_query("banned", array('admin' => $destination_user['uid']), $where);
// Carry over referrals
$db->update_query("users", array("referrer" => $destination_user['uid']), "referrer='{$source_user['uid']}' AND uid!='{$destination_user['uid']}'");
// If destination user has no referrer but source does and source user was not referred by destination user
// or destination user was referred by the source user
if(($destination_user['referrer'] == 0 && $source_user['referrer'] > 0 && $source_user['referrer'] != $destination_user['uid']) || $destination_user['referrer'] == $source_user['uid'])
{
$db->update_query("users", array("referrer" => $source_user['referrer']), "uid='{$destination_user['uid']}'");
}
$query = $db->simple_select("users", "COUNT(uid) as total_referrals", "referrer='{$destination_user['uid']}' AND uid!='{$source_user['uid']}'");
$new_referrals = $db->fetch_field($query, "total_referrals");
$db->update_query("users", array("referrals" => (int)$new_referrals), "uid='{$destination_user['uid']}'");
// Merging Reputation
// First, let's change all the details over to our new user...
$db->update_query("reputation", array("adduid" => $destination_user['uid']), "adduid = '".$source_user['uid']."'");
$db->update_query("reputation", array("uid" => $destination_user['uid']), "uid = '".$source_user['uid']."'");
// Now that all the repuation is merged, figure out what to do with this user's comments...
$options = array(
"order_by" => "uid",
"order_dir" => "ASC"
);
$to_remove = array();
$query = $db->simple_select("reputation", "*", "adduid = '".$destination_user['uid']."'", $options);
while($rep = $db->fetch_array($query))
{
if($rep['pid'] == 0 && $mybb->settings['multirep'] == 0 && $last_result['uid'] == $rep['uid'])
{
// Multiple reputation is disallowed, and this isn't a post, so let's remove this comment
$to_remove[] = $rep['rid'];
}
// Remove comments or posts liked by "me"
if($last_result['uid'] == $destination_user['uid'] || $rep['uid'] == $destination_user['uid'])
{
if(!in_array($rep['rid'], $to_remove))
{
$to_remove[] = $rep['rid'];
continue;
}
}
$last_result = array(
"rid" => $rep['rid'],
"uid" => $rep['uid']
);
}
// Remove any reputations we've selected to remove...
if(!empty($to_remove))
{
$imp = implode(",", $to_remove);
$db->delete_query("reputation", "rid IN (".$imp.")");
}
// Calculate the new reputation for this user...
$query = $db->simple_select("reputation", "SUM(reputation) as total_rep", "uid='{$destination_user['uid']}'");
$total_reputation = $db->fetch_field($query, "total_rep");
$db->update_query("users", array('reputation' => (int)$total_reputation), "uid='{$destination_user['uid']}'");
// Calculate warning points
$query = $db->query("
SELECT SUM(points) as warn_lev
FROM ".TABLE_PREFIX."warnings
WHERE uid='{$source_user['uid']}' AND expired='0'
");
$original_warn_level = $db->fetch_field($query, "warn_lev");
$query = $db->query("
SELECT SUM(points) as warn_lev
FROM ".TABLE_PREFIX."warnings
WHERE uid='{$destination_user['uid']}' AND expired='0'
");
$new_warn_level = $db->fetch_field($query, "warn_lev");
$db->update_query("users", array("warningpoints" => (int)$original_warn_level + $new_warn_level), "uid='{$destination_user['uid']}'");
// Additional updates for non-uid fields
$last_poster = array(
"lastposteruid" => $destination_user['uid'],
"lastposter" => $db->escape_string($destination_user['username'])
);
$db->update_query("forums", $last_poster, "lastposteruid='{$source_user['uid']}'");
$db->update_query("threads", $last_poster, "lastposteruid='{$source_user['uid']}'");
$edit_uid = array(
"edituid" => $destination_user['uid']
);
$db->update_query("posts", $edit_uid, "edituid='{$source_user['uid']}'");
$from_uid = array(
"fromid" => $destination_user['uid']
);
$db->update_query("privatemessages", $from_uid, "fromid='{$source_user['uid']}'");
$to_uid = array(
"toid" => $destination_user['uid']
);
$db->update_query("privatemessages", $to_uid, "toid='{$source_user['uid']}'");
// Buddy/ignore lists
$destination_buddies = explode(',', $destination_user['buddylist']);
$source_buddies = explode(',', $source_user['buddylist']);
$buddies = array_unique(array_merge($source_buddies, $destination_buddies));
// Make sure the new buddy list doesn't contain either users
$buddies_array = array_diff($buddies, array($destination_user['uid'], $source_user['uid']));
$destination_ignored = explode(',', $destination_user['ignorelist']);
$source_ignored = explode(',', $destination_user['ignorelist']);
$ignored = array_unique(array_merge($source_ignored, $destination_ignored));
// ... and the same for the new ignore list
$ignored_array = array_diff($ignored, array($destination_user['uid'], $source_user['uid']));
// Remove any ignored users from the buddy list
$buddies = array_diff($buddies_array, $ignored_array);
// implode the arrays so we get a nice neat list for each
$buddies = trim(implode(',', $buddies), ',');
$ignored = trim(implode(',', $ignored_array), ',');
$lists = array(
"buddylist" => $buddies,
"ignorelist" => $ignored
);
$db->update_query("users", $lists, "uid='{$destination_user['uid']}'");
// Get a list of forums where post count doesn't apply
$fids = array();
$query = $db->simple_select("forums", "fid", "usepostcounts=0");
while($fid = $db->fetch_field($query, "fid"))
{
$fids[] = $fid;
}
$fids_not_in = '';
if(!empty($fids))
{
$fids_not_in = "AND fid NOT IN(".implode(',', $fids).")";
}
// Update user post count
$query = $db->simple_select("posts", "COUNT(*) AS postnum", "uid='".$destination_user['uid']."' {$fids_not_in}");
$num = $db->fetch_array($query);
$updated_count = array(
"postnum" => $num['postnum']
);
$db->update_query("users", $updated_count, "uid='{$destination_user['uid']}'");
// Update user thread count
$query = $db->simple_select("threads", "COUNT(*) AS threadnum", "uid='".$destination_user['uid']."' {$fids_not_in}");
$num = $db->fetch_array($query);
$updated_count = array(
"threadnum" => $num['threadnum']
);
$db->update_query("users", $updated_count, "uid='{$destination_user['uid']}'");
// Use the earliest registration date
if($destination_user['regdate'] > $source_user['regdate'])
{
$db->update_query("users", array('regdate' => $source_user['regdate']), "uid='{$destination_user['uid']}'");
}
$plugins->run_hooks("admin_user_users_merge_commit");
// Set up user handler.
require_once MYBB_ROOT.'inc/datahandlers/user.php';
$userhandler = new UserDataHandler('delete');
// Delete the old user
$userhandler->delete_user($source_user['uid']);
$cache->update_awaitingactivation();
// Log admin action
log_admin_action($source_user['uid'], $source_user['username'], $destination_user['uid'], $destination_user['username']);
// Redirect!
$username = htmlspecialchars_uni($source_user['username']);
$destination_username = htmlspecialchars_uni($destination_user['username']);
flash_message("{$username} {$lang->success_merged} {$destination_username}", "success");
admin_redirect("index.php?module=user-users");
exit;
}
}
$page->add_breadcrumb_item($lang->merge_users);
$page->output_header($lang->merge_users);
$page->output_nav_tabs($sub_tabs, 'merge_users');
// If we have any error messages, show them
if($errors)
{
$page->output_inline_error($errors);
}
$form = new Form("index.php?module=user-users&action=merge", "post");
$form_container = new FormContainer($lang->merge_users);
$form_container->output_row($lang->source_account." *", $lang->source_account_desc, $form->generate_text_box('source_username', $mybb->get_input('source_username'), array('id' => 'source_username')), 'source_username');
$form_container->output_row($lang->destination_account." *", $lang->destination_account_desc, $form->generate_text_box('destination_username', $mybb->get_input('destination_username'), array('id' => 'destination_username')), 'destination_username');
$form_container->end();
// Autocompletion for usernames
echo '
';
$buttons[] = $form->generate_submit_button($lang->merge_user_accounts);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
if($mybb->input['action'] == "search")
{
$plugins->run_hooks("admin_user_users_search");
if($mybb->request_method == "post" || $mybb->get_input('results') == 1)
{
// Build view options from incoming search options
if($mybb->get_input('vid'))
{
$query = $db->simple_select("adminviews", "*", "vid='".$mybb->get_input('vid', MyBB::INPUT_INT)."'");
$admin_view = $db->fetch_array($query);
// View does not exist or this view is private and does not belong to the current user
if(!$admin_view['vid'] || ($admin_view['visibility'] == 1 && $admin_view['uid'] != $mybb->user['uid']))
{
unset($admin_view);
}
}
if($mybb->get_input('search_id') && $admin_session['data']['user_views'][$mybb->get_input('search_id')])
{
$admin_view = $admin_session['data']['user_views'][$mybb->get_input('search_id')];
unset($admin_view['extra_sql']);
}
// Don't have a view? Fetch the default
if(!isset($admin_view) || !$admin_view['vid'])
{
$default_view = fetch_default_view("user");
if(!$default_view)
{
$default_view = "0";
}
$query = $db->simple_select("adminviews", "*", "type='user' AND (vid='{$default_view}' OR uid=0)", array("order_by" => "uid", "order_dir" => "desc"));
$admin_view = $db->fetch_array($query);
}
// Override specific parts of the view
unset($admin_view['vid']);
if($mybb->get_input('type'))
{
$admin_view['view_type'] = $mybb->get_input('type');
}
if(!empty($mybb->input['conditions']))
{
$admin_view['conditions'] = $mybb->get_input('conditions', MyBB::INPUT_ARRAY);
}
if($mybb->get_input('sortby'))
{
$admin_view['sortby'] = $mybb->get_input('sortby');
}
if($mybb->get_input('perpage', MyBB::INPUT_INT))
{
$admin_view['perpage'] = $mybb->get_input('perpage');
}
if($mybb->get_input('order'))
{
$admin_view['sortorder'] = $mybb->get_input('order');
}
if($mybb->get_input('displayas'))
{
$admin_view['view_type'] = $mybb->get_input('displayas');
}
if(!empty($mybb->input['profile_fields']))
{
$admin_view['custom_profile_fields'] = $mybb->get_input('profile_fields', MyBB::INPUT_ARRAY);
}
$plugins->run_hooks("admin_user_users_search_commit");
$results = build_users_view($admin_view);
if($results)
{
$page->output_header($lang->find_users);
echo "";
$page->output_nav_tabs($sub_tabs, 'find_users');
echo $results;
$page->output_footer();
}
else
{
if($mybb->get_input('from') == "home")
{
flash_message($lang->error_no_users_found, 'error');
admin_redirect("index.php");
exit;
}
else
{
$errors[] = $lang->error_no_users_found;
}
}
}
$page->add_breadcrumb_item($lang->find_users);
$page->output_header($lang->find_users);
$page->output_nav_tabs($sub_tabs, 'find_users');
// If we have any error messages, show them
if($errors)
{
$page->output_inline_error($errors);
}
if(!$mybb->get_input('displayas'))
{
$mybb->input['displayas'] = "card";
}
$form = new Form("index.php?module=user-users&action=search", "post");
user_search_conditions($mybb->input, $form);
$form_container = new FormContainer($lang->display_options);
$sort_directions = array(
"asc" => $lang->ascending,
"desc" => $lang->descending
);
$form_container->output_row($lang->sort_results_by, "", $form->generate_select_box('sortby', $sort_options, $mybb->get_input('sortby'), array('id' => 'sortby'))." {$lang->in} ".$form->generate_select_box('order', $sort_directions, $mybb->get_input('order'), array('id' => 'order')), 'sortby');
$form_container->output_row($lang->results_per_page, "", $form->generate_numeric_field('perpage', $mybb->get_input('perpage'), array('id' => 'perpage', 'min' => 1)), 'perpage');
$form_container->output_row($lang->display_results_as, "", $form->generate_radio_button('displayas', 'table', $lang->table, array('checked' => ($mybb->get_input('displayas') != "card" ? true : false)))."
".$form->generate_radio_button('displayas', 'card', $lang->business_card, array('checked' => ($mybb->get_input('displayas') == "card" ? true : false))));
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->find_users);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
}
if($mybb->input['action'] == "inline_edit")
{
$plugins->run_hooks("admin_user_users_inline");
if(!empty($mybb->input['vid']) || !empty($mybb->cookies['acp_view']))
{
// We have a custom view
if(empty($mybb->cookies['acp_view']))
{
// Set a cookie
my_setcookie("acp_view", $mybb->input['vid'], 60);
}
else
{
// We already have a cookie, so let's use it...
$mybb->input['vid'] = $mybb->cookies['acp_view'];
}
$vid_url = "&vid=".$mybb->get_input('vid');
}
else
{
$vid_url = null;
}
// First, collect the user IDs that we're performing the moderation on
$selected = array();
if(isset($mybb->cookies['inlinemod_useracp']))
{
$ids = explode("|", $mybb->cookies['inlinemod_useracp']);
foreach($ids as $id)
{
if($id != '')
{
$selected[] = (int)$id;
}
}
}
// Verify incoming POST request
if(!verify_post_check($mybb->get_input('my_post_key')))
{
flash_message($lang->invalid_post_verify_key2, 'error');
admin_redirect("index.php?module=user-user");
}
$sub_tabs['manage_users'] = array(
"title" => $lang->manage_users,
"link" => "./",
"description" => $lang->manage_users_desc
);
$page->add_breadcrumb_item($lang->manage_users);
if(empty($selected))
{
// Not selected any users, show error
flash_message($lang->error_inline_no_users_selected, 'error');
admin_redirect("index.php?module=user-users".$vid_url);
}
switch($mybb->input['inline_action'])
{
case 'multiactivate':
// Run through the activating users, so that users already registered (but have been selected) aren't affected
if(is_array($selected))
{
$sql_array = implode(",", $selected);
$query = $db->simple_select("users", "uid, username, email", "usergroup = '5' AND uid IN (".$sql_array.")");
$user_mail_data = array();
while($user = $db->fetch_array($query))
{
$to_update[] = $user['uid'];
$user_mail_data[] = array('username' => $user['username'], 'email' => $user['email']);
}
}
$plugins->run_hooks("admin_user_multiactivate", $to_update);
if(isset($to_update) && is_array($to_update))
{
$sql_array = implode(",", $to_update);
$db->write_query("UPDATE ".TABLE_PREFIX."users SET usergroup = '2' WHERE uid IN (".$sql_array.")");
$cache->update_awaitingactivation();
// send activation mail
foreach($user_mail_data as $mail_data)
{
$message = $lang->sprintf($lang->email_adminactivateaccount, $mail_data['username'], $mybb->settings['bbname'], $mybb->settings['bburl']);
my_mail($mail_data['email'], $lang->sprintf($lang->emailsubject_activateaccount, $mybb->settings['bbname']), $message);
}
// Action complete, grab stats and show success message - redirect user
$to_update_count = count($to_update);
$lang->inline_activated = $lang->sprintf($lang->inline_activated, my_number_format($to_update_count));
if(is_array($selected) && $to_update_count != count($selected))
{
// The update count is different to how many we selected!
$not_updated_count = count($selected) - $to_update_count;
$lang->inline_activated_more = $lang->sprintf($lang->inline_activated_more, my_number_format($not_updated_count));
$lang->inline_activated = $lang->inline_activated."
".$lang->inline_activated_more; // Add these stats to the message
}
$mybb->input['action'] = "inline_activated"; // Force a change to the action so we can add it to the adminlog
log_admin_action($to_update_count); // Add to adminlog
my_unsetcookie("inlinemod_useracp"); // Unset the cookie, so that the users aren't still selected when we're redirected
flash_message($lang->inline_activated, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
else
{
// Nothing was updated, show an error
flash_message($lang->inline_activated_failed, 'error');
admin_redirect("index.php?module=user-users".$vid_url);
}
break;
case 'multilift':
// Get the users that are banned, and check that they have been selected
if($mybb->get_input('no'))
{
admin_redirect("index.php?module=user-users".$vid_url); // User clicked on 'No'
}
if($mybb->request_method == "post")
{
$sql_array = implode(",", $selected);
$query = $db->simple_select("banned", "*", "uid IN (".$sql_array.")");
$to_be_unbanned = $db->num_rows($query);
while($ban = $db->fetch_array($query))
{
$updated_group = array(
"usergroup" => $ban['oldgroup'],
"additionalgroups" => $db->escape_string($ban['oldadditionalgroups']),
"displaygroup" => $ban['olddisplaygroup']
);
$db->update_query("users", $updated_group, "uid = '".$ban['uid']."'");
$db->delete_query("banned", "uid = '".$ban['uid']."'");
}
$cache->update_moderators();
$mybb->input['action'] = "inline_lift";
log_admin_action($to_be_unbanned);
my_unsetcookie("inlinemod_useracp");
$lang->success_ban_lifted = $lang->sprintf($lang->success_ban_lifted, my_number_format($to_be_unbanned));
flash_message($lang->success_ban_lifted, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
else
{
$page->output_confirm_action("index.php?module=user-users&action=inline_edit&inline_action=multilift", $lang->confirm_multilift);
}
break;
case 'multiban':
if($mybb->input['processed'] == 1)
{
// We've posted ban information!
// Build an array of users to ban, =D
$sql_array = implode(",", $selected);
// Build a cache array for this users that have been banned already
$query = $db->simple_select("banned", "uid", "uid IN (".$sql_array.")");
while($user = $db->fetch_array($query))
{
$bannedcache[] = "u_".$user['uid'];
}
// Collect the users
$query = $db->simple_select("users", "uid, username, usergroup, additionalgroups, displaygroup", "uid IN (".$sql_array.")");
if($mybb->input['bantime'] == '---')
{
$lifted = 0;
}
else
{
$lifted = ban_date2timestamp($mybb->input['bantime']);
}
$reason = my_substr($mybb->input['reason'], 0, 255);
$banned_count = 0;
while($user = $db->fetch_array($query))
{
if($user['uid'] == $mybb->user['uid'] || is_super_admin($user['uid']))
{
// We remove ourselves and Super Admins from the mix
continue;
}
if(is_array($bannedcache) && in_array("u_".$user['uid'], $bannedcache))
{
// User already has a ban, update it!
$update_array = array(
"admin" => (int)$mybb->user['uid'],
"dateline" => TIME_NOW,
"bantime" => $db->escape_string($mybb->input['bantime']),
"lifted" => $db->escape_string($lifted),
"reason" => $db->escape_string($reason)
);
$db->update_query("banned", $update_array, "uid = '".$user['uid']."'");
}
else
{
// Not currently banned - insert the ban
$insert_array = array(
'uid' => $user['uid'],
'gid' => $mybb->get_input('usergroup', MyBB::INPUT_INT),
'oldgroup' => $user['usergroup'],
'oldadditionalgroups' => $db->escape_string($user['additionalgroups']),
'olddisplaygroup' => $user['displaygroup'],
'admin' => (int)$mybb->user['uid'],
'dateline' => TIME_NOW,
'bantime' => $db->escape_string($mybb->input['bantime']),
'lifted' => $db->escape_string($lifted),
'reason' => $db->escape_string($reason)
);
$db->insert_query('banned', $insert_array);
}
// Moved the user to the 'Banned' Group
$update_array = array(
'usergroup' => 7,
'displaygroup' => 0,
'additionalgroups' => '',
);
$db->update_query('users', $update_array, "uid = '{$user['uid']}'");
$db->delete_query("forumsubscriptions", "uid = '{$user['uid']}'");
$db->delete_query("threadsubscriptions", "uid = '{$user['uid']}'");
++$banned_count;
}
$mybb->input['action'] = "inline_banned";
log_admin_action($banned_count, $lifted);
my_unsetcookie("inlinemod_useracp"); // Remove the cookie of selected users as we've finished with them
$lang->users_banned = $lang->sprintf($lang->users_banned, $banned_count);
flash_message($lang->users_banned, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
$page->output_header($lang->manage_users);
$page->output_nav_tabs($sub_tabs, 'manage_users');
// Provide the user with a warning of what they're about to do
$table = new Table;
$lang->mass_ban_info = $lang->sprintf($lang->mass_ban_info, count($selected));
$table->construct_cell($lang->mass_ban_info);
$table->construct_row();
$table->output($lang->important);
// If there's any errors, display inline
if($errors)
{
$page->output_inline_error($errors);
}
$form = new Form("index.php?module=user-users", "post");
echo $form->generate_hidden_field('action', 'inline_edit');
echo $form->generate_hidden_field('inline_action', 'multiban');
echo $form->generate_hidden_field('processed', '1');
$form_container = new FormContainer(''.$lang->mass_ban);
$form_container->output_row($lang->ban_reason, "", $form->generate_text_area('reason', $mybb->input['reason'], array('id' => 'reason', 'maxlength' => '255')), 'reason');
$ban_times = fetch_ban_times();
foreach($ban_times as $time => $period)
{
if($time != '---')
{
$friendly_time = my_date("D, jS M Y @ {$mybb->settings['timeformat']}", ban_date2timestamp($time));
$period = "{$period} ({$friendly_time})";
}
$length_list[$time] = $period;
}
$form_container->output_row($lang->ban_time, "", $form->generate_select_box('bantime', $length_list, $mybb->input['bantime'], array('id' => 'bantime')), 'bantime');
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->ban_users);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
break;
case 'multidelete':
if($mybb->get_input('no'))
{
admin_redirect("index.php?module=user-users".$vid_url); // User clicked on 'No
}
else
{
if($mybb->input['processed'] == 1)
{
// Set up user handler.
require_once MYBB_ROOT.'inc/datahandlers/user.php';
$userhandler = new UserDataHandler('delete');
// Delete users
$deleted = $userhandler->delete_user($selected);
$to_be_deleted = $deleted['deleted_users']; // Get the correct number of deleted users
// Update forum stats, remove the cookie and redirect the user
my_unsetcookie("inlinemod_useracp");
$mybb->input['action'] = "inline_delete";
log_admin_action($to_be_deleted);
$lang->users_deleted = $lang->sprintf($lang->users_deleted, $to_be_deleted);
$cache->update_awaitingactivation();
flash_message($lang->users_deleted, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
$to_be_deleted = count($selected);
$lang->confirm_multidelete = $lang->sprintf($lang->confirm_multidelete, my_number_format($to_be_deleted));
$page->output_confirm_action("index.php?module=user-users&action=inline_edit&inline_action=multidelete&my_post_key={$mybb->post_code}&processed=1", $lang->confirm_multidelete);
}
break;
case 'multiprune':
if($mybb->input['processed'] == 1)
{
if(($mybb->input['day'] || $mybb->input['month'] || $mybb->input['year']) && $mybb->input['set'])
{
$errors[] = $lang->multi_selected_dates;
}
$day = $mybb->get_input('day', MyBB::INPUT_INT);
$month = $mybb->get_input('month', MyBB::INPUT_INT);
$year = $mybb->get_input('year', MyBB::INPUT_INT);
// Selected a date - check if the date the user entered is valid
if($mybb->input['day'] || $mybb->input['month'] || $mybb->input['year'])
{
// Is the date sort of valid?
if($day < 1 || $day > 31 || $month < 1 || $month > 12 || ($month == 2 && $day > 29))
{
$errors[] = $lang->incorrect_date;
}
// Check the month
$months = get_bdays($year);
if($day > $months[$month-1])
{
$errors[] = $lang->incorrect_date;
}
// Check the year
if($year != 0 && ($year < (date("Y")-100)) || $year > date("Y"))
{
$errors[] = $lang->incorrect_date;
}
if(!$errors)
{
// No errors, so let's continue and set the date to delete from
$date = mktime(date('H'), date('i'), date('s'), $month, $day, $year); // Generate a unix time stamp
}
}
elseif($mybb->input['set'] > 0)
{
// Set options
// For this purpose, 1 month = 31 days
$base_time = 24 * 60 * 60;
switch($mybb->input['set'])
{
case '1':
$threshold = $base_time * 31; // 1 month = 31 days, in the standard terms
break;
case '2':
$threshold = $base_time * 93; // 3 months = 31 days * 3
break;
case '3':
$threshold = $base_time * 183; // 6 months = 365 days / 2
break;
case '4':
$threshold = $base_time * 365; // 1 year = 365 days
break;
case '5':
$threshold = $base_time * 548; // 18 months = 365 + 183
break;
case '6':
$threshold = $base_time * 730; // 2 years = 365 * 2
break;
}
if(!$threshold)
{
// An option was entered that isn't in the dropdown box
$errors[] = $lang->no_set_option;
}
else
{
$date = TIME_NOW - $threshold;
}
}
else
{
$errors[] = $lang->no_prune_option;
}
if(!$errors)
{
$sql_array = implode(",", $selected);
$prune_array = array();
$query = $db->simple_select("users", "uid", "uid IN (".$sql_array.")");
while($user = $db->fetch_array($query))
{
// Protect Super Admins
if(is_super_admin($user['uid']) && !is_super_admin($mybb->user['uid']))
{
continue;
}
$return_array = delete_user_posts($user['uid'], $date); // Delete user posts, and grab a list of threads to delete
if($return_array && is_array($return_array))
{
$prune_array = array_merge_recursive($prune_array, $return_array);
}
}
$plugins->run_hooks("admin_user_multiprune_threads", $prune_array);
// No posts were found for the user, return error
if(!is_array($prune_array) || count($prune_array) == 0)
{
flash_message($lang->prune_fail, 'error');
admin_redirect("index.php?module=user-users".$vid_url);
}
// Require the rebuild functions
require_once MYBB_ROOT.'/inc/functions.php';
require_once MYBB_ROOT.'/inc/functions_rebuild.php';
// We've finished deleting user's posts, so let's delete the threads
if(is_array($prune_array['to_delete']) && count($prune_array['to_delete']) > 0)
{
foreach($prune_array['to_delete'] as $tid)
{
$db->delete_query("threads", "tid='$tid'");
$db->delete_query("threads", "closed='moved|$tid'");
$db->delete_query("threadsubscriptions", "tid='$tid'");
$db->delete_query("polls", "tid='$tid'");
$db->delete_query("threadsread", "tid='$tid'");
$db->delete_query("threadratings", "tid='$tid'");
}
}
// After deleting threads, rebuild the thread counters for the affected threads
if(is_array($prune_array['thread_update']) && count($prune_array['thread_update']) > 0)
{
$sql_array = implode(",", $prune_array['thread_update']);
$query = $db->simple_select("threads", "tid", "tid IN (".$sql_array.")", array('order_by' => 'tid', 'order_dir' => 'asc'));
while($thread = $db->fetch_array($query))
{
rebuild_thread_counters($thread['tid']);
}
}
// After updating thread counters, update the affected forum counters
if(is_array($prune_array['forum_update']) && count($prune_array['forum_update']) > 0)
{
$sql_array = implode(",", $prune_array['forum_update']);
$query = $db->simple_select("forums", "fid", "fid IN (".$sql_array.")", array('order_by' => 'fid', 'order_dir' => 'asc'));
while($forum = $db->fetch_array($query))
{
// Because we have a recursive array merge, check to see if there isn't a duplicated forum to update
if($looped_forum == $forum['fid'])
{
continue;
}
$looped_forum = $forum['fid'];
rebuild_forum_counters($forum['fid']);
}
}
//log_admin_action();
my_unsetcookie("inlinemod_useracp"); // We've got our users, remove the cookie
flash_message($lang->prune_complete, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
}
$page->output_header($lang->manage_users);
$page->output_nav_tabs($sub_tabs, 'manage_users');
// Display a table warning
$table = new Table;
$lang->mass_prune_info = $lang->sprintf($lang->mass_prune_info, count($selected));
$table->construct_cell($lang->mass_prune_info);
$table->construct_row();
$table->output($lang->important);
if($errors)
{
$page->output_inline_error($errors);
}
// Display the prune options
$form = new Form("index.php?module=user-users", "post");
echo $form->generate_hidden_field('action', 'inline_edit');
echo $form->generate_hidden_field('inline_action', 'multiprune');
echo $form->generate_hidden_field('processed', '1');
$form_container = new FormContainer($lang->mass_prune_posts);
// Generate a list of days (1 - 31)
$day_options = array();
$day_options[] = " ";
for($i = 1; $i <= 31; ++$i)
{
$day_options[] = $i;
}
// Generate a list of months (1 - 12)
$month_options = array();
$month_options[] = " ";
for($i = 1; $i <= 12; ++$i)
{
$string = "month_{$i}";
$month_options[] = $lang->$string;
}
$date_box = $form->generate_select_box('day', $day_options, $mybb->input['day']);
$month_box = $form->generate_select_box('month', $month_options, $mybb->input['month']);
$year_box = $form->generate_numeric_field('year', $mybb->input['year'], array('id' => 'year', 'style' => 'width: 50px;', 'min' => 0));
$prune_select = $date_box.$month_box.$year_box;
$form_container->output_row($lang->manual_date, "", $prune_select, 'date');
// Generate the set date box
$set_options = array();
$set_options[] = $lang->set_an_option;
for($i = 1; $i <= 6; ++$i)
{
$string = "option_{$i}";
$set_options[] = $lang->$string;
}
$form_container->output_row($lang->relative_date, "", $lang->delete_posts." ".$form->generate_select_box('set', $set_options, $mybb->input['set']), 'set');
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->prune_posts);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
break;
case 'multiusergroup':
if($mybb->input['processed'] == 1)
{
// Determine additional usergroups
if(is_array($mybb->input['additionalgroups']))
{
foreach($mybb->input['additionalgroups'] as $key => $gid)
{
if($gid == $mybb->input['usergroup'])
{
unset($mybb->input['additionalgroups'][$key]);
}
}
$additionalgroups = implode(",", array_map('intval', $mybb->input['additionalgroups']));
}
else
{
$additionalgroups = '';
}
// Create an update array
$update_array = array(
"usergroup" => $mybb->get_input('usergroup', MyBB::INPUT_INT),
"additionalgroups" => $additionalgroups,
"displaygroup" => $mybb->get_input('displaygroup', MyBB::INPUT_INT)
);
// Create an admin_user_multiusergroup hook array
$hook_params = array(
"selected" => &$selected,
"update_array" => &$update_array
);
$hook_params = $plugins->run_hooks("admin_user_multiusergroup", $hook_params);
// Do the usergroup update for all those selected
// If the a selected user is a super admin, don't update that user
$users_to_update = array();
foreach($selected as $user)
{
if(!is_super_admin($user))
{
$users_to_update[] = $user;
}
}
$to_update_count = count($users_to_update);
if($to_update_count > 0)
{
// Update the users in the database
$sql = implode(",", $users_to_update);
$db->update_query("users", $update_array, "uid IN (".$sql.")");
// Redirect the admin...
$mybb->input['action'] = "inline_usergroup";
log_admin_action($to_update_count);
my_unsetcookie("inlinemod_useracp");
flash_message($lang->success_mass_usergroups, 'success');
admin_redirect("index.php?module=user-users".$vid_url);
}
else
{
// They tried to edit super admins! Uh-oh!
$errors[] = $lang->no_usergroup_changed;
}
}
$page->output_header($lang->manage_users);
$page->output_nav_tabs($sub_tabs, 'manage_users');
// Display a table warning
$table = new Table;
$lang->usergroup_info = $lang->sprintf($lang->usergroup_info, count($selected));
$table->construct_cell($lang->usergroup_info);
$table->construct_row();
$table->output($lang->important);
if($errors)
{
$page->output_inline_error($errors);
}
// Display the usergroup options
$form = new Form("index.php?module=user-users", "post");
echo $form->generate_hidden_field('action', 'inline_edit');
echo $form->generate_hidden_field('inline_action', 'multiusergroup');
echo $form->generate_hidden_field('processed', '1');
$form_container = new FormContainer($lang->mass_usergroups);
// Usergroups
$display_group_options[0] = $lang->use_primary_user_group;
$options = array();
$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
while($usergroup = $db->fetch_array($query))
{
$options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
$display_group_options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
}
if(!is_array($mybb->input['additionalgroups']))
{
$mybb->input['additionalgroups'] = explode(',', $mybb->input['additionalgroups']);
}
$form_container->output_row($lang->primary_user_group, "", $form->generate_select_box('usergroup', $options, $mybb->input['usergroup'], array('id' => 'usergroup')), 'usergroup');
$form_container->output_row($lang->additional_user_groups, $lang->additional_user_groups_desc, $form->generate_select_box('additionalgroups[]', $options, $mybb->input['additionalgroups'], array('id' => 'additionalgroups', 'multiple' => true, 'size' => 5)), 'additionalgroups');
$form_container->output_row($lang->display_user_group, "", $form->generate_select_box('displaygroup', $display_group_options, $mybb->input['displaygroup'], array('id' => 'displaygroup')), 'displaygroup');
$form_container->end();
$buttons[] = $form->generate_submit_button($lang->alter_usergroups);
$form->output_submit_wrapper($buttons);
$form->end();
$page->output_footer();
break;
}
}
if(!$mybb->input['action'])
{
$plugins->run_hooks("admin_user_users_start");
$page->output_header($lang->browse_users);
echo "";
$page->output_nav_tabs($sub_tabs, 'browse_users');
if(isset($mybb->input['search_id']) && $admin_session['data']['user_views'][$mybb->input['search_id']])
{
$admin_view = $admin_session['data']['user_views'][$mybb->input['search_id']];
unset($admin_view['extra_sql']);
}
else
{
// Showing a specific view
if(isset($mybb->input['vid']))
{
$query = $db->simple_select("adminviews", "*", "vid='".$mybb->get_input('vid', MyBB::INPUT_INT)."'");
$admin_view = $db->fetch_array($query);
// View does not exist or this view is private and does not belong to the current user
if(!$admin_view['vid'] || ($admin_view['visibility'] == 1 && $admin_view['uid'] != $mybb->user['uid']))
{
unset($admin_view);
}
}
// Don't have a view? Fetch the default
if(!isset($admin_view))
{
$default_view = fetch_default_view("user");
if(!$default_view)
{
$default_view = "0";
}
$query = $db->simple_select("adminviews", "*", "type='user' AND (vid='{$default_view}' OR uid=0)", array("order_by" => "uid", "order_dir" => "desc"));
$admin_view = $db->fetch_array($query);
}
}
// Fetch a list of all of the views for this user
$popup = new PopupMenu("views", $lang->views);
$query = $db->simple_select("adminviews", "*", "type='user' AND (visibility=2 OR uid={$mybb->user['uid']})", array("order_by" => "title"));
while($view = $db->fetch_array($query))
{
$popup->add_item(htmlspecialchars_uni($view['title']), "index.php?module=user-users&vid={$view['vid']}");
}
$popup->add_item("{$lang->manage_views}", "index.php?module=user-users&action=views");
$admin_view['popup'] = $popup->fetch();
if(isset($mybb->input['type']))
{
$admin_view['view_type'] = $mybb->input['type'];
}
$results = build_users_view($admin_view);
if(!$results)
{
// If we came from the home page and clicked on the "Activate Users" link, send them back to here
if($admin_session['data']['from'] == "home")
{
flash_message($admin_session['data']['flash_message2']['message'], $admin_session['data']['flash_message2']['type']);
update_admin_session('flash_message2', '');
update_admin_session('from', '');
admin_redirect("index.php");
exit;
}
else
{
$errors[] = $lang->error_no_users_found;
}
}
// If we have any error messages, show them
if($errors)
{
if($inline != true)
{
echo "{$admin_view['popup']}
\n";
}
$page->output_inline_error($errors);
}
echo $results;
$page->output_footer();
}
/**
* @param array $view
*
* @return string
*/
function build_users_view($view)
{
global $mybb, $db, $cache, $lang, $user_view_fields, $page;
if($view['view_type'] != 'card')
{
$view['view_type'] = 'table';
}
$view_title = '';
if($view['title'])
{
if(isset($view['vid']))
{
$title_string = "view_title_{$view['vid']}";
if(isset($lang->$title_string))
{
$view['title'] = $lang->$title_string;
}
}
$view_title .= " (".htmlspecialchars_uni($view['title']).")";
}
// Build the URL to this view
if(!isset($view['url']))
{
$view['url'] = "index.php?module=user-users";
}
if(!is_array($view['conditions']))
{
$view['conditions'] = my_unserialize($view['conditions']);
}
if(!is_array($view['fields']))
{
$view['fields'] = my_unserialize($view['fields']);
}
if(!is_array($view['custom_profile_fields']))
{
$view['custom_profile_fields'] = my_unserialize($view['custom_profile_fields']);
}
if(isset($mybb->input['username']))
{
$view['conditions']['username'] = $mybb->input['username'];
$view['url'] .= "&username=".urlencode(htmlspecialchars_uni($mybb->input['username']));
}
if(!empty($view['vid']))
{
$view['url'] .= "&vid={$view['vid']}";
}
else
{
// If this is a custom view we need to save everything ready to pass it on from page to page
global $admin_session;
if(empty($mybb->input['search_id']))
{
$search_id = md5(random_str());
$admin_session['data']['user_views'][$search_id] = $view;
update_admin_session('user_views', $admin_session['data']['user_views']);
$mybb->input['search_id'] = $search_id;
}
$view['url'] .= "&search_id=".htmlspecialchars_uni($mybb->input['search_id']);
}
if(!isset($admin_session['data']['last_users_view']) || $admin_session['data']['last_users_view'] != str_replace("&", "&", $view['url']))
{
update_admin_session('last_users_url', str_replace("&", "&", $view['url']));
}
if(isset($view['conditions']['referrer'])){
$view['url'] .= "&action=referrers&uid=".htmlspecialchars_uni($view['conditions']['referrer']);
}
// Do we not have any views?
if(empty($view))
{
return false;
}
$table = new Table;
// Build header for table based view
if($view['view_type'] != "card")
{
foreach($view['fields'] as $field)
{
if(!$user_view_fields[$field])
{
continue;
}
$view_field = $user_view_fields[$field];
$field_options = array();
if($view_field['width'])
{
$field_options['width'] = $view_field['width'];
}
if($view_field['align'])
{
$field_options['class'] = "align_".$view_field['align'];
}
$table->construct_header($view_field['title'], $field_options);
}
$table->construct_header(""); // Create a header for the "select" boxes
}
$search_sql = '1=1';
// Build the search SQL for users
// List of valid LIKE search fields
$user_like_fields = array("username", "email", "website", "icq", "skype", "google", "signature", "usertitle");
foreach($user_like_fields as $search_field)
{
if(!empty($view['conditions'][$search_field]) && empty($view['conditions'][$search_field.'_blank']))
{
$search_sql .= " AND u.{$search_field} LIKE '%".$db->escape_string_like($view['conditions'][$search_field])."%'";
}
else if(!empty($view['conditions'][$search_field.'_blank']))
{
$search_sql .= " AND u.{$search_field} != ''";
}
}
// EXACT matching fields
$user_exact_fields = array("referrer");
foreach($user_exact_fields as $search_field)
{
if(!empty($view['conditions'][$search_field]))
{
$search_sql .= " AND u.{$search_field}='".$db->escape_string($view['conditions'][$search_field])."'";
}
}
// LESS THAN or GREATER THAN
$direction_fields = array("postnum", "threadnum");
foreach($direction_fields as $search_field)
{
$direction_field = $search_field."_dir";
if(isset($view['conditions'][$search_field]) && ($view['conditions'][$search_field] || $view['conditions'][$search_field] === '0') && $view['conditions'][$direction_field])
{
switch($view['conditions'][$direction_field])
{
case "greater_than":
$direction = ">";
break;
case "less_than":
$direction = "<";
break;
default:
$direction = "=";
}
$search_sql .= " AND u.{$search_field}{$direction}'".$db->escape_string($view['conditions'][$search_field])."'";
}
}
// Registration searching
$reg_fields = array("regdate");
foreach($reg_fields as $search_field)
{
if(!empty($view['conditions'][$search_field]) && (int)$view['conditions'][$search_field])
{
$threshold = TIME_NOW - ((int)$view['conditions'][$search_field] * 24 * 60 * 60);
$search_sql .= " AND u.{$search_field} >= '{$threshold}'";
}
}
// IP searching
$ip_fields = array("regip", "lastip");
foreach($ip_fields as $search_field)
{
if(!empty($view['conditions'][$search_field]))
{
$ip_range = fetch_ip_range($view['conditions'][$search_field]);
if(!is_array($ip_range))
{
$ip_sql = "{$search_field}=".$db->escape_binary($ip_range);
}
else
{
$ip_sql = "{$search_field} BETWEEN ".$db->escape_binary($ip_range[0])." AND ".$db->escape_binary($ip_range[1]);
}
$search_sql .= " AND {$ip_sql}";
}
}
// Post IP searching
if(!empty($view['conditions']['postip']))
{
$ip_range = fetch_ip_range($view['conditions']['postip']);
if(!is_array($ip_range))
{
$ip_sql = "ipaddress=".$db->escape_binary($ip_range);
}
else
{
$ip_sql = "ipaddress BETWEEN ".$db->escape_binary($ip_range[0])." AND ".$db->escape_binary($ip_range[1]);
}
$ip_uids = array(0);
$query = $db->simple_select("posts", "uid", $ip_sql);
while($uid = $db->fetch_field($query, "uid"))
{
$ip_uids[] = $uid;
}
$search_sql .= " AND u.uid IN(".implode(',', $ip_uids).")";
unset($ip_uids);
}
// Custom Profile Field searching
if($view['custom_profile_fields'])
{
$userfield_sql = '1=1';
foreach($view['custom_profile_fields'] as $column => $input)
{
if(!preg_match('/^fid[0-9]+(_blank)?$/', $column))
{
continue;
}
if(is_array($input))
{
foreach($input as $value => $text)
{
if($value == $column)
{
$value = $text;
}
if($value == $lang->na)
{
continue;
}
if(strpos($column, '_blank') !== false)
{
$column = str_replace('_blank', '', $column);
$userfield_sql .= ' AND '.$db->escape_string($column)." != ''";
}
else
{
$userfield_sql .= ' AND '.$db->escape_string($column)."='".$db->escape_string($value)."'";
}
}
}
else if(!empty($input))
{
if($input == $lang->na)
{
continue;
}
if(strpos($column, '_blank') !== false)
{
$column = str_replace('_blank', '', $column);
$userfield_sql .= ' AND '.$db->escape_string($column)." != ''";
}
else
{
$userfield_sql .= ' AND '.$db->escape_string($column)." LIKE '%".$db->escape_string_like($input)."%'";
}
}
}
if($userfield_sql != '1=1')
{
$userfield_uids = array(0);
$query = $db->simple_select("userfields", "ufid", $userfield_sql);
while($userfield = $db->fetch_array($query))
{
$userfield_uids[] = $userfield['ufid'];
}
$search_sql .= " AND u.uid IN(".implode(',', $userfield_uids).")";
unset($userfield_uids);
}
}
// Usergroup based searching
if(isset($view['conditions']['usergroup']))
{
if(!is_array($view['conditions']['usergroup']))
{
$view['conditions']['usergroup'] = array($view['conditions']['usergroup']);
}
foreach($view['conditions']['usergroup'] as $usergroup)
{
$usergroup = (int)$usergroup;
if(!$usergroup)
{
continue;
}
$additional_sql = '';
switch($db->type)
{
case "pgsql":
case "sqlite":
$additional_sql .= " OR ','||additionalgroups||',' LIKE '%,{$usergroup},%'";
break;
default:
$additional_sql .= "OR CONCAT(',',additionalgroups,',') LIKE '%,{$usergroup},%'";
}
}
$search_sql .= " AND (u.usergroup IN (".implode(",", array_map('intval', $view['conditions']['usergroup'])).") {$additional_sql})";
}
// COPPA users only?
if(isset($view['conditions']['coppa']))
{
$search_sql .= " AND u.coppauser=1 AND u.usergroup=5";
}
// Extra SQL?
if(isset($view['extra_sql']))
{
$search_sql .= $view['extra_sql'];
}
// Lets fetch out how many results we have
$query = $db->query("
SELECT COUNT(u.uid) AS num_results
FROM ".TABLE_PREFIX."users u
WHERE {$search_sql}
");
$num_results = $db->fetch_field($query, "num_results");
// No matching results then return false
if(!$num_results)
{
return false;
}
// Generate the list of results
else
{
if(!$view['perpage'])
{
$view['perpage'] = 20;
}
$view['perpage'] = (int)$view['perpage'];
// Establish which page we're viewing and the starting index for querying
if(!isset($mybb->input['page']))
{
$mybb->input['page'] = 1;
}
else
{
$mybb->input['page'] = $mybb->get_input('page', MyBB::INPUT_INT);
}
if($mybb->input['page'])
{
$start = ($mybb->input['page'] - 1) * $view['perpage'];
$pages = ceil($num_results / $view['perpage']);
if($mybb->input['page'] > $pages)
{
$start = 0;
$mybb->input['page'] = 1;
}
}
else
{
$start = 0;
$mybb->input['page'] = 1;
}
$from_bit = "";
if(isset($mybb->input['from']) && $mybb->input['from'] == "home")
{
$from_bit = "&from=home";
}
switch($view['sortby'])
{
case "regdate":
case "lastactive":
case "postnum":
case "reputation":
$view['sortby'] = $db->escape_string($view['sortby']);
break;
case "numposts":
$view['sortby'] = "postnum";
break;
case "numthreads":
$view['sortby'] = "threadnum";
break;
case "warninglevel":
$view['sortby'] = "warningpoints";
break;
default:
$view['sortby'] = "username";
}
if($view['sortorder'] != "desc")
{
$view['sortorder'] = "asc";
}
$usergroups = $cache->read("usergroups");
// Fetch matching users
$query = $db->query("
SELECT u.*
FROM ".TABLE_PREFIX."users u
WHERE {$search_sql}
ORDER BY {$view['sortby']} {$view['sortorder']}
LIMIT {$start}, {$view['perpage']}
");
$users = '';
while($user = $db->fetch_array($query))
{
$comma = $groups_list = '';
$user['username'] = htmlspecialchars_uni($user['username']);
$user['view']['username'] = "".format_name($user['username'], $user['usergroup'], $user['displaygroup'])."";
$user['view']['usergroup'] = htmlspecialchars_uni($usergroups[$user['usergroup']]['title']);
if($user['additionalgroups'])
{
$additional_groups = explode(",", $user['additionalgroups']);
foreach($additional_groups as $group)
{
$groups_list .= $comma.htmlspecialchars_uni($usergroups[$group]['title']);
$comma = $lang->comma;
}
}
if(!$groups_list)
{
$groups_list = $lang->none;
}
$user['view']['additionalgroups'] = "{$groups_list}";
$user['view']['email'] = "".htmlspecialchars_uni($user['email'])."";
$user['view']['regdate'] = my_date('relative', $user['regdate']);
$last_seen = max(array($user['lastactive'], $user['lastvisit']));
if(!empty($last_seen))
{
$user['view']['lastactive'] = my_date('relative', $last_seen);
}
else
{
$user['view']['lastactive'] = $lang->never;
}
// Build popup menu
$popup = new PopupMenu("user_{$user['uid']}", $lang->options);
$popup->add_item($lang->view_profile, $mybb->settings['bburl'].'/'.get_profile_link($user['uid']));
$popup->add_item($lang->edit_profile_and_settings, "index.php?module=user-users&action=edit&uid={$user['uid']}");
// Banning options... is this user banned?
if($usergroups[$user['usergroup']]['isbannedgroup'] == 1)
{
// Yes, so do we want to edit the ban or pardon his crime?
$popup->add_item($lang->edit_ban, "index.php?module=user-banning&uid={$user['uid']}#username");
$popup->add_item($lang->lift_ban, "index.php?module=user-banning&action=lift&uid={$user['uid']}&my_post_key={$mybb->post_code}");
}
else
{
// Not banned... but soon maybe!
$popup->add_item($lang->ban_user, "index.php?module=user-banning&uid={$user['uid']}#username");
}
if($user['usergroup'] == 5)
{
if($user['coppauser'])
{
$popup->add_item($lang->approve_coppa_user, "index.php?module=user-users&action=activate_user&uid={$user['uid']}&my_post_key={$mybb->post_code}{$from_bit}");
}
else
{
$popup->add_item($lang->approve_user, "index.php?module=user-users&action=activate_user&uid={$user['uid']}&my_post_key={$mybb->post_code}{$from_bit}");
}
}
$popup->add_item($lang->delete_user, "index.php?module=user-users&action=delete&uid={$user['uid']}&my_post_key={$mybb->post_code}", "return AdminCP.deleteConfirmation(this, '{$lang->user_deletion_confirmation}')");
$popup->add_item($lang->show_referred_users, "index.php?module=user-users&action=referrers&uid={$user['uid']}");
$popup->add_item($lang->show_ip_addresses, "index.php?module=user-users&action=ipaddresses&uid={$user['uid']}");
$popup->add_item($lang->show_attachments, "index.php?module=forum-attachments&results=1&username=".urlencode($user['username']));
$user['view']['controls'] = $popup->fetch();
// Fetch the reputation for this user
if($usergroups[$user['usergroup']]['usereputationsystem'] == 1 && $mybb->settings['enablereputation'] == 1)
{
$user['view']['reputation'] = get_reputation($user['reputation']);
}
else
{
$reputation = "-";
}
if($mybb->settings['enablewarningsystem'] != 0 && $usergroups[$user['usergroup']]['canreceivewarnings'] != 0)
{
if($mybb->settings['maxwarningpoints'] < 1)
{
$mybb->settings['maxwarningpoints'] = 10;
}
$warning_level = round($user['warningpoints']/$mybb->settings['maxwarningpoints']*100);
if($warning_level > 100)
{
$warning_level = 100;
}
$user['view']['warninglevel'] = get_colored_warning_level($warning_level);
}
if($view['view_type'] == "card")
{
$max_dimensions = '80x80';
}
else
{
$max_dimensions = '34x34';
}
$avatar = format_avatar($user['avatar'], $user['avatardimensions'], $max_dimensions);
$user['view']['avatar'] = "";
// Convert IP's to readable
$user['regip'] = my_inet_ntop($db->unescape_binary($user['regip']));
$user['lastip'] = my_inet_ntop($db->unescape_binary($user['lastip']));
if($view['view_type'] == "card")
{
$users .= build_user_view_card($user, $view, $i);
}
else
{
build_user_view_table($user, $view, $table);
}
}
// If card view, we need to output the results
if($view['view_type'] == "card")
{
$table->construct_cell($users);
$table->construct_row();
}
}
if(!isset($view['table_id']))
{
$view['table_id'] = "users_list";
}
$switch_view = "";
$switch_url = $view['url'];
if($mybb->input['page'] > 0)
{
$switch_url .= "&page=".$mybb->get_input('page', MyBB::INPUT_INT);
}
if($view['view_type'] != "card")
{
$switch_view .= "
{$lang->table_view} |
{$lang->card_view}";
}
else
{
$switch_view .= "
{$lang->table_view} |
{$lang->card_view}";
}
$switch_view .= "
";
// Do we need to construct the pagination?
if($num_results > $view['perpage'])
{
$view_type = htmlspecialchars_uni($view['view_type']);
$pagination = draw_admin_pagination($mybb->input['page'], $view['perpage'], $num_results, $view['url']."&type={$view_type}");
$search_class = "float_right";
$search_style = "";
}
else
{
$search_class = '';
$search_style = "text-align: right;";
}
$search_action = $view['url'];
// stop &username= in the query string
if($view_upos = strpos($search_action, '&username='))
{
$search_action = substr($search_action, 0, $view_upos);
}
$search_action = str_replace("&", "&", $search_action);
$search = new Form(htmlspecialchars_uni($search_action), 'post', 'search_form', 0, '', true);
$built_view = $search->construct_return;
$built_view .= "";
$built_view .= $search->generate_hidden_field('action', 'search')."\n";
if(isset($view['conditions']['username']))
{
$default_class = '';
$value = $view['conditions']['username'];
}
else
{
$default_class = "search_default";
$value = $lang->search_for_user;
}
$built_view .= $search->generate_text_box('username', htmlspecialchars_uni($value), array('id' => 'search_keywords', 'class' => "{$default_class} field150 field_small"))."\n";
$built_view .= "
search}\" />\n";
if(!empty($view['popup']))
{
$built_view .= "
{$view['popup']}
\n";
}
$built_view .= "\n";
$built_view .= "
\n";
// Autocompletion for usernames
// TODO Select2
$built_view .= $search->end();
if(isset($pagination))
{
$built_view .= $pagination;
}
if($view['view_type'] != "card")
{
$checkbox = '';
}
else
{
$checkbox = " ";
}
$built_view .= $table->construct_html("{$switch_view}{$checkbox}{$lang->users}{$view_title}
", 1, "", $view['table_id']);
if(isset($pagination))
{
$built_view .= $pagination;
}
$built_view .= '
';
return $built_view;
}
/**
* @param array $user
* @param array $view
* @param int $i
*
* @return string
*/
function build_user_view_card($user, $view, &$i)
{
global $user_view_fields;
++$i;
if($i == 3)
{
$i = 1;
}
// Loop through fields user wants to show
foreach($view['fields'] as $field)
{
if(!$user_view_fields[$field])
{
continue;
}
$view_field = $user_view_fields[$field];
// Special conditions for avatar
if($field == "avatar")
{
$avatar = $user['view']['avatar'];
}
else if($field == "controls")
{
$controls = $user['view']['controls'];
}
// Otherwise, just user data
else if($field != "username")
{
if(isset($user['view'][$field]))
{
$value = $user['view'][$field];
}
else
{
$value = $user[$field];
}
if($field == "postnum")
{
$value = my_number_format($value);
}
$user_details[] = "{$view_field['title']}: {$value}";
}
}
// Floated to the left or right?
if($i == 1)
{
$float = "left";
}
else
{
$float = "right";
}
// And build the final card
$uname = "";
if(in_array('username', $view['fields']))
{
$uname = $user['view']['username'];
}
$card = "";
return $card;
}
/**
* @param array $user
* @param array $view
* @param DefaultTable $table
*/
function build_user_view_table($user, $view, &$table)
{
global $user_view_fields;
foreach($view['fields'] as $field)
{
if(!$user_view_fields[$field])
{
continue;
}
$view_field = $user_view_fields[$field];
$field_options = array();
if(($view_field['align']))
{
$field_options['class'] = "align_".$view_field['align'];
}
if(!empty($user['view'][$field]))
{
$value = $user['view'][$field];
}
else
{
$value = $user[$field];
}
if($field == "postnum")
{
$value = my_number_format($user[$field]);
}
$table->construct_cell($value, $field_options);
}
$table->construct_cell("");
$table->construct_row();
}
/**
* @param array $fields
* @param array $values
* @param DefaultFormContainer $form_container
* @param DefaultForm $form
* @param bool $search
*/
function output_custom_profile_fields($fields, $values, &$form_container, &$form, $search=false)
{
global $lang, $mybb;
if(!is_array($fields))
{
return;
}
foreach($fields as $profile_field)
{
$profile_field['name'] = htmlspecialchars_uni($profile_field['name']);
$profile_field['description'] = htmlspecialchars_uni($profile_field['description']);
$type_data = explode("\n", $profile_field['type'], 2);
$type = $type_data[0];
$options = !empty($type_data[1]) ? $type_data[1] : null;
$type = trim($type);
$field_name = "fid{$profile_field['fid']}";
if(!isset($values[$field_name]))
{
$values[$field_name] = '';
}
if(!isset($values[$field_name.'_blank']))
{
$values[$field_name.'_blank'] = '';
}
switch($type)
{
case "multiselect":
$selected_options = array();
if(!is_array($values[$field_name]))
{
$user_options = explode("\n", $values[$field_name]);
}
else
{
$user_options = $values[$field_name];
}
foreach($user_options as $val)
{
$selected_options[$val] = htmlspecialchars_uni($val);
}
$select_options = explode("\n", $options);
$options = array();
if($search == true)
{
$select_options[''] = $lang->na;
}
foreach($select_options as $val)
{
$val = htmlspecialchars_uni(trim($val));
$options[$val] = $val;
}
if(!$profile_field['length'])
{
$profile_field['length'] = 3;
}
$code = $form->generate_select_box("profile_fields[{$field_name}][]", $options, $selected_options, array('id' => "profile_field_{$field_name}", 'multiple' => true, 'size' => $profile_field['length']));
break;
case "select":
$select_options = array();
if($search == true)
{
$select_options[''] = $lang->na;
}
$select_options += explode("\n", $options);
$options = array();
foreach($select_options as $val)
{
$val = htmlspecialchars_uni(trim($val));
$options[$val] = $val;
}
if(!$profile_field['length'])
{
$profile_field['length'] = 1;
}
if($search == true)
{
$code = $form->generate_select_box("profile_fields[{$field_name}][{$field_name}]", $options, htmlspecialchars_uni($values[$field_name]), array('id' => "profile_field_{$field_name}", 'size' => $profile_field['length']));
}
else
{
$code = $form->generate_select_box("profile_fields[{$field_name}]", $options, htmlspecialchars_uni($values[$field_name]), array('id' => "profile_field_{$field_name}", 'size' => $profile_field['length']));
}
break;
case "radio":
$radio_options = array();
if($search == true)
{
$radio_options[''] = $lang->na;
}
$radio_options += explode("\n", $options);
$code = '';
foreach($radio_options as $val)
{
$val = trim($val);
$code .= $form->generate_radio_button("profile_fields[{$field_name}]", $val, htmlspecialchars_uni($val), array('id' => "profile_field_{$field_name}", 'checked' => ($val == $values[$field_name] ? true : false)))."
";
}
break;
case "checkbox":
$select_options = array();
if(!is_array($values[$field_name]))
{
$user_options = explode("\n", $values[$field_name]);
}
else
{
$user_options = $values[$field_name];
}
$selected_options = array();
foreach($user_options as $val)
{
$selected_options[$val] = $val;
}
if($search == true)
{
$select_options[''] = $lang->na;
}
$select_options += explode("\n", $options);
$code = '';
foreach($select_options as $val)
{
$val = trim($val);
$code .= $form->generate_check_box("profile_fields[{$field_name}][]", $val, htmlspecialchars_uni($val), array('id' => "profile_field_{$field_name}", 'checked' => (isset($selected_options[$val]) && $val == $selected_options[$val] ? true : false)))."
";
}
break;
case "textarea":
$extra = '';
if(isset($mybb->input['action']) && $mybb->input['action'] == "search")
{
$extra = " {$lang->or} ".$form->generate_check_box("profile_fields[{$field_name}_blank]", 1, $lang->is_not_blank, array('id' => "{$field_name}_blank", 'checked' => $values[$field_name.'_blank']));
}
$code = $form->generate_text_area("profile_fields[{$field_name}]", $values[$field_name], array('id' => "profile_field_{$field_name}", 'rows' => 6, 'cols' => 50)).$extra;
break;
default:
$extra = '';
if(isset($mybb->input['action']) && $mybb->input['action'] == "search")
{
$extra = " {$lang->or} ".$form->generate_check_box("profile_fields[{$field_name}_blank]", 1, $lang->is_not_blank, array('id' => "{$field_name}_blank", 'checked' => $values[$field_name.'_blank']));
}
$code = $form->generate_text_box("profile_fields[{$field_name}]", $values[$field_name], array('id' => "profile_field_{$field_name}", 'maxlength' => $profile_field['maxlength'], 'length' => $profile_field['length'])).$extra;
break;
}
$form_container->output_row($profile_field['name'], $profile_field['description'], $code, "", array('id' => "profile_field_{$field_name}"));
$code = $user_options = $selected_options = $radio_options = $val = $options = '';
}
}
/**
* @param array $input
* @param DefaultForm $form
*/
function user_search_conditions($input, &$form)
{
global $mybb, $db, $lang;
if(!$input)
{
$input = $mybb->input;
}
if(empty($input['conditions']))
{
$input['conditions'] = array();
}
if(!is_array($input['conditions']))
{
$input['conditions'] = (array)my_unserialize($input['conditions']);
}
$array = array('username', 'email', 'usergroup', 'website', 'website_blank', 'icq', 'icq_blank', 'skype', 'skype_blank', 'google', 'google_blank', 'signature', 'signature_blank', 'usertitle', 'usertitle_blank', 'postnum_dir', 'postnum', 'threadnum_dir', 'threadnum', 'regdate', 'regip', 'lastip', 'postip');
foreach($array as $condition)
{
if(!isset($input['conditions'][$condition]))
{
$input['conditions'][$condition] = '';
}
}
if(empty($input['profile_fields']))
{
$input['profile_fields'] = array();
}
if(!is_array($input['profile_fields']))
{
$input['profile_fields'] = (array)my_unserialize($input['profile_fields']);
}
if(empty($input['fields']))
{
$input['fields'] = array();
}
if(!is_array($input['fields']))
{
$input['fields'] = (array)my_unserialize($input['fields']);
}
$form_container = new FormContainer($lang->find_users_where);
$form_container->output_row($lang->username_contains, "", $form->generate_text_box('conditions[username]', htmlspecialchars_uni($input['conditions']['username']), array('id' => 'username')), 'username');
$form_container->output_row($lang->email_address_contains, "", $form->generate_text_box('conditions[email]', $input['conditions']['email'], array('id' => 'email')), 'email');
$options = array();
$query = $db->simple_select("usergroups", "gid, title", "gid != '1'", array('order_by' => 'title'));
while($usergroup = $db->fetch_array($query))
{
$options[$usergroup['gid']] = htmlspecialchars_uni($usergroup['title']);
}
$form_container->output_row($lang->is_member_of_groups, $lang->additional_user_groups_desc, $form->generate_select_box('conditions[usergroup][]', $options, $input['conditions']['usergroup'], array('id' => 'usergroups', 'multiple' => true, 'size' => 5)), 'usergroups');
$form_container->output_row($lang->website_contains, "", $form->generate_text_box('conditions[website]', $input['conditions']['website'], array('id' => 'website'))." {$lang->or} ".$form->generate_check_box('conditions[website_blank]', 1, $lang->is_not_blank, array('id' => 'website_blank', 'checked' => $input['conditions']['website_blank'])), 'website');
$form_container->output_row($lang->icq_number_contains, "", $form->generate_text_box('conditions[icq]', $input['conditions']['icq'], array('id' => 'icq'))." {$lang->or} ".$form->generate_check_box('conditions[icq_blank]', 1, $lang->is_not_blank, array('id' => 'icq_blank', 'checked' => $input['conditions']['icq_blank'])), 'icq');
$form_container->output_row($lang->skype_contains, "", $form->generate_text_box('conditions[skype]', $input['conditions']['skype'], array('id' => 'skype'))." {$lang->or} ".$form->generate_check_box('conditions[skype_blank]', 1, $lang->is_not_blank, array('id' => 'skype_blank', 'checked' => $input['conditions']['skype_blank'])), 'skype');
$form_container->output_row($lang->google_contains, "", $form->generate_text_box('conditions[google]', $input['conditions']['google'], array('id' => 'google'))." {$lang->or} ".$form->generate_check_box('conditions[google_blank]', 1, $lang->is_not_blank, array('id' => 'google_blank', 'checked' => $input['conditions']['google_blank'])), 'google');
$form_container->output_row($lang->signature_contains, "", $form->generate_text_box('conditions[signature]', $input['conditions']['signature'], array('id' => 'signature'))." {$lang->or} ".$form->generate_check_box('conditions[signature_blank]', 1, $lang->is_not_blank, array('id' => 'signature_blank', 'checked' => $input['conditions']['signature_blank'])), 'signature');
$form_container->output_row($lang->user_title_contains, "", $form->generate_text_box('conditions[usertitle]', $input['conditions']['usertitle'], array('id' => 'usertitle'))." {$lang->or} ".$form->generate_check_box('conditions[usertitle_blank]', 1, $lang->is_not_blank, array('id' => 'usertitle_blank', 'checked' => $input['conditions']['usertitle_blank'])), 'usertitle');
$greater_options = array(
"greater_than" => $lang->greater_than,
"is_exactly" => $lang->is_exactly,
"less_than" => $lang->less_than
);
$form_container->output_row($lang->post_count_is, "", $form->generate_select_box('conditions[postnum_dir]', $greater_options, $input['conditions']['postnum_dir'], array('id' => 'numposts_dir'))." ".$form->generate_text_box('conditions[postnum]', $input['conditions']['postnum'], array('id' => 'numposts')), 'numposts');
$form_container->output_row($lang->thread_count_is, "", $form->generate_select_box('conditions[threadnum_dir]', $greater_options, $input['conditions']['threadnum_dir'], array('id' => 'numthreads_dir'))." ".$form->generate_text_box('conditions[threadnum]', $input['conditions']['threadnum'], array('id' => 'numthreads')), 'numthreads');
$form_container->output_row($lang->reg_in_x_days, '', $form->generate_text_box('conditions[regdate]', $input['conditions']['regdate'], array('id' => 'regdate')).' '.$lang->days, 'regdate');
$form_container->output_row($lang->reg_ip_matches, $lang->wildcard, $form->generate_text_box('conditions[regip]', $input['conditions']['regip'], array('id' => 'regip')), 'regip');
$form_container->output_row($lang->last_known_ip, $lang->wildcard, $form->generate_text_box('conditions[lastip]', $input['conditions']['lastip'], array('id' => 'lastip')), 'lastip');
$form_container->output_row($lang->posted_with_ip, $lang->wildcard, $form->generate_text_box('conditions[postip]', $input['conditions']['postip'], array('id' => 'postip')), 'postip');
$form_container->end();
// Custom profile fields go here
$form_container = new FormContainer($lang->custom_profile_fields_match);
// Fetch custom profile fields
$query = $db->simple_select("profilefields", "*", "", array('order_by' => 'disporder'));
$profile_fields = array(
'required' => array(),
'optional' => array(),
);
while($profile_field = $db->fetch_array($query))
{
if($profile_field['required'] == 1)
{
$profile_fields['required'][] = $profile_field;
}
else
{
$profile_fields['optional'][] = $profile_field;
}
}
output_custom_profile_fields($profile_fields['required'], $input['profile_fields'], $form_container, $form, true);
output_custom_profile_fields($profile_fields['optional'], $input['profile_fields'], $form_container, $form, true);
$form_container->end();
// Autocompletion for usernames
echo '
';
}
/**
* @param int $source_uid
* @param int $destination_uid
*/
function merge_thread_ratings($source_uid, $destination_uid)
{
global $db;
$source_ratings = $dest_threads = $delete_list = $decrement_list = array();
// Get all thread ratings from both accounts
$query = $db->simple_select('threadratings', 'tid, uid, rid, rating', "uid IN ({$destination_uid}, {$source_uid})");
while($rating = $db->fetch_array($query))
{
if($rating['uid'] == $destination_uid)
{
$dest_threads[] = $rating['tid'];
}
else
{
$source_ratings[] = $rating;
}
}
// If there are duplicates, mark them for deletion
foreach($source_ratings as $rating)
{
if(in_array($rating['tid'], $dest_threads))
{
$delete_list[] = $rating['rid'];
$decrement_list[$rating['tid']][] = (int) $rating['rating'];
}
}
// Attribute all of the source user's ratings to the destination user
$db->update_query("threadratings", array("uid" => $destination_uid), "uid='{$source_uid}'");
// Remove ratings previously given to recently acquired threads
$query = $db->query("
SELECT tr.rid, tr.rating, t.tid
FROM {$db->table_prefix}threadratings tr
LEFT JOIN {$db->table_prefix}threads t ON (t.tid=tr.tid)
WHERE tr.uid='{$destination_uid}' AND tr.uid=t.uid
");
while($rating = $db->fetch_array($query))
{
$delete_list[] = $rating['rid'];
$decrement_list[$rating['tid']][] = (int) $rating['rating'];
}
// Delete the duplicate/disallowed ratings
if(!empty($delete_list))
{
$imp = implode(',', $delete_list);
$db->delete_query('threadratings', "rid IN ({$imp})");
}
// Correct the thread rating counters
if(!empty($decrement_list))
{
foreach($decrement_list as $tid => $ratings)
{
if(is_array($ratings))
{
$db->update_query('threads', array('numratings' => 'numratings-'.count($ratings), 'totalratings' => 'totalratings-'.array_sum($ratings)), "tid='{$tid}'", 1, true);
}
}
}
}