LDAPAccountManager/lam/lib/modules/imapAccess.inc

709 lines
28 KiB
PHP
Raw Normal View History

<?php
/*
$Id$
This code is part of LDAP Account Manager (http://www.ldap-account-manager.org/)
Copyright (C) 2010 - 2011 Pavel Pozdniak
2017-12-02 13:53:31 +00:00
2010 - 2017 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
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
/**
* Manages mailboxes on an IMAP server.
*
* @package modules
* @author Pavel Pozdniak
* @author Roland Gruber
*/
/**
* Manages mailboxes on an IMAP server.
*
* @package modules
* @author Pavel Pozdniak
* @author Roland Gruber
*/
class imapAccess extends baseModule {
2015-08-03 19:56:49 +00:00
2012-07-15 12:05:47 +00:00
/** quota limit from profile */
2011-04-03 10:54:54 +00:00
private $profileQuotaLimit = null;
2015-08-03 19:56:49 +00:00
/** user name */
private $user;
/** email address */
private $email;
/**
* Returns true if this module can manage accounts of the current type, otherwise false.
2015-08-03 19:56:49 +00:00
*
* @return boolean true if module fits
*/
public function can_manage() {
return in_array($this->get_scope(), array('user'));
}
/**
* Returns meta data that is interpreted by parent class
*
* @return array array with meta data
2015-08-03 19:56:49 +00:00
*
* @see baseModule::get_metaData()
*/
function get_metaData() {
$return = array();
// alias name
$return["alias"] = _("Mailbox");
// module dependencies
2015-08-03 19:56:49 +00:00
$return['dependencies'] = array('depends' => array(array('inetOrgPerson', 'windowsUser')), 'conflicts' => array());
// managed object classes
$return['objectClasses'] = array();
// managed attributes
$return['attributes'] = array();
// PHP extensions
$return['extensions'] = array('imap');
// icon
$return['icon'] = 'mailBig.png';
// help
$return['help'] = array(
'ImapServerAddress' => array(
"Headline" => _("Server address"),
"Text" => _("Address of IMAP server (e.g. mail.example.org).")),
'ImapServerEncryptionProtocol' => array(
"Headline" => _("Encryption protocol"),
"Text" => _("Encryption protocol for connecting to IMAP server. LAM requires an encrypted connection.")),
'ImapValidateServerCert' => array(
"Headline" => _("Validate server certificate"),
"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"),
2013-12-29 09:50:41 +00:00
"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"),
2013-12-29 09:50:41 +00:00
"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.")),
'ImapUserPrefix' => array(
"Headline" => _("Prefix for mailboxes"),
"Text" => _("Some IMAP servers store mailboxes with a prefix (e.g. \"user\" for Cyrus which results in \"user.username\").")),
'ImapMailDomain' => array(
2012-02-05 19:15:50 +00:00
"Headline" => _("Mail domains"),
"Text" => _("Please enter a comma separated list of domain names (e.g. \"company.com,example.com\"). LAM will only manage mailboxes from these domains.")),
'ImapUserNameAttr' => array(
"Headline" => _("User name attribute"),
2015-08-04 05:22:59 +00:00
"Text" => _("Please choose the attribute to get the IMAP user name. The default is \"mail\" but you can also use \"uid\" or \"userPrincipalName\".")),
'MailAddress' => array(
"Headline" => _("Mailbox"),
2011-03-20 14:54:41 +00:00
"Text" => _("This mailbox will be created/deleted.")),
'ImapUserQuotaLimit' => array(
"Headline" => _("Quota"),
"Text" => _("Please enter the quota limit of this mailbox in kilobytes.")),
'pathSeparator' => array(
"Headline" => _("Path separator"),
"Text" => _("This is the separator for the mailbox path. Usually, this is \".\" but e.g. Cyrus with \"unixhierarchysep\" will require \"/\".")),
2015-10-18 18:08:34 +00:00
'initialFolders' => array(
"Headline" => _("Initial folders"),
"Text" => _("Use this to provide a list of folders (e.g. Trash) to add for new accounts.")),
);
2010-11-28 20:24:17 +00:00
// configuration checks
$return['config_checks']['all']['ImapAccess_ImapServerAddress'] = array (
'type' => 'ext_preg',
'regex' => 'DNSname',
'required' => true,
'required_message' => $this->messages['config'][0],
'error_message' => $this->messages['config'][0]);
$return['config_checks']['all']['ImapAccess_ImapDomain'] = array (
'type' => 'regex_i',
'regex' => '[\\*a-z0-9\\._-]+(,[a-z0-9\\._-]+)*',
2010-11-28 20:24:17 +00:00
'required' => true,
'required_message' => $this->messages['config'][1],
'error_message' => $this->messages['config'][1]);
2011-04-03 10:54:54 +00:00
// profile options
$profileContainer = new htmlTable();
2015-08-03 19:56:49 +00:00
$profileContainer->addElement(new htmlTableExtendedInputField(_('Quota'), 'ImapAccess_QuotaLimit', null, 'ImapUserQuotaLimit'), true);
2011-04-03 10:54:54 +00:00
$return['profile_options'] = $profileContainer;
$return['profile_checks']['ImapAccess_QuotaLimit'] = array(
'type' => 'ext_preg',
'regex' => 'digit',
'error_message' => $this->messages['managemailbox'][8]);
return $return;
}
/**
* This function fills the error message array with messages
*/
function load_Messages() {
2010-11-28 20:24:17 +00:00
$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.'));
2013-12-29 09:50:41 +00:00
$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.'));
$this->messages['managemailbox'][3] = array('ERROR', _('Unable to locate mailbox on IMAP.'));
2012-02-05 19:17:58 +00:00
$this->messages['managemailbox'][4] = array('ERROR', _('Your IMAP domains and email address domain do not match.'));
$this->messages['managemailbox'][5] = array('ERROR', _('Invalid password for IMAP admin or other problem occured.'));
$this->messages['managemailbox'][6] = array('WARN', _('Your LAM login password was not accepted by the IMAP server.'));
2011-03-20 14:54:41 +00:00
$this->messages['managemailbox'][7] = array('ERROR', _('Cannot update quota.'));
$this->messages['managemailbox'][8] = array('ERROR', _('Wrong quota format. Quota must be numeric.'));
}
/**
2015-08-03 19:56:49 +00:00
* Extracts user name and email address from inetOrgPerson/posixAccount/windowsUser modules.
*
2015-08-03 19:56:49 +00:00
* @return htmlStatusMessage message if any
*/
2015-08-03 19:56:49 +00:00
private function extractUserAndEmail() {
$this->email = '';
if ($this->getAccountContainer()->getAccountModule('inetOrgPerson') != null) {
$attrs = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->getAttributes();
2011-04-25 17:56:34 +00:00
}
2015-08-03 19:56:49 +00:00
else {
$attrs = $this->getAccountContainer()->getAccountModule('windowsUser')->getAttributes();
}
2015-08-03 20:00:58 +00:00
$this->email = !empty($attrs['mail'][0]) ? $attrs['mail'][0] : '';
2015-08-03 19:56:49 +00:00
$this->user = '';
// extract user name from email address
2015-08-03 19:56:49 +00:00
if (empty($this->moduleSettings['ImapAccess_UserNameAttribute'][0]) || $this->moduleSettings['ImapAccess_UserNameAttribute'][0] == 'mail') {
$email_parts = explode('@', $this->email, 2);
$this->user = array_shift($email_parts);
}
2015-08-03 19:56:49 +00:00
elseif ($this->moduleSettings['ImapAccess_UserNameAttribute'][0] == 'userPrincipalName') {
2015-08-03 20:00:58 +00:00
if (!empty($attrs['userPrincipalName'][0])) {
$parts = explode('@', $attrs['userPrincipalName'][0], 2);
$this->user = array_shift($parts);
}
2015-08-03 19:56:49 +00:00
}
// extract user name from Unix user name (might be in inetOrgPerson/windowUser or posixAccount module)
else {
if ($this->getAccountContainer()->getAccountModule('posixAccount') != null) {
$attrsUnix = $this->getAccountContainer()->getAccountModule('posixAccount')->getAttributes();
2015-08-03 19:56:49 +00:00
$this->user = !empty($attrsUnix['uid'][0]) ? $attrsUnix['uid'][0] : '';
}
else {
2015-08-03 19:56:49 +00:00
$this->user = !empty($attrs['uid'][0]) ? $attrs['uid'][0] : '';
}
}
2015-08-03 19:56:49 +00:00
if (empty($this->email)) {
2015-08-03 20:00:58 +00:00
$modName = ($this->getAccountContainer()->getAccountModule('inetOrgPerson') != null) ? 'inetOrgPerson' : 'windowsUser';
2015-08-03 19:56:49 +00:00
return new htmlStatusMessage('INFO', _("Please enter an email address on this page: %s"), '', array($this->getAccountContainer()->getAccountModule($modName)->get_alias()));
}
}
/**
* Returns the HTML meta data for the main account page.
*
* @return array HTML meta data
*/
function display_html_attributes() {
$return = new htmlTable();
if (!checkIfWriteAccessIsAllowed($this->get_scope())) {
return $return;
}
$msg = $this->extractUserAndEmail();
if ($msg != null) {
$return->addElement($msg);
return $return;
}
$prefix = $this->getMailboxPrefix();
$email_domain = substr(strstr($this->email, '@'), 1);
$imap_admin_password = $this->getAdminPassword(); // check for password for fall back mechanism
if (!isset($_SESSION['imapAdmPass']) && !isset($imap_admin_password)) {
return $this->display_html_password();
}
2015-08-03 19:56:49 +00:00
$return->addElement(new htmlOutputText(_('Email address')));
2015-08-03 19:56:49 +00:00
$return->addElement(new htmlOutputText($this->email), true);
$imap_server_address = $this->getServerAddress();
2013-12-29 09:50:41 +00:00
$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) {
return $this->display_html_password();
}
2015-08-03 19:56:49 +00:00
$return->addElement(new htmlOutputText(_('Mailbox')));
2015-08-03 19:56:49 +00:00
$return->addElement(new htmlOutputText($prefix . $this->getSep() . $this->user));
$return->addElement(new htmlHelpLink('MailAddress'), true);
$return->addElement(new htmlSpacer(null, '10px'), true);
2015-08-03 19:56:49 +00:00
$is_mailbox_exist = false; //default is false
2015-08-03 19:56:49 +00:00
$list = imap_list($mbox, "{" . $imap_server_address . "}", $prefix . $this->getSep() . $this->user);
if (is_array($list) && sizeof($list) == 1) {
2015-08-03 19:56:49 +00:00
$this->renderQuotasForMailbox($return, $mbox, $prefix . $this->getSep() . $this->user);
$mailboxMessage = new htmlOutputText(_("Mailbox already exists on IMAP server."));
$mailboxMessage->colspan = 3;
$return->addElement($mailboxMessage, true);
$return->addElement(new htmlSpacer(null, '10px'), true);
$return->addElement(new htmlButton('deleteMailbox', _('Delete mailbox')));
}
else {
$mailboxMessage = new htmlOutputText(_("Mailbox does not exist on IMAP server."));
$mailboxMessage->colspan = 3;
$return->addElement($mailboxMessage, true);
$return->addElement(new htmlSpacer(null, '10px'), true);
$createButton = new htmlButton('createMailbox', _('Create mailbox'));
$message = '';
if ($this->isWrongDomain($email_domain)) {
$createButton->setIsEnabled(false);
$message = '<< ' . $this->messages['managemailbox'][4][1];
}
$return->addElement($createButton);
$return->addElement(new htmlOutputText($message));
}
imap_close($mbox);
return $return;
}
/**
* Returns the HTML meta data for the password page.
*
* @return array HTML meta data
*/
function display_html_password() {
$return = new htmlTable();
if($this->moduleSettings['ImapAccess_ImapAdminPasswordSelect'][0] == "lam_user_pass"){
$message = $this->messages['managemailbox'][6];
$messageElement = new htmlStatusMessage($message[0], $message[1]);
$messageElement->colspan = 3;
$return->addElement($messageElement);
$return->addElement(new htmlSpacer(null, '10px'), true);
}
$passwordInput = new htmlTableExtendedInputField(_("Password of IMAP admin user"), 'ImapAdminPassword', '', 'ImapAdminPassword_Sess');
$passwordInput->setIsPassword(true);
$passwordInput->setRequired(true);
2014-09-21 19:28:56 +00:00
$passwordInput->setOnKeyPress('SubmitForm(\'enterPasswordButton\', event);');
$return->addElement($passwordInput, true);
$return->addElement(new htmlSpacer(null, '10px'), true);
$return->addElement(new htmlButton('enterPasswordButton', _('Ok')));
return $return;
}
2011-03-20 14:54:41 +00:00
/**
* Display the mailbox quota.
2015-08-03 19:56:49 +00:00
*
2011-03-20 14:54:41 +00:00
* @param htmlTable $htmlTable structure that contained information to be displayed
* @param stream $mbox stream to open IMAP session
2012-07-15 12:05:47 +00:00
* @param String $username user name to connect to IMAP server
2011-03-20 14:54:41 +00:00
* @return htmlTable table with added information about user quotas or controls to add quota
*/
function renderQuotasForMailbox($htmlTable, $mbox, $username) {
2011-04-03 10:54:54 +00:00
if (($this->profileQuotaLimit != null) && ($this->profileQuotaLimit != '')) {
@imap_set_quota($mbox, $username, $this->profileQuotaLimit);
$this->profileQuotaLimit = null;
}
2011-03-20 14:54:41 +00:00
$quota_values = @imap_get_quota($mbox, $username);
imap_errors();
if (is_array($quota_values) && (sizeof($quota_values) > 0)) {
if (isset($quota_values['STORAGE']) && is_array($quota_values['STORAGE'])) {
2011-04-03 10:54:54 +00:00
$quotaLimit = $quota_values['STORAGE']['limit'];
2011-03-20 15:03:38 +00:00
$htmlTable->addElement(new htmlOutputText(_("Current usage (kB)")));
2011-03-20 14:54:41 +00:00
$htmlTable->addElement(new htmlOutputText($quota_values['STORAGE']['usage']), true);
2011-04-03 10:54:54 +00:00
$quotaLimitInput = new htmlTableExtendedInputField(_("Quota limit (kB)"), 'ImapUserQuotaLimit', $quotaLimit, 'ImapUserQuotaLimit');
2011-03-20 14:54:41 +00:00
$htmlTable->addElement($quotaLimitInput, false);
$htmlTable->addElement(new htmlSpacer('10px', null), false);
$htmlTable->addElement(new htmlButton('updateQuota', _('Update quota')), true);
$htmlTable->addElement(new htmlSpacer(null, '10px'), true);
}
}
else {
$quotaLimit = "";
2011-03-20 15:11:27 +00:00
$quotaLimitInput = new htmlTableExtendedInputField(_("Quota limit (kB)"), 'ImapUserQuotaLimit', $quotaLimit, 'ImapUserQuotaLimit');
2011-03-20 14:54:41 +00:00
$htmlTable->addElement($quotaLimitInput, false);
$htmlTable->addElement(new htmlSpacer('10px', null), false);
$htmlTable->addElement(new htmlButton('updateQuota', _('Update quota')), true);
$htmlTable->addElement(new htmlSpacer(null, '10px'), true);
}
return $htmlTable;
}
/**
* Processes user input of the primary module page.
* It checks if all input values are correct and updates the associated LDAP attributes.
*
* @return array list of info/error messages
*/
function process_attributes() {
$errors = array();
if (!checkIfWriteAccessIsAllowed($this->get_scope())) {
2011-04-25 17:56:34 +00:00
return $errors;
}
$prefix = $this->getMailboxPrefix();
2015-08-03 19:56:49 +00:00
$imap_server_address = $this->getServerAddress();
2013-12-29 09:50:41 +00:00
$imap_admin_user = $this->getAdminUser();
2015-08-03 19:56:49 +00:00
2012-02-16 06:43:34 +00:00
if (isset($_POST['ImapAdminPassword']) && isset($_POST['enterPasswordButton'])) {
$errors = $this->doLogin();
}
2015-08-03 19:56:49 +00:00
$imap_admin_password = $this->getAdminPassword();
2012-02-16 06:43:34 +00:00
$mbox = 0;//default state is false
2015-08-03 19:56:49 +00:00
if ($imap_admin_password) {
$mbox = @imap_open("{" . $imap_server_address . "}", $imap_admin_user, $imap_admin_password, OP_HALFOPEN, 1);
}
if ($mbox) {
2015-08-03 19:56:49 +00:00
$this->extractUserAndEmail();
$email_domain = substr(strstr($this->email, '@'), 1);
if (isset($_POST['deleteMailbox'])) {
if ($this->isWrongDomain($email_domain)) {
$errors[] = $this->messages['managemailbox'][4];
}
else {
2015-08-03 19:56:49 +00:00
if (!imap_setacl($mbox, $prefix . $this->getSep() . $this->user, $imap_admin_user, "c")) {
$errors[] = $this->messages['managemailbox'][0];
}
2015-08-03 19:56:49 +00:00
$delete_mailbox_arg = "{" . $imap_server_address . "}" . $prefix . $this->getSep() . $this->user;
if (!@imap_deletemailbox($mbox, $delete_mailbox_arg)) {
$errors[] = $this->messages['managemailbox'][1];
}
}
}
2015-08-03 19:56:49 +00:00
if (isset($_POST['createMailbox'])) {
if ($this->isWrongDomain($email_domain)) {
$errors[] = $this->messages['managemailbox'][4];
}
else {
2015-08-03 19:56:49 +00:00
$create_mailbox_arg = "{" . $imap_server_address . "}" . $prefix . $this->getSep() . $this->user;
if (imap_createmailbox($mbox, imap_utf7_encode($create_mailbox_arg))) {
2015-08-03 19:56:49 +00:00
$list = imap_list($mbox, "{" . $imap_server_address . "}", $prefix . $this->getSep() . $this->user);
2015-10-18 18:08:34 +00:00
if (!is_array($list) || (sizeof($list) != 1)) {
$errors[] = $this->messages['managemailbox'][3];
}
2015-10-18 18:08:34 +00:00
// create initial folders
foreach ($this->getInitialFolders() as $folder) {
$created = imap_createmailbox($mbox, imap_utf7_encode($create_mailbox_arg . $this->getSep() . $folder));
if (!$created) {
$error = $this->messages['managemailbox'][2];
$error[] = htmlspecialchars($folder);
$errors[] = $error;
}
}
}
else {
$errors[] = $this->messages['managemailbox'][2];
}
}
}
2011-03-20 14:54:41 +00:00
if (isset($_POST['updateQuota'])) {
if ($this->isWrongDomain($email_domain)) {
$errors[] = $this->messages['managemailbox'][4];
}
else {
if (!isset($_POST['ImapUserQuotaLimit']) || ($_POST['ImapUserQuotaLimit'] == '')) {
2013-12-29 09:50:41 +00:00
/* deactivated because -1 is not accepted, no possibility to remove quota
* if (!imap_set_quota($mbox, $prefix . $this->getSep() . $email_username, -1)) {
2011-03-20 14:54:41 +00:00
$message = $this->messages['managemailbox'][7];
$message[] = imap_last_error();
$errors[] = $message;
}*/
}
elseif (isset($_POST['ImapUserQuotaLimit']) && ($_POST['ImapUserQuotaLimit'] != '') && get_preg($_POST['ImapUserQuotaLimit'], 'digit')){
2015-08-03 19:56:49 +00:00
if (!imap_set_quota($mbox, $prefix . $this->getSep() . $this->user, $_POST['ImapUserQuotaLimit'])) {
2011-03-20 14:54:41 +00:00
$message = $this->messages['managemailbox'][7];
$message[] = imap_last_error();
$errors[] = $message;
}
}
else {
$errors[] = $this->messages['managemailbox'][8];
}
}
}
imap_close($mbox);
}
// Return error-messages
return $errors;
}
2011-04-03 10:54:54 +00:00
/**
* Loads the values of an account profile into internal variables.
*
* @param array $profile hash array with profile values (identifier => value)
*/
function load_profile($profile) {
// profile mappings in meta data
parent::load_profile($profile);
if (isset($profile['ImapAccess_QuotaLimit'][0]) && $profile['ImapAccess_QuotaLimit'][0] != '') {
2015-08-03 19:56:49 +00:00
$this->profileQuotaLimit = $profile['ImapAccess_QuotaLimit'][0];
}
2011-04-03 10:54:54 +00:00
}
2015-08-03 19:56:49 +00:00
2015-10-18 18:08:34 +00:00
/**
* Returns a list of configuration options.
*
* @param array $scopes account types (user, group, host)
* @param array $allScopes list of all active account modules and their scopes (module => array(scopes))
* @return mixed htmlElement or array of htmlElement
*
* @see htmlElement
*/
public function get_configOptions($scopes, $allScopes) {
// configuration settings
2017-12-02 13:53:31 +00:00
$configContainer = new htmlResponsiveRow();
$configServer = new htmlResponsiveInputField(_('Server address'), 'ImapAccess_ImapServerAddress', '', 'ImapServerAddress');
2015-10-18 18:08:34 +00:00
$configServer->setRequired(true);
2017-12-02 13:53:31 +00:00
$configContainer->add($configServer, 12);
$configContainer->add(new htmlResponsiveSelect('ImapAccess_ImapServerEncriptionProtocol', array('TLS', 'SSL'), array('TLS'), _("Encryption protocol"), 'ImapServerEncryptionProtocol'), 12);
$configCertValidate = new htmlResponsiveSelect('ImapAccess_ImapValidateServerCert', array(_('Yes') => 'validate-cert', _('No') => 'novalidate-cert'), array('validate-cert'), _("Validate server certificate"), 'ImapValidateServerCert');
2015-10-18 18:08:34 +00:00
$configCertValidate->setHasDescriptiveElements(true);
2017-12-02 13:53:31 +00:00
$configContainer->add($configCertValidate, 12);
$configUser = new htmlResponsiveInputField(_('IMAP admin user'), 'ImapAccess_ImapAdmin', '', 'ImapAdmin');
2015-10-18 18:08:34 +00:00
$configUser->setRequired(true);
2017-12-02 13:53:31 +00:00
$configContainer->add($configUser, 12);
2015-10-18 18:08:34 +00:00
$pwdSelectOptions = array(
_('LAM user password') => 'lam_user_pass',
_('Ask') => 'ask_pass',
_('Server profile') => 'config');
2017-12-02 13:53:31 +00:00
$configPasswordType = new htmlResponsiveSelect('ImapAccess_ImapAdminPasswordSelect', $pwdSelectOptions, array('ask_pass'), _("IMAP password input"), 'ImapAdminPasswordSelect');
2015-10-18 18:08:34 +00:00
$configPasswordType->setHasDescriptiveElements(true);
$configPasswordType->setTableRowsToShow(array('config' => array('ImapAccess_ImapAdminPassword')));
$configPasswordType->setTableRowsToHide(array('lam_user_pass' => array('ImapAccess_ImapAdminPassword'), 'ask_pass' => array('ImapAccess_ImapAdminPassword')));
2017-12-02 13:53:31 +00:00
$configContainer->add($configPasswordType, 12);
$adminPwdInput = new htmlResponsiveInputField(_('Admin password'), 'ImapAccess_ImapAdminPassword', null, 'ImapAdminPasswordSelect');
2015-10-18 18:08:34 +00:00
$adminPwdInput->setIsPassword(true);
$adminPwdInput->setObfuscate(true);
2017-12-02 13:53:31 +00:00
$configContainer->add($adminPwdInput, 12);
$mailDomainsInput = new htmlResponsiveInputField(_('Mail domains'), 'ImapAccess_ImapDomain', '', 'ImapMailDomain');
2015-10-18 18:08:34 +00:00
$mailDomainsInput->setRequired(true);
2017-12-02 13:53:31 +00:00
$configContainer->add($mailDomainsInput, 12);
$configContainer->add(new htmlResponsiveInputField(_('Prefix for mailboxes'), 'ImapAccess_ImapUserPrefix', '', 'ImapUserPrefix'), 12);
$configContainer->add(new htmlResponsiveInputTextarea('ImapAccess_initialFolders', '', 10, 3, _('Initial folders'), 'initialFolders'), 12);
$configUserName = new htmlResponsiveSelect('ImapAccess_UserNameAttribute', array('mail', 'uid', 'userPrincipalName'), array('mail'), _("User name attribute"), 'ImapUserNameAttr');
$configContainer->add($configUserName, 12);
$configPathSeparator = new htmlResponsiveSelect('ImapAccess_pathSeparator', array('.', '/'), array('.'), _("Path separator"), 'pathSeparator');
$configContainer->add($configPathSeparator, 12);
2015-10-18 18:08:34 +00:00
return $configContainer;
}
2013-12-29 09:50:41 +00:00
/**
2017-12-20 19:44:08 +00:00
* {@inheritDoc}
* @see baseModule::check_configOptions()
*/
public function check_configOptions($typeIds, &$options) {
$errors = parent::check_configOptions($typeIds, $options);
2013-12-29 09:50:41 +00:00
if ($options['ImapAccess_ImapAdminPasswordSelect'][0] == 'config') {
if (empty($options['ImapAccess_ImapAdminPassword'][0])) {
$errors[] = $this->messages['config'][2];
}
}
return $errors;
}
2015-08-03 19:56:49 +00:00
2013-12-29 09:50:41 +00:00
/**
* Returns the user name of the IMAP admin.
2015-08-03 19:56:49 +00:00
*
2013-12-29 09:50:41 +00:00
* @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];
2014-12-11 18:22:35 +00:00
$sr = @ldap_read($_SESSION['ldap']->server(), $dn, '(objectclass=*)', $attrNames, 0, 0, 0, LDAP_DEREF_NEVER);
2013-12-29 09:50:41 +00:00
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;
}
2015-08-03 19:56:49 +00:00
/**
* Returns the admin password.
*
* @return String password
*/
2013-12-29 09:50:41 +00:00
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'])) {
$imap_admin_password = lamDecrypt($_SESSION['imapAdmPass']);
}
elseif (isset($this->moduleSettings['ImapAccess_ImapAdminPasswordSelect'][0]) && ($this->moduleSettings['ImapAccess_ImapAdminPasswordSelect'][0] == "lam_user_pass")) {
$credentials = $_SESSION['ldap']->decrypt_login();
$imap_admin_password = $credentials[1];
}
2013-12-29 09:50:41 +00:00
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;
}
/**
* Checks the password given by user and save it as session parameter.
2015-08-03 19:56:49 +00:00
*
* @return array list of error messages
*/
function doLogin() {
$errors = array();
$imap_server_address = $this->getServerAddress();
2013-12-29 09:50:41 +00:00
$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);
if ($mbox) {
$_SESSION['imapAdmPass'] = lamEncrypt($_POST['ImapAdminPassword']);
@imap_close($mbox);
}
else {
$error = $this->messages['managemailbox'][5];
$error[] = imap_last_error();
$errors[] = $error;
}
}
return $errors;
}
/**
* This function returns the IMAP server address including encryption options.
2015-08-03 19:56:49 +00:00
*
* @return String server address
*/
function getServerAddress() {
$imap_encryption_protocol = $this->moduleSettings['ImapAccess_ImapServerEncriptionProtocol'][0];
if (strrpos($this->moduleSettings['ImapAccess_ImapServerAddress'][0], ":")) {
$imap_port_number = substr(strstr($this->moduleSettings['ImapAccess_ImapServerAddress'][0], ':'), 1);
$imap_server_name = array_shift(explode(':', $this->moduleSettings['ImapAccess_ImapServerAddress'][0], 2));
}
else {
$imap_server_name = $this->moduleSettings['ImapAccess_ImapServerAddress'][0];
if (strcmp($imap_encryption_protocol, "TLS") == 0) {
$imap_port_number = 143;
}
else {
$imap_port_number = 993;
}
}
if (isset($this->moduleSettings['ImapAccess_ImapValidateServerCert'][0]) && ($this->moduleSettings['ImapAccess_ImapValidateServerCert'][0] == 'novalidate-cert')) {
$validate_opt = "novalidate-cert";
}
else {
$validate_opt = "validate-cert";
}
$imap_server_address = $imap_server_name . ":" . $imap_port_number . "/" . $imap_encryption_protocol . "/" . $validate_opt;
return $imap_server_address;
}
/**
* This function returns the prefix for mailboxes.
* If no prefix was given during configuration then "user" will be used (default for Cyrus).
2015-08-03 19:56:49 +00:00
*
* @return String prefix
*/
function getMailboxPrefix() {
if (!isset($this->moduleSettings['ImapAccess_ImapUserPrefix'][0]) || ($this->moduleSettings['ImapAccess_ImapUserPrefix'][0] == '')) {
return "user";
}
else {
return $this->moduleSettings['ImapAccess_ImapUserPrefix'][0];
}
}
/**
* This function checks if the domain of the mailbox is not in the list of domains listed in the configuration.
* If it is in the list then it returns false, otherwise returns true. If the list of domains is not set then it returns true.
2015-08-03 19:56:49 +00:00
*
2012-07-15 12:05:47 +00:00
* @param String $email_domain email domain
* @return boolean true if domains match
*/
function isWrongDomain($email_domain) {
if (isset($this->moduleSettings['ImapAccess_ImapDomain'][0])) {
$domain_list_string = $this->moduleSettings['ImapAccess_ImapDomain'][0];
if ($domain_list_string == '*') {
return false;
}
$domains_array = explode(",", $domain_list_string);
if ((sizeof($domains_array) == 0) || in_array($email_domain, $domains_array)) {
return false;
}
}
else {
return false;
}
return true;
}
2015-08-03 19:56:49 +00:00
/**
* Returns the path separator.
2015-08-03 19:56:49 +00:00
*
* @return String separator char
*/
private function getSep() {
if (isset($this->moduleSettings['ImapAccess_pathSeparator'][0])) {
return $this->moduleSettings['ImapAccess_pathSeparator'][0];
}
return '.'; // default
}
2015-10-18 18:08:34 +00:00
/**
* Returns the list of initial folders to create for a new mailbox.
*
* @return array list of folders
*/
private function getInitialFolders() {
$list = array();
if (!empty($this->moduleSettings['ImapAccess_initialFolders'])) {
foreach ($this->moduleSettings['ImapAccess_initialFolders'] as $folder) {
$folder = trim($folder);
if (!empty($folder)) {
$list[] = $folder;
}
}
}
return $list;
}
}
?>