2023-12-11 15:48:31 +01:00
|
|
|
<?php
|
|
|
|
|
|
|
|
/**
|
|
|
|
* For the full copyright and license information, please view the LICENSE
|
|
|
|
* file that was distributed with this source code.
|
|
|
|
*
|
|
|
|
* https://www.d3data.de
|
|
|
|
*
|
|
|
|
* @copyright (C) D3 Data Development (Inh. Thomas Dartsch)
|
|
|
|
* @author D3 Data Development - Daniel Seifert <info@shopmodule.com>
|
|
|
|
* @link https://www.oxidmodule.com
|
|
|
|
*/
|
|
|
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
namespace D3\MailConfigChecker\Application\Controller\Admin;
|
|
|
|
|
|
|
|
use Assert\InvalidArgumentException;
|
2024-06-04 14:20:20 +02:00
|
|
|
use D3\MailAuthenticationCheck\DMARCCheck;
|
|
|
|
use D3\MailAuthenticationCheck\Model\DMARCResult;
|
|
|
|
use D3\MailConfigChecker\Application\Model\Constants;
|
|
|
|
use D3\MailConfigChecker\Application\Model\DmarcResult as OxDmarcResult;
|
2023-12-11 15:48:31 +01:00
|
|
|
use D3\MailConfigChecker\Application\Model\SpfResult;
|
|
|
|
use Mika56\SPFCheck\DNS\DNSRecordGetter;
|
|
|
|
use Mika56\SPFCheck\Model\Query;
|
|
|
|
use Mika56\SPFCheck\Model\Result;
|
|
|
|
use Mika56\SPFCheck\SPFCheck;
|
|
|
|
use OxidEsales\Eshop\Application\Controller\Admin\AdminDetailsController;
|
2023-12-12 11:43:46 +01:00
|
|
|
use OxidEsales\Eshop\Application\Model\Shop;
|
2023-12-11 15:48:31 +01:00
|
|
|
use OxidEsales\Eshop\Core\Registry;
|
|
|
|
|
|
|
|
class SpfChecker extends AdminDetailsController
|
|
|
|
{
|
|
|
|
protected $_sThisTemplate = 'spfCheck.tpl';
|
|
|
|
|
|
|
|
public function render()
|
|
|
|
{
|
|
|
|
$this->checkSpf();
|
2024-06-04 14:20:20 +02:00
|
|
|
$this->checkDmarc();
|
2023-12-11 15:48:31 +01:00
|
|
|
return parent::render();
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function checkSpf()
|
|
|
|
{
|
|
|
|
$result = [];
|
|
|
|
$mailDomains = $this->getMailDomains();
|
|
|
|
array_walk(
|
|
|
|
$mailDomains,
|
2023-12-12 11:50:41 +01:00
|
|
|
function ($domain) use (&$result) {
|
2023-12-11 15:48:31 +01:00
|
|
|
$this->checkSpfByDomain($domain, $result);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
2024-06-04 14:20:20 +02:00
|
|
|
$this->addTplParam('spf_result', $result);
|
2023-12-11 15:48:31 +01:00
|
|
|
}
|
|
|
|
|
2024-06-04 14:20:20 +02:00
|
|
|
protected function checkDmarc()
|
|
|
|
{
|
|
|
|
$result = [];
|
|
|
|
$mailDomains = $this->getMailDomains();
|
|
|
|
array_walk(
|
|
|
|
$mailDomains,
|
|
|
|
function ($domain) use (&$result) {
|
|
|
|
$this->checkDmarcByDomain($domain, $result);
|
|
|
|
}
|
|
|
|
);
|
|
|
|
|
|
|
|
$this->addTplParam('dmarc_result', $result);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function getMailDomains(): array
|
2023-12-11 15:48:31 +01:00
|
|
|
{
|
2023-12-12 11:43:46 +01:00
|
|
|
/** @var Shop $shop */
|
|
|
|
$shop = Registry::getConfig()->getActiveShop();
|
|
|
|
|
2023-12-11 15:48:31 +01:00
|
|
|
return
|
|
|
|
array_filter(
|
|
|
|
array_unique(
|
|
|
|
array_map(
|
2023-12-12 11:50:41 +01:00
|
|
|
function ($mailAddress) {
|
2023-12-11 15:48:31 +01:00
|
|
|
$mailAddress = trim($mailAddress);
|
2023-12-12 11:28:18 +01:00
|
|
|
try {
|
2023-12-12 11:50:41 +01:00
|
|
|
if (! strstr($mailAddress, '@')) {
|
|
|
|
throw oxNew(InvalidArgumentException::class);
|
2023-12-12 11:28:18 +01:00
|
|
|
}
|
2023-12-12 11:50:41 +01:00
|
|
|
$addressChunks = explode('@', $mailAddress);
|
2023-12-12 11:28:18 +01:00
|
|
|
|
2023-12-12 11:50:41 +01:00
|
|
|
return array_pop($addressChunks);
|
2023-12-12 11:28:18 +01:00
|
|
|
} catch (InvalidArgumentException $e) {
|
|
|
|
return '';
|
|
|
|
}
|
2023-12-11 15:48:31 +01:00
|
|
|
},
|
|
|
|
[
|
2023-12-12 11:43:46 +01:00
|
|
|
$shop->getFieldData('oxinfoemail'),
|
|
|
|
$shop->getFieldData('oxorderemail'),
|
|
|
|
$shop->getFieldData('oxowneremail'),
|
2023-12-11 15:48:31 +01:00
|
|
|
]
|
|
|
|
)
|
|
|
|
)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
|
|
|
protected function checkSpfByDomain($domain, &$summarize)
|
|
|
|
{
|
|
|
|
$checker = new SPFCheck(new DNSRecordGetter());
|
|
|
|
$query = new Query('', $domain);
|
|
|
|
|
|
|
|
$result = $checker->getResult($query);
|
|
|
|
switch ($result->getResult()) {
|
|
|
|
case Result::FAIL:
|
|
|
|
case Result::NEUTRAL:
|
|
|
|
case Result::PASS:
|
|
|
|
case Result::SOFTFAIL:
|
|
|
|
$status = SpfResult::SET;
|
|
|
|
break;
|
|
|
|
case Result::NONE:
|
|
|
|
$status = SpfResult::MISSING;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$status = SpfResult::ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
$rawRecord = ($record = $result->getRecord()) ?
|
|
|
|
$record->getRawRecord() :
|
|
|
|
null;
|
|
|
|
|
|
|
|
$summarize[$domain] = oxNew(SpfResult::class, $status, $rawRecord);
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getSpfStatusColor(SpfResult $result)
|
|
|
|
{
|
|
|
|
switch ($result->getStatus()) {
|
|
|
|
case SpfResult::SET:
|
|
|
|
return 'success';
|
|
|
|
case SpfResult::ERROR:
|
|
|
|
return 'warning';
|
|
|
|
default:
|
|
|
|
return 'danger';
|
|
|
|
}
|
|
|
|
}
|
2024-06-04 14:20:20 +02:00
|
|
|
|
|
|
|
public function checkDmarcByDomain($domain, &$summarize)
|
|
|
|
{
|
|
|
|
try {
|
|
|
|
$check = new DMARCCheck(new DNSRecordGetter());
|
|
|
|
$query = new Query('', $domain);
|
|
|
|
$record = $check->getResult($query)->getRecord();
|
|
|
|
|
|
|
|
switch ( $record->getRejectPolicy()->getValue() ) {
|
|
|
|
case DMARCResult::REJECT_QUARANTINE:
|
|
|
|
case DMARCResult::REJECT_REJECT:
|
|
|
|
$status = OxDmarcResult::SET;
|
|
|
|
break;
|
|
|
|
case DMARCResult::REJECT_NONE:
|
|
|
|
$status = OxDmarcResult::MISSING;
|
|
|
|
break;
|
|
|
|
default:
|
|
|
|
$status = OxDmarcResult::ERROR;
|
|
|
|
}
|
|
|
|
|
|
|
|
$summarize[$domain] = oxNew( OxDmarcResult::class, $status, $record->getRawRecord());
|
|
|
|
} catch (\LogicException) {
|
|
|
|
$summarize[$domain] = oxNew( OxDmarcResult::class, OxDmarcResult::MISSING, '');
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
public function getDmarcStatusColor(OxDmarcResult $result)
|
|
|
|
{
|
|
|
|
switch ($result->getStatus()) {
|
|
|
|
case SpfResult::SET:
|
|
|
|
return 'success';
|
|
|
|
case SpfResult::ERROR:
|
|
|
|
return 'warning';
|
|
|
|
default:
|
|
|
|
return 'danger';
|
|
|
|
}
|
|
|
|
}
|
2023-12-12 11:50:41 +01:00
|
|
|
}
|