diff --git a/emailadmin/inc/class.emailadmin_so.inc.php b/emailadmin/inc/class.emailadmin_so.inc.php
new file mode 100644
index 0000000000..32867c145a
--- /dev/null
+++ b/emailadmin/inc/class.emailadmin_so.inc.php
@@ -0,0 +1,474 @@
+ '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_imapoldcclient' => 'imapoldcclient',
+ '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];
+
+ $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("emailadmin::emailadmin_so->getUserProfile, no Default configured");
+ $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':
+ case 'imapEnableCyrusAdmin':
+ case 'imapAdminUsername':
+ case 'imapAdminPW':
+ if (strlen($toMerge['imapServer'])>0) $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:
+ $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;
+ }
+ $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;
+ }
+
+ function setOrder($_order)
+ {
+ foreach($_order as $order => $profileID)
+ {
+ $this->db->update($this->table,array(
+ 'ea_order' => $order,
+ ),array(
+ 'ea_profile_id' => $profileID,
+ ),__LINE__, __FILE__);
+ }
+ }
+ }
+?>