*/ class DnsHelper { use \ThurData\Servers\KerioEmail\Core\UI\Traits\WhmcsParams; public function __construct() { $this->params = $this->getWhmcsParamsByKeys(['domain', 'userid', 'serverhostname', 'serverusername', 'serverpassword', 'domainid', 'serverid', 'pid']); $this->server = Server::select('id', 'nameserver1ip', 'nameserver2ip')->findOrFail($this->params['serverid']); $this->nameserver = array(trim($this->server->nameserver1ip), trim($this->server->nameserver2ip)); // $this->nameserver = array('127.0.0.1', '127.0.0.2'); //test $this->resolver = new \Net_DNS2_Resolver(array('nameservers' => $this->nameserver)); } public function getMX($domain){ try { $result = $this->resolver->query($domain, 'MX'); } catch(\Net_DNS2_Exception $e) { echo "::query() failed: ", $e->getMessage(), "\n"; } $domainMX = $result->answer; if(empty($domainMX)){ $vars['mx'] = 'unset'; $vars['mxtarget'] = $this->params['serverhostname']; } else { if(count($domainMX) > 1) { $vars['multiMX'] = TRUE; } else { $vars['multiMX'] = FALSE; } $vars['domainMX'] = $domainMX; $domainMXrecord = array_shift($domainMX); $vars['mxtarget'] = $domainMXrecord->exchange; if($domainMXrecord->exchange == $this->params['serverhostname']) { $vars['mx'] = 'set'; } else { $var['mx'] = 'wrong'; } } return $vars; } public function getSPF($domain){ try { $result = $this->resolver->query($domain, 'MX'); } catch(\Net_DNS2_Exception $e) { echo "::query() failed: ", $e->getMessage(), "\n"; } $domainMX = $result->answer; if(count($domainMX) > 1) { $vars['multiMX'] = TRUE; } else { $vars['multiMX'] = FALSE; } if(empty($domainMX)){ $vars['mx'] = 'unset'; $vars['mxtarget'] = $this->params['serverhostname']; } else { $vars['domainMX'] = $domainMX; $domainMXrecord = array_shift($domainMX); $vars['mxtarget'] = $domainMXrecord->exchange; if($domainMXrecord->exchange == $this->params['serverhostname']) { $vars['mx'] = 'set'; } else { $var['mx'] = 'wrong'; } } return $vars; } public function getRecords($domain) { $zoneID = $this->selfDns($domain); if($zoneID) { return $this->getLocalRecords($zoneID); } return $this->getResolverRecords($domain); } public function getResolverRecords($domain) { try { $responseMX = $this->resolver->query($domain, 'MX'); $responseTXT = $this->resolver->query($domain, 'TXT'); } catch(\Net_DNS2_Exception $e) { echo "::query() failed: ", $e->getMessage(), "\n"; } $domainMX = $responseMX->answer; $domainTXT = $responseTXT->answer; logModuleCall( 'kerioEmail', __FUNCTION__, $domainMX, 'DEbug', $domainTXT ); if(empty($domainMX)){ $vars['mx'] = 'unset'; $vars['mxtarget'] = $this->params['serverhostname']; } else { if(count($domainMX) > 1) { $vars['multiMX'] = TRUE; } else { $vars['multiMX'] = FALSE; } $vars['domainMX'] = $domainMX; $domainMXrecord = array_shift($domainMX); $vars['mxtarget'] = $domainMXrecord->exchange; if($domainMXrecord->exchange == $this->params['serverhostname']) { $vars['mx'] = 'set'; } else { $var['mx'] = 'wrong'; } } $domainSPF = array(); $domainDMARC = array(); $domainDKIM = array(); if(empty($domainTXT)){ $vars['spf'] = 'unset'; $vars['dmarc'] = 'unset'; $vars['dkim'] = 'unset'; } else { foreach($domainTXT as $txtRecord) { foreach($txtRecord->text as $txtData) { if(strstr($txtData,'v=spf')) { array_push($domainSPF,$txtData); } if(strstr($txtData,'v=DKIM')) { array_push($domainDKIM,$txtData); } if(strstr($txtData,'v=DMARC')) { array_push($domainDMARC,$txtData); } } } # SPF, multi verboten if (count($domainSPF) > 1) { $vars['multiSPF'] = TRUE; $vars['spf'] = 'wrong'; } else { $vars['multiSPF'] = FALSE; if (empty($domainSPF)) { $vars['spf'] = 'unset'; } else { if($domainSPF[0] === $spfConfig) { $vars['spf'] = 'set'; } else { $vars['spf'] = 'wrong'; } } } # DKIM if (count($domainDKIM) > 1) { $vars['multiDKIM'] = TRUE; } else { $vars['multiDKIM'] = FALSE; } if (empty($domainDKIM)) { $vars['dkim'] = 'unset'; } else { $vars['dkim'] = 'set'; } $vars['domainDKIM'] = $domainDKIM; # DMARC if (count($domainDMARC) > 1) { $vars['multiDMARC'] = TRUE; } else { $vars['multiDMARC'] = FALSE; } $vars['dmarc'] = 'wrong'; if (empty($domainDMARC)) { $vars['dmarc'] = 'unset'; } else { foreach($domainDMARC as $dmarc) { if($dmarc === $dmarcConfig) { $vars['dmarc'] = 'set'; } } } $vars['domainDMARC'] = $domainDMARC; } return $vars; } public function selfDns($domain){ $zoneIDcollection = Capsule::table('dns_manager2_zone') ->select('id') ->where('name', '=', $domain) ->get(); $zoneIDobj = $zoneIDcollection[0]; if(!isset($zoneIDobj->{'id'})) { return false; } return $zoneIDobj->{'id'}; } public function getLocalRecords($zoneID) { $dnsZone = localAPI('dnsmanager', array( 'dnsaction' => 'getZone', 'zone_id' => $zoneID)); if($dnsZone['result'] != 'success') { return 'Error: cloud not fetch zone for ID ' . $zoneID; } logModuleCall( 'kerioEmail', __FUNCTION__, $zoneID, 'DEbug', $dnsZone ); $zoneRecords = array(); foreach($dnsZone['data']->records as $record) { if(in_array($record->type, ['MX', 'TXT'])){ array_push($zoneRecords, $record); } } return $zoneRecords; } function KerioEmailsetDNS() { return 'success'; $zoneIDcollection = Capsule::table('dns_manager2_zone') ->select('id') ->where('name', '=', $this->params['domain']) ->get(); $zoneIDobj = $zoneIDcollection[0]; $zoneID = $zoneIDobj->{'id'}; if(!isset($zoneID)) { return 'Error: zone ID not found for domain ' . $this->params['domain']; } $dnsZone = localAPI('dnsmanager', array( 'dnsaction' => 'getZone', 'zone_id' => $zoneID)); logModuleCall( 'kerioEmail', __FUNCTION__, $this->params, 'DEbug', $dnsZone['result'] ); if($dnsZone['result'] != 'success') { return 'Error: cloud not fetch zone for ID ' . $zoneID; } $zoneRecords = array(); $mxRecord = array( 'line' => $this->params['domain'].'.|MX|0', 'name' => '@', 'type' => 'MX', 'class' => 'IN', 'data' => array( 'preference' => '10', 'exchange' => $this->params['serverhostname'], ), ); array_push($zoneRecords, $mxRecord); $spfRecord = array( 'line' => $this->params['domain'].'.|TXT|0', 'name' => '@', 'type' => 'TXT', 'class' => 'IN', 'data' => $this->spfConfig ); array_push($zoneRecords, $spfRecord); $dmarcRecord = array( 'line' => $this->params['domain'].'.|TXT|0', 'name' => '@', 'type' => 'TXT', 'class' => 'IN', 'data' => $this->dmarcConfig ); array_push($zoneRecords, $dmarcRecord); foreach($dnsZone['data']->records as $record) { if($record->type == 'MX') continue; if(!$record->type === 'TXT') { // skip dmarc if(preg_match('/^v=DMARC1(.*)$/i', trim($record->rdata->txtdata,'"'))) continue; // skip spf if(preg_match('/^v=spf(.*)$/i', trim($record->rdata->txtdata,'"'))) continue; // skip own dkim if(($this->dkimName == $record->name) && ($this->domainKey == trim($record->rdata->txtdata,'"'))) continue; }; array_push($zoneRecords, $record); } logModuleCall( 'kerioEmail', __FUNCTION__, $this->params, 'DEbug', $zoneRecords ); /* $result = localAPI('dnsmanager' , array( 'dnsaction' => 'updateZone', 'zone_id' => $zoneID, 'records' => $zoneRecords, ) ); if($result['result'] != 'success') { return 'Error: cloud not update zone for ID ' . $zoneID; } */ return 'success'; } function KerioEmailunsetMX() { $zoneIDcollection = Capsule::table('dns_manager2_zone') ->select('id') ->where('name', '=', $this->params['domain']) ->get(); $zoneIDobj = $zoneIDcollection[0]; $zoneID = $zoneIDobj->{'id'}; if(!isset($zoneID)) { return 'Error: zone ID not found for domain ' . $this->params['domain']; } $dnsZone = localAPI('dnsmanager', array( 'dnsaction' => 'getZone', 'zone_id' => $zoneID)); if($dnsZone['result'] != 'success') { return 'Error: cloud not fetch zone for ID ' . $zoneID; } $zoneRecords = array(); foreach($dnsZone['data']->records as $record) { if($record->type == 'MX') continue; array_push($zoneRecords, $record); } logModuleCall( 'kerioEmail', __FUNCTION__, $this->params, 'DEbug', $zoneRecords ); /* $result = localAPI('dnsmanager' , array( 'dnsaction' => 'updateZone', 'zone_id' => $zoneID, 'records' => $zoneRecords, ) ); if($result['result'] != 'success') { return 'Error: cloud not update zone for ID ' . $zoneID; } */ return 'success'; } }