Changeset 101345 in spip-zone


Ignore:
Timestamp:
Dec 27, 2016, 11:46:52 AM (3 years ago)
Author:
brunobergot@…
Message:

version 3.4.6 : sécurité, maj de la lib PHPMailer en version 5.2.19

on en profite pour ajouter PHPMailer aux crédits du plugin

astuce en cadeau, les commandes svn pour retirer les fichiers absents ou ajouteur les nouveaux :

svn rm $( svn status | sed -e '/^!/!d' -e 's/^!//' ) + svn add $( svn status | sed -e '/^?/!d' -e 's/^?//' )

Location:
_plugins_/facteur/trunk
Files:
6 added
8 deleted
17 edited

Legend:

Unmodified
Added
Removed
  • _plugins_/facteur/trunk/paquet.xml

    r100655 r101345  
    22        prefix="facteur"
    33        categorie="communication"
    4         version="3.4.5"
     4        version="3.4.6"
    55        etat="stable"
    66        compatibilite="[3.0.0;3.1.*]"
     
    1414
    1515        <auteur>Collectif SPIP</auteur>
     16        <credit lien="https://github.com/PHPMailer/PHPMailer">PHPMailer</credit>
    1617
    1718        <pipeline nom="facteur_pre_envoi" action="" />
  • _plugins_/facteur/trunk/phpmailer-php5/VERSION

    r92830 r101345  
    1 5.2.14
     15.2.19
  • _plugins_/facteur/trunk/phpmailer-php5/class.phpmailer.php

    r92830 r101345  
    3232     * @var string
    3333     */
    34     public $Version = '5.2.14';
     34    public $Version = '5.2.19';
    3535
    3636    /**
     
    202202     * An ID to be used in the Message-ID header.
    203203     * If empty, a unique id will be generated.
     204     * You can set your own, but it must be in the format "<id@domain>",
     205     * as defined in RFC5322 section 3.6.4 or it will be ignored.
     206     * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
    204207     * @var string
    205208     */
     
    286289    /**
    287290     * SMTP auth type.
    288      * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
     291     * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that order if not specified
    289292     * @var string
    290293     */
     
    353356     * Whether to split multiple to addresses into multiple messages
    354357     * or send them all in one message.
     358     * Only supported in `mail` and `sendmail` transports, not in SMTP.
    355359     * @var boolean
    356360     */
     
    395399    /**
    396400     * DKIM Identity.
    397      * Usually the email address used as the source of the email
     401     * Usually the email address used as the source of the email.
    398402     * @var string
    399403     */
     
    419423     */
    420424    public $DKIM_private = '';
     425
     426    /**
     427     * DKIM private key string.
     428     * If set, takes precedence over `$DKIM_private`.
     429     * @var string
     430     */
     431    public $DKIM_private_string = '';
    421432
    422433    /**
     
    448459
    449460    /**
     461     * Which validator to use by default when validating email addresses.
     462     * May be a callable to inject your own validator, but there are several built-in validators.
     463     * @see PHPMailer::validateAddress()
     464     * @var string|callable
     465     * @static
     466     */
     467    public static $validator = 'auto';
     468
     469    /**
    450470     * An instance of the SMTP sender class.
    451471     * @var SMTP
     
    635655     * @param boolean $exceptions Should we throw external exceptions?
    636656     */
    637     public function __construct($exceptions = false)
    638     {
    639         $this->exceptions = (boolean)$exceptions;
     657    public function __construct($exceptions = null)
     658    {
     659        if ($exceptions !== null) {
     660            $this->exceptions = (boolean)$exceptions;
     661        }
    640662    }
    641663
     
    646668    {
    647669        //Close any open SMTP connection nicely
    648         if ($this->Mailer == 'smtp') {
    649             $this->smtpClose();
    650         }
     670        $this->smtpClose();
    651671    }
    652672
     
    672692            $subject = $this->encodeHeader($this->secureHeader($subject));
    673693        }
    674         if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
     694
     695        //Can't use additional_parameters in safe_mode, calling mail() with null params breaks
     696        //@link http://php.net/manual/en/function.mail.php
     697        if (ini_get('safe_mode') or !$this->UseSendmailOptions or is_null($params)) {
    675698            $result = @mail($to, $subject, $body, $header);
    676699        } else {
     
    679702        return $result;
    680703    }
    681 
    682704    /**
    683705     * Output debugging info via user-defined method.
     
    714736            default:
    715737                //Normalize line breaks
    716                 $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
     738                $str = preg_replace('/\r\n?/ms', "\n", $str);
    717739                echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
    718740                    "\n",
     
    851873        if (($pos = strrpos($address, '@')) === false) {
    852874            // At-sign is misssing.
    853             $error_message = $this->lang('invalid_address') . $address;
     875            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
    854876            $this->setError($error_message);
    855877            $this->edebug($error_message);
     
    901923        }
    902924        if (!$this->validateAddress($address)) {
    903             $error_message = $this->lang('invalid_address') . $address;
     925            $error_message = $this->lang('invalid_address') . " (addAnAddress $kind): $address";
    904926            $this->setError($error_message);
    905927            $this->edebug($error_message);
     
    9951017            (!$this->has8bitChars(substr($address, ++$pos)) or !$this->idnSupported()) and
    9961018            !$this->validateAddress($address)) {
    997             $error_message = $this->lang('invalid_address') . $address;
     1019            $error_message = $this->lang('invalid_address') . " (setFrom) $address";
    9981020            $this->setError($error_message);
    9991021            $this->edebug($error_message);
     
    10281050     * Check that a string looks like an email address.
    10291051     * @param string $address The email address to check
    1030      * @param string $patternselect A selector for the validation pattern to use :
     1052     * @param string|callable $patternselect A selector for the validation pattern to use :
    10311053     * * `auto` Pick best pattern automatically;
    10321054     * * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >= 5.3.2, 5.2.14;
     
    10351057     * * `html5` Use the pattern given by the HTML5 spec for 'email' type form input elements.
    10361058     * * `noregex` Don't use a regex: super fast, really dumb.
     1059     * Alternatively you may pass in a callable to inject your own validator, for example:
     1060     * PHPMailer::validateAddress('user@example.com', function($address) {
     1061     *     return (strpos($address, '@') !== false);
     1062     * });
     1063     * You can also set the PHPMailer::$validator static to a callable, allowing built-in methods to use your validator.
    10371064     * @return boolean
    10381065     * @static
    10391066     * @access public
    10401067     */
    1041     public static function validateAddress($address, $patternselect = 'auto')
    1042     {
     1068    public static function validateAddress($address, $patternselect = null)
     1069    {
     1070        if (is_null($patternselect)) {
     1071            $patternselect = self::$validator;
     1072        }
     1073        if (is_callable($patternselect)) {
     1074            return call_user_func($patternselect, $address);
     1075        }
    10431076        //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
    10441077        if (strpos($address, "\n") !== false or strpos($address, "\r") !== false) {
     
    12171250                $this->$address_kind = $this->punyencodeAddress($this->$address_kind);
    12181251                if (!$this->validateAddress($this->$address_kind)) {
    1219                     $error_message = $this->lang('invalid_address') . $this->$address_kind;
     1252                    $error_message = $this->lang('invalid_address') . ' (punyEncode) ' . $this->$address_kind;
    12201253                    $this->setError($error_message);
    12211254                    $this->edebug($error_message);
     
    12281261
    12291262            // Set whether the message is multipart/alternative
    1230             if (!empty($this->AltBody)) {
     1263            if ($this->alternativeExists()) {
    12311264                $this->ContentType = 'multipart/alternative';
    12321265            }
     
    12621295            // Sign with DKIM if enabled
    12631296            if (!empty($this->DKIM_domain)
    1264                 && !empty($this->DKIM_private)
    12651297                && !empty($this->DKIM_selector)
    1266                 && file_exists($this->DKIM_private)) {
     1298                && (!empty($this->DKIM_private_string)
     1299                   || (!empty($this->DKIM_private) && file_exists($this->DKIM_private))
     1300                )
     1301            ) {
    12671302                $header_dkim = $this->DKIM_Add(
    12681303                    $this->MIMEHeader . $this->mailHeader,
     
    13301365    protected function sendmailSend($header, $body)
    13311366    {
    1332         if ($this->Sender != '') {
     1367        if (!empty($this->Sender)) {
    13331368            if ($this->Mailer == 'qmail') {
    13341369                $sendmail = sprintf('%s -f%s', escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
     
    14051440        $to = implode(', ', $toArr);
    14061441
    1407         if (empty($this->Sender)) {
    1408             $params = ' ';
    1409         } else {
    1410             $params = sprintf('-f%s', $this->Sender);
    1411         }
    1412         if ($this->Sender != '' and !ini_get('safe_mode')) {
     1442        $params = null;
     1443        //This sets the SMTP envelope sender which gets turned into a return-path header by the receiver
     1444        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
     1445            $params = sprintf('-f%s', escapeshellarg($this->Sender));
     1446        }
     1447        if (!empty($this->Sender) and !ini_get('safe_mode') and $this->validateAddress($this->Sender)) {
    14131448            $old_from = ini_get('sendmail_from');
    14141449            ini_set('sendmail_from', $this->Sender);
    14151450        }
    14161451        $result = false;
    1417         if ($this->SingleTo && count($toArr) > 1) {
     1452        if ($this->SingleTo and count($toArr) > 1) {
    14181453            foreach ($toArr as $toAddr) {
    14191454                $result = $this->mailPassthru($toAddr, $this->Subject, $body, $header, $params);
     
    14641499            throw new phpmailerException($this->lang('smtp_connect_failed'), self::STOP_CRITICAL);
    14651500        }
    1466         if ('' == $this->Sender) {
     1501        if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
     1502            $smtp_from = $this->Sender;
     1503        } else {
    14671504            $smtp_from = $this->From;
    1468         } else {
    1469             $smtp_from = $this->Sender;
    14701505        }
    14711506        if (!$this->smtp->mail($smtp_from)) {
     
    15211556     * @return boolean
    15221557     */
    1523     public function smtpConnect($options = array())
     1558    public function smtpConnect($options = null)
    15241559    {
    15251560        if (is_null($this->smtp)) {
    15261561            $this->smtp = $this->getSMTPInstance();
     1562        }
     1563
     1564        //If no options are provided, use whatever is set in the instance
     1565        if (is_null($options)) {
     1566            $options = $this->SMTPOptions;
    15271567        }
    15281568
     
    15961636                            throw new phpmailerException($this->lang('connect_host'));
    15971637                        }
    1598                         // We must resend HELO after tls negotiation
     1638                        // We must resend EHLO after TLS negotiation
    15991639                        $this->smtp->hello($hello);
    16001640                    }
     
    16351675    public function smtpClose()
    16361676    {
    1637         if ($this->smtp !== null) {
     1677        if (is_a($this->smtp, 'SMTP')) {
    16381678            if ($this->smtp->connected()) {
    16391679                $this->smtp->quit();
     
    16541694    public function setLanguage($langcode = 'en', $lang_path = '')
    16551695    {
     1696        // Backwards compatibility for renamed language codes
     1697        $renamed_langcodes = array(
     1698            'br' => 'pt_br',
     1699            'cz' => 'cs',
     1700            'dk' => 'da',
     1701            'no' => 'nb',
     1702            'se' => 'sv',
     1703        );
     1704
     1705        if (isset($renamed_langcodes[$langcode])) {
     1706            $langcode = $renamed_langcodes[$langcode];
     1707        }
     1708
    16561709        // Define full set of translatable strings in English
    16571710        $PHPMAILER_LANG = array(
     
    16791732            // Calculate an absolute path so it can work if CWD is not here
    16801733            $lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'. DIRECTORY_SEPARATOR;
     1734        }
     1735        //Validate $langcode
     1736        if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
     1737            $langcode = 'en';
    16811738        }
    16821739        $foundlang = true;
     
    19732030        }
    19742031
    1975         if ($this->MessageID != '') {
     2032        // Only allow a custom message ID if it conforms to RFC 5322 section 3.6.4
     2033        // https://tools.ietf.org/html/rfc5322#section-3.6.4
     2034        if ('' != $this->MessageID and preg_match('/^<.*@.*>$/', $this->MessageID)) {
    19762035            $this->lastMessageID = $this->MessageID;
    19772036        } else {
     
    20752134    public function getSentMIMEMessage()
    20762135    {
    2077         return $this->MIMEHeader . $this->mailHeader . self::CRLF . $this->MIMEBody;
     2136        return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") . self::CRLF . self::CRLF . $this->MIMEBody;
     2137    }
     2138
     2139    /**
     2140     * Create unique ID
     2141     * @return string
     2142     */
     2143    protected function generateId() {
     2144        return md5(uniqid(time()));
    20782145    }
    20792146
     
    20892156        $body = '';
    20902157        //Create unique IDs and preset boundaries
    2091         $this->uniqueid = md5(uniqid(time()));
     2158        $this->uniqueid = $this->generateId();
    20922159        $this->boundary[1] = 'b1_' . $this->uniqueid;
    20932160        $this->boundary[2] = 'b2_' . $this->uniqueid;
     
    21052172        if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
    21062173            $bodyEncoding = '7bit';
     2174            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
    21072175            $bodyCharSet = 'us-ascii';
    21082176        }
    21092177        //If lines are too long, and we're not already using an encoding that will shorten them,
    2110         //change to quoted-printable transfer encoding
     2178        //change to quoted-printable transfer encoding for the body part only
    21112179        if ('base64' != $this->Encoding and self::hasLineLongerThanMax($this->Body)) {
    2112             $this->Encoding = 'quoted-printable';
    21132180            $bodyEncoding = 'quoted-printable';
    21142181        }
     
    21192186        if ($altBodyEncoding == '8bit' and !$this->has8bitChars($this->AltBody)) {
    21202187            $altBodyEncoding = '7bit';
     2188            //All ISO 8859, Windows codepage and UTF-8 charsets are ascii compatible up to 7-bit
    21212189            $altBodyCharSet = 'us-ascii';
    21222190        }
    2123         //If lines are too long, change to quoted-printable transfer encoding
    2124         if (self::hasLineLongerThanMax($this->AltBody)) {
     2191        //If lines are too long, and we're not already using an encoding that will shorten them,
     2192        //change to quoted-printable transfer encoding for the alt body part only
     2193        if ('base64' != $altBodyEncoding and self::hasLineLongerThanMax($this->AltBody)) {
    21252194            $altBodyEncoding = 'quoted-printable';
    21262195        }
     
    22252294                break;
    22262295            default:
    2227                 // catch case 'plain' and case ''
    2228                 $body .= $this->encodeString($this->Body, $bodyEncoding);
     2296                // Catch case 'plain' and case '', applies to simple `text/plain` and `text/html` body content types
     2297                //Reset the `Encoding` property in case we changed it for line length reasons
     2298                $this->Encoding = $bodyEncoding;
     2299                $body .= $this->encodeString($this->Body, $this->Encoding);
    22292300                break;
    22302301        }
     
    23322403    /**
    23332404     * Set the message type.
    2334      * PHPMailer only supports some preset message types,
    2335      * not arbitrary MIME structures.
     2405     * PHPMailer only supports some preset message types, not arbitrary MIME structures.
    23362406     * @access protected
    23372407     * @return void
     
    23512421        $this->message_type = implode('_', $type);
    23522422        if ($this->message_type == '') {
     2423            //The 'plain' message_type refers to the message having a single body element, not that it is plain-text
    23532424            $this->message_type = 'plain';
    23542425        }
     
    32653336
    32663337    /**
    3267      * Create a message from an HTML string.
    3268      * Automatically makes modifications for inline images and backgrounds
    3269      * and creates a plain-text version by converting the HTML.
    3270      * Overwrites any existing values in $this->Body and $this->AltBody
     3338     * Create a message body from an HTML string.
     3339     * Automatically inlines images and creates a plain-text version by converting the HTML,
     3340     * overwriting any existing values in Body and AltBody.
     3341     * $basedir is used when handling relative image paths, e.g. <img src="images/a.png">
     3342     * will look for an image file in $basedir/images/a.png and convert it to inline.
     3343     * If you don't want to apply these transformations to your HTML, just set Body and AltBody yourself.
    32713344     * @access public
    32723345     * @param string $message HTML message string
    3273      * @param string $basedir baseline directory for path
     3346     * @param string $basedir base directory for relative paths to images
    32743347     * @param boolean|callable $advanced Whether to use the internal HTML to text converter
    32753348     *    or your own custom converter @see PHPMailer::html2text()
    3276      * @return string $message
     3349     * @return string $message The transformed message Body
    32773350     */
    32783351    public function msgHTML($message, $basedir = '', $advanced = false)
     
    32973370                        );
    32983371                    }
    3299                 } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[A-z]+://#', $url)) {
     3372                } elseif (substr($url, 0, 4) !== 'cid:' && !preg_match('#^[a-z][a-z0-9+.-]*://#i', $url)) {
    33003373                    // Do not change urls for absolute images (thanks to corvuscorax)
    33013374                    // Do not change urls that are already inline images
     
    33333406        $this->Body = $this->normalizeBreaks($message);
    33343407        $this->AltBody = $this->normalizeBreaks($this->html2text($message, $advanced));
    3335         if (empty($this->AltBody)) {
     3408        if (!$this->alternativeExists()) {
    33363409            $this->AltBody = 'To view this email message, open it in a program that understands HTML!' .
    33373410                self::CRLF . self::CRLF;
     
    33443417     * This is used by msgHTML().
    33453418     * Note - older versions of this function used a bundled advanced converter
    3346      * which was been removed for license reasons in #232
     3419     * which was been removed for license reasons in #232.
    33473420     * Example usage:
    33483421     * <code>
     
    36443717     * @param string $signHeader
    36453718     * @throws phpmailerException
    3646      * @return string
     3719     * @return string The DKIM signature value
    36473720     */
    36483721    public function DKIM_Sign($signHeader)
     
    36543727            return '';
    36553728        }
    3656         $privKeyStr = file_get_contents($this->DKIM_private);
    3657         if ($this->DKIM_passphrase != '') {
     3729        $privKeyStr = !empty($this->DKIM_private_string) ? $this->DKIM_private_string : file_get_contents($this->DKIM_private);
     3730        if ('' != $this->DKIM_passphrase) {
    36583731            $privKey = openssl_pkey_get_private($privKeyStr, $this->DKIM_passphrase);
    36593732        } else {
    3660             $privKey = $privKeyStr;
    3661         }
    3662         if (openssl_sign($signHeader, $signature, $privKey)) {
    3663             return base64_encode($signature);
    3664         }
     3733            $privKey = openssl_pkey_get_private($privKeyStr);
     3734        }
     3735        //Workaround for missing digest algorithms in old PHP & OpenSSL versions
     3736        //@link http://stackoverflow.com/a/11117338/333340
     3737        if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
     3738            in_array('sha256WithRSAEncryption', openssl_get_md_methods(true))) {
     3739            if (openssl_sign($signHeader, $signature, $privKey, 'sha256WithRSAEncryption')) {
     3740                openssl_pkey_free($privKey);
     3741                return base64_encode($signature);
     3742            }
     3743        } else {
     3744            $pinfo = openssl_pkey_get_details($privKey);
     3745            $hash = hash('sha256', $signHeader);
     3746            //'Magic' constant for SHA256 from RFC3447
     3747            //@link https://tools.ietf.org/html/rfc3447#page-43
     3748            $t = '3031300d060960864801650304020105000420' . $hash;
     3749            $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
     3750            $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
     3751
     3752            if (openssl_private_encrypt($eb, $signature, $privKey, OPENSSL_NO_PADDING)) {
     3753                openssl_pkey_free($privKey);
     3754                return base64_encode($signature);
     3755            }
     3756        }
     3757        openssl_pkey_free($privKey);
    36653758        return '';
    36663759    }
     
    36793772            list($heading, $value) = explode(':', $line, 2);
    36803773            $heading = strtolower($heading);
    3681             $value = preg_replace('/\s+/', ' ', $value); // Compress useless spaces
     3774            $value = preg_replace('/\s{2,}/', ' ', $value); // Compress useless spaces
    36823775            $lines[$key] = $heading . ':' . trim($value); // Don't forget to remove WSP around the value
    36833776        }
     
    37173810    public function DKIM_Add($headers_line, $subject, $body)
    37183811    {
    3719         $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
     3812        $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
    37203813        $DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of header/body
    37213814        $DKIMquery = 'dns/txt'; // Query method
     
    37253818        $from_header = '';
    37263819        $to_header = '';
     3820        $date_header = '';
    37273821        $current = '';
    37283822        foreach ($headers as $header) {
     
    37333827                $to_header = $header;
    37343828                $current = 'to_header';
     3829            } elseif (strpos($header, 'Date:') === 0) {
     3830                $date_header = $header;
     3831                $current = 'date_header';
    37353832            } else {
    37363833                if (!empty($$current) && strpos($header, ' =?') === 0) {
     
    37433840        $from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
    37443841        $to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
     3842        $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
    37453843        $subject = str_replace(
    37463844            '|',
     
    37503848        $body = $this->DKIM_BodyC($body);
    37513849        $DKIMlen = strlen($body); // Length of body
    3752         $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed binary SHA-1 hash of body
     3850        $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64 of packed binary SHA-256 hash of body
    37533851        if ('' == $this->DKIM_identity) {
    37543852            $ident = '';
     
    37633861            ";\r\n" .
    37643862            "\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
    3765             "\th=From:To:Subject;\r\n" .
     3863            "\th=From:To:Date:Subject;\r\n" .
    37663864            "\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
    37673865            "\tz=$from\r\n" .
    37683866            "\t|$to\r\n" .
     3867            "\t|$date\r\n" .
    37693868            "\t|$subject;\r\n" .
    37703869            "\tbh=" . $DKIMb64 . ";\r\n" .
     
    37733872            $from_header . "\r\n" .
    37743873            $to_header . "\r\n" .
     3874            $date_header . "\r\n" .
    37753875            $subject_header . "\r\n" .
    37763876            $dkimhdrs
  • _plugins_/facteur/trunk/phpmailer-php5/class.phpmaileroauth.php

    r92830 r101345  
    8181     * @access public
    8282     * @return bool
     83     * @throws phpmailerException
    8384     */
    8485    public function smtpConnect($options = array())
  • _plugins_/facteur/trunk/phpmailer-php5/class.phpmaileroauthgoogle.php

    r92830 r101345  
    5050    }
    5151
    52     private function getProvider() {
     52    private function getProvider()
     53    {
    5354        return new League\OAuth2\Client\Provider\Google([
    5455            'clientId' => $this->oauthClientId,
  • _plugins_/facteur/trunk/phpmailer-php5/class.pop3.php

    r92830 r101345  
    3535     * @access public
    3636     */
    37     public $Version = '5.2.14';
     37    public $Version = '5.2.19';
    3838
    3939    /**
  • _plugins_/facteur/trunk/phpmailer-php5/class.smtp.php

    r92830 r101345  
    3131     * @var string
    3232     */
    33     const VERSION = '5.2.14';
     33    const VERSION = '5.2.19';
    3434
    3535    /**
     
    8282     * @see SMTP::VERSION
    8383     */
    84     public $Version = '5.2.14';
     84    public $Version = '5.2.19';
    8585
    8686    /**
     
    151151    public $Timelimit = 300;
    152152
     153        /**
     154         * @var array patterns to extract smtp transaction id from smtp reply
     155         * Only first capture group will be use, use non-capturing group to deal with it
     156         * Extend this class to override this property to fulfil your needs.
     157         */
     158        protected $smtp_transaction_id_patterns = array(
     159                'exim' => '/[0-9]{3} OK id=(.*)/',
     160                'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
     161                'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
     162        );
     163
    153164    /**
    154165     * The socket for the server connection.
     
    207218        //Avoid clash with built-in function names
    208219        if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo')) and is_callable($this->Debugoutput)) {
    209             call_user_func($this->Debugoutput, $str, $this->do_debug);
     220            call_user_func($this->Debugoutput, $str, $level);
    210221            return;
    211222        }
     
    273284        if ($streamok) {
    274285            $socket_context = stream_context_create($options);
    275             //Suppress errors; connection failures are handled at a higher level
    276             $this->smtp_conn = @stream_socket_client(
     286            set_error_handler(array($this, 'errorHandler'));
     287            $this->smtp_conn = stream_socket_client(
    277288                $host . ":" . $port,
    278289                $errno,
     
    282293                $socket_context
    283294            );
     295            restore_error_handler();
    284296        } else {
    285297            //Fall back to fsockopen which should work in more places, but is missing some features
     
    288300                self::DEBUG_CONNECTION
    289301            );
     302            set_error_handler(array($this, 'errorHandler'));
    290303            $this->smtp_conn = fsockopen(
    291304                $host,
     
    295308                $timeout
    296309            );
     310            restore_error_handler();
    297311        }
    298312        // Verify we connected properly
     
    337351            return false;
    338352        }
     353
     354        //Allow the best TLS version(s) we can
     355        $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
     356
     357        //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in STREAM_CRYPTO_METHOD_TLS_CLIENT
     358        //so add them back in manually if we can
     359        if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
     360            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
     361            $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
     362        }
     363
    339364        // Begin encrypted connection
    340365        if (!stream_socket_enable_crypto(
    341366            $this->smtp_conn,
    342367            true,
    343             STREAM_CRYPTO_METHOD_TLS_CLIENT
     368            $crypto_method
    344369        )) {
    345370            return false;
     
    390415
    391416            if (empty($authtype)) {
    392                 foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN', 'XOAUTH2') as $method) {
     417                foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM', 'XOAUTH2') as $method) {
    393418                    if (in_array($method, $this->server_caps['AUTH'])) {
    394419                        $authtype = $method;
     
    464489                $ntlm_client = new ntlm_sasl_client_class;
    465490                //Check that functions are available
    466                 if (!$ntlm_client->Initialize($temp)) {
     491                if (!$ntlm_client->initialize($temp)) {
    467492                    $this->setError($temp->error);
    468493                    $this->edebug(
     
    474499                }
    475500                //msg1
    476                 $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
     501                $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1
    477502
    478503                if (!$this->sendCommand(
     
    493518                );
    494519                //msg3
    495                 $msg3 = $ntlm_client->TypeMsg3(
     520                $msg3 = $ntlm_client->typeMsg3(
    496521                    $ntlm_res,
    497522                    $username,
     
    737762    {
    738763        $this->server_caps = array();
    739         $lines = explode("\n", $this->last_reply);
     764        $lines = explode("\n", $this->helo_rply);
    740765
    741766        foreach ($lines as $n => $s) {
     
    11791204        return $this->Timeout;
    11801205    }
     1206
     1207    /**
     1208     * Reports an error number and string.
     1209     * @param integer $errno The error number returned by PHP.
     1210     * @param string $errmsg The error message returned by PHP.
     1211     */
     1212    protected function errorHandler($errno, $errmsg)
     1213    {
     1214        $notice = 'Connection: Failed to connect to server.';
     1215        $this->setError(
     1216            $notice,
     1217            $errno,
     1218            $errmsg
     1219        );
     1220        $this->edebug(
     1221            $notice . ' Error number ' . $errno . '. "Error notice: ' . $errmsg,
     1222            self::DEBUG_CONNECTION
     1223        );
     1224    }
     1225
     1226        /**
     1227         * Will return the ID of the last smtp transaction based on a list of patterns provided
     1228         * in SMTP::$smtp_transaction_id_patterns.
     1229         * If no reply has been received yet, it will return null.
     1230         * If no pattern has been matched, it will return false.
     1231         * @return bool|null|string
     1232         */
     1233        public function getLastTransactionID()
     1234        {
     1235                $reply = $this->getLastReply();
     1236
     1237                if (empty($reply)) {
     1238                        return null;
     1239                }
     1240
     1241                foreach($this->smtp_transaction_id_patterns as $smtp_transaction_id_pattern) {
     1242                        if(preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
     1243                                return $matches[1];
     1244                        }
     1245                }
     1246
     1247                return false;
     1248    }
    11811249}
  • _plugins_/facteur/trunk/phpmailer-php5/composer.json

    r92830 r101345  
    2828    },
    2929    "suggest": {
    30         "league/oauth2-client": "Needed for XOAUTH2 authentication",
    31         "league/oauth2-google": "Needed for Gmail XOAUTH2"
     30        "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
    3231    },
    3332    "autoload": {
  • _plugins_/facteur/trunk/phpmailer-php5/extras/htmlfilter.php

    r89555 r101345  
    462462 *
    463463 * @param string $attvalue A string to run entity check against.
    464  * @return             Void, modifies a reference value.
    465464 */
    466465function tln_defang(&$attvalue)
     
    489488 *
    490489 * @param string $attvalue     The attribute value before extraneous spaces removed.
    491  * @return     Void, modifies a reference value.
    492490 */
    493491function tln_unspace(&$attvalue)
     
    512510 * @param string $trans_image_path
    513511 * @param boolean $block_external_images
    514  * @return                                      Array with modified attributes.
     512 * @return array with modified attributes.
    515513 */
    516514function tln_fixatts(
     
    668666function tln_fixstyle($body, $pos, $trans_image_path, $block_external_images)
    669667{
    670     $me = 'tln_fixstyle';
    671668    // workaround for </style> in between comments
    672     $iCurrentPos = $pos;
    673669    $content = '';
    674670    $sToken = '';
     
    741737    $content = preg_replace("|body(\s*\{.*?\})|si", ".bodyclass\\1", $content);
    742738
    743     $trans_image_path = $trans_image_path;
    744 
    745739    /**
    746740    * Fix url('blah') declarations.
     
    797791function tln_body2div($attary, $trans_image_path)
    798792{
    799     $me = 'tln_body2div';
    800793    $divattary = array('class' => "'bodyclass'");
    801794    $text = '#000000';
     
    902895                $trusted .= tln_tagprint($tagname, $attary, $tagtype);
    903896                $trusted .= $free_content;
    904                 $trusted .= tln_tagprint($tagname, false, 2);
     897                $trusted .= tln_tagprint($tagname, null, 2);
    905898            }
    906899            continue;
  • _plugins_/facteur/trunk/phpmailer-php5/extras/ntlm_sasl_client.php

    r89555 r101345  
    161161        switch ($this->state) {
    162162            case SASL_NTLM_STATE_IDENTIFY_DOMAIN:
    163                 $message = $this->TypeMsg1($this->credentials["realm"], $this->credentials["workstation"]);
     163                $message = $this->typeMsg1($this->credentials["realm"], $this->credentials["workstation"]);
    164164                $this->state = SASL_NTLM_STATE_RESPOND_CHALLENGE;
    165165                break;
    166166            case SASL_NTLM_STATE_RESPOND_CHALLENGE:
    167167                $ntlm_response = $this->NTLMResponse(substr($response, 24, 8), $this->credentials["password"]);
    168                 $message = $this->TypeMsg3(
     168                $message = $this->typeMsg3(
    169169                    $ntlm_response,
    170170                    $this->credentials["user"],
  • _plugins_/facteur/trunk/phpmailer-php5/get_oauth_token.php

    r92830 r101345  
    1414 */
    1515
     16namespace League\OAuth2\Client\Provider;
     17
    1618require 'vendor/autoload.php';
     19
     20use League\OAuth2\Client\Provider\Exception\IdentityProviderException;
     21use League\OAuth2\Client\Token\AccessToken;
     22use League\OAuth2\Client\Tool\BearerAuthorizationTrait;
     23use Psr\Http\Message\ResponseInterface;
    1724
    1825session_start();
     
    2633$clientSecret = 'RANDOMCHARS-----lGyjPcRtvP';
    2734
     35class Google extends AbstractProvider
     36{
     37    use BearerAuthorizationTrait;
     38
     39    const ACCESS_TOKEN_RESOURCE_OWNER_ID = 'id';
     40
     41    /**
     42     * @var string If set, this will be sent to google as the "access_type" parameter.
     43     * @link https://developers.google.com/accounts/docs/OAuth2WebServer#offline
     44     */
     45    protected $accessType;
     46
     47    /**
     48     * @var string If set, this will be sent to google as the "hd" parameter.
     49     * @link https://developers.google.com/accounts/docs/OAuth2Login#hd-param
     50     */
     51    protected $hostedDomain;
     52
     53    /**
     54     * @var string If set, this will be sent to google as the "scope" parameter.
     55     * @link https://developers.google.com/gmail/api/auth/scopes
     56     */
     57    protected $scope;
     58
     59    public function getBaseAuthorizationUrl()
     60    {
     61        return 'https://accounts.google.com/o/oauth2/auth';
     62    }
     63
     64    public function getBaseAccessTokenUrl(array $params)
     65    {
     66        return 'https://accounts.google.com/o/oauth2/token';
     67    }
     68
     69    public function getResourceOwnerDetailsUrl(AccessToken $token)
     70    {
     71        return ' ';
     72    }
     73
     74    protected function getAuthorizationParameters(array $options)
     75    {
     76        if (is_array($this->scope)) {
     77            $separator = $this->getScopeSeparator();
     78            $this->scope = implode($separator, $this->scope);
     79        }
     80
     81        $params = array_merge(
     82            parent::getAuthorizationParameters($options),
     83            array_filter([
     84                'hd'          => $this->hostedDomain,
     85                'access_type' => $this->accessType,
     86                'scope'       => $this->scope,
     87                // if the user is logged in with more than one account ask which one to use for the login!
     88                'authuser'    => '-1'
     89            ])
     90        );
     91        return $params;
     92    }
     93
     94    protected function getDefaultScopes()
     95    {
     96        return [
     97            'email',
     98            'openid',
     99            'profile',
     100        ];
     101    }
     102
     103    protected function getScopeSeparator()
     104    {
     105        return ' ';
     106    }
     107
     108    protected function checkResponse(ResponseInterface $response, $data)
     109    {
     110        if (!empty($data['error'])) {
     111            $code  = 0;
     112            $error = $data['error'];
     113
     114            if (is_array($error)) {
     115                $code  = $error['code'];
     116                $error = $error['message'];
     117            }
     118
     119            throw new IdentityProviderException($error, $code, $data);
     120        }
     121    }
     122
     123    protected function createResourceOwner(array $response, AccessToken $token)
     124    {
     125        return new GoogleUser($response);
     126    }
     127}
     128
     129
    28130//Set Redirect URI in Developer Console as [https/http]://<yourdomain>/<folder>/get_oauth_token.php
    29 $provider = new League\OAuth2\Client\Provider\Google(
     131$provider = new Google(
    30132    array(
    31133        'clientId' => $clientId,
    32134        'clientSecret' => $clientSecret,
    33135        'redirectUri' => $redirectUri,
    34         'scopes' => array('https://mail.google.com/'),
    35         'accessType' => 'offline'
     136        'scope' => array('https://mail.google.com/'),
     137        'accessType' => 'offline'
    36138    )
    37139);
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-de.php

    r92830 r101345  
    55 */
    66
    7 $PHPMAILER_LANG['authenticate']         = 'SMTP Fehler: Authentifizierung fehlgeschlagen.';
    8 $PHPMAILER_LANG['connect_host']         = 'SMTP Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
    9 $PHPMAILER_LANG['data_not_accepted']    = 'SMTP Fehler: Daten werden nicht akzeptiert.';
    10 $PHPMAILER_LANG['empty_message']        = 'E-Mail Inhalt ist leer.';
    11 $PHPMAILER_LANG['encoding']             = 'Unbekanntes Encoding-Format: ';
     7$PHPMAILER_LANG['authenticate']         = 'SMTP-Fehler: Authentifizierung fehlgeschlagen.';
     8$PHPMAILER_LANG['connect_host']         = 'SMTP-Fehler: Konnte keine Verbindung zum SMTP-Host herstellen.';
     9$PHPMAILER_LANG['data_not_accepted']    = 'SMTP-Fehler: Daten werden nicht akzeptiert.';
     10$PHPMAILER_LANG['empty_message']        = 'E-Mail-Inhalt ist leer.';
     11$PHPMAILER_LANG['encoding']             = 'Unbekannte Kodierung: ';
    1212$PHPMAILER_LANG['execute']              = 'Konnte folgenden Befehl nicht ausführen: ';
    1313$PHPMAILER_LANG['file_access']          = 'Zugriff auf folgende Datei fehlgeschlagen: ';
    14 $PHPMAILER_LANG['file_open']            = 'Datei Fehler: konnte folgende Datei nicht öffnen: ';
     14$PHPMAILER_LANG['file_open']            = 'Dateifehler: Konnte folgende Datei nicht öffnen: ';
    1515$PHPMAILER_LANG['from_failed']          = 'Die folgende Absenderadresse ist nicht korrekt: ';
    16 $PHPMAILER_LANG['instantiate']          = 'Mail Funktion konnte nicht initialisiert werden.';
    17 $PHPMAILER_LANG['invalid_address']      = 'E-Mail wird nicht gesendet, die Adresse ist ungültig: ';
     16$PHPMAILER_LANG['instantiate']          = 'Mail-Funktion konnte nicht initialisiert werden.';
     17$PHPMAILER_LANG['invalid_address']      = 'Die Adresse ist ungültig: ';
    1818$PHPMAILER_LANG['mailer_not_supported'] = ' mailer wird nicht unterstützt.';
    19 $PHPMAILER_LANG['provide_address']      = 'Bitte geben Sie mindestens eine Empfänger E-Mailadresse an.';
    20 $PHPMAILER_LANG['recipients_failed']    = 'SMTP Fehler: Die folgenden Empfänger sind nicht korrekt: ';
     19$PHPMAILER_LANG['provide_address']      = 'Bitte geben Sie mindestens eine Empfängeradresse an.';
     20$PHPMAILER_LANG['recipients_failed']    = 'SMTP-Fehler: Die folgenden Empfänger sind nicht korrekt: ';
    2121$PHPMAILER_LANG['signing']              = 'Fehler beim Signieren: ';
    22 $PHPMAILER_LANG['smtp_connect_failed']  = 'Verbindung zu SMTP Server fehlgeschlagen.';
    23 $PHPMAILER_LANG['smtp_error']           = 'Fehler vom SMTP Server: ';
     22$PHPMAILER_LANG['smtp_connect_failed']  = 'Verbindung zum SMTP-Server fehlgeschlagen.';
     23$PHPMAILER_LANG['smtp_error']           = 'Fehler vom SMTP-Server: ';
    2424$PHPMAILER_LANG['variable_set']         = 'Kann Variable nicht setzen oder zurücksetzen: ';
    25 //$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
     25$PHPMAILER_LANG['extension_missing']    = 'Fehlende Erweiterung: ';
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-es.php

    r89555 r101345  
    2424$PHPMAILER_LANG['smtp_error']           = 'Error del servidor SMTP: ';
    2525$PHPMAILER_LANG['variable_set']         = 'No se pudo configurar la variable: ';
    26 //$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
     26$PHPMAILER_LANG['extension_missing']    = 'Extensión faltante: ';
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-ka.php

    r89555 r101345  
    2424$PHPMAILER_LANG['smtp_error']           = 'SMTP სერვერის შეცდომა: ';
    2525$PHPMAILER_LANG['variable_set']         = 'შეუძლებელია შემდეგი ცვლადის შექმნა ან შეცვლა: ';
    26 //$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
     26$PHPMAILER_LANG['extension_missing']    = 'ბიბლიოთეკა არ არსებობს: ';
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-pl.php

    r89555 r101345  
    2424$PHPMAILER_LANG['smtp_error']           = 'Błąd SMTP: ';
    2525$PHPMAILER_LANG['variable_set']         = 'Nie można ustawić lub zmodyfikować zmiennej: ';
    26 //$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
     26$PHPMAILER_LANG['extension_missing']    = 'Brakujące rozszerzenie: ';
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-ro.php

    r92830 r101345  
    33 * Romanian PHPMailer language file: refer to English translation for definitive list
    44 * @package PHPMailer
    5  * @author Catalin Constantin <catalin@dazoot.ro>
     5 * @author Alex Florea <alecz.fia@gmail.com>
    66 */
    77
    8 $PHPMAILER_LANG['authenticate']         = 'Eroare SMTP: Nu a functionat autentificarea.';
    9 $PHPMAILER_LANG['connect_host']         = 'Eroare SMTP: Nu m-am putut conecta la adresa SMTP.';
    10 $PHPMAILER_LANG['data_not_accepted']    = 'Eroare SMTP: Continutul mailului nu a fost acceptat.';
     8$PHPMAILER_LANG['authenticate']         = 'Eroare SMTP: Autentificarea a eșuat.';
     9$PHPMAILER_LANG['connect_host']         = 'Eroare SMTP: Conectarea la serverul SMTP a eșuat.';
     10$PHPMAILER_LANG['data_not_accepted']    = 'Eroare SMTP: Datele nu au fost acceptate.';
    1111$PHPMAILER_LANG['empty_message']        = 'Mesajul este gol.';
    12 $PHPMAILER_LANG['encoding']             = 'Encodare necunoscuta: ';
    13 $PHPMAILER_LANG['execute']              = 'Nu pot executa:  ';
    14 $PHPMAILER_LANG['file_access']          = 'Nu pot accesa fisierul: ';
    15 $PHPMAILER_LANG['file_open']            = 'Eroare de fisier: Nu pot deschide fisierul: ';
    16 $PHPMAILER_LANG['from_failed']          = 'Urmatoarele adrese From au dat eroare: ';
    17 $PHPMAILER_LANG['instantiate']          = 'Nu am putut instantia functia mail.';
    18 $PHPMAILER_LANG['invalid_address']      = 'Adresa de email nu este valida: ';
     12$PHPMAILER_LANG['encoding']             = 'Encodare necunoscută: ';
     13$PHPMAILER_LANG['execute']              = 'Nu se poate executa următoarea comandă:  ';
     14$PHPMAILER_LANG['file_access']          = 'Nu se poate accesa următorul fișier: ';
     15$PHPMAILER_LANG['file_open']            = 'Eroare fișier: Nu se poate deschide următorul fișier: ';
     16$PHPMAILER_LANG['from_failed']          = 'Următoarele adrese From au dat eroare: ';
     17$PHPMAILER_LANG['instantiate']          = 'Funcția mail nu a putut fi inițializată.';
     18$PHPMAILER_LANG['invalid_address']      = 'Adresa de email nu este validă: ';
    1919$PHPMAILER_LANG['mailer_not_supported'] = ' mailer nu este suportat.';
    20 $PHPMAILER_LANG['provide_address']      = 'Trebuie sa adaugati cel putin un recipient (adresa de mail).';
    21 $PHPMAILER_LANG['recipients_failed']    = 'Eroare SMTP: Urmatoarele adrese de mail au dat eroare: ';
    22 $PHPMAILER_LANG['signing']              = 'A aparut o problema la semnarea emailului. ';
    23 $PHPMAILER_LANG['smtp_connect_failed']  = 'Conectarea la serverul SMTP a esuat.';
    24 $PHPMAILER_LANG['smtp_error']           = 'A aparut o eroare la serverul SMTP. ';
     20$PHPMAILER_LANG['provide_address']      = 'Trebuie să adăugați cel puțin o adresă de email.';
     21$PHPMAILER_LANG['recipients_failed']    = 'Eroare SMTP: Următoarele adrese de email au eșuat: ';
     22$PHPMAILER_LANG['signing']              = 'A aparut o problemă la semnarea emailului. ';
     23$PHPMAILER_LANG['smtp_connect_failed']  = 'Conectarea la serverul SMTP a eșuat.';
     24$PHPMAILER_LANG['smtp_error']           = 'Eroare server SMTP: ';
    2525$PHPMAILER_LANG['variable_set']         = 'Nu se poate seta/reseta variabila. ';
    26 //$PHPMAILER_LANG['extension_missing']    = 'Extension missing: ';
     26$PHPMAILER_LANG['extension_missing']    = 'Lipsește extensia: ';
  • _plugins_/facteur/trunk/phpmailer-php5/language/phpmailer.lang-ru.php

    r92830 r101345  
    1919$PHPMAILER_LANG['mailer_not_supported'] = ' — почтовый сервер не поддерживается.';
    2020$PHPMAILER_LANG['recipients_failed']    = 'Ошибка SMTP: отправка по следующим адресам получателей не удалась: ';
    21 $PHPMAILER_LANG['empty_message']        = 'Пустое тело сообщения';
     21$PHPMAILER_LANG['empty_message']        = 'Пустое сообщение';
    2222$PHPMAILER_LANG['invalid_address']      = 'Не отослано, неправильный формат email адреса: ';
    23 $PHPMAILER_LANG['signing']              = 'Ошибка подписывания: ';
     23$PHPMAILER_LANG['signing']              = 'Ошибка подписи: ';
    2424$PHPMAILER_LANG['smtp_connect_failed']  = 'Ошибка соединения с SMTP-сервером';
    2525$PHPMAILER_LANG['smtp_error']           = 'Ошибка SMTP-сервера: ';
Note: See TracChangeset for help on using the changeset viewer.