IMAP dynamic login names
This commit is contained in:
parent
066dc11564
commit
28b37af889
|
@ -1,5 +1,5 @@
|
||||||
March 2014 4.5
|
March 2014 4.5
|
||||||
|
- IMAP: allow dynamic admin user names by replacing wildcards with LDAP attributes
|
||||||
|
|
||||||
18.12.2013 4.4
|
18.12.2013 4.4
|
||||||
- PyKota support: users, groups, printers, billing codes
|
- PyKota support: users, groups, printers, billing codes
|
||||||
|
|
|
@ -3024,10 +3024,19 @@ Have fun!
|
||||||
can specify the IMAP server name, encryption options, the
|
can specify the IMAP server name, encryption options, the
|
||||||
authentication for the IMAP connection and the valid mail domains. LAM
|
authentication for the IMAP connection and the valid mail domains. LAM
|
||||||
can use either your LAM login password for the IMAP connection or
|
can use either your LAM login password for the IMAP connection or
|
||||||
display a dialog where you need to enter the password. The mail
|
display a dialog where you need to enter the password. It is also
|
||||||
domains specify for which accounts mailboxes may be created/deleted.
|
possible to store the admin password in your server profile. This is
|
||||||
E.g. if you enter "lam-demo.org" then mailboxes can be managed for
|
not recommended for security reasons.</para>
|
||||||
"user@lam-demo.org" but not for "user@example.com".</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
|
<para>You need to install the SSL certificate of the CA that signed
|
||||||
your server certificate. This is usually done by installing the
|
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
|
<para>It is not recommended to disable the validation of IMAP server
|
||||||
certificates.</para>
|
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>
|
<screenshot>
|
||||||
<mediaobject>
|
<mediaobject>
|
||||||
<imageobject>
|
<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/)
|
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
|
||||||
Copyright (C) 2010 - 2011 Pavel Pozdniak
|
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
|
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
|
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.")),
|
"Text" => _("This option allows you to disable the certificate check of your IMAP server certificate. Disabling the certificate check is not recommended.")),
|
||||||
'ImapAdmin' => array(
|
'ImapAdmin' => array(
|
||||||
"Headline" => _("IMAP admin user"),
|
"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(
|
'ImapAdminPasswordSelect' => array(
|
||||||
"Headline" => _("IMAP password input"),
|
"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(
|
'ImapAdminPassword_Sess' => array(
|
||||||
"Headline" => _("Password of IMAP admin user"),
|
"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.")),
|
"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 = new htmlTableExtendedInputField(_('IMAP admin user'), 'ImapAccess_ImapAdmin', '', 'ImapAdmin');
|
||||||
$configUser->setRequired(true);
|
$configUser->setRequired(true);
|
||||||
$configContainer->addElement($configUser, 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->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($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 = new htmlTableExtendedInputField(_('Mail domains'), 'ImapAccess_ImapDomain', '', 'ImapMailDomain');
|
||||||
$mailDomainsInput->setRequired(true);
|
$mailDomainsInput->setRequired(true);
|
||||||
$configContainer->addElement($mailDomainsInput, 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');
|
$configUserName = new htmlTableExtendedSelect('ImapAccess_UserNameAttribute', array('mail', 'uid'), array('mail'), _("User name attribute"), 'ImapUserNameAttr');
|
||||||
$configContainer->addElement($configUserName, true);
|
$configContainer->addElement($configUserName, true);
|
||||||
$configPathSeparator = new htmlTableExtendedSelect('ImapAccess_pathSeparator', array('.', '/'), array('.'), _("Path separator"), 'pathSeparator');
|
$configPathSeparator = new htmlTableExtendedSelect('ImapAccess_pathSeparator', array('.', '/'), array('.'), _("Path separator"), 'pathSeparator');
|
||||||
|
@ -157,6 +169,7 @@ class imapAccess extends baseModule {
|
||||||
function load_Messages() {
|
function load_Messages() {
|
||||||
$this->messages['config'][0] = array('ERROR', _('Please enter a valid server name where the mailboxes reside.'));
|
$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'][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'][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'][1] = array('ERROR', _('Unable to delete mailbox from IMAP server.'));
|
||||||
$this->messages['managemailbox'][2] = array('ERROR', _('Unable to create mailbox on 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);
|
$return->addElement(new htmlOutputText($email), true);
|
||||||
|
|
||||||
$imap_server_address = $this->getServerAddress();
|
$imap_server_address = $this->getServerAddress();
|
||||||
$imap_admin_user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
|
$imap_admin_user = $this->getAdminUser();
|
||||||
$imap_admin_password = $this->getAdminPassword();
|
$imap_admin_password = $this->getAdminPassword();
|
||||||
$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
|
$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
|
||||||
if (!$mbox) {
|
if (!$mbox) {
|
||||||
|
@ -328,7 +341,7 @@ class imapAccess extends baseModule {
|
||||||
$prefix = $this->getMailboxPrefix();
|
$prefix = $this->getMailboxPrefix();
|
||||||
|
|
||||||
$imap_server_address = $this->getServerAddress();
|
$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'])) {
|
if (isset($_POST['ImapAdminPassword']) && isset($_POST['enterPasswordButton'])) {
|
||||||
$errors = $this->doLogin();
|
$errors = $this->doLogin();
|
||||||
|
@ -364,7 +377,7 @@ class imapAccess extends baseModule {
|
||||||
$errors[] = $this->messages['managemailbox'][4];
|
$errors[] = $this->messages['managemailbox'][4];
|
||||||
}
|
}
|
||||||
else {
|
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];
|
$errors[] = $this->messages['managemailbox'][0];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -401,7 +414,8 @@ class imapAccess extends baseModule {
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (!isset($_POST['ImapUserQuotaLimit']) || ($_POST['ImapUserQuotaLimit'] == '')) {
|
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 = $this->messages['managemailbox'][7];
|
||||||
$message[] = imap_last_error();
|
$message[] = imap_last_error();
|
||||||
$errors[] = $message;
|
$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.
|
* Returns the admin password.
|
||||||
*
|
*
|
||||||
* @return String password
|
* @return String password
|
||||||
*/
|
*/
|
||||||
function getAdminPassword() {
|
private function getAdminPassword() {
|
||||||
//perform admin password
|
//perform admin password
|
||||||
$imap_admin_password = null; //default value is null, it can be changed during the work
|
$imap_admin_password = null; //default value is null, it can be changed during the work
|
||||||
if (isset($_SESSION['imapAdmPass'])) {
|
if (isset($_SESSION['imapAdmPass'])) {
|
||||||
|
@ -453,6 +538,10 @@ class imapAccess extends baseModule {
|
||||||
$credentials = $_SESSION['ldap']->decrypt_login();
|
$credentials = $_SESSION['ldap']->decrypt_login();
|
||||||
$imap_admin_password = $credentials[1];
|
$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;
|
return $imap_admin_password;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -464,7 +553,7 @@ class imapAccess extends baseModule {
|
||||||
function doLogin() {
|
function doLogin() {
|
||||||
$errors = array();
|
$errors = array();
|
||||||
$imap_server_address = $this->getServerAddress();
|
$imap_server_address = $this->getServerAddress();
|
||||||
$imap_admin_user = $this->moduleSettings['ImapAccess_ImapAdmin'][0];
|
$imap_admin_user = $this->getAdminUser();
|
||||||
if (isset($_POST['ImapAdminPassword']) && $_POST['ImapAdminPassword'] != "") {
|
if (isset($_POST['ImapAdminPassword']) && $_POST['ImapAdminPassword'] != "") {
|
||||||
$imap_admin_password = $_POST['ImapAdminPassword'];
|
$imap_admin_password = $_POST['ImapAdminPassword'];
|
||||||
$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
|
$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
|
||||||
|
|
Loading…
Reference in New Issue