From 28b37af88903411065372edb75075120d4c9873d Mon Sep 17 00:00:00 2001 From: Roland Gruber Date: Sun, 29 Dec 2013 09:50:41 +0000 Subject: [PATCH] IMAP dynamic login names --- lam/HISTORY | 2 +- lam/docs/manual-sources/howto.xml | 22 +++- .../manual-sources/images/imapAccess2.png | Bin 22773 -> 28182 bytes lam/lib/modules/imapAccess.inc | 111 ++++++++++++++++-- 4 files changed, 119 insertions(+), 16 deletions(-) diff --git a/lam/HISTORY b/lam/HISTORY index 4277df8c..07cd9ca6 100644 --- a/lam/HISTORY +++ b/lam/HISTORY @@ -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 diff --git a/lam/docs/manual-sources/howto.xml b/lam/docs/manual-sources/howto.xml index aa093893..5f929e6e 100644 --- a/lam/docs/manual-sources/howto.xml +++ b/lam/docs/manual-sources/howto.xml @@ -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". + 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. + + 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". + + 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. 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! It is not recommended to disable the validation of IMAP server certificates. + 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. + diff --git a/lam/docs/manual-sources/images/imapAccess2.png b/lam/docs/manual-sources/images/imapAccess2.png index 43cf9201ba2e7ba9ce70f7779c8dfdb9599c8914..59ffd921b041df3a57dee16819e09dc055162465 100644 GIT binary patch literal 28182 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àGT*qma_Bg3B#r|gKFPVPQan0Dq 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%0AgWZ~viW@(dMP`KTgsJzf$NeikWNU#|| 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 T+An1NE>BO}_+FKk(~JKBW2BZM diff --git a/lam/lib/modules/imapAccess.inc b/lam/lib/modules/imapAccess.inc index 48991aac..6b7f871a 100644 --- a/lam/lib/modules/imapAccess.inc +++ b/lam/lib/modules/imapAccess.inc @@ -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}.
+ *
+ * If the input data is invalid the return value is an array that contains subarrays to build StatusMessages ('message type', 'message head', 'message text'). + *
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);