diff --git a/lib/Froxlor/Cron/Dns/DnsBase.php b/lib/Froxlor/Cron/Dns/DnsBase.php index 31ae32df..da56d64b 100644 --- a/lib/Froxlor/Cron/Dns/DnsBase.php +++ b/lib/Froxlor/Cron/Dns/DnsBase.php @@ -215,7 +215,7 @@ abstract class DnsBase `" . TABLE_PANEL_DOMAINS . "` `d` LEFT JOIN `" . TABLE_PANEL_CUSTOMERS . "` `c` USING(`customerid`) WHERE - `d`.`isbinddomain` = '1' + `d`.`isbinddomain` = '1' aND `d`.`deactivated` = '0' ORDER BY `d`.`domain` ASC "); diff --git a/lib/Froxlor/Dns/Dns.php b/lib/Froxlor/Dns/Dns.php index ef374bc0..239397d6 100644 --- a/lib/Froxlor/Dns/Dns.php +++ b/lib/Froxlor/Dns/Dns.php @@ -184,6 +184,8 @@ class Dns // check for DKIM content later //self::addRequiredEntry('dkim' . $domain['dkim_id'] . '._domainkey.' . $sub_record, 'TXT', $required_entries); self::addRequiredEntry('mx._domainkey.' . $sub_record, 'TXT', $required_entries); + //Also add dmarc + self::addRequiredEntry('_dmarc' . $sub_record, 'TXT', $required_entries); } } } @@ -222,6 +224,8 @@ class Dns // check for DKIM content later //self::addRequiredEntry('dkim' . $domain['dkim_id'] . '._domainkey', 'TXT', $required_entries); self::addRequiredEntry('mx._domainkey', 'TXT', $required_entries); + //Also add dmarc + self::addRequiredEntry('_dmarc', 'TXT', $required_entries); } } @@ -379,10 +383,13 @@ class Dns if (array_key_exists("TXT", $required_entries)) { if (Settings::Get('dkim.use_dkim') == '1') { $dkim_entries = self::generateDkimEntries($domain); + $dmarc_entries = self::generateDmarcEntries($domain); } foreach ($required_entries as $type => $records) { if ($type == 'TXT') { + //$dkim_record = 'dkim' . $domain['dkim_id'] . '._domainkey'; + $dkim_record = 'mx._domainkey'; foreach ($records as $record) { if ($record == '@SPF@') { // spf for main-domain @@ -393,10 +400,8 @@ class Dns $txt_content = Settings::Get('spf.spf_entry'); $sub_record = substr($record, 6); $zonerecords[] = new DnsEntry($sub_record, 'TXT', self::encloseTXTContent($txt_content)); - } elseif (!empty($dkim_entries)) { + } elseif (!empty($dkim_entries) && $record == $dkim_record ) { // DKIM entries - //$dkim_record = 'dkim' . $domain['dkim_id'] . '._domainkey'; - $dkim_record = 'mx._domainkey'; if ($record == $dkim_record) { // dkim for main-domain // check for multiline entry @@ -414,7 +419,10 @@ class Dns } $zonerecords[] = new DnsEntry($record, 'TXT', self::encloseTXTContent($dkim_entries[0], $multiline)); } + } elseif ($record == '_dmarc' && !empty($dmarc_entries) && $domain['isemaildomain'] == '1') { + $zonerecords[] = new DnsEntry($record, 'TXT', self::encloseTXTContent($dmarc_entries[0])); } + } } } @@ -582,7 +590,15 @@ class Dns } return $zone_dkim; } - + private static function generateDmarcEntries(array $domain): array + { + $zone_dmarc = []; + if (Settings::Get('dkim.use_dkim') == '1' && $domain['dkim'] == '1' ){ + $dmarc_txt = 'v=DMARC1; p=quarantine; ruf=mailto:dmarc@'. $domain['domain'] . '; rua=mailto:dmarc@'. $domain['domain'] . '; fo=1; adkim=r; aspf=r; pct=100; rf=afrf; ri=345600;'; + $zone_dmarc[] = $dmarc_txt; + } + return $zone_dmarc; + } /** * @param string $txt_content * @param bool $isMultiLine