From 3e994a81a8b407c0076eaf90649fbf98e71082e2 Mon Sep 17 00:00:00 2001 From: Michael Fürmann <michael@spicyweb.de> Date: Thu, 19 Feb 2015 10:04:10 -0500 Subject: [PATCH] XMPP User and domain changes and Metronome SQL Auth scripts --- interface/web/mail/xmpp_domain_edit.php | 89 ++++++++++++++++++++++++++++++++++++++++---- 1 files changed, 81 insertions(+), 8 deletions(-) diff --git a/interface/web/mail/xmpp_domain_edit.php b/interface/web/mail/xmpp_domain_edit.php index d87778d..127acd7 100644 --- a/interface/web/mail/xmpp_domain_edit.php +++ b/interface/web/mail/xmpp_domain_edit.php @@ -263,16 +263,19 @@ if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); // Read auth method - if(isset($this->dataRecord["auth_method"])) - switch($this->dataRecord["auth_method"]){ + if(isset($this->dataRecord["management_method"])) + switch($this->dataRecord["management_method"]){ case 0: - $this->dataRecord["auth_method"] = 'plain'; + $this->dataRecord["management_method"] = 'normal'; break; case 1: - $this->dataRecord["auth_method"] = 'hashed'; - break; - case 2: - $this->dataRecord["auth_method"] = 'isp'; + $this->dataRecord["management_method"] = 'maildomain'; + // Check for corresponding mail domain + $tmp = $app->db->queryOneRecord("SELECT count(domain_id) AS number FROM mail_domain WHERE domain = '".$this->dataRecord["domain"]."' AND ".$app->tform->getAuthSQL('r')." ORDER BY domain"); + if($tmp['count']==0){ + $app->error($app->tform->wordbook["no_corresponding_maildomain_txt"]); + break; + } break; } // vjud opt mode @@ -311,6 +314,10 @@ //* make sure that the xmpp domain is lowercase if(isset($this->dataRecord["domain"])) $this->dataRecord["domain"] = strtolower($this->dataRecord["domain"]); + + // create new accounts from mail domain + if($this->dataRecord['management_method']=='maildomain') + $this->syncMailusers($this->dataRecord['domain']); // Insert DNS Records $soa = $app->db->queryOneRecord("SELECT id AS zone, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other, server_id, ttl, serial FROM dns_soa WHERE active = 'Y' AND origin = ?", $this->dataRecord['domain'].'.'); @@ -354,10 +361,16 @@ function onAfterUpdate() { global $app, $conf; + // create new accounts from mail domain + if($this->oldDataRecord['management_method'] != 'maildomain' && $this->dataRecord['management_method']=='maildomain') + $this->syncMailusers($this->dataRecord['domain']); + // or reset to normal permissions + elseif($this->oldDataRecord['management_method'] == 'maildomain' && $this->dataRecord['management_method']!='maildomain') + $this->desyncMailusers($this->dataRecord['domain']); // Update DNS Records // TODO: Update gets only triggered from main form. WHY? // TODO: if(in_array($this->_xmpp_type, array('muc', 'modules'))){ - $soa = $app->db->queryOneRecord("SELECT id AS zone, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other, server_id, ttl, serial FROM dns_soa WHERE active = 'Y' AND origin = ?", $this->dataRecord['domain'].'.'); + $soa = $app->db->queryOneRecord("SELECT id AS zone, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other FROM dns_soa WHERE active = 'Y' AND = ?", $this->dataRecord['domain'].'.'); if ( isset($soa) && !empty($soa) ) $this->update_dns($this->dataRecord, $soa); //} } @@ -428,6 +441,66 @@ } + private function syncMailusers($domain){ + global $app, $conf; + // get all mailusers + $db_mailusers = $app->db->queryAllRecords("SELECT email, password, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other FROM mail_user WHERE email like ?", '@'.$this->dataRecord['domain'].'.'); + // get existing xmpp users + $db_xmppusers = $app->db->queryAllRecords("SELECT jid, password, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other FROM xmpp_user WHERE jid like ?", '@'.$this->dataRecord['domain'].'.'); + + // Migrate user accounts + $users_delete = array(); + $users_update = array(); + $users_create = array(); + foreach($db_xmppusers AS $ix=>$x){ + $matched = false; + foreach($db_mailusers AS $im=>$m){ + if($x['jid']==$m['email']){ + // User matched, mark for update + $x['password'] = $m['password']; + $users_update[] = $x; + unset($db_xmppusers[$ix]); + unset($db_mailusers[$im]); + $matched = true; + break; + } + } + // XMPP user not matched, mark for deletion + if(!$matched){ + $users_delete[] = $x; + unset($db_xmppusers[$ix]); + } + } + // Mark remaining mail users for creation + $users_create = $db_xmppusers; + foreach($users_create AS $u){ + $u['server_id'] = $this->dataRecord['server_id']; + $u['sys_perm_user'] = 'r'; + $u['sys_perm_group'] = 'r'; + $app->db->datalogInsert('xmpp_user', $u, 'xmppuser_id'); + } + foreach($users_update AS $u){ + $u['sys_perm_user'] = 'r'; + $u['sys_perm_group'] = 'r'; + $app->db->datalogUpdate('xmpp_user', $u, 'xmppuser_id', $u['xmppuser_id']); + } + foreach($users_delete AS $u){ + $app->db->datalogDelete('xmpp_user', 'xmppuser_id', $u['xmppuser_id']); + } + + } + + private function desyncMailusers($domain){ + global $app, $conf; + // get existing xmpp users + $db_xmppusers = $app->db->queryAllRecords("SELECT jid, password, sys_userid, sys_groupid, sys_perm_user, sys_perm_group, sys_perm_other FROM xmpp_user WHERE jid like ?", '@'.$this->dataRecord['domain'].'.'); + foreach($db_xmppusers AS $u){ + $u['sys_perm_user'] = 'riud'; + $u['sys_perm_group'] = 'riud'; + $app->db->datalogUpdate('xmpp_user', $u, 'xmppuser_id', $u['xmppuser_id']); + } + } + } $page = new page_action; -- Gitblit v1.9.1