| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183 |
- <?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>
- *
- * @deprecated since SwiftMailer 6.1.0; use Swift_Signers_DKIMSigner instead.
- */
- 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 function addSignature(Swift_Mime_SimpleHeaderSet $headers)
- {
- $header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature');
- $headerVal = $this->dkimHandler->getSignatureHeader();
- if (false === $headerVal || \is_int($headerVal)) {
- throw new Swift_SwiftException('OpenDKIM Error: '.$this->dkimHandler->getError());
- }
- $header->setValue($headerVal);
- $headers->set($header);
- return $this;
- }
- public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
- {
- $hash = 'rsa-sha1' == $this->hashAlgorithm ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256;
- $bodyCanon = 'simple' == $this->bodyCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
- $headerCanon = 'simple' == $this->headerCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
- $this->dkimHandler = new OpenDKIMSign($this->privateKey, $this->selector, $this->domainName, $headerCanon, $bodyCanon, $hash, -1);
- // 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 $this
- */
- public function setSignatureTimestamp($time)
- {
- $this->signatureTimestamp = $time;
- return $this;
- }
- /**
- * Set the signature expiration timestamp.
- *
- * @param int $time
- *
- * @return $this
- */
- public function setSignatureExpiration($time)
- {
- $this->signatureExpiration = $time;
- return $this;
- }
- /**
- * Enable / disable the DebugHeaders.
- *
- * @param bool $debug
- *
- * @return $this
- */
- public function setDebugHeaders($debug)
- {
- $this->debugHeaders = (bool) $debug;
- return $this;
- }
- // Protected
- protected function canonicalizeBody($string)
- {
- if (!$this->peclLoaded) {
- return parent::canonicalizeBody($string);
- }
- if (true === $this->dropFirstLF) {
- if ("\r" == $string[0] && "\n" == $string[1]) {
- $string = substr($string, 2);
- }
- }
- $this->dropFirstLF = false;
- if (\strlen($string)) {
- $this->dkimHandler->body($string);
- }
- }
- }
|