Seditio Source
Root |
./othercms/elxis_5.3_atlas_rev2452/includes/libraries/swift/classes/Swift/Signers/OpenDKIMSigner.php
<?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 $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 (
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);
        }
    }
}