spfcheck : first use bugs corrections

git-svn-id: https://svn.fournier38.fr/svn/ProgSVN/trunk@5963 bf3deb0d-5f1a-0410-827f-c0cc1f45334c
This commit is contained in:
2020-04-26 19:30:17 +00:00
parent 6c5f3f4847
commit 0f736fdf25

View File

@@ -38,7 +38,9 @@ class spfcheck
/** Store all the DNS requests done /** Store all the DNS requests done
*/ */
private $dnsRequests = array (); private $dnsRequests = array ();
/** Store the number of DNS requests
*/
private $dnsCounter = 0;
/** Set the DNS maximum number of requests /** Set the DNS maximum number of requests
*/ */
const dnsRequestsMax = 30; const dnsRequestsMax = 30;
@@ -58,11 +60,12 @@ class spfcheck
// {{{ // {{{
{ {
$this->errors = array (); $this->errors = array ();
$this->dnsCounter = 0;
$this->dnsRequests = array (); $this->dnsRequests = array ();
$this->catchAll = ""; $this->catchAll = "";
$this->ipRecords = $this->getRecordsRecurse ($domain); $this->ipRecords = $this->getRecordsRecurse ($domain);
if ($this->catchAll === "") if ($this->catchAll === "")
$this->errors[$domain] = dgettext ("domframework", $this->errors[$domain][] = dgettext ("domframework",
"No catch all defined for the domain"); "No catch all defined for the domain");
return $this->ipRecords; return $this->ipRecords;
} }
@@ -125,6 +128,11 @@ class spfcheck
$this->matchRule = "$this->catchAllDomain/$this->catchAll"; $this->matchRule = "$this->catchAllDomain/$this->catchAll";
return "SOFTFAIL"; return "SOFTFAIL";
} }
if ($this->catchAll === "?all")
{
$this->matchRule = "$this->catchAllDomain/$this->catchAll";
return "NEUTRAL";
}
} }
// }}} // }}}
@@ -185,6 +193,18 @@ class spfcheck
} }
// }}} // }}}
/** Get the DNS values set for the provided $domain/$part(/$entity)
* @param string $search The search entity
* @return array The array of result from DNS
* @return false if not exists
*/
public function getDNSEntries ($search)
{
if (! key_exists ($search, $this->dnsRequests))
return false;
return $this->dnsRequests[$search];
}
///////////////////////// /////////////////////////
// PRIVATE METHODS // // PRIVATE METHODS //
///////////////////////// /////////////////////////
@@ -268,10 +288,11 @@ class spfcheck
"Invalid mx set form domain '%s' : empty"), $domain); "Invalid mx set form domain '%s' : empty"), $domain);
continue; continue;
} }
foreach ($this->dns_get_record ($ext, DNS_MX, $domain) as $record) foreach ($this->dns_get_record ($ext, DNS_MX, "$domain/$part") as
$record)
{ {
foreach ($this->dns_get_record ($record, DNS_A | DNS_AAAA, $domain) foreach ($this->dns_get_record ($record, DNS_A | DNS_AAAA,
as $ip) "$domain/$part/$record") as $ip)
{ {
$ips[$domain][$part][] = $ip; $ips[$domain][$part][] = $ip;
} }
@@ -331,7 +352,7 @@ class spfcheck
{ {
$this->errors[$domain][$part] = sprintf (dgettext ("domframework", $this->errors[$domain][$part] = sprintf (dgettext ("domframework",
"Invalid ptr set for domain '%s' : PTR must not be used anymore ". "Invalid ptr set for domain '%s' : PTR must not be used anymore ".
"(see RFC7208)"), $domain, $part); "(see RFC7208) : Skip it"), $domain, $part);
continue; continue;
} }
// }}} // }}}
@@ -349,8 +370,8 @@ class spfcheck
"Invalid A set form domain '%s' : empty"), $domain); "Invalid A set form domain '%s' : empty"), $domain);
continue; continue;
} }
foreach ($this->dns_get_record ($ext, DNS_A | DNS_AAAA, $domain) as foreach ($this->dns_get_record ($ext, DNS_A | DNS_AAAA,
$record) "$domain/$part") as $record)
{ {
$ips[$domain][$part][] = $record; $ips[$domain][$part][] = $record;
} }
@@ -360,6 +381,7 @@ class spfcheck
// "-all" / "~all" / "+all" part // "-all" / "~all" / "+all" part
elseif (strtolower ($part) === "-all" || elseif (strtolower ($part) === "-all" ||
strtolower ($part) === "~all" || strtolower ($part) === "~all" ||
strtolower ($part) === "?all" ||
strtolower ($part) === "+all") strtolower ($part) === "+all")
// {{{ // {{{
{ {
@@ -410,11 +432,11 @@ class spfcheck
default: throw new \Exception (dgettext ("domframework", default: throw new \Exception (dgettext ("domframework",
"SPFCheck : Invalid type for DNS get record"), 500); "SPFCheck : Invalid type for DNS get record"), 500);
} }
if (count ($this->dnsRequests) >= self::dnsRequestsMax) if ($this->dnsCounter >= self::dnsRequestsMax)
throw new \Exception (sprintf (dgettext ("domframework", throw new \Exception (sprintf (dgettext ("domframework",
"SPFCheck : Too much DNS requests (%d >= %d)"), "SPFCheck : Too much DNS requests (%d >= %d)"),
count ($this->dnsRequests), self::dnsRequestsMax), 500); $this->dnsCounter, self::dnsRequestsMax), 500);
$this->dnsRequests[] = "$hostname, $typeStr"; $this->dnsCounter++;
$res = array (); $res = array ();
if ($type === DNS_TXT) if ($type === DNS_TXT)
{ {
@@ -422,7 +444,7 @@ class spfcheck
{ {
if (! isset ($record["txt"])) if (! isset ($record["txt"]))
{ {
$this->errors[$somain][] = sprintf (dgettext ("domframework", $this->errors[$domain][] = sprintf (dgettext ("domframework",
"No TXT record for domain '%s'"), $domain); "No TXT record for domain '%s'"), $domain);
continue; continue;
} }
@@ -465,6 +487,7 @@ class spfcheck
} }
else else
throw new \Exception ("Can not get unknown type : $type"); throw new \Exception ("Can not get unknown type : $type");
$this->dnsRequests[$domain] = $res;
return $res; return $res;
} }
// }}} // }}}