<?php
/**
 * EGroupware Api: Postfix using Active Directorys Exchange attributes
 *
 * @link http://www.egroupware.org
 * @package api
 * @subpackage mail
 * @author Ralf Becker <RalfBecker-AT-outdoor-training.de>
 * @copyright (c) 2013-16 by Ralf Becker <RalfBecker-AT-outdoor-training.de>
 * @license http://opensource.org/licenses/gpl-license.php GPL - GNU General Public License
 * @version $Id$
 */

namespace EGroupware\Api\Mail\Smtp;

/**
 * Postfix using Active Directorys proxyAddresses attribute
 * (available without installing Exchange schemas).
 *
 * This plugin is NOT meant to administrate an Exchange Server using AD!
 *
 * Aliases, forwards, forward only and quota is stored in
 * multivalued attribute proxyAddresses with different prefixes.
 *
 * Primary mail address is additionally stored in proxyAddresses.
 * Disabling mail removes proxyAddresses completly.
 *
 * @link http://msdn.microsoft.com/en-us/library/ms679424(v=vs.85).aspx
 * @link http://www.dovecot.org/list/dovecot/2010-February/046763.html
 */
class Ads extends Ldap
{
	/**
	 * Label shown in EMailAdmin
	 */
	const DESCRIPTION = 'Active Directory';
	/**
	 * Capabilities of this class (pipe-separated): default, forward
	 */
	const CAPABILITIES = 'default|forward';

	/**
	 * Name of schema, has to be in the right case!
	 */
	const SCHEMA = 'top';

	/**
	 * Filter for users
	 *
	 * objectCategory is indexed, while objectclass is not!
	 */
	const USER_FILTER = '(objectCategory=person)';

	/**
	 * Name of schema for groups, has to be in the right case!
	 */
	const GROUP_SCHEMA = 'group';

	/**
	 * Attribute to enable mail for an account, OR false if existence of ALIAS_ATTR is enough for mail delivery
	 */
	const MAIL_ENABLE_ATTR = false;

	/**
	 * Attribute for aliases OR false to use mail
	 */
	const ALIAS_ATTR = 'proxyaddresses';

	/**
	 * Caseinsensitive prefix for aliases (eg. "smtp:"), aliases get added with it and only aliases with it are reported
	 */
	const ALIAS_PREFIX = 'smtp:';

	/**
	 * Primary mail address required as an alias too: true or false
	 */
	const REQUIRE_MAIL_AS_ALIAS = true;

	/**
	 * Attribute for forwards OR false if not possible
	 */
	const FORWARD_ATTR = 'proxyaddresses';

	/**
	 * Caseinsensitive prefix for forwards (eg. "forward:"), forwards get added with it and only forwards with it are reported
	 */
	const FORWARD_PREFIX = 'forward:';

	/**
	 * Attribute to only forward mail, OR false if not available
	 */
	const FORWARD_ONLY_ATTR = false;

	/**
	 * Value of forward-only attribute, if not set any value will switch forward only on (checked with =*)
	 */
	const FORWARD_ONLY_VALUE = 'forwardOnly';

	/**
	 * Attribute for mailbox, to which mail gets delivered OR false if not supported
	 */
	const MAILBOX_ATTR = false;

	/**
	 * Attribute for quota limit of user in MB
	 */
	const QUOTA_ATTR = 'proxyaddresses';

	/**
	 * Caseinsensitive prefix for quota (eg. "quota:"), quota get added with it and only quota with it are reported
	 */
	const QUOTA_PREFIX = 'quota:';

	/**
	 * Internal quota in MB is multiplicated with this factor before stored in LDAP
	 */
	const QUOTA_FACTOR = 1048576;

	/**
	 * Attribute for user name
	 */
	const USER_ATTR = 'samaccountname';

	/**
	 * Attribute for numeric user id (optional)
	 *
	 * No single uidNumber attribute, as we use RID (last part of objectSid attribute) for it.
	 */
	const USERID_ATTR = false;

	/**
	 * Return LDAP connection
	 */
	protected function getLdapConnection()
	{
		static $ldap=null;

		if (is_null($ldap))
		{
			if (!is_a($GLOBALS['egw']->accounts->backend, 'EGroupware\\Api\\Accounts\\Ads'))
			{
				throw new \EGroupware\Api\Exception\WrongUserinput('Postfix with Active Directory requires accounts stored in ADS!');
			}
			$ldap = $GLOBALS['egw']->accounts->backend->ldap_connection();
		}
		return $ldap;
	}

	/**
	 * Constructor
	 *
	 * @param string $defaultDomain =null
	 */
	function __construct($defaultDomain=null)
	{
		parent::__construct($defaultDomain);

		$this->setBase($GLOBALS['egw']->accounts->backend->ads_context());
	}
	/**
	 * Return description for EMailAdmin
	 *
	 * @return string
	 */
	public static function description()
	{
		return static::DESCRIPTION;
	}
}