invitationPolicies = array( 'ACT_ALWAYS_ACCEPT' => _('Always accept'), 'ACT_ALWAYS_REJECT' => _('Always reject'), 'ACT_MANUAL' => _('Manual'), 'ACT_REJECT_IF_CONFLICTS' => _('Reject if conflicts'), 'ACT_MANUAL_IF_CONFLICTS' => _('Manual if conflicts') ); $this->autoAddObjectClasses = false; } /** * Returns meta data that is interpreted by parent class * * @return array array with meta data * * @see baseModule::get_metaData() */ function get_metaData() { $return = array(); // icon $return['icon'] = 'kolab.png'; // manages host accounts $return["account_types"] = array("user"); // alias name $return["alias"] = _("Kolab"); // module dependencies $return['dependencies'] = array('depends' => array('inetOrgPerson'), 'conflicts' => array()); // LDAP filter $return["ldap_filter"] = array('or' => "(objectClass=kolabInetOrgPerson)"); // managed object classes $return['objectClasses'] = array('kolabInetOrgPerson'); if ($this->manageMailrecipient()) { $return['objectClasses'][] = 'mailrecipient'; } // managed attributes $return['attributes'] = array('alias', 'mailHost', 'kolabDelegate', 'kolabInvitationPolicy', 'kolabDeleteflag', 'kolabAllowSMTPRecipient', 'kolabAllowSMTPSender'); if ($this->manageMailrecipient()) { $return['attributes'][] = 'mailQuota'; } // profile options $profileContainer = new htmlTable(); $profileContainer->addElement(new htmlTableExtendedInputField(_('Mail server'), 'kolab_mailHost', null, 'mailHost'), true); $return['profile_options'] = $profileContainer; // profile checks $return['profile_checks']['kolab_mailHost'] = array( 'type' => 'ext_preg', 'regex' => 'DNSname', 'error_message' => $this->messages['mailHost'][0]); // profile mappings $return['profile_mappings'] = array( 'kolab_mailHost' => 'mailHost', ); // config options $configContainer = new htmlTable(); $configContainer->addElement(new htmlTableExtendedInputCheckbox('kolabUser_mailrecipient', true, _('Manage object class "mailrecipient"'), 'mailrecipient'), true); $return['config_options']['all'] = $configContainer; // self service field settings $return['selfServiceFieldSettings'] = array( 'kolabDelegate' => _('Delegates'), 'kolabInvitationPolicy' => _('Invitation policy') ); // possible self service read-only fields $return['selfServiceReadOnlyFields'] = array('kolabDelegate', 'kolabInvitationPolicy'); // help Entries $return['help'] = array( 'invPol' => array( "Headline" => _("Invitation policy"), 'attr' => 'kolabInvitationPolicy', "Text" => _("For automatic invitation handling.") ), 'invPolList' => array( "Headline" => _("Invitation policy list"), 'attr' => 'kolabInvitationPolicy', "Text" => _("This is a comma separated list of invitation policies.") ), 'delegate' => array( "Headline" => _("Delegates"), 'attr' => 'kolabDelegate', "Text" => _("A user may define who is allowed to act on behalf of herself. This property is checked when using the Kolab smtp daemon (Postfix) to send emails.") ), 'delegateList' => array( "Headline" => _("Delegates"), 'attr' => 'kolabDelegate', "Text" => _("This is a comma separated list of delegates.") ), 'alias' => array( "Headline" => _("Email alias"), 'attr' => 'alias', "Text" => _("Email alias for this account.") ), 'aliasList' => array( "Headline" => _("Email alias list"), 'attr' => 'alias', "Text" => _("This is a comma separated list of eMail aliases.") ), 'mailHost' => array( "Headline" => _("Mailbox home server"), 'attr' => 'mailHost', "Text" => _("The name of the server where the mailbox is located.") ), 'kolabAllowSMTPRecipient' => array ( "Headline" => _('Allowed recipients'), 'attr' => 'kolabAllowSMTPRecipient', "Text" => _('Describes the allowed or disallowed SMTP recipient addresses for mail sent by this account (e.g. "domain.tld" or "-user@domain.tld").') ), 'kolabAllowSMTPRecipientList' => array ( "Headline" => _('Allowed recipients'), 'attr' => 'kolabAllowSMTPRecipient', "Text" => _('Describes the allowed or disallowed SMTP recipient addresses for mail sent by this account (e.g. "domain.tld" or "-user@domain.tld").') . ' ' . _("Multiple values are separated by semicolon.") ), 'kolabAllowSMTPSender' => array ( "Headline" => _('Allowed senders'), 'attr' => 'kolabAllowSMTPSender', "Text" => _('Describes the allowed or disallowed SMTP addresses sending mail to this account (e.g. "domain.tld" or "-user@domain.tld").') ), 'kolabAllowSMTPSenderList' => array ( "Headline" => _('Allowed senders'), 'attr' => 'kolabAllowSMTPSender', "Text" => _('Describes the allowed or disallowed SMTP addresses sending mail to this account (e.g. "domain.tld" or "-user@domain.tld").') . ' ' . _("Multiple values are separated by semicolon.") ), 'mailrecipient' => array( "Headline" => _('Manage object class "mailrecipient"'), "Text" => _('Adds the object class "mailrecipient" to all user accounts.') ), 'deleteFlag' => array( "Headline" => _("Mark for deletion"), 'attr' => 'kolabDeleteflag', "Text" => _("This will set a special flag on the account which tells Kolabd to remove it. Use this to cleanly delete Kolab accounts (e.g. this removes mail boxes).") ), ); // upload fields $return['upload_columns'] = array( array( 'name' => 'kolabUser_invPol', 'description' => _('Invitation policy'), 'help' => 'invPolList', 'example' => 'user@domain:ACT_ALWAYS_ACCEPT,user2@domain:ACT_MANUAL' ), array( 'name' => 'kolabUser_mailHost', 'description' => _('Mailbox home server'), 'help' => 'mailHost', 'example' => 'localhost', 'required' => true ), array( 'name' => 'kolabUser_aliases', 'description' => _('Email aliases'), 'help' => 'aliasList', 'example' => 'user@domain,user2@domain' ), array( 'name' => 'kolabUser_delegates', 'description' => _('Delegates'), 'help' => 'delegateList', 'example' => 'user@domain,user2@domain' ), array( 'name' => 'kolabUser_kolabAllowSMTPRecipient', 'description' => _('Allowed recipients'), 'help' => 'kolabAllowSMTPRecipientList', 'example' => '.com; -.net', ), array( 'name' => 'kolabUser_kolabAllowSMTPSender', 'description' => _('Allowed senders'), 'help' => 'kolabAllowSMTPSenderList', 'example' => '.com; -.net', ), ); // available PDF fields $return['PDF_fields'] = array( 'invPol' => _('Invitation policy'), 'mailHost' => _('Mailbox home server'), 'aliases' => _('Email aliases'), 'delegate' => _('Delegates'), 'kolabAllowSMTPRecipient' => _('Allowed recipients'), 'kolabAllowSMTPSender' => _('Allowed senders'), ); return $return; } /** * This function fills the error message array with messages */ function load_Messages() { $this->messages['invPol'][0] = array('ERROR', _('Target of invitation policy is invalid!')); // third array value is set dynamically $this->messages['invPol'][1] = array('ERROR', _('Account %s:') . ' kolabUser_invPol', _('Policy list has invalid format!')); $this->messages['alias'][0] = array('ERROR', _('Email alias is invalid!')); // third array value is set dynamically $this->messages['alias'][1] = array('ERROR', _('Account %s:') . ' kolabUser_aliases', _('Email alias list has invalid format!')); $this->messages['mailHost'][0] = array('ERROR', _('Mailbox home server name is invalid!')); // third array value is set dynamically $this->messages['mailHost'][1] = array('ERROR', _('Account %s:') . ' kolabUser_mailHost', _('Mailbox home server name is invalid!')); $this->messages['mailHost'][2] = array('ERROR', _('Mailbox home server name is empty!')); $this->messages['delegate'][0] = array('ERROR', _('Account %s:') . ' kolabUser_delegates', _('Unknown delegate address: %s')); $this->messages['kolabAllowSMTPRecipient'][0] = array('ERROR', _('Allowed recipients'), _('Please enter a valid recepient expression.')); $this->messages['kolabAllowSMTPRecipient'][1] = array('ERROR', _('Account %s:') . ' kolabUser_kolabAllowSMTPRecipient', _('Please enter a valid recepient expression.')); $this->messages['kolabAllowSMTPSender'][0] = array('ERROR', _('Allowed senders'), _('Please enter a valid sender expression.')); $this->messages['kolabAllowSMTPSender'][1] = array('ERROR', _('Account %s:') . ' kolabUser_kolabAllowSMTPSender', _('Please enter a valid sender expression.')); } /** * Returns the HTML meta data for the main account page. * * @return htmlElement HTML meta data */ function display_html_attributes() { $return = new htmlTable(); if (isset($this->attributes['objectClass']) && in_array('kolabInetOrgPerson', $this->attributes['objectClass'])) { $attrsI = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->getAttributes(); if ($this->getAccountContainer()->isNewAccount) { if ($this->getAccountContainer()->getAccountModule('posixAccount') != null) { $attrsP = $this->getAccountContainer()->getAccountModule('posixAccount')->getAttributes(); if (!isset($attrsP['userPassword'][0]) || ($attrsP['userPassword'][0] == '')) { $message = new htmlStatusMessage('ERROR', _("Please enter a user password.")); $message->colspan = 5; $return->addElement($message, true); } } elseif (!isset($attrsI['userPassword'][0]) || ($attrsI['userPassword'][0] == '')) { $message = new htmlStatusMessage('ERROR', _("Please enter a user password.")); $message->colspan = 5; $return->addElement($message, true); } } if (!isset($attrsI['mail'][0])) { $message = new htmlStatusMessage('ERROR', _("Please enter an email address on this page: %s"), '', array($this->getAccountContainer()->getAccountModule('inetOrgPerson')->get_alias())); $message->colspan = 5; $return->addElement($message, true); } // check if account is marked for deletion if (isset($this->attributes['kolabDeleteflag'])) { $return->addElement(new htmlOutputText(_('This account is marked for deletion.'))); return $return; } // mailbox server if (!isset($this->orig['mailHost'][0])) { // value currently not set $this->addSimpleInputTextField($return, 'mailHost', _('Mailbox home server'), true); } else { // input is unchangable when set $return->addElement(new htmlOutputText(_('Mailbox home server'))); $return->addElement(new htmlOutputText($this->attributes['mailHost'][0])); $return->addElement(new htmlHelpLink('mailHost'), true); } // invitation policies $return->addElement(new htmlSubTitle(_('Invitation policy')), true); $invitationContainer = new htmlTable(); $invitationContainer->colspan = 3; // default invitation policy $defaultInvPol = $this->invitationPolicies['ACT_MANUAL']; if (isset($this->attributes['kolabInvitationPolicy'])) { for ($i = 0; $i < sizeof($this->attributes['kolabInvitationPolicy']); $i++) { $parts = explode(":", $this->attributes['kolabInvitationPolicy'][$i]); if (sizeof($parts) == 1) { $defaultInvPol = $this->invitationPolicies[$this->attributes['kolabInvitationPolicy'][$i]]; unset($this->attributes['kolabInvitationPolicy'][$i]); $this->attributes['kolabInvitationPolicy'] = array_values($this->attributes['kolabInvitationPolicy']); break; } } } $invitationContainer->addElement(new htmlTableExtendedSelect('defaultInvPol', array_values($this->invitationPolicies), array($defaultInvPol), _('Anyone'), 'invPol'), true); // other invitation policies if (isset($this->attributes['kolabInvitationPolicy'])) { for ($i = 0; $i < sizeof($this->attributes['kolabInvitationPolicy']); $i++) { $parts = explode(":", $this->attributes['kolabInvitationPolicy'][$i]); if (sizeof($parts) == 2) { $invitationContainer->addElement(new htmlInputField('invPol1' . $i, $parts[0])); $invitationContainer->addElement(new htmlSelect('invPol2' . $i, array_values($this->invitationPolicies), array($this->invitationPolicies[$parts[1]]))); $invitationContainer->addElement(new htmlButton('delInvPol' . $i, 'del.png', true)); $invitationContainer->addElement(new htmlHelpLink('invPol'), true); } } } // input box for new invitation policy $invitationContainer->addElement(new htmlInputField('invPol1', '')); $invitationContainer->addElement(new htmlSelect('invPol2', array_values($this->invitationPolicies))); $invitationContainer->addElement(new htmlButton('addInvPol', 'add.png', true)); $invitationContainer->addElement(new htmlHelpLink('invPol'), true); $return->addElement($invitationContainer, true); // mail aliases $return->addElement(new htmlSubTitle(_('Email aliases')), true); $this->addMultiValueInputTextField($return, 'alias'); // delegates $delegates = searchLDAPByAttribute('mail', '*', 'inetOrgPerson', array('mail'), array('user')); for ($i = 0; $i < sizeof($delegates); $i++) { $delegates[$i] = $delegates[$i]['mail'][0]; } sort($delegates); $return->addElement(new htmlSubTitle(_('Delegates')), true); $delegatesContainer = new htmlTable(); $delegatesContainer->colspan = 3; if (isset($this->attributes['kolabDelegate'])) { for ($i = 0; $i < sizeof($this->attributes['kolabDelegate']); $i++) { $delegatesContainer->addElement(new htmlSelect('delegate' . $i, $delegates, array($this->attributes['kolabDelegate'][$i]))); $delegatesContainer->addElement(new htmlButton('delDelegate' . $i, 'del.png', true)); if ($i == 0) { $delegatesContainer->addElement(new htmlHelpLink('delegate')); } $delegatesContainer->addNewLine(); } } // input box for new delegate $delegatesContainer->addElement(new htmlSelect('delegate', $delegates)); $delegatesContainer->addElement(new htmlButton('addDelegate', 'add.png', true)); if (empty($this->attributes['kolabDelegate'])) { $delegatesContainer->addElement(new htmlHelpLink('delegate')); } $return->addElement($delegatesContainer, true); $return->addElement(new htmlSubTitle(_('Options')), true); // allowed recipients $this->addMultiValueInputTextField($return, 'kolabAllowSMTPRecipient', _('Allowed recipients')); // allowed senders $this->addMultiValueInputTextField($return, 'kolabAllowSMTPSender', _('Allowed senders')); // delete flag if (!$this->getAccountContainer()->isNewAccount) { $deleteContainer = new htmlTable(); $deleteContainer->addElement(new htmlSpacer(null, '20px'), true); $deleteContainer->addElement(new htmlAccountPageButton(get_class($this), 'deleteUser', 'open', _('Mark account for deletion'))); $deleteContainer->addElement(new htmlHelpLink('deleteFlag')); $return->addElement($deleteContainer); } } else { $return->addElement(new htmlButton('addObjectClass', _('Add Kolab extension'))); } return $return; } /** * 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 (isset($_POST['addObjectClass'])) { $this->attributes['objectClass'][] = 'kolabInetOrgPerson'; if ($this->manageMailrecipient()) { $this->attributes['objectClass'][] = 'mailrecipient'; } } else { if (isset($_POST['form_subpage_kolabUser_deleteUser_open'])) return array(); $this->attributes['kolabInvitationPolicy'] = array(); // mailbox server if (isset($_POST['mailHost'])) { if ($_POST['mailHost'] == "") { $errors[] = $this->messages['mailHost'][2]; } elseif (get_preg($_POST['mailHost'], 'DNSname')) { $this->attributes['mailHost'][0] = $_POST['mailHost']; } else { $message = $this->messages['mailHost'][0]; $message[] = $_POST['mailHost']; $errors[] = $message; } } // check old invitation policies $policies = array_flip($this->invitationPolicies); $targets = array(); $i = 0; while (isset($_POST['invPol1' . $i])) { if (isset($_POST['delInvPol' . $i])) { $i++; continue; } if (isset($_POST['invPol2' . $i]) && ($_POST['invPol1' . $i] != "") && !in_array($_POST['invPol1' . $i], $targets)) { $targets[] = $_POST['invPol1' . $i]; // check invitation policy if (!get_preg($_POST['invPol1' . $i], 'email')) { $message = $this->messages['invPol'][0]; $message[] = $_POST['invPol1' . $i]; $errors[] = $message; } else { $this->attributes['kolabInvitationPolicy'][] = $_POST['invPol1' . $i] . ':' . $policies[$_POST['invPol2' . $i]]; } } $i++; } // check new invitation policy if (isset($_POST['invPol1']) && ($_POST['invPol1'] != "") && !in_array($_POST['invPol1'], $targets)) { // check new invitation policy if (!get_preg($_POST['invPol1'], 'email')) { $message = $this->messages['invPol'][0]; $message[] = $_POST['invPol1']; $errors[] = $message; } else { $this->attributes['kolabInvitationPolicy'][] = $_POST['invPol1'] . ':' . $policies[$_POST['invPol2']]; } } // default invitation policy if (isset($_POST['defaultInvPol']) && ($_POST['defaultInvPol'] != "")) { $this->attributes['kolabInvitationPolicy'][] = $policies[$_POST['defaultInvPol']]; } // mail aliases $this->processMultiValueInputTextField('alias', $errors, 'email'); // check old delegates $this->attributes['kolabDelegate'] = array(); $i = 0; while (isset($_POST['delegate' . $i])) { if (isset($_POST['delDelegate' . $i])) { $i++; continue; } $this->attributes['kolabDelegate'][] = $_POST['delegate' . $i]; $i++; } // check new delegate if (isset($_POST['addDelegate']) && ($_POST['delegate'] != "")) { $this->attributes['kolabDelegate'][] = $_POST['delegate']; } $this->attributes['kolabDelegate'] = array_unique($this->attributes['kolabDelegate']); // allowed recipients $this->processMultiValueInputTextField('kolabAllowSMTPRecipient', $errors, 'kolabEmailPrefix'); // allowed senders $this->processMultiValueInputTextField('kolabAllowSMTPSender', $errors, 'kolabEmailPrefix'); } return $errors; } /** * This function will create the meta HTML code to show a page to mark an account for deletion. * * @return htmlElement HTML meta data */ function display_html_deleteUser() { $return = new htmlTable(); $message = new htmlOutputText(_('Do you really want to mark this account for deletion?')); $message->colspan = 2; $return->addElement($message, true); $return->addElement(new htmlSpacer(null, '10px'), true); $return->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'confirm', _('Mark account for deletion'))); $return->addElement(new htmlAccountPageButton(get_class($this), 'attributes', 'cancel', _('Cancel'))); return $return; } /** * Write variables into object and do some regex checks */ function process_deleteUser() { if (isset($_POST['form_subpage_kolabUser_attributes_confirm'])) { // set delete flag $this->attributes['kolabDeleteflag'][0] = $this->attributes['mailHost'][0]; } } /** * This function returns true if all needed settings are done. * * @return true, if account can be saved */ function module_complete() { if (isset($this->attributes['objectClass']) && in_array('kolabInetOrgPerson', $this->attributes['objectClass'])) { $attrsI = $this->getAccountContainer()->getAccountModule('inetOrgPerson')->getAttributes(); if (!$attrsI['mail'][0]) return false; if ($this->getAccountContainer()->isNewAccount) { if ($this->getAccountContainer()->getAccountModule('posixAccount') != null) { $attrsP = $this->getAccountContainer()->getAccountModule('posixAccount')->getAttributes(); if (!$attrsP['userPassword'][0]) return false; } elseif (!$attrsI['userPassword'][0]) { return false; } } } return true; } /** * Returns a list of modifications which have to be made to the LDAP account. * * @return array list of modifications * This function returns an array with 3 entries: * array( DN1 ('add' => array($attr), 'remove' => array($attr), 'modify' => array($attr)), DN2 .... ) * DN is the DN to change. It may be possible to change several DNs (e.g. create a new user and add him to some groups via attribute memberUid) * "add" are attributes which have to be added to LDAP entry * "remove" are attributes which have to be removed from LDAP entry * "modify" are attributes which have to been modified in LDAP entry * "info" are values with informational value (e.g. to be used later by pre/postModify actions) */ function save_attributes() { if (!in_array('kolabInetOrgPerson', $this->attributes['objectClass']) && !in_array('kolabInetOrgPerson', $this->orig['objectClass'])) { // skip saving if the extension was not added/modified return array(); } return $this->getAccountContainer()->save_module_attributes($this->attributes, $this->orig); } /** * In this function the LDAP account is built up. * * @param array $rawAccounts list of hash arrays (name => value) from user input * @param array $ids list of IDs for column position (e.g. "posixAccount_uid" => 5) * @param array $partialAccounts list of hash arrays (name => value) which are later added to LDAP * @param array $selectedModules list of selected account modules * @return array list of error messages if any */ function build_uploadAccounts($rawAccounts, $ids, &$partialAccounts, $selectedModules) { $messages = array(); $delegates = searchLDAPByAttribute(null, null, 'inetOrgPerson', array('mail'), array('user')); for ($d = 0; $d < sizeof($delegates); $d++) { if (isset($delegates[$d]['mail'][0])) { $delegates[$d] = $delegates[$d]['mail'][0]; } } for ($i = 0; $i < sizeof($rawAccounts); $i++) { // add object class if (!in_array("kolabInetOrgPerson", $partialAccounts[$i]['objectClass'])) { $partialAccounts[$i]['objectClass'][] = "kolabInetOrgPerson"; } if ($this->manageMailrecipient() && !in_array("mailrecipient", $partialAccounts[$i]['objectClass'])) { $partialAccounts[$i]['objectClass'][] = "mailrecipient"; } // mailbox server if ($rawAccounts[$i][$ids['kolabUser_mailHost']] != "") { if (get_preg($rawAccounts[$i][$ids['kolabUser_mailHost']], 'DNSname')) { $partialAccounts[$i]['mailHost'] = $rawAccounts[$i][$ids['kolabUser_mailHost']]; } else { $errMsg = $this->messages['mailHost'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; } } // add invitation policies if ($rawAccounts[$i][$ids['kolabUser_invPol']] != "") { $pols = explode(',', $rawAccounts[$i][$ids['kolabUser_invPol']]); // check format $policies = array_keys($this->invitationPolicies); $defaultFound = false; for ($p = 0; $p < sizeof($pols); $p++) { $parts = explode(":", $pols[$p]); // default policy if (sizeof($parts) == 1) { if (!$defaultFound && get_preg($parts[0], 'email')) { $partialAccounts[$i]['kolabInvitationPolicy'][] = $parts[0]; } else { $errMsg = $this->messages['invPol'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; } $defaultFound = true; } // additional policies elseif (sizeof($parts) == 2) { if (get_preg($parts[0], 'email') && in_array($parts[1], $policies)) { $partialAccounts[$i]['kolabInvitationPolicy'][] = $pols[$p]; } else { $errMsg = $this->messages['invPol'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; } } // invalid format else { $errMsg = $this->messages['invPol'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; } } } // add mail aliases if ($rawAccounts[$i][$ids['kolabUser_aliases']] != "") { $aliases = explode(',', $rawAccounts[$i][$ids['kolabUser_aliases']]); // check format for ($a = 0; $a < sizeof($aliases); $a++) { if (get_preg($aliases[$a], 'email')) { $partialAccounts[$i]['alias'][] = $aliases[$a]; } // invalid format else { $errMsg = $this->messages['alias'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; } } } // add delegates if ($rawAccounts[$i][$ids['kolabUser_delegates']] != "") { $newDelegates = explode(',', $rawAccounts[$i][$ids['kolabUser_delegates']]); // check format for ($d = 0; $d < sizeof($newDelegates); $d++) { if (in_array($newDelegates[$d], $delegates)) { $partialAccounts[$i]['kolabDelegate'][] = $newDelegates[$d]; } // invalid format else { $errMsg = $this->messages['delegate'][0]; array_push($errMsg, array($i, $newDelegates[$d])); $messages[] = $errMsg; } } } // allowed recipients if (!empty($rawAccounts[$i][$ids['kolabUser_kolabAllowSMTPRecipient']])) { $mails = preg_split('/;[ ]*/', $rawAccounts[$i][$ids['kolabUser_kolabAllowSMTPRecipient']]); for ($m = 0; $m < sizeof($mails); $m++) { if (get_preg($mails[$m], 'kolabEmailPrefix')) { $partialAccounts[$i]['kolabAllowSMTPRecipient'][] = $mails[$m]; } else { $errMsg = $this->messages['kolabAllowSMTPRecipient'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; break; } } } // allowed senders if (!empty($rawAccounts[$i][$ids['kolabUser_kolabAllowSMTPSender']])) { $mails = preg_split('/;[ ]*/', $rawAccounts[$i][$ids['kolabUser_kolabAllowSMTPSender']]); for ($m = 0; $m < sizeof($mails); $m++) { if (get_preg($mails[$m], 'kolabEmailPrefix')) { $partialAccounts[$i]['kolabAllowSMTPSender'][] = $mails[$m]; } else { $errMsg = $this->messages['kolabAllowSMTPSender'][1]; array_push($errMsg, array($i)); $messages[] = $errMsg; break; } } } } return $messages; } /** * Returns the PDF entries for this module. * * @return array list of possible PDF entries */ function get_pdfEntries() { $return = array(); $this->addSimplePDFField($return, 'mailHost', _('Mailbox home server')); // invitation policies if (isset($this->attributes['kolabInvitationPolicy'][0])) { // find default policy $default = ""; for ($i = 0; $i < sizeof($this->attributes['kolabInvitationPolicy']); $i++) { if (!strpos($this->attributes['kolabInvitationPolicy'][$i], ":")) { $default = $this->attributes['kolabInvitationPolicy'][$i]; break; } } $return['kolabUser_invPol'][0] = '' . _('Invitation policy') . '' . _('Anyone') . ": " . $this->invitationPolicies[$default] . ''; for ($i = 0; $i < sizeof($this->attributes['kolabInvitationPolicy']); $i++) { $parts = explode(':', $this->attributes['kolabInvitationPolicy'][$i]); if (sizeof($parts) == 2) { $return['kolabUser_invPol'][] = '' . $parts[0] . ": " . $this->invitationPolicies[$parts[1]] . ''; } } } $this->addSimplePDFField($return, 'aliases', _('Email aliases'), 'alias'); $this->addSimplePDFField($return, 'delegate', _('Delegates'), 'kolabDelegate'); $this->addSimplePDFField($return, 'kolabAllowSMTPRecipient', _('Allowed recipients')); $this->addSimplePDFField($return, 'kolabAllowSMTPSender', _('Allowed senders')); return $return; } /** * Returns the meta HTML code for each input field. * format: array( => array(), ...) * It is not possible to display help links. * * @param array $fields list of active fields * @param array $attributes attributes of LDAP account * @param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable * @param array $readOnlyFields list of read-only fields * @return array list of meta HTML elements (field name => htmlTableRow) */ function getSelfServiceOptions($fields, $attributes, $passwordChangeOnly, $readOnlyFields) { if ($passwordChangeOnly) { return array(); // no Kolab fields as long no LDAP content can be read } if (!in_array('kolabInetOrgPerson', $attributes['objectClass'])) { return array(); } $return = array(); // delegates if (in_array('kolabDelegate', $fields)) { $delegates = array(); $sr = @ldap_search($_SESSION['ldapHandle'], escapeDN($this->selfServiceSettings->LDAPSuffix), '(&(objectClass=inetOrgPerson)(mail=*))', array('mail'), 0, 0, 0, LDAP_DEREF_NEVER); if ($sr) { $result = ldap_get_entries($_SESSION['ldapHandle'], $sr); cleanLDAPResult($result); for ($i = 0; $i < sizeof($result); $i++) { $delegates[] = $result[$i]['mail'][0]; } } $delegates = array_unique($delegates); sort($delegates); $kolabDelegate = array(); if (isset($attributes['kolabDelegate'])) { $kolabDelegate = $attributes['kolabDelegate']; // do not show existing delegation candidates in selection list for ($i = 0; $i < sizeof($kolabDelegate); $i++) { $key = array_search($kolabDelegate[$i], $delegates); if ($key !== false) { unset($delegates[$key]); } } } $delegates = array_values($delegates); sort($kolabDelegate); $_SESSION['kolabUser_kolabDelegate'] = $kolabDelegate; $delegateFields = array(); $delegateContainer = new htmlTable(); for ($i = 0; $i < sizeof($kolabDelegate); $i++) { $delegateContainer->addElement(new htmlOutputText($kolabDelegate[$i])); if (!in_array('kolabDelegate', $readOnlyFields)) { $delegateContainer->addElement(new htmlTableExtendedInputCheckbox('delDelegate_' . $i, false, _('Delete'), null, false), true); } else { $delegateContainer->addNewLine(); } } if (!in_array('kolabDelegate', $readOnlyFields)) { $delegateContainer->addElement(new htmlSelect('new_delegate_value', $delegates)); $delegateContainer->addElement(new htmlTableExtendedInputCheckbox('new_delegate', false, _("Add"), null, false), true); } $delegateLabel = new htmlOutputText($this->getSelfServiceLabel('kolabDelegate', _('Delegates'))); $delegateLabel->alignment = htmlElement::ALIGN_TOP; $return['kolabDelegate'] = new htmlTableRow(array( $delegateLabel, $delegateContainer )); } // invitation policies if (in_array('kolabInvitationPolicy', $fields)) { $invitationContainer = new htmlTable(); // default invitation policy $defaultInvPol = $this->invitationPolicies['ACT_MANUAL']; for ($i = 0; $i < sizeof($attributes['kolabInvitationPolicy']); $i++) { $parts = explode(":", $attributes['kolabInvitationPolicy'][$i]); if (sizeof($parts) == 1) { $defaultInvPol = $this->invitationPolicies[$attributes['kolabInvitationPolicy'][$i]]; unset($attributes['kolabInvitationPolicy'][$i]); $attributes['kolabInvitationPolicy'] = array_values($attributes['kolabInvitationPolicy']); break; } } if (!in_array('kolabDelegate', $readOnlyFields)) { $invitationContainer->addElement(new htmlTableExtendedSelect('defaultInvPol', array_values($this->invitationPolicies), array($defaultInvPol), _('Anyone')), true); } else { $invitationContainer->addElement(new htmlOutputText(_('Anyone'))); $invitationContainer->addElement(new htmlOutputText($defaultInvPol), true); } // other invitation policies for ($i = 0; $i < sizeof($attributes['kolabInvitationPolicy']); $i++) { $parts = explode(":", $attributes['kolabInvitationPolicy'][$i]); if (sizeof($parts) == 2) { if (!in_array('kolabDelegate', $readOnlyFields)) { $invitationContainer->addElement(new htmlInputField('invPol1' . $i, $parts[0])); $invitationContainer->addElement(new htmlSelect('invPol2' . $i, array_values($this->invitationPolicies), array($this->invitationPolicies[$parts[1]]))); $invitationContainer->addElement(new htmlTableExtendedInputCheckbox('delInvPol' . $i, false, _("Remove"), null, false), true); } else { $invitationContainer->addElement(new htmlOutputText($parts[0])); $invitationContainer->addElement(new htmlOutputText($this->invitationPolicies[$parts[1]]), true); } } } // input box for new invitation policy if (!in_array('kolabDelegate', $readOnlyFields)) { $invitationContainer->addElement(new htmlInputField('invPol1', '')); $invitationContainer->addElement(new htmlSelect('invPol2', array_values($this->invitationPolicies))); $invitationContainer->addElement(new htmlTableExtendedInputCheckbox('addInvPol', false, _("Add"), null, false), true); } $invitationLabel = new htmlOutputText($this->getSelfServiceLabel('kolabInvitationPolicy', _('Invitation policy'))); $invitationLabel->alignment = htmlElement::ALIGN_TOP; $return['kolabInvitationPolicy'] = new htmlTableRow(array( $invitationLabel, $invitationContainer )); } return $return; } /** * Checks if all input values are correct and returns the LDAP attributes which should be changed. * Return values: * messages: array of parameters to create status messages * add: array of attributes to add * del: array of attributes to remove * mod: array of attributes to modify * info: array of values with informational value (e.g. to be used later by pre/postModify actions) * * Calling this method does not require the existence of an enclosing {@link accountContainer}. * * @param string $fields input fields * @param array $attributes LDAP attributes * @param boolean $passwordChangeOnly indicates that the user is only allowed to change his password and no LDAP content is readable * @param array $readOnlyFields list of read-only fields * @return array messages and attributes (array('messages' => array(), 'add' => array('mail' => array('test@test.com')), 'del' => array(), 'mod' => array(), 'info' => array())) */ function checkSelfServiceOptions($fields, $attributes, $passwordChangeOnly, $readOnlyFields) { $return = array('messages' => array(), 'add' => array(), 'del' => array(), 'mod' => array(), 'info' => array()); if ($passwordChangeOnly) { return $return; // skip processing if only a password change is done } if (!in_array_ignore_case('kolabInetOrgPerson', $attributes['objectClass'])) { return $return; } $attributeNames = array(); // list of attributes which should be checked for modification $attributesNew = $attributes; // delegates if (in_array('kolabDelegate', $fields) && !in_array('kolabDelegate', $readOnlyFields)) { $attributeNames[] = 'kolabDelegate'; // new delegation if (isset($_POST['new_delegate']) && ($_POST['new_delegate'] == 'on')) { $attributesNew['kolabDelegate'][] = $_POST['new_delegate_value']; } // check for deleted delegations $postKeys = array_keys($_POST); for ($i = 0; $i < sizeof($postKeys); $i++) { if (strpos($postKeys[$i], 'delDelegate_') !== false) { $sKey = substr($postKeys[$i], strlen('delDelegate_')); $key = array_search($_SESSION['kolabUser_kolabDelegate'][$sKey], $attributesNew['kolabDelegate']); if ($key !== false) { unset($attributesNew['kolabDelegate'][$key]); $attributesNew['kolabDelegate'] = array_values($attributesNew['kolabDelegate']); } } } } // invitation policies if (in_array('kolabInvitationPolicy', $fields) && !in_array('kolabInvitationPolicy', $readOnlyFields)) { $attributeNames[] = 'kolabInvitationPolicy'; $policies = array_flip($this->invitationPolicies); $attributesNew['kolabInvitationPolicy'] = array(); // check old invitation policies $targets = array(); $i = 0; while (isset($_POST['invPol1' . $i])) { if (isset($_POST['delInvPol' . $i])) { $i++; continue; } if (isset($_POST['invPol2' . $i]) && ($_POST['invPol1' . $i] != "") && !in_array($_POST['invPol1' . $i], $targets)) { $targets[] = $_POST['invPol1' . $i]; // check invitation policy if (!get_preg($_POST['invPol1' . $i], 'email')) { $message = $this->messages['invPol'][0]; $message[] = $_POST['invPol1' . $i]; $errors[] = $message; } else { $attributesNew['kolabInvitationPolicy'][] = $_POST['invPol1' . $i] . ':' . $policies[$_POST['invPol2' . $i]]; } } $i++; } // check new invitation policy if (isset($_POST['invPol1']) && ($_POST['invPol1'] != "") && !in_array($_POST['invPol1'], $targets)) { // check new invitation policy if (!get_preg($_POST['invPol1'], 'email')) { $message = $this->messages['invPol'][0]; $message[] = $_POST['invPol1']; $errors[] = $message; } else { $attributesNew['kolabInvitationPolicy'][] = $_POST['invPol1'] . ':' . $policies[$_POST['invPol2']]; } } // default invitation policy if (isset($_POST['defaultInvPol']) && ($_POST['defaultInvPol'] != "")) { $attributesNew['kolabInvitationPolicy'][] = $policies[$_POST['defaultInvPol']]; } } // find differences for ($i = 0; $i < sizeof($attributeNames); $i++) { $attrName = $attributeNames[$i]; if (isset($attributes[$attrName]) && !isset($attributesNew[$attrName])) { $return['del'][$attrName] = $attributes[$attrName]; } elseif (!isset($attributes[$attrName]) && isset($attributesNew[$attrName])) { $return['add'][$attrName] = $attributesNew[$attrName]; } else { if (isset($attributes[$attrName])) { for ($a = 0; $a < sizeof($attributes[$attrName]); $a++) { if (!in_array($attributes[$attrName][$a], $attributesNew[$attrName])) { $return['mod'][$attrName] = $attributesNew[$attrName]; break; } } } if (isset($attributesNew[$attrName])) { for ($a = 0; $a < sizeof($attributesNew[$attrName]); $a++) { if (!in_array($attributesNew[$attrName][$a], $attributes[$attrName])) { $return['mod'][$attrName] = $attributesNew[$attrName]; break; } } } } } return $return; } /** * Returns if the object class "mailrecipient" is managed by this module. * * @return boolean manage mailrecipient object class */ private function manageMailrecipient() { // abort if configuration is not available if (!isset($this->moduleSettings) || !is_array($this->moduleSettings)) { return true; } if (isset($this->moduleSettings['kolabUser_mailrecipient'][0]) && ($this->moduleSettings['kolabUser_mailrecipient'][0] == 'false')) { return false; } return true; } } ?>