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