<?php

if(!defined('IN_MYBB'))
	die('This file cannot be accessed directly.');


$plugins->add_hook('datahandler_user_validate', 'stduname_run');
$plugins->add_hook('datahandler_post_validate_post', 'stduname_run_post');
$plugins->add_hook('datahandler_post_validate_thread', 'stduname_run_post');
if($GLOBALS['mybb']->version_code >= 1700)
	$plugins->add_hook('xmlhttp', 'stduname_ajaxreg_18');
elseif($GLOBALS['mybb']->version_code >= 1400)
	$plugins->add_hook('xmlhttp', 'stduname_ajaxreg');

function stduname_info()
{
	return array(
		'name'			=> 'Disable Special Characters in Usernames',
		'description'	=> 'Only allows users to sign up with usernames container letters, numbers and the underscore (_) character.',
		'website'		=> 'http://mybbhacks.zingaburga.com/',
		'author'		=> 'ZiNgA BuRgA',
		'authorsite'	=> 'http://zingaburga.com/',
		'version'		=> '1.4',
		'compatibility'	=> '1*',
		'guid'			=> ''
	);
}

function stduname_activate()
{
	global $db, $mybb;
	$tableprefix = ($mybb->version_code>=1400?'':TABLE_PREFIX);
	$gid = $db->fetch_field($db->simple_select($tableprefix.'settinggroups', 'gid', 'name="member"'), 'gid');
	
	$db->insert_query($tableprefix.'settings', array(
		'gid' => $gid,
		'name' => 'stduname_allowedchars',
		'title' => 'Allowed Special Characters',
		'description' => $db->escape_string('List of special (non-alphanumeric) characters which are allowed in usernames.  Just enter the characters you want to allow - don\'t comma separate them etc (eg &quot;_-&quot; will allow both underscores and dashes).'),
		'optionscode' => 'text',
		'value' => '_',
		'disporder' => 1000,
		'isdefault' => 1
	));
	if(function_exists('rebuild_settings')) rebuild_settings();
	else rebuildsettings();
}
function stduname_deactivate()
{
	global $db, $mybb;
	$db->delete_query(($mybb->version_code>=1400?'':TABLE_PREFIX).'settings', 'name="stduname_allowedchars"');
	if(function_exists('rebuild_settings')) rebuild_settings();
	else rebuildsettings();
}

function stduname_validname($name)
{
	global $mybb;
	return !preg_match('#[^0-9a-zA-Z'.strtr($mybb->settings['stduname_allowedchars'], array('\\' => '\\\\', '[' => '\\[', ']' => '\\]', '-' => '\\-', "\0" => '')).']#', $name);
}

function stduname_run(&$uh)
{
	if(!stduname_validname($uh->data['username']))
	{
		global $lang, $mybb;
		$uh->set_error('invalid_username_characters', (htmlspecialchars($mybb->settings['stduname_allowedchars'])));
		isset($lang->userdata_invalid_username_characters) or $lang->userdata_invalid_username_characters = 'The username you entered contains invalid characters.  Only letters, numbers and the following characters are allowed in usernames: {1}';
	}
}
function stduname_run_post(&$ph)
{
	if($ph->data['uid'] != 0 || $ph->data['username'] == $GLOBALS['lang']->guest)
		return;
	
	if(!stduname_validname($ph->data['username']))
	{
		global $lang, $mybb;
		$ph->set_error('invalid_username_characters', (htmlspecialchars($mybb->settings['stduname_allowedchars'])));
		isset($lang->postdata_invalid_username_characters) or $lang->postdata_invalid_username_characters = 'The username you entered contains invalid characters.  Only letters, numbers and the following characters are allowed in usernames: {1}';
	}
}

function stduname_ajaxreg()
{
	global $mybb;
	if($mybb->input['action'] == 'username_availability')
	{
		$username = trim($mybb->input['value']);
		if($username && !stduname_validname($username))
		{
			global $lang, $charset;
			header('Content-type: text/xml; charset='.$charset);
			isset($lang->userdata_invalid_username_characters) or $lang->userdata_invalid_username_characters = 'The username you entered contains invalid characters.  Only letters, numbers and the following characters are allowed in usernames: {1}';
			echo '<fail>'.$lang->sprintf($lang->userdata_invalid_username_characters, htmlspecialchars($mybb->settings['stduname_allowedchars'])).'</fail>';
			exit;
		}
	}
}

function stduname_ajaxreg_18()
{
	global $mybb;
	if($mybb->input['action'] == 'username_availability')
	{
		$username = trim($mybb->input['username']);
		if($username && !stduname_validname($username))
		{
			global $lang;
			die(json_encode($lang->banned_characters_username));
		}
	}
}

?>