mirror of https://github.com/avecms/AVE.cms.git
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
190 lines
5.2 KiB
190 lines
5.2 KiB
<?php |
|
|
|
/* |
|
* This file is part of SwiftMailer. |
|
* (c) 2004-2009 Chris Corbyn |
|
* |
|
* For the full copyright and license information, please view the LICENSE |
|
* file that was distributed with this source code. |
|
*/ |
|
|
|
/** |
|
* DKIM Signer used to apply DKIM Signature to a message |
|
* Takes advantage of pecl extension. |
|
* |
|
* @author Xavier De Cock <xdecock@gmail.com> |
|
*/ |
|
class Swift_Signers_OpenDKIMSigner extends Swift_Signers_DKIMSigner |
|
{ |
|
private $_peclLoaded = false; |
|
|
|
private $_dkimHandler = null; |
|
|
|
private $dropFirstLF = true; |
|
|
|
const CANON_RELAXED = 1; |
|
const CANON_SIMPLE = 2; |
|
const SIG_RSA_SHA1 = 3; |
|
const SIG_RSA_SHA256 = 4; |
|
|
|
public function __construct($privateKey, $domainName, $selector) |
|
{ |
|
if (!extension_loaded('opendkim')) { |
|
throw new Swift_SwiftException('php-opendkim extension not found'); |
|
} |
|
|
|
$this->_peclLoaded = true; |
|
|
|
parent::__construct($privateKey, $domainName, $selector); |
|
} |
|
|
|
public static function newInstance($privateKey, $domainName, $selector) |
|
{ |
|
return new static($privateKey, $domainName, $selector); |
|
} |
|
|
|
public function addSignature(Swift_Mime_HeaderSet $headers) |
|
{ |
|
$header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature'); |
|
$headerVal = $this->_dkimHandler->getSignatureHeader(); |
|
if (!$headerVal) { |
|
throw new Swift_SwiftException('OpenDKIM Error: '.$this->_dkimHandler->getError()); |
|
} |
|
$header->setValue($headerVal); |
|
$headers->set($header); |
|
|
|
return $this; |
|
} |
|
|
|
public function setHeaders(Swift_Mime_HeaderSet $headers) |
|
{ |
|
$bodyLen = $this->_bodyLen; |
|
if (is_bool($bodyLen)) { |
|
$bodyLen = -1; |
|
} |
|
$hash = $this->_hashAlgorithm == 'rsa-sha1' ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256; |
|
$bodyCanon = $this->_bodyCanon == 'simple' ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; |
|
$headerCanon = $this->_headerCanon == 'simple' ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED; |
|
$this->_dkimHandler = new OpenDKIMSign($this->_privateKey, $this->_selector, $this->_domainName, $headerCanon, $bodyCanon, $hash, $bodyLen); |
|
// Hardcode signature Margin for now |
|
$this->_dkimHandler->setMargin(78); |
|
|
|
if (!is_numeric($this->_signatureTimestamp)) { |
|
OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, time()); |
|
} else { |
|
if (!OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, $this->_signatureTimestamp)) { |
|
throw new Swift_SwiftException('Unable to force signature timestamp ['.openssl_error_string().']'); |
|
} |
|
} |
|
if (isset($this->_signerIdentity)) { |
|
$this->_dkimHandler->setSigner($this->_signerIdentity); |
|
} |
|
$listHeaders = $headers->listAll(); |
|
foreach ($listHeaders as $hName) { |
|
// Check if we need to ignore Header |
|
if (!isset($this->_ignoredHeaders[strtolower($hName)])) { |
|
$tmp = $headers->getAll($hName); |
|
if ($headers->has($hName)) { |
|
foreach ($tmp as $header) { |
|
if ($header->getFieldBody() != '') { |
|
$htosign = $header->toString(); |
|
$this->_dkimHandler->header($htosign); |
|
$this->_signedHeaders[] = $header->getFieldName(); |
|
} |
|
} |
|
} |
|
} |
|
} |
|
|
|
return $this; |
|
} |
|
|
|
public function startBody() |
|
{ |
|
if (!$this->_peclLoaded) { |
|
return parent::startBody(); |
|
} |
|
$this->dropFirstLF = true; |
|
$this->_dkimHandler->eoh(); |
|
|
|
return $this; |
|
} |
|
|
|
public function endBody() |
|
{ |
|
if (!$this->_peclLoaded) { |
|
return parent::endBody(); |
|
} |
|
$this->_dkimHandler->eom(); |
|
|
|
return $this; |
|
} |
|
|
|
public function reset() |
|
{ |
|
$this->_dkimHandler = null; |
|
parent::reset(); |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Set the signature timestamp. |
|
* |
|
* @param int $time |
|
* |
|
* @return Swift_Signers_DKIMSigner |
|
*/ |
|
public function setSignatureTimestamp($time) |
|
{ |
|
$this->_signatureTimestamp = $time; |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Set the signature expiration timestamp. |
|
* |
|
* @param int $time |
|
* |
|
* @return Swift_Signers_DKIMSigner |
|
*/ |
|
public function setSignatureExpiration($time) |
|
{ |
|
$this->_signatureExpiration = $time; |
|
|
|
return $this; |
|
} |
|
|
|
/** |
|
* Enable / disable the DebugHeaders. |
|
* |
|
* @param bool $debug |
|
* |
|
* @return Swift_Signers_DKIMSigner |
|
*/ |
|
public function setDebugHeaders($debug) |
|
{ |
|
$this->_debugHeaders = (bool) $debug; |
|
|
|
return $this; |
|
} |
|
|
|
// Protected |
|
|
|
protected function _canonicalizeBody($string) |
|
{ |
|
if (!$this->_peclLoaded) { |
|
return parent::_canonicalizeBody($string); |
|
} |
|
if (false && $this->dropFirstLF === true) { |
|
if ($string[0] == "\r" && $string[1] == "\n") { |
|
$string = substr($string, 2); |
|
} |
|
} |
|
$this->dropFirstLF = false; |
|
if (strlen($string)) { |
|
$this->_dkimHandler->body($string); |
|
} |
|
} |
|
}
|
|
|