parent->by_object['group']) && isset($this->parent->by_object['group']->$attr)){
$this->$attr = &$this->parent->by_object['group']->$attr;
}elseif(isset($this->attrs[$attr])){
$this->$attr = $this->attrs[$attr][0];
}
}
// Set vacation start/stop if not set alreasy
$this->vacationStart = time();
$this->vacationStop = time() + (14 * 60*60*24);
// Prepare vacation start/stop time to be initially valid.
$this->vacationStart= date('d.m.Y', $this->vacationStart);
$this->vacationStop= date('d.m.Y', $this->vacationStop);
}
function execute()
{
// Register plugin execution
$display = plugin::execute();
// Log plugin execution.
if($this->is_account && !$this->view_logged){
$this->view_logged = TRUE;
new log("view","users/".get_class($this),$this->dn);
}
/****************
Account status
****************/
if(isset($_POST['modify_state'])){
if($this->is_account && $this->acl_is_removeable() && $this->mailMethod->accountRemoveAble()){
$this->is_account= FALSE;
}elseif(!$this->is_account && $this->acl_is_createable() && $this->mailMethod->accountCreateable()){
$this->is_account= TRUE;
}
}
if(!$this->multiple_support_active){
if (!$this->is_account && $this->parent === NULL){
$display= " ".
msgPool::noValidExtension(_("Mail"))."";
$display.= back_to_main();
return ($display);
}
if ($this->parent !== NULL){
if ($this->is_account){
$display= $this->show_disable_header(msgPool::removeFeaturesButton(_("Mail")),msgPool::featuresEnabled(_("Mail")));
} else {
$display= $this->show_enable_header(msgPool::addFeaturesButton(_("Mail")),msgPool::featuresDisabled(_("Mail")));
return ($display);
}
}
}
/****************
Forward addresses
****************/
// Display dialog to select a local fowarder
if (isset($_POST['addLocalForwardingAddress'])){
$this->mailAddressSelectDialog= new mailAddressSelect($this->config, get_userinfo());
$this->dialog= TRUE;
}
// Close dialogs, action was canceled
if (isset($_POST['mailAddressSelect_cancel'])){
$this->mailAddressSelectDialog= FALSE;
$this->dialog= FALSE;
}
// Append selected forwarding addresses now.
if (isset($_POST['mailAddressSelect_save']) && $this->mailAddressSelectDialog instanceOf mailAddressSelect){
if($this->acl_is_writeable("gosaMailForwardingAddress")){
$list = $this->mailAddressSelectDialog->save();
foreach ($list as $entry){
$val = $entry['mail'][0];
if (!in_array ($val, $this->gosaMailAlternateAddress) && $val != $this->mail){
$this->addForwarder($val);
$this->is_modified= TRUE;
}
}
$this->mailAddressSelectDialog= FALSE;
$this->dialog= FALSE;
} else {
msg_dialog::display(_("Error"), _("Please select an entry!"), ERROR_DIALOG);
}
}
// Display the address selection dialog.
if($this->mailAddressSelectDialog instanceOf mailAddressSelect){
$used = array();
$used['mail'] = array_values($this->gosaMailAlternateAddress);
$used['mail'] = array_merge($used['mail'], array_values($this->gosaMailForwardingAddress));
$used['mail'][] = $this->mail;
// Build up blocklist
session::set('filterBlacklist', $used);
return($this->mailAddressSelectDialog->execute());
}
// Add manually inserted forwarding address.
if (isset($_POST['addForwardingAddress'])){
if ($_POST['forwardingAddressInput'] != ""){
$address= get_post('forwardingAddressInput');
$valid= FALSE;
if (!tests::is_email($address)){
if (!tests::is_email($address, TRUE)){
if ($this->is_template){
$valid= TRUE;
} else {
msg_dialog::display(_("Error"), msgPool::invalid(_("Mail address"),
"","","your-address@your-domain.com"),ERROR_DIALOG);
}
}
} elseif ($address == $this->mail
|| in_array($address, $this->gosaMailAlternateAddress)) {
msg_dialog::display(_("Error"),_("Cannot add primary address to the list of forwarders!") , ERROR_DIALOG);
} else {
$valid= TRUE;
}
if ($valid){
if($this->acl_is_writeable("gosaMailForwardingAddress")){
$this->addForwarder ($address);
$this->is_modified= TRUE;
}
}
}
}
if (isset($_POST['deleteForwardingAddress'])){
$this->delForwarder ($_POST['forwardingAddressList']);
}
/****************
Alternate addresses
****************/
// Add manually inserted alternate mail address.
if (isset($_POST['addAlternateAddress'])){
$valid= FALSE;
if (!tests::is_email($_POST['alternateAddressInput'])){
if ($this->is_template){
if (!(tests::is_email($_POST['alternateAddressInput'], TRUE))){
msg_dialog::display(_("Error"),msgPool::invalid(_("Mail address"),
"","","your-domain@your-domain.com"),ERROR_DIALOG);
} else {
$valid= TRUE;
}
} else {
msg_dialog::display(_("Error"),msgPool::invalid(_("Mail address"),
"","","your-domain@your-domain.com"),ERROR_DIALOG);
}
} else {
$valid= TRUE;
}
if ($valid && ($user= $this->addAlternate (get_post('alternateAddressInput'))) != ""){
$ui= get_userinfo();
$addon= "";
if ($user[0] == "!") {
$addon= sprintf(_("Address is already in use by group '%s'."), mb_substr($user, 1));
} else {
$addon= sprintf(_("Address is already in use by user '%s'."), $user);
}
msg_dialog::display(_("Error"), msgPool::duplicated(_("Mail address"))."
".
"$addon", ERROR_DIALOG);
}
}
// Remove alternate mail address.
if (isset($_POST['deleteAlternateAddress']) && isset($_POST['alternateAddressList'])){
$this->delAlternate ($_POST['alternateAddressList']);
}
/****************
SMARTY- Assign smarty variables
****************/
$smarty = get_smarty();
foreach($this->attributes as $attr){
$smarty->assign($attr, $this->$attr);
}
/****************
SMARTY- Assign flags
****************/
/****************
Smarty- Vacation settings
****************/
$smarty->assign("mailLocations", array("tester"));
if (count($this->vacationTemplates)){
$smarty->assign("displayTemplateSelector", "true");
$smarty->assign("vacationTemplate", set_post($this->vacationTemplate));
$smarty->assign("vacationTemplates", set_post($this->vacationTemplates));
$smarty->assign("template", set_post(get_post('vacation_template')));
} else {
$smarty->assign("displayTemplateSelector", "false");
}
return($display.$smarty->fetch(get_template_path("generic.tpl",TRUE,dirname(__FILE__))));
}
/* Save data to object */
function save_object()
{
}
/*! \brief Parse vacation templates and build up an array
containing 'filename' => 'description'.
Used to fill vacation dropdown box.
@return Array All useable vacation templates.
*/
function get_vacation_templates()
{
$vct = array();
if ($this->config->get_cfg_value("core","vacationTemplateDirectory") != ""){
$dir= $this->config->get_cfg_value("core","vacationTemplateDirectory");
if (is_dir($dir) && is_readable($dir)){
$dh = opendir($dir);
while($file = readdir($dh)){
$description= "";
if (is_file($dir."/".$file)){
$fh = fopen($dir."/".$file, "r");
$line= fgets($fh, 256);
if (!preg_match('/^DESC:/', $line)){
msg_dialog::display(_("Configuration error"), sprintf(_("No DESC tag in vacation template '%s'!"), $file), ERROR_DIALOG);
}else{
$description= trim(preg_replace('/^DESC:\s*/', '', $line));
}
fclose ($fh);
}
if ($description != ""){
$vct["$dir/$file"]= $description;
}
}
closedir($dh);
}
}
return($vct);
}
/*! \brief Adds the given mail address to the list of mail forwarders
*/
function addForwarder($address)
{
if(empty($address)) return;
if($this->acl_is_writeable("gosaMailForwardingAddress")){
$this->gosaMailForwardingAddress[]= $address;
$this->gosaMailForwardingAddress= array_unique ($this->gosaMailForwardingAddress);
sort ($this->gosaMailForwardingAddress);
reset ($this->gosaMailForwardingAddress);
$this->is_modified= TRUE;
}else{
msg_dialog::display(_("Permission error"), _("You have no permission to modify these addresses!"), ERROR_DIALOG);
}
}
/*! \brief Removes the given mail address from the list of mail forwarders
*/
function delForwarder($addresses)
{
if($this->acl_is_writeable("gosaMailForwardingAddress")){
$this->gosaMailForwardingAddress= array_remove_entries ($addresses, $this->gosaMailForwardingAddress);
$this->is_modified= TRUE;
}else{
msg_dialog::display(_("Permission error"), _("You have no permission to modify these addresses!"), ERROR_DIALOG);
}
}
/*! \brief Add given mail address to the list of alternate adresses ,
. check if this mal address is used, skip adding in this case
*/
function addAlternate($address)
{
if(empty($address)) return;
if($this->acl_is_writeable("gosaMailAlternateAddress")){
$ldap= $this->config->get_ldap_link();
$address= strtolower($address);
/* Is this address already assigned in LDAP? */
$ldap->cd ($this->config->current['BASE']);
$ldap->search ("(&(!(objectClass=gosaUserTemplate))(objectClass=gosaMailAccount)(|(mail=$address)".
"(alias=$address)(gosaMailAlternateAddress=$address)))", array("uid", "cn"));
if ($ldap->count() > 0){
$attrs= $ldap->fetch ();
if (!isset($attrs["uid"])) {
return ("!".$attrs["cn"][0]);
}
return ($attrs["uid"][0]);
}
if (!in_array($address, $this->gosaMailAlternateAddress)){
$this->gosaMailAlternateAddress[]= $address;
$this->is_modified= TRUE;
}
sort ($this->gosaMailAlternateAddress);
reset ($this->gosaMailAlternateAddress);
return ("");
}else{
msg_dialog::display(_("Permission error"), _("You have no permission to modify these addresses!"), ERROR_DIALOG);
}
}
/*! \brief Removes the given mail address from the alternate addresses list
*/
function delAlternate($addresses)
{
if($this->acl_is_writeable("gosaMailAlternateAddress")){
$this->gosaMailAlternateAddress= array_remove_entries ($addresses,$this->gosaMailAlternateAddress);
$this->is_modified= TRUE;
}else{
msg_dialog::display(_("Permission error"), _("You have no permission to modify these addresses!"), ERROR_DIALOG);
}
}
/*! \brief Prepare importet vacation string. \
. Replace placeholder like %givenName a.s.o.
@param string Vacation string
@return string Completed vacation string
*/
private function prepare_vacation_template($contents)
{
/* Replace attributes */
$attrs = array();
$obj = NULL;
if(isset($this->parent->by_object['user'])){
$attrs = $this->parent->by_object['user']->attributes;
$obj = $this->parent->by_object['user'];
}else{
$obj = new user($this->config,$this->dn);
$attrs = $obj->attributes;
}
if($obj){
/* Replace vacation start and end time */
if($this->mailMethod->vacationRangeEnabled()){
if(preg_match("/%start/",$contents)){
$contents = preg_replace("/%start/",$this->vacationStart,$contents);
}
if(preg_match("/%end/",$contents)){
$contents = preg_replace("/%end/",$this->vacationStop,$contents);
}
}else{
if(preg_match("/%start/",$contents)){
$contents = preg_replace("/%start/", _("unknown"),$contents);
}
if(preg_match("/%end/",$contents)){
$contents = preg_replace("/%end/", _("unknown"), $contents);
}
}
foreach ($attrs as $val){
// We can only replace strings here
if(!is_string($obj->$val)) continue;
if(preg_match("/dateOfBirth/",$val)){
if($obj->use_dob){
$contents= preg_replace("/%$val/",date("Y-d-m",$obj->dateOfBirth),$contents);
}
}else {
$contents= preg_replace("/%$val/",
$obj->$val, $contents);
}
}
}
$contents = ltrim(preg_replace("/^DESC:.*$/m","",$contents),"\n ");
return($contents);
}
function remove_from_parent()
{
/* Cancel if there's nothing to do here */
if (!$this->initially_was_account){
return;
}
}
function save()
{
}
/*! \brief Check given values
*/
function check()
{
if(!$this->is_account){
return(array());
}
$ldap= $this->config->get_ldap_link();
/* Call common method to give check the hook */
$message= plugin::check();
if(empty($this->gosaMailServer)){
$message[]= msgPool::noserver(_("Mail"));
}
/* Mail address checks */
$mail = $this->mail;
if(!(!$this->mailMethod->isModifyableMail() && $this->initially_was_account)){
if($this->mailMethod->domainSelectionEnabled()){
$mail.= "@".$this->mailDomainPart;
}
if (empty($mail)){
$message[]= msgPool::required(_("Primary address"));
}
if ($this->is_template){
if (!tests::is_email($mail, TRUE)){
$message[]= msgPool::invalid(_("Mail address"),"","","%givenName.%sn@your-domain.com");
}
} else {
if (!tests::is_email($mail)){
$message[]= msgPool::invalid(_("Mail address"),"","","your-address@your-domain.com");
}
}
/* Check if this mail address is already in use */
$ldap->cd($this->config->current['BASE']);
$filter = "(&(!(objectClass=gosaUserTemplate))(!(uid=".$this->uid."))".
"(objectClass=gosaMailAccount)".
"(|(mail=".$mail.")(alias=".$mail.")(gosaMailAlternateAddress=".$mail.")))";
$ldap->search($filter,array("uid", "cn"));
if ($ldap->count() != 0){
$entry= $ldap->fetch();
$addon= "";
if (!isset($entry['uid'])) {
$addon= sprintf(_("Address is already in use by group '%s'."), $entry['cn'][0]);
} else {
$addon= sprintf(_("Address is already in use by user '%s'."), $entry['uid'][0]);
}
$message[]= msgPool::duplicated(_("Mail address"))."
$addon";
}
}
/* Check quota */
if ($this->gosaMailQuota != '' && $this->acl_is_writeable("gosaMailQuota")){
if (!is_numeric($this->gosaMailQuota)) {
$message[]= msgPool::invalid(_("Quota size"),$this->gosaMailQuota,"/^[0-9]*/");
} else {
$this->gosaMailQuota= (int) $this->gosaMailQuota;
}
}
/* Check rejectsize for integer */
if ($this->gosaMailMaxSize != '' && $this->acl_is_writeable("gosaMailMaxSize")){
if (!is_numeric($this->gosaMailMaxSize)){
$message[]= msgPool::invalid(_("Mail reject size"),$this->gosaMailMaxSize,"/^[0-9]*/");
} else {
$this->gosaMailMaxSize= (int) $this->gosaMailMaxSize;
}
}
/* Need gosaMailMaxSize if use_mailsize_limit is checked */
if (is_integer(strpos($this->gosaMailDeliveryMode, "R")) && $this->gosaMailMaxSize == ""){
$message[]= msgPool::required(_("Mail reject size"));
}
if((preg_match("/S/", $this->gosaMailDeliveryMode))&&(empty($this->gosaSpamMailbox))) {
$message[]= msgPool::required(_("Spam folder"));
}
if ($this->mailMethod->vacationRangeEnabled() && preg_match('/V/', $this->gosaMailDeliveryMode)){
/* Check date strings */
$state= true;
if ($this->vacationStart == "" || !tests::is_date($this->vacationStart)) {
$message[]= msgPool::invalid(_("from"),$this->vacationStart);
$state= false;
}
if ($this->vacationStart == "" || !tests::is_date($this->vacationStop)) {
$message[]= msgPool::invalid(_("to"),$this->vacationStop);
$state= false;
}
#TODO: take care of date format
if ($state) {
list($day, $month, $year)= explode('.', $this->vacationStart);
$start= mktime(0,0,0,$month, $day, $year);
list($day, $month, $year)= explode('.', $this->vacationStop);
$stop= mktime(0,0,0,$month, $day, $year);
if($start > $stop){
$message[]= msgPool::invalid(_("Vacation interval"));
}
}
}
return($message);
}
/*! \brief Adapt from template, using 'dn'
*/
function adapt_from_template($dn, $skip= array())
{
plugin::adapt_from_template($dn, $skip);
}
/*! \brief ACL settings
*/
static function plInfo()
{
return (array(
"plShortName" => _("Mail"),
"plDescription" => _("Mail settings"),
"plSelfModify" => TRUE,
"plDepends" => array("user"), // This plugin depends on
"plPriority" => 4, // Position in tabs
"plSection" => array("personal" => _("My account")),
"plCategory" => array("users"),
"plOptions" => array(),
"plProvidedAcls" => array(
"mailAddress" => _("Mail address"),
"mailLocation" => _("Mail location"),
"quotaUsage" => _("Quota usage"),
"quotaSize" => _("Quota size"),
"alternateAddresses" => _("Alternate mail addresses"),
"forwardingAddresses" => _("Forwarding mail addresses"),
"vacationEnabled" => _("Vaction switch"),
"vacationStart" => _("Vacation start time"),
"vacationStop" => _("Vacation stop time"),
"vacationMessage" => _("Vacation message"),
"mailBoxWarnLimit" => _("Warn sizelimit"),
"mailBoxSendSizelimit" => _("Send sizelimit"),
"mailBoxHardSizelimit" => _("Hard sizelimit"),
"mailBoxAutomaticRemoval" => _("Automatic mail removal"),
)
));
}
}
// vim:tabstop=2:expandtab:shiftwidth=2:filetype=php:syntax:ruler:
?>