<?php

abstract class XenForo_Helper_Email
{
	/**
	 * Banned email cache for default banned emails option.
	 *
	 * @var array|null Null when not set up
	 */
	protected static $_bannedEmailCache = null;

	/**
	 * Determines if the specified email is banned. List of banned emails
	 * is simply an array of strings with * as wildcards.
	 *
	 * @param string $email
	 * @param array|null $bannedEmails List of banned emails; if null, uses the default value
	 *
	 * @return boolean
	 */
	public static function isEmailBanned($email, array $bannedEmails = null)
	{
		if ($bannedEmails === null)
		{
			if (self::$_bannedEmailCache === null)
			{
				$bannedEmails = XenForo_Model::create('XenForo_Model_DataRegistry')->get('bannedEmails');
				if (!is_array($bannedEmails))
				{
					$bannedEmails = XenForo_Model::create('XenForo_Model_Banning')->rebuildBannedEmailCache();
				}

				self::$_bannedEmailCache = $bannedEmails;
			}
			else
			{
				$bannedEmails = self::$_bannedEmailCache;
			}
		}

		foreach ($bannedEmails AS $bannedEmail)
		{
			$bannedEmail = str_replace('\\*', '(.*)', preg_quote($bannedEmail, '/'));
			if (preg_match('/^' . $bannedEmail . '$/i', $email))
			{
				return true;
			}
		}

		return false;
	}

	/**
	 * Determine if an email is valid (does not validate TLDs).
	 *
	 * @param string $email
	 *
	 * @return bool
	 */
	public static function isEmailValid($email)
	{
		if (preg_match('/["\'\s\\\\]/', $email))
		{
			// rejecting some odd emails as a sanity check
			return false;
		}

		$validator = new Zend_Validate_EmailAddress();
		$validator->getHostnameValidator()
			->setValidateTld(false)
			->setValidateIdn(false);
		return $validator->isValid($email);
	}

	public static function emailHasTypo($email)
	{
		// This is a very basic function and is really just trying to catch simple typos.
		// Most significantly, gamil.com since this can trigger an SFS action unexpectedly.
		$matches = array(
			'gamil.com',
			'gmial.com',
			'gmail.cmo',
			'gmail.co',
			'gmail.cm',
			'gnail.com',
			'hotnail.com',
			'hotmail.cmo',
			'hotmail.co',
			'hotmail.cm',
			'yahooo.com',
			'yaho.com',
			'yahoo.co',
			'yahoo.cmo',
			'yahoo.cm'
		);

		$regex = implode('|', array_map('preg_quote', $matches));
		return preg_match('/@(' . $regex . ')$/i', $email) ? true : false;
	}
}