'profileID', 'ea_smtp_server' => 'smtpServer', 'ea_smtp_type' => 'smtpType', 'ea_smtp_port' => 'smtpPort', 'ea_smtp_auth' => 'smtpAuth', 'ea_editforwardingaddress' => 'editforwardingaddress', 'ea_smtp_ldap_server' => 'smtpLDAPServer', 'ea_smtp_ldap_basedn' => 'smtpLDAPBaseDN', 'ea_smtp_ldap_admindn' => 'smtpLDAPAdminDN', 'ea_smtp_ldap_adminpw' => 'smtpLDAPAdminPW', 'ea_smtp_ldap_use_default' => 'smtpLDAPUseDefault', 'ea_imap_server' => 'imapServer', 'ea_imap_type' => 'imapType', 'ea_imap_port' => 'imapPort', 'ea_imap_login_type' => 'imapLoginType', 'ea_imap_auth_username' => 'imapAuthUsername', 'ea_imap_auth_password' => 'imapAuthPassword', 'ea_imap_tsl_auth' => 'imapTLSAuthentication', 'ea_imap_tsl_encryption' => 'imapTLSEncryption', 'ea_imap_enable_cyrus' => 'imapEnableCyrusAdmin', 'ea_imap_admin_user' => 'imapAdminUsername', 'ea_imap_admin_pw' => 'imapAdminPW', 'ea_imap_enable_sieve' => 'imapEnableSieve', 'ea_imap_sieve_server' => 'imapSieveServer', 'ea_imap_sieve_port' => 'imapSievePort', 'ea_description' => 'description', 'ea_default_domain' => 'defaultDomain', 'ea_organisation_name' => 'organisationName', 'ea_user_defined_identities' => 'userDefinedIdentities', 'ea_user_defined_accounts' => 'userDefinedAccounts', 'ea_order' => 'ea_order', 'ea_active' => 'ea_active', 'ea_group' => 'ea_group', 'ea_user' => 'ea_user', 'ea_appname' => 'ea_appname', 'ea_smtp_auth_username' => 'ea_smtp_auth_username', 'ea_smtp_auth_password' => 'ea_smtp_auth_password', 'ea_user_defined_signatures' => 'ea_user_defined_signatures', 'ea_default_signature' => 'ea_default_signature', 'ea_stationery_active_templates' => 'ea_stationery_active_templates', ); function __construct() { if (is_object($GLOBALS['egw_setup']->db)) { $this->db = clone($GLOBALS['egw_setup']->db); } else { $this->db = clone($GLOBALS['egw']->db); } $this->db->set_app('emailadmin'); } /** * Convert array with internal values/names to db-column-names * * @param array $vals * @return array */ function vals2db($vals) { $cols = array(); foreach($vals as $key => $val) { if (($k = array_search($key,$this->db_cols)) === false) $k = $key; $cols[$k] = $val; } return $cols; } /** * Convert array with db-columns/-values to internal names * * @param array $vals * @return array */ function db2vals($cols) { $vals = array(); foreach($cols as $key => $val) { if (isset($this->db_cols[$key])) $key = $this->db_cols[$key]; if ($key == 'smtpType' && substr($val, 8) == 'stylite_') // convert old epl names { $val = $val == 'stylite_postfixsuse' ? 'emailadmin_smtp_suse' : 'emailadmin_smtp_mandriva'; } $vals[$key] = $val; } return $vals; } function updateProfile($_globalSettings, $_smtpSettings=array(), $_imapSettings=array()) { $profileID = (int) $_globalSettings['profileID']; unset($_globalSettings['profileID']); $where = $profileID ? array('ea_profile_id' => $profileID) : false; $this->db->insert($this->table,$this->vals2db($_smtpSettings+$_globalSettings+$_imapSettings),$where,__LINE__,__FILE__); return $profileID ? $profileID : $this->db->get_last_insert_id($this->table,'ea_profile_id'); } function addProfile($_globalSettings, $_smtpSettings, $_imapSettings) { unset($_globalSettings['profileID']); // just in case return $this->updateProfile($_globalSettings, $_smtpSettings, $_imapSettings); } function deleteProfile($_profileID) { $this->db->delete($this->table,array('ea_profile_id' => $_profileID),__LINE__ , __FILE__); } function getProfile($_profileID, $_fieldNames) { $_fieldNames = array_keys($this->vals2db(array_flip($_fieldNames))); $this->db->select($this->table,$_fieldNames,array('ea_profile_id' => $_profileID), __LINE__, __FILE__); if (($data = $this->db->row(true))) { return $this->db2vals($data); } return $data; } function getUserProfile($_appName, $_groups, $_user = NULL) { if(empty($_appName) || !is_array($_groups)) return false; if (!empty($_user)) { $where = $this->db->expression( $this->table,'(', array('ea_appname'=>$_appName), ' OR ea_appname IS NULL or ea_appname = \'\') and ', '(', array('ea_group'=>$_groups), ' OR ea_group IS NULL or ea_group = \'\') and ', '(', array('ea_user'=>$_user), ' OR ea_user IS NULL or ea_user = \'0\' or ea_user = \'\')' ); } else { $where = $this->db->expression( $this->table,'(', array('ea_appname'=>$_appName), ' OR ea_appname IS NULL or ea_appname = \'\') and ', '(', array('ea_group'=>$_groups), ' OR ea_group IS NULL or ea_group = \'\')' ); } $anyValues = 0; // retrieve the Global/Overall Settings $this->db->select($this->table,'ea_profile_id',$where, __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); if (($data = $this->db->row(true))) { $globalDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); $anyValues++; } else { error_log(__METHOD__.__LINE__.", no Default configured"); error_log('# Instance='.$GLOBALS['egw_info']['user']['domain'].', User='.$GLOBALS['egw_info']['user']['account_lid'].', URL='. ($_SERVER['HTTPS']?'https://':'http://').$_SERVER['HTTP_HOST'].$_SERVER['REQUEST_URI']); $globalDefaults = array(); } // retrieve application settings if set if (strlen($_appName)>0) { $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_appname'=>$_appName),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); if (($data = $this->db->row(true))) { $appDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); $globalDefaults = self::mergeProfileData($globalDefaults, $appDefaults); $anyValues++; } } // retrieve primary-group settings if set if (is_array($_groups) && $_groups[1] == $GLOBALS['egw_info']['user']['account_primary_group']) { $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_group'=>$_groups[1]),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); if (($data = $this->db->row(true))) { $groupDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); $globalDefaults = self::mergeProfileData($globalDefaults, $groupDefaults); $anyValues++; } } // retrieve usersettings if set if (!empty($_user) && $_user != 0) { $this->db->select($this->table,'ea_profile_id',$this->db->expression($this->table,'(',array('ea_user'=>$_user),' and ea_active=1)'), __LINE__, __FILE__, false, 'ORDER BY ea_order', false, 1); if (($data = $this->db->row(true))) { $userDefaults = $this->getProfile($data['ea_profile_id'], $this->db_cols); $globalDefaults = self::mergeProfileData($globalDefaults, $userDefaults); $anyValues++; } } if ($anyValues) { return $globalDefaults; } else { return false; } } /* * merge profile data. * for each key of the mergeInTo Array check if there is a value set in the toMerge Array and replace it. */ static function mergeProfileData($mergeInTo, $toMerge) { if (is_array($toMerge) && count($toMerge)>0) { $allkeys = array_unique(array_keys($mergeInTo)+array_keys($toMerge)); foreach ($allkeys as $i => $key) { if (!array_key_exists($key, $mergeInTo) && array_key_exists($key, $toMerge) && !empty($toMerge[$key])) { $mergeInTo[$key]=$toMerge[$key]; } else { if (array_key_exists($key, $toMerge) && !empty($toMerge[$key])) { //error_log($key.'->'.$toMerge[$key]); switch ($key) { case 'imapLoginType': // if the logintype is admin, it will be added to the default value if ($toMerge[$key] =='admin' || $toMerge[$key] =='email') { // take the first value found by explode, which is assumed the default value list($mergeInTo[$key],$rest) = explode('#',$mergeInTo[$key],2); $mergeInTo[$key] = $mergeInTo[$key].'#'.$toMerge[$key]; //error_log($mergeInTo[$key]); break; } case 'imapServer': case 'imapType': case 'imapPort': case 'imapTLSEncryption': case 'imapTLSAuthentication': // whatever it is, if the server is set and the imapTLSAuthentication option is checked, // then the user wanted that (checked results in a value "no") if (strlen($toMerge['imapServer'])>0 && $toMerge[$key]=='no') { //error_log(__METHOD__.__LINE__." $key $mergeInTo[$key] = $toMerge[$key]"); $mergeInTo[$key]=$toMerge[$key]; break; } case 'imapEnableCyrusAdmin': case 'imapAdminUsername': case 'imapAdminPW': if (strlen($toMerge['imapServer'])>0 && $toMerge[$key]!='no') { $mergeInTo[$key]=$toMerge[$key]; } break; case 'smtpPort': case 'smtpType': case 'smtpServer': if (strlen($toMerge['smtpServer'])>0) $mergeInTo[$key]=$toMerge[$key]; break; case 'smtpLDAPServer': case 'smtpLDAPBaseDN': case 'smtpLDAPAdminDN': case 'smtpLDAPAdminPW': case 'smtpLDAPUseDefault': if (strlen($toMerge['smtpLDAPServer'])>0) $mergeInTo[$key]=$toMerge[$key]; break; case 'ea_default_signature': $testVal = $toMerge['ea_default_signature']; //bofelamimail::getCleanHTML($testVal); $testVal = html::purify($testVal); if (strlen($testVal)>10 || $testVal != '
' || $testVal != '
') $mergeInTo[$key]=$toMerge[$key]; break; default: //you may allow stuff, but you should not be able to remove an already granted right //error_log($key.'->'.$toMerge[$key].' '.function_backtrace()); if ($toMerge[$key]!='no') $mergeInTo[$key]=$toMerge[$key]; } } } } } return $mergeInTo; } function getProfileList($_profileID=0,$_defaultProfile=false,$_appName=false,$_groupID=false,$_accountID=false) { $where = false; if ((int) $_profileID) { $where = array('ea_profile_id' => $_profileID); } elseif ($_defaultProfile) { $where[] = "(ea_appname ='' or ea_appname is NULL)"; $where[] = "(ea_group='0' or ea_group is NULL)"; // ea_group&ea_user are varchar! $where[] = "(ea_user ='0' or ea_user is NULL)"; } elseif ($_appName) { $where['ea_appname'] = $_appName; } elseif ((int) $_groupID) { $where['ea_group'] = (int) $_groupID; } elseif ((int) $_accountID) { $where['ea_user'] = (int) $_accountID; } //error_log(__METHOD__.__LINE__.' Where Condition:'.array2string($where).' Backtrace:'.function_backtrace()); $this->db->select($this->table,'*',$where, __LINE__,__FILE__,false,(int) $_profileID ? '' : 'ORDER BY ea_order'); $serverList = false; while (($row = $this->db->row(true))) { $serverList[] = $this->db2vals($row); } return $serverList; } function getUserData($_accountID) { $ldap = $GLOBALS['egw']->common->ldapConnect(); if (($sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],"(uidnumber=$_accountID)"))) { $allValues = ldap_get_entries($ldap, $sri); if ($allValues['count'] > 0) { #print "found something
"; $userData["mailLocalAddress"] = $allValues[0]["mail"][0]; $userData["mailAlternateAddress"] = $allValues[0]["mailalternateaddress"]; $userData["accountStatus"] = $allValues[0]["accountstatus"][0]; $userData["mailRoutingAddress"] = $allValues[0]["mailforwardingaddress"]; $userData["qmailDotMode"] = $allValues[0]["qmaildotmode"][0]; $userData["deliveryProgramPath"] = $allValues[0]["deliveryprogrampath"][0]; $userData["deliveryMode"] = $allValues[0]["deliverymode"][0]; unset($userData["mailAlternateAddress"]["count"]); unset($userData["mailRoutingAddress"]["count"]); return $userData; } } // if we did not return before, return false return false; } function saveUserData($_accountID, $_accountData) { $ldap = $GLOBALS['egw']->common->ldapConnect(); // need to be fixed if(is_numeric($_accountID)) { $filter = "uidnumber=$_accountID"; } else { $filter = "uid=$_accountID"; } $sri = @ldap_search($ldap,$GLOBALS['egw_info']['server']['ldap_context'],$filter); if ($sri) { $allValues = ldap_get_entries($ldap, $sri); $accountDN = $allValues[0]['dn']; $uid = $allValues[0]['uid'][0]; $homedirectory = $allValues[0]['homedirectory'][0]; $objectClasses = $allValues[0]['objectclass']; unset($objectClasses['count']); } else { return false; } if(empty($homedirectory)) { $homedirectory = "/home/".$uid; } // the old code for qmail ldap $newData = array ( 'mail' => $_accountData["mailLocalAddress"], 'mailAlternateAddress' => $_accountData["mailAlternateAddress"], 'mailRoutingAddress' => $_accountData["mailRoutingAddress"], 'homedirectory' => $homedirectory, 'mailMessageStore' => $homedirectory."/Maildir/", 'gidnumber' => '1000', 'qmailDotMode' => $_accountData["qmailDotMode"], 'deliveryProgramPath' => $_accountData["deliveryProgramPath"] ); if(!in_array('qmailUser',$objectClasses) && !in_array('qmailuser',$objectClasses)) { $objectClasses[] = 'qmailuser'; } // the new code for postfix+cyrus+ldap $newData = array ( 'mail' => $_accountData["mailLocalAddress"], 'accountStatus' => $_accountData["accountStatus"], 'objectclass' => $objectClasses ); if(is_array($_accountData["mailAlternateAddress"])) { $newData['mailAlternateAddress'] = $_accountData["mailAlternateAddress"]; } else { $newData['mailAlternateAddress'] = array(); } if($_accountData["accountStatus"] == 'active') { $newData['accountStatus'] = 'active'; } else { $newData['accountStatus'] = 'disabled'; } if(!empty($_accountData["deliveryMode"])) { $newData['deliveryMode'] = $_accountData["deliveryMode"]; } else { $newData['deliveryMode'] = array(); } if(is_array($_accountData["mailRoutingAddress"])) { $newData['mailForwardingAddress'] = $_accountData["mailRoutingAddress"]; } else { $newData['mailForwardingAddress'] = array(); } #print "DN: $accountDN
"; ldap_mod_replace ($ldap, $accountDN, $newData); #print ldap_error($ldap); // also update the account_email field in egw_accounts // when using sql account storage if($GLOBALS['egw_info']['server']['account_repository'] == 'sql') { $this->db->update('egw_accounts',array( 'account_email' => $_accountData["mailLocalAddress"] ), array( 'account_id' => $_accountID ),__LINE__,__FILE__ ); } return true; } } ?>