diff --git a/lam/lib/baseModule.inc b/lam/lib/baseModule.inc index ad4fbb7f..1865c5c6 100644 --- a/lam/lib/baseModule.inc +++ b/lam/lib/baseModule.inc @@ -1912,7 +1912,7 @@ abstract class baseModule { /** * Returns a list of wildcards that can be replaced in input fileds. - * E.g. "$firstname$" is replaced with "givenName" attribute value. + * E.g. "$firstname" is replaced with "givenName" attribute value. * * @return array replacements as wildcard => value */ diff --git a/lam/lib/modules/courierMailAccount.inc b/lam/lib/modules/courierMailAccount.inc new file mode 100644 index 00000000..1b1d3c79 --- /dev/null +++ b/lam/lib/modules/courierMailAccount.inc @@ -0,0 +1,582 @@ +autoAddObjectClasses = false; + } + + /** + * Returns true if this module can manage accounts of the current type, otherwise false. + * + * @return boolean true if module fits + */ + public function can_manage() { + return in_array($this->get_scope(), array( + 'user' + )); + } + + /** + * {@inheritDoc} + */ + public function get_metaData() { + $return = array(); + // icon + $return['icon'] = 'courierMail.png'; + // alias name + $return["alias"] = _("Courier"); + // module dependencies + $return['dependencies'] = array( + 'depends' => array( + 'inetOrgPerson' + ), + 'conflicts' => array() + ); + // managed object classes + $return['objectClasses'] = array( + 'courierMailAccount' + ); + // managed attributes + $return['attributes'] = array( + 'mailbox', 'mailhost', 'sharedgroup', 'disableimap', + 'disablepop3', 'disableshared', 'disablewebmail', 'quota' + ); + // help entries + $return['help'] = array( + 'disableimap' => array( + "Headline" => _("Disable IMAP access"), + "attr" => 'disableimap', + "Text" => _("Setting this will disallow the user from logging in using IMAP.") + ), + 'disablepop3' => array( + "Headline" => _("Disable POP3 access"), + "attr" => 'disablepop3', + "Text" => _("Setting this will disallow the user from logging in using POP3.") + ), + 'disablewebmail' => array( + "Headline" => _("Disable webmail access"), + "attr" => 'disablewebmail', + "Text" => _("Setting this will disallow the user from logging in using SQwebmail.") + ), + 'disableshared' => array( + "Headline" => _("Disable shared folder access"), + "attr" => 'disableshared', + "Text" => _("Setting this will make shared folders invisible to this user.") + ), + 'mailbox' => array( + "Headline" => _("User mailbox"), + "attr" => 'mailbox', + "Text" => _("Path to the user's mailbox. Usually relative to the user's home folder. In a mixed setup with users that are both local unix users and virtual Courier mail users it can be beneficial to configure this to be the Courier mail home directory.") + ), + 'mailhost' => array( + "Headline" => _("User mail host"), + "attr" => 'mailhost', + "Text" => _("Name of the host that stores the user's email. Must be a FQDN.") + ), + 'quota' => array( + "Headline" => _("User mail quota"), + "attr" => 'quota', + "Text" => _("The amont of storage available to the user.") + ), + 'quotaUpload' => array( + "Headline" => _("User mail quota"), + "attr" => 'quota', + "Text" => _("The amont of storage available to the user.") . ' ' . _('Please enter the amount in MB, e.g. 1000 means 1000MB of quota.') + ), + 'autoAdd' => array( + "Headline" => _("Automatically add this extension"), + "Text" => _("Automatically add this extension when creating new users.") + ), + 'homeDirectory' => array( + "Headline" => _("User home directory"), + "attr" => 'homeDirectory', + "Text" => _("The system home directory of the user. In a virtual user setup this is typically the root for all users.") + ), + ); + // profile options + $profileContainer = new htmlTable(); + $profileContainer->addElement(new htmlTableExtendedInputCheckbox('courierMailAccount_addExt', false, _('Automatically add this extension'), 'autoAdd'), true); + $return['profile_options'] = $profileContainer; + // PDF fields + $return['PDF_fields'] = array( + 'mailbox' => _('User mailbox'), + 'mailhost' => _('User mail host'), + 'quota' => _('User mail quota'), + 'disableimap' => _('Disable IMAP access'), + 'disablepop3' => _('Disable POP3 access'), + 'disablewebmail' => _('Disable webmail access'), + 'disableshared' => _('Disable shared folder access') + ); + // upload fields + $return['upload_columns'] = array( + array( + 'name' => 'courierMailAccount_mailbox', + 'description' => _('User mailbox'), + 'help' => 'mailbox', + ), + array( + 'name' => 'courierMailAccount_mailhost', + 'description' => _('User mail host'), + 'help' => 'mailhost', + ), + array( + 'name' => 'courierMailAccount_quota', + 'description' => _('User mail quota'), + 'help' => 'quotaUpload', + 'example' => '1000' + ), + array( + 'name' => 'courierMailAccount_disableimap', + 'description' => _('Disable IMAP access'), + 'help' => 'disableimap', + 'values' => 'true, false', + 'default' => 'false', + ), + array( + 'name' => 'courierMailAccount_disablepop3', + 'description' => _('Disable POP3 access'), + 'help' => 'disablepop3', + 'values' => 'true, false', + 'default' => 'false', + ), + array( + 'name' => 'courierMailAccount_disablewebmail', + 'description' => _('Disable webmail access'), + 'help' => 'disablewebmail', + 'values' => 'true, false', + 'default' => 'false', + ), + array( + 'name' => 'courierMailAccount_disableshared', + 'description' => _('Disable shared folder access'), + 'help' => 'disableshared', + 'values' => 'true, false', + 'default' => 'false', + ), + ); + return $return; + } + + /** + * This function fills the error message array with messages + */ + public function load_Messages() { + $this->messages['mailhost'][0] = array('ERROR', _('The mail host is not valid.')); // third array value is set dynamically + $this->messages['mailhost'][1] = array('ERROR', _('Account %s:') . ' courierMailAccount_mailhost', _('The mail host is not valid.')); + $this->messages['quota'][0] = array('ERROR', _('The quota must be entered as a floating point number.')); // third array value is set dynamically + $this->messages['quota'][1] = array('ERROR', _('Account %s:') . ' courierMailAccount_quota', _('Please enter a numeric value.')); + $this->messages['homeDirectory'][0] = array('ERROR', _('Homedirectory contains invalid characters.')); // third array value is set dynamically + $this->messages['homeDirectory'][1] = array('ERROR', _('Account %s:') . ' courierMailAccount_homeDirectory', _('Homedirectory contains invalid characters.')); + $this->messages['boolean'][0] = array('ERROR', _('Account %s:') . ' courierMailAccount_%s', _('This value can only be "true" or "false".')); + } + + /** + * {@inheritDoc} + * @see baseModule::getManagedAttributes() + */ + public function getManagedAttributes($typeId) { + $attrs = parent::getManagedAttributes($typeId); + $typeManager = new TypeManager(); + $modules = $typeManager->getConfiguredType($typeId)->getModules(); + if ($this->isUnixDisabled($modules)) { + $attrs[] = 'homeDirectory'; + } + return $attrs; + } + + /** + * {@inheritDoc} + */ + public function display_html_attributes() { + $return = new htmlTable(); + if ($this->isExtensionEnabled()) { + if ($this->isUnixDisabled($this->getAccountContainer()->get_type()->getModules())) { + // home directory + $this->addSimpleInputTextField($return, 'homeDirectory', _('Home directory'), true); + } + // show current mailBox + $this->addSimpleInputTextField($return, 'mailbox', _('Mailbox folder')); + // mail host input + $this->addSimpleInputTextField($return, 'mailhost', _('Mailbox host')); + // quota with selection for unit of measure + $unitIndex = 2; + $value = 0; + if (isset($this->attributes['quota'][0]) && (strlen($this->attributes['quota'][0]) > 0)) { + $unitIndex = floor(log(substr($this->attributes['quota'][0], 0, -1), 1000)); + $value = round((float) (substr($this->attributes['quota'][0], 0, -1)) / pow(1000, $unitIndex), 2); + } + $return->addElement(new htmlOutputText(_('Mail quota'))); + $tempTable = new htmlTable(); + $boxInput = new htmlInputField('quotaValue', $value); + $boxInput->setFieldSize(5); + $boxInput->setFieldMaxLength(5); + $tempTable->addElement($boxInput); + $units = array( + 'B', 'kB', 'MB', 'GB', + 'TB', 'PB', 'EB' + ); + $selected = array( + $units[$unitIndex] + ); + $unitSelect = new htmlSelect('quotaUnit', $units, $selected); + $unitSelect->setSortElements(false); + $tempTable->addElement($unitSelect); + $return->addElement($tempTable); + $return->addElement(new htmlHelpLink('quota'), true); + // check boxes for account access control + $disableimap = isset($this->attributes['disableimap'][0]) && ($this->attributes['disableimap'][0] != 0); + $return->addElement(new htmlTableExtendedInputCheckbox('disableimap', $disableimap, _('Disable IMAP use'), 'disableimap'), true); + $disablepop3 = isset($this->attributes['disablepop3'][0]) && ($this->attributes['disablepop3'][0] != 0); + $return->addElement(new htmlTableExtendedInputCheckbox('disablepop3', $disablepop3, _('Disable POP3 use'), 'disablepop3'), true); + $disablewebmail = isset($this->attributes['disablewebmail'][0]) && ($this->attributes['disablewebmail'][0] != 0); + $return->addElement(new htmlTableExtendedInputCheckbox('disablewebmail', $disablewebmail, _('Disable Webmail use'), 'disablewebmail'), true); + $disableshared = isset($this->attributes['disableshared'][0]) && ($this->attributes['disableshared'][0] != 0); + $return->addElement(new htmlTableExtendedInputCheckbox('disableshared', $disableshared, _('Disable Shared Folder use'), 'disableshared'), true); + // remove extension + $return->addElement(new htmlSpacer(null, '20px'), true); + $remButton = new htmlButton('remObjectClass', _('Remove Courier mail extension')); + $remButton->colspan = 3; + $return->addElement($remButton); + } + else { + $return->addElement(new htmlButton('addObjectClass', _('Add Courier mail extension'))); + } + return $return; + } + + /** + * {@inheritdoc} + */ + public function process_attributes() { + // add extension + if (isset($_POST['addObjectClass'])) { + $this->attributes['objectClass'][] = 'courierMailAccount'; + return array(); + } + // remove extension + elseif (isset($_POST['remObjectClass'])) { + $this->attributes['objectClass'] = array_delete(array( + 'courierMailAccount' + ), $this->attributes['objectClass']); + $attrNames = $this->getManagedAttributes($this->getAccountContainer()->get_type()->getId()); + foreach ($attrNames as $attrName) { + if (isset($this->attributes[$attrName])) { + unset($this->attributes[$attrName]); + } + } + return array(); + } + // skip processing if extension is not active + if (!$this->isExtensionEnabled()) { + return array(); + } + $this->getAccountContainer()->replaceWildcardsInPOST(array('homeDirectory', 'mailbox')); + $errors = array(); + // check new mailbox + $this->attributes['mailbox'][0] = $_POST['mailbox']; + // quota + $units = array( + 'B', 'kB', 'MB', + 'GB', 'TB', 'PB', 'EB' + ); + // check new quota + if (isset($_POST['quotaValue'])) { + if (is_numeric($_POST['quotaValue']) && in_array($_POST['quotaUnit'], $units)) { + if ($_POST['quotaValue'] > 0) { + $power = array_search($_POST['quotaUnit'], $units); + $this->attributes['quota'][0] = $_POST['quotaValue'] * pow(1000, $power) . "S"; + } + elseif (isset($this->attributes['quota'])) { + unset($this->attributes['quota']); + } + } + else { + $message = $this->messages['quota'][0]; + $message[] = $_POST['quotaValue']; + $errors[] = $message; + } + } + elseif (isset($this->attributes['quota'])) { + unset($this->attributes['quota']); + } + // mail host + if (!empty($_POST['mailhost'])) { + // must be a valid host name + $this->attributes['mailhost'][0] = $_POST['mailhost']; + if (!get_preg($this->attributes['mailhost'][0], 'hostname')) { + $message = $this->messages['mailhost'][0]; + $message[] = $_POST['mailhost']; + $errors[] = $message; + } + } + elseif (isset($this->attributes['mailhost'])) { + unset($this->attributes['mailhost']); + } + // disable IMAP + $this->attributes['disableimap'][0] = 0; + if (isset($_POST['disableimap'])) { + $this->attributes['disableimap'][0] = 1; + } + // disable POP3 + $this->attributes['disablepop3'][0] = 0; + if (isset($_POST['disablepop3'])) { + $this->attributes['disablepop3'][0] = 1; + } + // disable Webmail + $this->attributes['disablewebmail'][0] = 0; + if (isset($_POST['disablewebmail'])) { + $this->attributes['disablewebmail'][0] = 1; + } + // disable shared folder + $this->attributes['disableshared'][0] = 0; + if (isset($_POST['disableshared'])) { + $this->attributes['disableshared'][0] = 1; + } + // home directory + if ($this->isUnixDisabled($this->getAccountContainer()->get_type()->getModules())) { + // check new home directory + $this->attributes['homeDirectory'][0] = $_POST['homeDirectory']; + // check for valid path + if (!get_preg($this->attributes['homeDirectory'][0], 'filePath')) { + $message = $this->messages['homeDirectory'][0]; + $message[] = $this->attributes['homeDirectory'][0]; + $errors[] = $message; + } + } + return $errors; + } + + /** + * {@inheritdoc} + */ + public function module_ready() { + $attrs = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->getAttributes(); + return isset($attrs['mail'][0]); + } + + /** + * Returns if the Courier extension is enabled. + * + * @return boolean Courier extension is active + */ + private function isExtensionEnabled() { + return in_array('courierMailAccount', $this->attributes['objectClass']); + } + + /** + * {@inheritDoc} + * @see baseModule::get_pdfFields() + */ + public function get_pdfFields($typeId) { + $fields = parent::get_pdfFields($typeId); + $typeManager = new TypeManager(); + $modules = $typeManager->getConfiguredType($typeId)->getModules(); + if ($this->isUnixDisabled($modules)) { + $fields['homeDirectory'] = _('Home directory'); + } + return $fields; + } + + /** + * {@inheritdoc} + */ + public function get_pdfEntries() { + $return = array(); + $this->addSimplePDFField($return, 'mailbox', _('User mailbox')); + $this->addSimplePDFField($return, 'mailhost', _('User mail host')); + $this->addSimplePDFField($return, 'homeDirectory', _('Home directory')); + $disableOptions = array( + 'disableimap' => _('IMAP access disabled'), + 'disablepop3' => _('POP3 access disabled'), + 'disablewebmail' => _('Webmail access disabled'), + 'disableshared' => _('Shared folder access disabled') + ); + foreach ($disableOptions as $attrName => $label) { + $value = _('No'); + if (isset($this->attributes[$attrName][0]) && ($this->attributes[$attrName][0] == '1')) { + $value = _('Yes'); + } + $this->addPDFKeyValue($return, $attrName, $label, $value); + } + // quota + $unitIndex = 2; + $value = 0; + if (isset($this->attributes['quota'][0]) && (strlen($this->attributes['quota'][0]) > 0)) { + $unitIndex = floor(log(substr($this->attributes['quota'][0], 0, -1), 1000)); + $value = round((float) (substr($this->attributes['quota'][0], 0, -1)) / pow(1000, $unitIndex), 2); + } + $units = array( + 'B', 'kB', 'MB', 'GB', + 'TB', 'PB', 'EB' + ); + $this->addPDFKeyValue($return, 'quota', _('User mail quota'), $value . $units[$unitIndex]); + return $return; + } + + /** + * {@inheritDoc} + * @see baseModule::getManagedAttributes() + */ + function get_uploadColumns($selectedModules, &$type) { + $return = parent::get_uploadColumns($selectedModules, $type); + // home directory + if ($this->isUnixDisabled($selectedModules)) { + $return[] = array( + 'name' => 'courierMailAccount_homeDirectory', + 'description' => _('Home directory'), + 'help' => 'homeDirectory', + 'example' => _('/home/smiller'), + 'required' => 'true' + ); + } + return $return; + } + + /** + * {@inheritdoc} + */ + public function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts, $selectedModules) { + $messages = array(); + for ($i = 0; $i < sizeof($rawAccounts); $i++) { + // add object class + if (!in_array("courierMailAccount", $partialAccounts[$i]['objectClass'])) { + $partialAccounts[$i]['objectClass'][] = "courierMailAccount"; + } + // home directory + if ($this->isUnixDisabled($selectedModules)) { + if (!get_preg($rawAccounts[$i][$ids['courierMailAccount_homeDirectory']], 'homeDirectory')) { + $message = $this->messages['homeDirectory'][1]; + $message[] = array($i); + $messages[] = $message; + } + else { + $partialAccounts[$i]['homeDirectory'] = $rawAccounts[$i][$ids['courierMailAccount_homeDirectory']]; + } + } + // mailbox + if (!empty($rawAccounts[$i][$ids['courierMailAccount_mailbox']])) { + $partialAccounts[$i]['mailbox'] = $rawAccounts[$i][$ids['courierMailAccount_mailbox']]; + } + // add mailhost + if (!empty($rawAccounts[$i][$ids['courierMailAccount_mailhost']])) { + if (!get_preg($rawAccounts[$i][$ids['courierMailAccount_mailhost']], 'hostname')) { + $message = $this->messages['mailhost'][1]; + $message[] = array($i); + $messages[] = $message; + } + else { + $partialAccounts[$i]['mailhost'] = $rawAccounts[$i][$ids['courierMailAccount_mailhost']]; + } + } + // mail quota + if (!empty($rawAccounts[$i][$ids['courierMailAccount_quota']])) { + if (is_numeric($rawAccounts[$i][$ids['courierMailAccount_quota']])) { + $partialAccounts[$i]['quota'] = ($rawAccounts[$i][$ids['courierMailAccount_quota']] * 1000000) . "S"; + } + else { + $message = $this->messages['quota'][1]; + $message[] = array($i); + $messages[] = $message; + } + } + // boolean flags + $flags = array( + 'disableimap', 'disablepop3', + 'disablewebmail', 'disableshared' + ); + $flagValues = array('true', 'false'); + foreach ($flags as $flag) { + $partialAccounts[$i][$flag] = 0; + if (!empty($rawAccounts[$i][$ids['courierMailAccount_' . $flag]])) { + $flagValue = $rawAccounts[$i][$ids['courierMailAccount_' . $flag]]; + if (!in_array($flagValue, $flagValues)) { + $message = $this->messages['boolean'][0]; + $message[] = array($i, $flag); + $messages[] = $message; + } + elseif ($flagValue == 'true') { + $partialAccounts[$i][$flag] = 1; + } + } + } + } + return $messages; + } + + /** + * {@inheritdoc} + */ + public function load_profile($profile) { + // profile mappings in meta data + parent::load_profile($profile); + // add extension + if (isset($profile['courierMailAccount_addExt'][0]) && ($profile['courierMailAccount_addExt'][0] == "true")) { + if (!in_array('courierMailAccount', $this->attributes['objectClass'])) { + $this->attributes['objectClass'][] = 'courierMailAccount'; + } + } + } + + /** + * Returns if this account is virtual only or also a unix account + * + * @param string[] modules + * @return boolean only virtual account + */ + private function isUnixDisabled($modules) { + if (in_array('posixAccount', $modules)) { + return false; + } + else { + return true; + } + } + +} + +?> \ No newline at end of file diff --git a/lam/lib/modules/inetOrgPerson.inc b/lam/lib/modules/inetOrgPerson.inc index f16ea6ba..78ac31ef 100644 --- a/lam/lib/modules/inetOrgPerson.inc +++ b/lam/lib/modules/inetOrgPerson.inc @@ -3822,10 +3822,7 @@ class inetOrgPerson extends baseModule implements passwordService { } /** - * Returns a list of wildcards that can be replaced in input fileds. - * E.g. "$firstname$" is replaced with "givenName" attribute value. - * - * @return array replacements as wildcard => value + * {@inheritdoc} */ public function getWildCardReplacements() { $replacements = array(); diff --git a/lam/lib/modules/posixAccount.inc b/lam/lib/modules/posixAccount.inc index 9cde9c85..e1d1e1f1 100644 --- a/lam/lib/modules/posixAccount.inc +++ b/lam/lib/modules/posixAccount.inc @@ -2109,7 +2109,7 @@ class posixAccount extends baseModule implements passwordService { function get_uploadColumns($selectedModules, &$type) { $return = parent::get_uploadColumns($selectedModules, $type); if (($this->get_scope() == 'user') && $this->manageCn($selectedModules)) { - array_unshift($return['upload_columns'], array( + array_unshift($return, array( 'name' => 'posixAccount_cn', 'description' => _('Common name'), 'help' => 'cn', @@ -3479,10 +3479,7 @@ class posixAccount extends baseModule implements passwordService { } /** - * Returns a list of wildcards that can be replaced in input fileds. - * E.g. "$firstname$" is replaced with "givenName" attribute value. - * - * @return array replacements as wildcard => value + * {@inheritdoc} */ public function getWildCardReplacements() { $replacements = array(); diff --git a/lam/lib/modules/windowsUser.inc b/lam/lib/modules/windowsUser.inc index 49fa336a..9e8812eb 100644 --- a/lam/lib/modules/windowsUser.inc +++ b/lam/lib/modules/windowsUser.inc @@ -3377,10 +3377,7 @@ class windowsUser extends baseModule implements passwordService { } /** - * Returns a list of wildcards that can be replaced in input fileds. - * E.g. "$firstname$" is replaced with "givenName" attribute value. - * - * @return array replacements as wildcard => value + * {@inheritdoc} */ public function getWildCardReplacements() { $replacements = array();