MyBB Community Forums

Full Version: Disallowed user and mails with regexp
You're currently viewing a stripped down version of our content. View the full version with proper formatting.
It could be an interesting feature to use regexp for disallowing usernames and emails.

Short example: I had yesterday 3 spammers, with username me886me, tu886tu and we886we, and their mail was <username>@outlook.com
I can't forbid *@outlook.com and I can't ban *886*, but I probably can ban ([a-z]{2})\d{3}\1 as username
That's sounds pretty good and it seems too logical...... I also want this.
Looking @ is_banned_username() and is_banned_email(), it could be quite easy to do.
I've 2 proposals:
- use a special char at the beginning of the mask
- add a checkbox (and a field in mybb_banfilters)

And modification in function should be something like:
/**
 * Checks if a username has been disallowed for registration/use.
 *
 * @param string $username The username
 * @param boolean $update_lastuse True if the 'last used' dateline should be updated if a match is found.
 * @return boolean True if banned, false if not banned
 */
function is_banned_username($username, $update_lastuse=false)
{
	global $db;
	$query = $db->simple_select('banfilters', 'filter, fid, regex', "type='2'");
	while($banned_username = $db->fetch_array($query))
	{
		// Make regular expression * match
		if ($banned_username['regex']==1)
		{
			$pattern = "#^" . $banned_username['filter'] . "$#i";
		}
		else
		{
			$banned_username['filter'] = str_replace('\*', '(.*)', preg_quote($banned_username['filter'], '#'));
			$pattern = "#(^|\b){$banned_username['filter']}($|\b)#i";
  		}
		if(preg_match($pattern, $username))
		{
			// Updating last use
			if($update_lastuse == true)
			{
				$db->update_query("banfilters", array("lastuse" => TIME_NOW), "fid='{$banned_username['fid']}'");
			}
			return true;
		}
	}
	// Still here - good username
	return false;
}
The creation of $pattern is only because if we need back references, we must not have capture group at the beginning.