IMAP dynamic login names
This commit is contained in:
		
							parent
							
								
									066dc11564
								
							
						
					
					
						commit
						28b37af889
					
				| 
						 | 
				
			
			@ -1,5 +1,5 @@
 | 
			
		|||
March 2014 4.5
 | 
			
		||||
 | 
			
		||||
  - IMAP: allow dynamic admin user names by replacing wildcards with LDAP attributes
 | 
			
		||||
 | 
			
		||||
18.12.2013 4.4
 | 
			
		||||
  - PyKota support: users, groups, printers, billing codes
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -3024,10 +3024,19 @@ Have fun!
 | 
			
		|||
        can specify the IMAP server name, encryption options, the
 | 
			
		||||
        authentication for the IMAP connection and the valid mail domains. LAM
 | 
			
		||||
        can use either your LAM login password for the IMAP connection or
 | 
			
		||||
        display a dialog where you need to enter the password. The mail
 | 
			
		||||
        domains specify for which accounts mailboxes may be created/deleted.
 | 
			
		||||
        E.g. if you enter "lam-demo.org" then mailboxes can be managed for
 | 
			
		||||
        "user@lam-demo.org" but not for "user@example.com".</para>
 | 
			
		||||
        display a dialog where you need to enter the password. It is also
 | 
			
		||||
        possible to store the admin password in your server profile. This is
 | 
			
		||||
        not recommended for security reasons.</para>
 | 
			
		||||
 | 
			
		||||
        <para>The user name can either be a fixed name (e.g. "admin") or it
 | 
			
		||||
        can be generated with LDAP attributes of the LAM admn user. E.g. $uid$
 | 
			
		||||
        will be transformed to "myUser" if you login with
 | 
			
		||||
        "uid=myUser,ou=people,dc=example,dc=com".</para>
 | 
			
		||||
 | 
			
		||||
        <para>The mail domains specify for which accounts mailboxes may be
 | 
			
		||||
        created/deleted. E.g. if you enter "lam-demo.org" then mailboxes can
 | 
			
		||||
        be managed for "user@lam-demo.org" but not for "user@example.com". Use
 | 
			
		||||
        "*" for any domain.</para>
 | 
			
		||||
 | 
			
		||||
        <para>You need to install the SSL certificate of the CA that signed
 | 
			
		||||
        your server certificate. This is usually done by installing the
 | 
			
		||||
| 
						 | 
				
			
			@ -3039,6 +3048,11 @@ Have fun!
 | 
			
		|||
        <para>It is not recommended to disable the validation of IMAP server
 | 
			
		||||
        certificates.</para>
 | 
			
		||||
 | 
			
		||||
        <para>The prefix, user name attribute and path separator specifies how
 | 
			
		||||
        your mailboxes are named (e.g. "user.myUser@localhost" or
 | 
			
		||||
        "user/myUser"). Select the values depending on your IMAP server
 | 
			
		||||
        settings.</para>
 | 
			
		||||
 | 
			
		||||
        <screenshot>
 | 
			
		||||
          <mediaobject>
 | 
			
		||||
            <imageobject>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
										
											Binary file not shown.
										
									
								
							| 
		 Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 28 KiB  | 
| 
						 | 
				
			
			@ -4,7 +4,7 @@ $Id$
 | 
			
		|||
 | 
			
		||||
  This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
 | 
			
		||||
  Copyright (C) 2010 - 2011  Pavel Pozdniak
 | 
			
		||||
                2010 - 2011  Roland Gruber
 | 
			
		||||
                2010 - 2013  Roland Gruber
 | 
			
		||||
 | 
			
		||||
  This program is free software; you can redistribute it and/or modify
 | 
			
		||||
  it under the terms of the GNU General Public License as published by
 | 
			
		||||
| 
						 | 
				
			
			@ -77,10 +77,12 @@ class imapAccess extends baseModule {
 | 
			
		|||
				"Text" => _("This option allows you to disable the certificate check of your IMAP server certificate. Disabling the certificate check is not recommended.")),
 | 
			
		||||
			'ImapAdmin' => array(
 | 
			
		||||
				"Headline" => _("IMAP admin user"),
 | 
			
		||||
				"Text" => _("The login name of your IMAP user who has rights to create/delete mailboxes.")),
 | 
			
		||||
				"Text" => _("The login name of your IMAP user who has rights to create/delete mailboxes.") . ' ' . _('Use wildcards like $uid$ for LDAP attributes of the current LAM admin user.')),
 | 
			
		||||
			'ImapAdminPasswordSelect' => array(
 | 
			
		||||
				"Headline" => _("IMAP password input"),
 | 
			
		||||
				"Text" => _("Choose the way how to provide the IMAP admin password. You can use the same password as for the LAM login or LAM will ask you for a password when it is required.")),
 | 
			
		||||
				"Text" => _("Choose the way how to provide the IMAP admin password. You can use the same password as for the LAM login or LAM will ask you for a password when it is required.")
 | 
			
		||||
							. ' ' . _('Storing the password in your server profile is also possible but not recommended.')
 | 
			
		||||
			),
 | 
			
		||||
			'ImapAdminPassword_Sess' => array(
 | 
			
		||||
				"Headline" => _("Password of IMAP admin user"),
 | 
			
		||||
				"Text" => _("The password of your IMAP admin user. The login name for the IMAP admin user is stored in the LAM server profile.")),
 | 
			
		||||
| 
						 | 
				
			
			@ -115,13 +117,23 @@ class imapAccess extends baseModule {
 | 
			
		|||
		$configUser = new htmlTableExtendedInputField(_('IMAP admin user'), 'ImapAccess_ImapAdmin', '', 'ImapAdmin');
 | 
			
		||||
		$configUser->setRequired(true);
 | 
			
		||||
		$configContainer->addElement($configUser, true);
 | 
			
		||||
		$configPasswordType = new htmlTableExtendedSelect('ImapAccess_ImapAdminPasswordSelect', array(_('LAM user password') => 'lam_user_pass', _('Ask') => 'ask_pass'), array('ask_pass'), _("IMAP password input"), 'ImapAdminPasswordSelect');
 | 
			
		||||
		$pwdSelectOptions = array(
 | 
			
		||||
			_('LAM user password') => 'lam_user_pass',
 | 
			
		||||
			_('Ask') => 'ask_pass',
 | 
			
		||||
			_('Server profile') => 'config');
 | 
			
		||||
		$configPasswordType = new htmlTableExtendedSelect('ImapAccess_ImapAdminPasswordSelect', $pwdSelectOptions, array('ask_pass'), _("IMAP password input"), 'ImapAdminPasswordSelect');
 | 
			
		||||
		$configPasswordType->setHasDescriptiveElements(true);
 | 
			
		||||
		$configPasswordType->setTableRowsToShow(array('config' => array('ImapAccess_ImapAdminPassword')));
 | 
			
		||||
		$configPasswordType->setTableRowsToHide(array('lam_user_pass' => array('ImapAccess_ImapAdminPassword'), 'ask_pass' => array('ImapAccess_ImapAdminPassword')));
 | 
			
		||||
		$configContainer->addElement($configPasswordType, true);
 | 
			
		||||
		$configContainer->addElement(new htmlTableExtendedInputField(_('Prefix for mailboxes'), 'ImapAccess_ImapUserPrefix', '', 'ImapUserPrefix'), true);
 | 
			
		||||
		$adminPwdInput = new htmlTableExtendedInputField(_('Admin password'), 'ImapAccess_ImapAdminPassword', null, 'ImapAdminPasswordSelect');
 | 
			
		||||
		$adminPwdInput->setIsPassword(true);
 | 
			
		||||
		$adminPwdInput->setObfuscate(true);
 | 
			
		||||
		$configContainer->addElement($adminPwdInput, true);
 | 
			
		||||
		$mailDomainsInput = new htmlTableExtendedInputField(_('Mail domains'), 'ImapAccess_ImapDomain', '', 'ImapMailDomain');
 | 
			
		||||
		$mailDomainsInput->setRequired(true);
 | 
			
		||||
		$configContainer->addElement($mailDomainsInput, true);
 | 
			
		||||
		$configContainer->addElement(new htmlTableExtendedInputField(_('Prefix for mailboxes'), 'ImapAccess_ImapUserPrefix', '', 'ImapUserPrefix'), true);
 | 
			
		||||
		$configUserName = new htmlTableExtendedSelect('ImapAccess_UserNameAttribute', array('mail', 'uid'), array('mail'), _("User name attribute"), 'ImapUserNameAttr');
 | 
			
		||||
		$configContainer->addElement($configUserName, true);
 | 
			
		||||
		$configPathSeparator = new htmlTableExtendedSelect('ImapAccess_pathSeparator', array('.', '/'), array('.'), _("Path separator"), 'pathSeparator');
 | 
			
		||||
| 
						 | 
				
			
			@ -157,6 +169,7 @@ class imapAccess extends baseModule {
 | 
			
		|||
	function load_Messages() {
 | 
			
		||||
		$this->messages['config'][0] = array('ERROR', _('Please enter a valid server name where the mailboxes reside.'));
 | 
			
		||||
		$this->messages['config'][1] = array('ERROR', _('Please enter a correct list of valid mail domains.'));
 | 
			
		||||
		$this->messages['config'][2] = array('ERROR', _('The IMAP admin password is empty.'));
 | 
			
		||||
		$this->messages['managemailbox'][0] = array('ERROR', _('Unable to change ACL on IMAP server for mailbox deletion.'));
 | 
			
		||||
		$this->messages['managemailbox'][1] = array('ERROR', _('Unable to delete mailbox from IMAP server.'));
 | 
			
		||||
		$this->messages['managemailbox'][2] = array('ERROR', _('Unable to create mailbox on IMAP server.'));
 | 
			
		||||
| 
						 | 
				
			
			@ -213,7 +226,7 @@ class imapAccess extends baseModule {
 | 
			
		|||
		$return->addElement(new htmlOutputText($email), true);
 | 
			
		||||
 | 
			
		||||
		$imap_server_address = $this->getServerAddress();
 | 
			
		||||
		$imap_admin_user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
 | 
			
		||||
		$imap_admin_user = $this->getAdminUser();
 | 
			
		||||
		$imap_admin_password = $this->getAdminPassword();
 | 
			
		||||
		$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
 | 
			
		||||
		if (!$mbox) {
 | 
			
		||||
| 
						 | 
				
			
			@ -328,7 +341,7 @@ class imapAccess extends baseModule {
 | 
			
		|||
		$prefix = $this->getMailboxPrefix();
 | 
			
		||||
		
 | 
			
		||||
		$imap_server_address = $this->getServerAddress();
 | 
			
		||||
		$imap_admin_user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
 | 
			
		||||
		$imap_admin_user = $this->getAdminUser();
 | 
			
		||||
		
 | 
			
		||||
		if (isset($_POST['ImapAdminPassword']) && isset($_POST['enterPasswordButton'])) {
 | 
			
		||||
			$errors = $this->doLogin();
 | 
			
		||||
| 
						 | 
				
			
			@ -364,7 +377,7 @@ class imapAccess extends baseModule {
 | 
			
		|||
					$errors[] = $this->messages['managemailbox'][4];
 | 
			
		||||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					if (!imap_setacl($mbox, $prefix . $this->getSep() . $email_username, $this->moduleSettings['ImapAccess_ImapAdmin'][0], "c")) {
 | 
			
		||||
					if (!imap_setacl($mbox, $prefix . $this->getSep() . $email_username, $imap_admin_user, "c")) {
 | 
			
		||||
						$errors[] = $this->messages['managemailbox'][0];
 | 
			
		||||
					}
 | 
			
		||||
					
 | 
			
		||||
| 
						 | 
				
			
			@ -401,7 +414,8 @@ class imapAccess extends baseModule {
 | 
			
		|||
				}
 | 
			
		||||
				else {
 | 
			
		||||
					if (!isset($_POST['ImapUserQuotaLimit']) || ($_POST['ImapUserQuotaLimit'] == '')) {
 | 
			
		||||
/*						if (!imap_set_quota($mbox, $prefix . $this->getSep() . $email_username, -1)) {
 | 
			
		||||
/* deactivated because -1 is not accepted, no possibility to remove quota
 | 
			
		||||
 * 						if (!imap_set_quota($mbox, $prefix . $this->getSep() . $email_username, -1)) {
 | 
			
		||||
							$message = $this->messages['managemailbox'][7];
 | 
			
		||||
							$message[] = imap_last_error();
 | 
			
		||||
							$errors[] = $message;
 | 
			
		||||
| 
						 | 
				
			
			@ -438,12 +452,83 @@ class imapAccess extends baseModule {
 | 
			
		|||
		}            
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	* Checks input values of module settings.
 | 
			
		||||
	* 
 | 
			
		||||
	* Calling this method does not require the existence of an enclosing {@link accountContainer}.<br>
 | 
			
		||||
	* <br>
 | 
			
		||||
	* If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ('message type', 'message head', 'message text').
 | 
			
		||||
	* <br>If no errors occured the function returns an empty array.
 | 
			
		||||
	*
 | 
			
		||||
	* @param array $scopes list of account types which are used
 | 
			
		||||
	* @param array $options hash array (option name => value) that contains the input. The option values are all arrays containing one or more elements.
 | 
			
		||||
	* @return array list of error messages
 | 
			
		||||
	* 
 | 
			
		||||
	* @see baseModule::get_metaData()
 | 
			
		||||
	*/
 | 
			
		||||
	public function check_configOptions($scopes, &$options) {
 | 
			
		||||
		$errors = parent::check_configOptions($scopes, $options);
 | 
			
		||||
		if ($options['ImapAccess_ImapAdminPasswordSelect'][0] == 'config') {
 | 
			
		||||
			if (empty($options['ImapAccess_ImapAdminPassword'][0])) {
 | 
			
		||||
				$errors[] = $this->messages['config'][2];
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		return $errors;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the user name of the IMAP admin.
 | 
			
		||||
	 * 
 | 
			
		||||
	 * @return String admin user name
 | 
			
		||||
	 */
 | 
			
		||||
	private function getAdminUser() {
 | 
			
		||||
		if (isset($_SESSION['imapAdmUser'])) {
 | 
			
		||||
			return $_SESSION['imapAdmUser'];
 | 
			
		||||
		}
 | 
			
		||||
		$user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
 | 
			
		||||
		// check if user name contains any wildcards that need to be replaced with LDAP attribute values
 | 
			
		||||
		$matches = array();
 | 
			
		||||
		preg_match_all('/\\$[a-z0-9_-]+\\$/i', $this->moduleSettings['ImapAccess_ImapAdmin'][0], $matches);
 | 
			
		||||
		if (sizeof($matches) > 0) {
 | 
			
		||||
			// find wildcards
 | 
			
		||||
			$attrNames = array();
 | 
			
		||||
			foreach ($matches as $match) {
 | 
			
		||||
				foreach ($match as $attr) {
 | 
			
		||||
					$attrNames[] = substr($attr, 1, -1);
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			$attrNames = array_values(array_unique($attrNames));
 | 
			
		||||
			$attrNames = array_change_key_case($attrNames, CASE_LOWER);
 | 
			
		||||
			// read LAM login user data
 | 
			
		||||
			$data = $_SESSION['ldap']->decrypt_login();
 | 
			
		||||
			$dn = $data[0];
 | 
			
		||||
			$sr = @ldap_read($_SESSION['ldap']->server(), $dn, '(objectclass=*)', $attrNames);
 | 
			
		||||
			if ($sr) {
 | 
			
		||||
				$info = @ldap_get_entries($_SESSION['ldap']->server(), $sr);
 | 
			
		||||
				if ($info) {
 | 
			
		||||
					cleanLDAPResult($info);
 | 
			
		||||
					$info = $info[0];
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			// replace wildcards
 | 
			
		||||
			foreach ($attrNames as $attr) {
 | 
			
		||||
				if (empty($info[$attr])) {
 | 
			
		||||
					continue;
 | 
			
		||||
				}
 | 
			
		||||
				$user = preg_replace('/\\$' . $attr . '\\$/i', $info[$attr][0], $user);
 | 
			
		||||
			}
 | 
			
		||||
		}
 | 
			
		||||
		logNewMessage(LOG_DEBUG, 'IMAP admin user: ' . $user);
 | 
			
		||||
		$_SESSION['imapAdmUser'] = $user;
 | 
			
		||||
		return $user;
 | 
			
		||||
	}
 | 
			
		||||
	
 | 
			
		||||
	/**
 | 
			
		||||
	 * Returns the admin password.
 | 
			
		||||
	 *
 | 
			
		||||
	 * @return String password
 | 
			
		||||
	 */
 | 
			
		||||
	function getAdminPassword() {
 | 
			
		||||
	private function getAdminPassword() {
 | 
			
		||||
		//perform admin password
 | 
			
		||||
		$imap_admin_password = null; //default value is null, it can be changed during the work
 | 
			
		||||
		if (isset($_SESSION['imapAdmPass'])) {
 | 
			
		||||
| 
						 | 
				
			
			@ -453,6 +538,10 @@ class imapAccess extends baseModule {
 | 
			
		|||
			$credentials = $_SESSION['ldap']->decrypt_login();
 | 
			
		||||
			$imap_admin_password = $credentials[1];
 | 
			
		||||
		}
 | 
			
		||||
		elseif (!empty($this->moduleSettings['ImapAccess_ImapAdminPasswordSelect'][0]) && ($this->moduleSettings['ImapAccess_ImapAdminPasswordSelect'][0] == "config")
 | 
			
		||||
			&& !empty($this->moduleSettings['ImapAccess_ImapAdminPassword'][0])) {
 | 
			
		||||
			$imap_admin_password = deobfuscateText($this->moduleSettings['ImapAccess_ImapAdminPassword'][0]);
 | 
			
		||||
		}
 | 
			
		||||
		return $imap_admin_password;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
| 
						 | 
				
			
			@ -464,7 +553,7 @@ class imapAccess extends baseModule {
 | 
			
		|||
	function doLogin() {
 | 
			
		||||
		$errors = array();
 | 
			
		||||
		$imap_server_address = $this->getServerAddress();
 | 
			
		||||
		$imap_admin_user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
 | 
			
		||||
		$imap_admin_user = $this->getAdminUser();
 | 
			
		||||
		if (isset($_POST['ImapAdminPassword']) && $_POST['ImapAdminPassword'] != "") {
 | 
			
		||||
			$imap_admin_password = $_POST['ImapAdminPassword'];
 | 
			
		||||
			$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
		Reference in New Issue