[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Fmsystem-commits] [16450] Stable: Merge 16447:16449 from trunk
From: |
sigurdne |
Subject: |
[Fmsystem-commits] [16450] Stable: Merge 16447:16449 from trunk |
Date: |
Fri, 17 Mar 2017 11:58:53 -0400 (EDT) |
Revision: 16450
http://svn.sv.gnu.org/viewvc/?view=rev&root=fmsystem&revision=16450
Author: sigurdne
Date: 2017-03-17 11:58:52 -0400 (Fri, 17 Mar 2017)
Log Message:
-----------
Stable: Merge 16447:16449 from trunk
Modified Paths:
--------------
branches/Version-2_0-branch/eventplanner/inc/model/class.vendor.inc.php
branches/Version-2_0-branch/phpgwapi/inc/class.mailer_smtp.inc.php
branches/Version-2_0-branch/phpgwapi/inc/class.uicommon.inc.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/VERSION
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmailer.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.pop3.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.smtp.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.json
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/code_generator.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/contentsutf8.html
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/scripts/XRegExp.js
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/scripts/shLegacy.js
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/send_file_upload.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/smtp_check.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/extras/EasyPeasyICS.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/extras/htmlfilter.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/extras/ntlm_sasl_client.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ar.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-bg.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ca.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ch.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-de.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-el.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-es.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-et.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-fi.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-fo.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-fr.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-gl.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-he.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-hr.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ja.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ka.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ko.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-lt.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-lv.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ms.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-nl.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-pl.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-pt.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ro.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-ru.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-sl.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-sr.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-vi.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-zh_cn.php
Added Paths:
-----------
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauth.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauthgoogle.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.lock
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/DKIM.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/contactform.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/gmail_xoauth.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/send_multiple_file_upload.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/examples/signed-mail.phps
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/get_oauth_token.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-cs.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-da.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-nb.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-pt_br.php
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/language/phpmailer.lang-sv.php
Property Changed:
----------------
branches/Version-2_0-branch/
Index: branches/Version-2_0-branch
===================================================================
--- branches/Version-2_0-branch 2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch 2017-03-17 15:58:52 UTC (rev 16450)
Property changes on: branches/Version-2_0-branch
___________________________________________________________________
Modified: svn:mergeinfo
## -1,4 +1,4 ##
/branches/dev-syncromind:13653
/branches/dev-syncromind-2:14933-16394
/branches/stavangerkommune:12743-12875,12986
-/trunk:14721-14732,14734-14735,14737,14739,14741,14743-14744,14746-14749,14751,14753,14755-14757,14759,14761-14764,14766-14768,14770-14783,14785-14792,14794-14813,14815-14816,14818,14820-14822,14824-14825,14827-14829,14831-14834,14836,14838,14840-14842,14844-14845,14847,14849-14866,14868-14869,14871,14873-14875,14877-14878,14880-14884,14886-14896,14898,14900-14902,14904,14906-14909,14911-14915,14917-14919,14921-14922,14924-14978,14980-15258,15260-15261,15263-15264,15266-15285,15287-15288,15290-15291,15293,15295,15297,15299-15305,15307-15310,15312-15335,15337-15352,15354,15356,15358,15360-15541,15543-15566,15568-15569,15571,15573-15581,15583,15585-15617,15619,15621-15630,15632-15635,15637-15639,15641-15643,15645,15647-15665,15667-15668,15670-15671,15673-15693,15695-15712,15714-15764,15766-15767,15769-15787,15789-15802,15804-15811,15813-15814,15816-15818,15820-15849,15851-15887,15889-15900,15902-16046,16048-16051,16053,16055,16057-16063,16065-16071,16073-16077,16079-16081,16083-16099,16101-16130,16132-16140,16142,16144-16212,16214-16219,16221,16223-16224,16226,16228-16229,16231,16233,16235,16237,16239-16240,16242,16244-16246,16248,16250-16251,16253-16255,16257-16259,16261,16263,16265,16267,16269-16276,16278,16280-16283,16285,16287-16288,16290,16292-16295,16297-16305,16307-16314,16316-16318,16320-16322,16324,16326-16330,16332,16334,16336,16338-16339,16341-16342,16344,16346,16348,16350,16352-16353,16355-16358,16360,16362,16364-16369,16371,16373,16375-16378,16380,16382-16383,16385,16387,16389,16391,16393-16395,16397,16399-16402,16404,16406,16408,16410-16415,16417,16419-16420,16422-16425,16427,16429-16440,16442,16444,16446
\ No newline at end of property
+/trunk:14721-14732,14734-14735,14737,14739,14741,14743-14744,14746-14749,14751,14753,14755-14757,14759,14761-14764,14766-14768,14770-14783,14785-14792,14794-14813,14815-14816,14818,14820-14822,14824-14825,14827-14829,14831-14834,14836,14838,14840-14842,14844-14845,14847,14849-14866,14868-14869,14871,14873-14875,14877-14878,14880-14884,14886-14896,14898,14900-14902,14904,14906-14909,14911-14915,14917-14919,14921-14922,14924-14978,14980-15258,15260-15261,15263-15264,15266-15285,15287-15288,15290-15291,15293,15295,15297,15299-15305,15307-15310,15312-15335,15337-15352,15354,15356,15358,15360-15541,15543-15566,15568-15569,15571,15573-15581,15583,15585-15617,15619,15621-15630,15632-15635,15637-15639,15641-15643,15645,15647-15665,15667-15668,15670-15671,15673-15693,15695-15712,15714-15764,15766-15767,15769-15787,15789-15802,15804-15811,15813-15814,15816-15818,15820-15849,15851-15887,15889-15900,15902-16046,16048-16051,16053,16055,16057-16063,16065-16071,16073-16077,16079-16081,16083-16099,16101-16130,16132-16140,16142,16144-16212,16214-16219,16221,16223-16224,16226,16228-16229,16231,16233,16235,16237,16239-16240,16242,16244-16246,16248,16250-16251,16253-16255,16257-16259,16261,16263,16265,16267,16269-16276,16278,16280-16283,16285,16287-16288,16290,16292-16295,16297-16305,16307-16314,16316-16318,16320-16322,16324,16326-16330,16332,16334,16336,16338-16339,16341-16342,16344,16346,16348,16350,16352-16353,16355-16358,16360,16362,16364-16369,16371,16373,16375-16378,16380,16382-16383,16385,16387,16389,16391,16393-16395,16397,16399-16402,16404,16406,16408,16410-16415,16417,16419-16420,16422-16425,16427,16429-16440,16442,16444,16446,16448-16449
\ No newline at end of property
Modified:
branches/Version-2_0-branch/eventplanner/inc/model/class.vendor.inc.php
===================================================================
--- branches/Version-2_0-branch/eventplanner/inc/model/class.vendor.inc.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/eventplanner/inc/model/class.vendor.inc.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -101,6 +101,7 @@
'label' => 'id',
'sortable'=> true,
'formatter' =>
'JqueryPortico.formatLink',
+ 'public' => true
),
'owner_id' => array('action'=> PHPGW_ACL_ADD,
'type' => 'int',
@@ -130,6 +131,7 @@
'label' => 'name',
'required' => true,
'query' => true,
+ 'public' => true
),
'address_1' => array('action'=> PHPGW_ACL_ADD |
PHPGW_ACL_EDIT,
'type' => 'string',
@@ -186,7 +188,8 @@
'required' => true,
'query' => true,
'sf_validator' =>
createObject('booking.sfValidatorNorwegianOrganizationNumber', array(),
array('invalid' => '%field% is invalid')),
- 'label' => 'organization number'
+ 'label' => 'organization number',
+ 'public' => true
),
);
Modified: branches/Version-2_0-branch/phpgwapi/inc/class.mailer_smtp.inc.php
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/class.mailer_smtp.inc.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/class.mailer_smtp.inc.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -12,7 +12,7 @@
/**
* @see phpmailer
*/
- require_once PHPGW_INCLUDE_ROOT .
'/phpgwapi/inc/phpmailer/class.phpmailer.php';
+// require_once PHPGW_INCLUDE_ROOT .
'/phpgwapi/inc/phpmailer/class.phpmailer.php';
require_once PHPGW_INCLUDE_ROOT .
'/phpgwapi/inc/phpmailer/PHPMailerAutoload.php';
/**
@@ -31,7 +31,7 @@
{
parent::__construct(true); // enable exceptions
$this->IsSMTP(true);
- $this->PluginDir = PHPGW_INCLUDE_ROOT .
'/phpgwapi/inc/phpmailer/';
+ // $this->PluginDir = PHPGW_INCLUDE_ROOT .
'/phpgwapi/inc/phpmailer/';
$this->Host =
$GLOBALS['phpgw_info']['server']['smtp_server'];
$this->Port =
isset($GLOBALS['phpgw_info']['server']['smtp_port']) ?
$GLOBALS['phpgw_info']['server']['smtp_port'] : 25;
$this->SMTPSecure =
isset($GLOBALS['phpgw_info']['server']['smtpSecure']) ?
$GLOBALS['phpgw_info']['server']['smtpSecure'] : '';
Modified: branches/Version-2_0-branch/phpgwapi/inc/class.uicommon.inc.php
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/class.uicommon.inc.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/class.uicommon.inc.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -214,7 +214,7 @@
private function get_data($relaxe_acl = false)
{
- if (empty($this->permissions[PHPGW_ACL_READ]))
+ if (!$relaxe_acl &&
empty($this->permissions[PHPGW_ACL_READ]))
{
phpgw::no_access();
}
@@ -248,7 +248,7 @@
*/
public function get_list()
{
- $values = $this->get_data();
+ $values = $this->get_data(true);
$results = array();
foreach ($values['results'] as $row)
Modified: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/VERSION
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/VERSION 2017-03-17
15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/VERSION 2017-03-17
15:58:52 UTC (rev 16450)
@@ -1 +1 @@
-5.2.10
\ No newline at end of file
+5.2.23
Modified: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmailer.php
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmailer.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmailer.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -29,27 +29,27 @@
{
/**
* The PHPMailer Version number.
- * @type string
+ * @var string
*/
- public $Version = '5.2.10';
+ public $Version = '5.2.23';
/**
* Email priority.
* Options: null (default), 1 = High, 3 = Normal, 5 = low.
* When null, the header is not set at all.
- * @type integer
+ * @var integer
*/
public $Priority = null;
/**
* The character set of the message.
- * @type string
+ * @var string
*/
public $CharSet = 'iso-8859-1';
/**
* The MIME Content-type of the message.
- * @type string
+ * @var string
*/
public $ContentType = 'text/plain';
@@ -56,25 +56,25 @@
/**
* The message encoding.
* Options: "8bit", "7bit", "binary", "base64", and "quoted-printable".
- * @type string
+ * @var string
*/
public $Encoding = '8bit';
/**
* Holds the most recent mailer error message.
- * @type string
+ * @var string
*/
public $ErrorInfo = '';
/**
* The From email address for the message.
- * @type string
+ * @var string
*/
public $From = 'address@hidden';
/**
* The From name of the message.
- * @type string
+ * @var string
*/
public $FromName = 'Root User';
@@ -81,7 +81,7 @@
/**
* The Sender email (Return-Path) of the message.
* If not empty, will be sent via -f to sendmail or as 'MAIL FROM' in smtp
mode.
- * @type string
+ * @var string
*/
public $Sender = '';
@@ -88,7 +88,7 @@
/**
* The Return-Path of the message.
* If empty, it will be set to either From or Sender.
- * @type string
+ * @var string
* @deprecated Email senders should never set a return-path header;
* it's the receiver's job (RFC5321 section 4.4), so this no longer does
anything.
* @link https://tools.ietf.org/html/rfc5321#section-4.4 RFC5321 reference
@@ -97,7 +97,7 @@
/**
* The Subject of the message.
- * @type string
+ * @var string
*/
public $Subject = '';
@@ -104,7 +104,7 @@
/**
* An HTML or plain text message body.
* If HTML then call isHTML(true).
- * @type string
+ * @var string
*/
public $Body = '';
@@ -113,7 +113,7 @@
* This body can be read by mail clients that do not have HTML email
* capability such as mutt & Eudora.
* Clients that can read HTML will view the normal Body.
- * @type string
+ * @var string
*/
public $AltBody = '';
@@ -123,7 +123,7 @@
* To generate iCal events, use the bundled extras/EasyPeasyICS.php class
or iCalcreator
* @link
http://sprain.ch/blog/downloads/php-class-easypeasyics-create-ical-files-with-php/
* @link http://kigkonsult.se/iCalcreator/
- * @type string
+ * @var string
*/
public $Ical = '';
@@ -130,13 +130,13 @@
/**
* The complete compiled MIME message body.
* @access protected
- * @type string
+ * @var string
*/
protected $MIMEBody = '';
/**
* The complete compiled MIME message headers.
- * @type string
+ * @var string
* @access protected
*/
protected $MIMEHeader = '';
@@ -143,7 +143,7 @@
/**
* Extra headers that createHeader() doesn't fold in.
- * @type string
+ * @var string
* @access protected
*/
protected $mailHeader = '';
@@ -151,7 +151,7 @@
/**
* Word-wrap the message body to this number of chars.
* Set to 0 to not wrap. A useful value here is 78, for RFC2822 section
2.1.1 compliance.
- * @type integer
+ * @var integer
*/
public $WordWrap = 0;
@@ -158,13 +158,13 @@
/**
* Which method to use to send mail.
* Options: "mail", "sendmail", or "smtp".
- * @type string
+ * @var string
*/
public $Mailer = 'mail';
/**
* The path to the sendmail program.
- * @type string
+ * @var string
*/
public $Sendmail = '/usr/sbin/sendmail';
@@ -171,7 +171,7 @@
/**
* Whether mail() uses a fully sendmail-compatible MTA.
* One which supports sendmail's "-oi -f" options.
- * @type boolean
+ * @var boolean
*/
public $UseSendmailOptions = true;
@@ -178,30 +178,33 @@
/**
* Path to PHPMailer plugins.
* Useful if the SMTP class is not in the PHP include path.
- * @type string
+ * @var string
* @deprecated Should not be needed now there is an autoloader.
*/
public $PluginDir = '';
/**
- * The email address that a reading confirmation should be sent to.
- * @type string
+ * The email address that a reading confirmation should be sent to, also
known as read receipt.
+ * @var string
*/
public $ConfirmReadingTo = '';
/**
- * The hostname to use in Message-Id and Received headers
- * and as default HELO string.
- * If empty, the value returned
- * by SERVER_NAME is used or 'localhost.localdomain'.
- * @type string
+ * The hostname to use in the Message-ID header and as default HELO string.
+ * If empty, PHPMailer attempts to find one with, in order,
+ * $_SERVER['SERVER_NAME'], gethostname(), php_uname('n'), or the value
+ * 'localhost.localdomain'.
+ * @var string
*/
public $Hostname = '';
/**
- * An ID to be used in the Message-Id header.
+ * An ID to be used in the Message-ID header.
* If empty, a unique id will be generated.
- * @type string
+ * You can set your own, but it must be in the format "<address@hidden>",
+ * as defined in RFC5322 section 3.6.4 or it will be ignored.
+ * @see https://tools.ietf.org/html/rfc5322#section-3.6.4
+ * @var string
*/
public $MessageID = '';
@@ -208,7 +211,7 @@
/**
* The message Date to be used in the Date header.
* If empty, the current date will be added.
- * @type string
+ * @var string
*/
public $MessageDate = '';
@@ -221,13 +224,13 @@
* You can also specify encryption type, for example:
* (e.g. "tls://smtp1.example.com:587;ssl://smtp2.example.com:465").
* Hosts will be tried in order.
- * @type string
+ * @var string
*/
public $Host = 'localhost';
/**
* The default SMTP server port.
- * @type integer
+ * @var integer
* @TODO Why is this needed when the SMTP class takes care of it?
*/
public $Port = 25;
@@ -234,8 +237,9 @@
/**
* The SMTP HELO of the message.
- * Default is $Hostname.
- * @type string
+ * Default is $Hostname. If $Hostname is empty, PHPMailer attempts to find
+ * one with the same method described above for $Hostname.
+ * @var string
* @see PHPMailer::$Hostname
*/
public $Helo = '';
@@ -243,7 +247,7 @@
/**
* What kind of encryption to use on the SMTP connection.
* Options: '', 'ssl' or 'tls'
- * @type string
+ * @var string
*/
public $SMTPSecure = '';
@@ -251,7 +255,7 @@
* Whether to enable TLS encryption automatically if a server supports it,
* even if `SMTPSecure` is not set to 'tls'.
* Be aware that in PHP >= 5.6 this requires that the server's
certificates are valid.
- * @type boolean
+ * @var boolean
*/
public $SMTPAutoTLS = true;
@@ -258,7 +262,7 @@
/**
* Whether to use SMTP authentication.
* Uses the Username and Password properties.
- * @type boolean
+ * @var boolean
* @see PHPMailer::$Username
* @see PHPMailer::$Password
*/
@@ -266,26 +270,26 @@
/**
* Options array passed to stream_context_create when connecting via SMTP.
- * @type array
+ * @var array
*/
public $SMTPOptions = array();
/**
* SMTP username.
- * @type string
+ * @var string
*/
public $Username = '';
/**
* SMTP password.
- * @type string
+ * @var string
*/
public $Password = '';
/**
* SMTP auth type.
- * Options are LOGIN (default), PLAIN, NTLM, CRAM-MD5
- * @type string
+ * Options are CRAM-MD5, LOGIN, PLAIN, NTLM, XOAUTH2, attempted in that
order if not specified
+ * @var string
*/
public $AuthType = '';
@@ -292,7 +296,7 @@
/**
* SMTP realm.
* Used for NTLM auth
- * @type string
+ * @var string
*/
public $Realm = '';
@@ -299,7 +303,7 @@
/**
* SMTP workstation.
* Used for NTLM auth
- * @type string
+ * @var string
*/
public $Workstation = '';
@@ -306,7 +310,7 @@
/**
* The SMTP server timeout in seconds.
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
- * @type integer
+ * @var integer
*/
public $Timeout = 300;
@@ -319,7 +323,7 @@
* * `2` Data and commands
* * `3` As 2 plus connection status
* * `4` Low-level data output
- * @type integer
+ * @var integer
* @see SMTP::$do_debug
*/
public $SMTPDebug = 0;
@@ -335,7 +339,7 @@
* <code>
* $mail->Debugoutput = function($str, $level) {echo "debug level $level;
message: $str";};
* </code>
- * @type string|callable
+ * @var string|callable
* @see SMTP::$Debugoutput
*/
public $Debugoutput = 'echo';
@@ -344,7 +348,7 @@
* Whether to keep SMTP connection open after each message.
* If this is set to true then to close the connection
* requires an explicit call to smtpClose().
- * @type boolean
+ * @var boolean
*/
public $SMTPKeepAlive = false;
@@ -351,13 +355,14 @@
/**
* Whether to split multiple to addresses into multiple messages
* or send them all in one message.
- * @type boolean
+ * Only supported in `mail` and `sendmail` transports, not in SMTP.
+ * @var boolean
*/
public $SingleTo = false;
/**
* Storage for addresses when SingleTo is enabled.
- * @type array
+ * @var array
* @TODO This should really not be public
*/
public $SingleToArray = array();
@@ -365,15 +370,15 @@
/**
* Whether to generate VERP addresses on send.
* Only applicable when sending via SMTP.
- * @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
+ * @link https://en.wikipedia.org/wiki/Variable_envelope_return_path
* @link http://www.postfix.org/VERP_README.html Postfix VERP info
- * @type boolean
+ * @var boolean
*/
public $do_verp = false;
/**
* Whether to allow sending messages with an empty body.
- * @type boolean
+ * @var boolean
*/
public $AllowEmpty = false;
@@ -381,20 +386,20 @@
* The default line ending.
* @note The default remains "\n". We force CRLF where we know
* it must be used via self::CRLF.
- * @type string
+ * @var string
*/
public $LE = "\n";
/**
* DKIM selector.
- * @type string
+ * @var string
*/
public $DKIM_selector = '';
/**
* DKIM Identity.
- * Usually the email address used as the source of the email
- * @type string
+ * Usually the email address used as the source of the email.
+ * @var string
*/
public $DKIM_identity = '';
@@ -401,7 +406,7 @@
/**
* DKIM passphrase.
* Used if your key is encrypted.
- * @type string
+ * @var string
*/
public $DKIM_passphrase = '';
@@ -408,17 +413,24 @@
/**
* DKIM signing domain name.
* @example 'example.com'
- * @type string
+ * @var string
*/
public $DKIM_domain = '';
/**
* DKIM private key file path.
- * @type string
+ * @var string
*/
public $DKIM_private = '';
/**
+ * DKIM private key string.
+ * If set, takes precedence over `$DKIM_private`.
+ * @var string
+ */
+ public $DKIM_private_string = '';
+
+ /**
* Callback Action function name.
*
* The function that handles the result of the send email action.
@@ -434,7 +446,7 @@
* string $subject the subject
* string $body the email body
* string $from email address of sender
- * @type string
+ * @var string
*/
public $action_function = '';
@@ -441,34 +453,43 @@
/**
* What to put in the X-Mailer header.
* Options: An empty string for PHPMailer default, whitespace for none, or
a string to use
- * @type string
+ * @var string
*/
public $XMailer = '';
/**
+ * Which validator to use by default when validating email addresses.
+ * May be a callable to inject your own validator, but there are several
built-in validators.
+ * @see PHPMailer::validateAddress()
+ * @var string|callable
+ * @static
+ */
+ public static $validator = 'auto';
+
+ /**
* An instance of the SMTP sender class.
- * @type SMTP
+ * @var SMTP
* @access protected
*/
protected $smtp = null;
/**
- * The array of 'to' addresses.
- * @type array
+ * The array of 'to' names and addresses.
+ * @var array
* @access protected
*/
protected $to = array();
/**
- * The array of 'cc' addresses.
- * @type array
+ * The array of 'cc' names and addresses.
+ * @var array
* @access protected
*/
protected $cc = array();
/**
- * The array of 'bcc' addresses.
- * @type array
+ * The array of 'bcc' names and addresses.
+ * @var array
* @access protected
*/
protected $bcc = array();
@@ -475,7 +496,7 @@
/**
* The array of reply-to names and addresses.
- * @type array
+ * @var array
* @access protected
*/
protected $ReplyTo = array();
@@ -483,14 +504,37 @@
/**
* An array of all kinds of addresses.
* Includes all of $to, $cc, $bcc
- * @type array
+ * @var array
* @access protected
+ * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
*/
protected $all_recipients = array();
/**
+ * An array of names and addresses queued for validation.
+ * In send(), valid and non duplicate entries are moved to $all_recipients
+ * and one of $to, $cc, or $bcc.
+ * This array is used only for addresses with IDN.
+ * @var array
+ * @access protected
+ * @see PHPMailer::$to @see PHPMailer::$cc @see PHPMailer::$bcc
+ * @see PHPMailer::$all_recipients
+ */
+ protected $RecipientsQueue = array();
+
+ /**
+ * An array of reply-to names and addresses queued for validation.
+ * In send(), valid and non duplicate entries are moved to $ReplyTo.
+ * This array is used only for addresses with IDN.
+ * @var array
+ * @access protected
+ * @see PHPMailer::$ReplyTo
+ */
+ protected $ReplyToQueue = array();
+
+ /**
* The array of attachments.
- * @type array
+ * @var array
* @access protected
*/
protected $attachment = array();
@@ -497,7 +541,7 @@
/**
* The array of custom headers.
- * @type array
+ * @var array
* @access protected
*/
protected $CustomHeader = array();
@@ -504,7 +548,7 @@
/**
* The most recent Message-ID (including angular brackets).
- * @type string
+ * @var string
* @access protected
*/
protected $lastMessageID = '';
@@ -511,7 +555,7 @@
/**
* The message's MIME type.
- * @type string
+ * @var string
* @access protected
*/
protected $message_type = '';
@@ -518,7 +562,7 @@
/**
* The array of MIME boundary strings.
- * @type array
+ * @var array
* @access protected
*/
protected $boundary = array();
@@ -525,7 +569,7 @@
/**
* The array of available languages.
- * @type array
+ * @var array
* @access protected
*/
protected $language = array();
@@ -532,7 +576,7 @@
/**
* The number of errors encountered.
- * @type integer
+ * @var integer
* @access protected
*/
protected $error_count = 0;
@@ -539,7 +583,7 @@
/**
* The S/MIME certificate file path.
- * @type string
+ * @var string
* @access protected
*/
protected $sign_cert_file = '';
@@ -546,7 +590,7 @@
/**
* The S/MIME key file path.
- * @type string
+ * @var string
* @access protected
*/
protected $sign_key_file = '';
@@ -553,7 +597,7 @@
/**
* The optional S/MIME extra certificates ("CA Chain") file path.
- * @type string
+ * @var string
* @access protected
*/
protected $sign_extracerts_file = '';
@@ -561,7 +605,7 @@
/**
* The S/MIME password for the key.
* Used only if the key is encrypted.
- * @type string
+ * @var string
* @access protected
*/
protected $sign_key_pass = '';
@@ -568,7 +612,7 @@
/**
* Whether to throw exceptions for errors.
- * @type boolean
+ * @var boolean
* @access protected
*/
protected $exceptions = false;
@@ -575,7 +619,7 @@
/**
* Unique ID used for message ID and boundaries.
- * @type string
+ * @var string
* @access protected
*/
protected $uniqueid = '';
@@ -602,7 +646,7 @@
/**
* The maximum line length allowed by RFC 2822 section 2.1.1
- * @type integer
+ * @var integer
*/
const MAX_LINE_LENGTH = 998;
@@ -610,9 +654,11 @@
* Constructor.
* @param boolean $exceptions Should we throw external exceptions?
*/
- public function __construct($exceptions = false)
+ public function __construct($exceptions = null)
{
- $this->exceptions = (boolean)$exceptions;
+ if ($exceptions !== null) {
+ $this->exceptions = (boolean)$exceptions;
+ }
}
/**
@@ -621,9 +667,7 @@
public function __destruct()
{
//Close any open SMTP connection nicely
- if ($this->Mailer == 'smtp') {
- $this->smtpClose();
- }
+ $this->smtpClose();
}
/**
@@ -647,7 +691,10 @@
} else {
$subject = $this->encodeHeader($this->secureHeader($subject));
}
- if (ini_get('safe_mode') || !($this->UseSendmailOptions)) {
+
+ //Can't use additional_parameters in safe_mode, calling mail() with
null params breaks
+ //@link http://php.net/manual/en/function.mail.php
+ if (ini_get('safe_mode') or !$this->UseSendmailOptions or
is_null($params)) {
$result = @mail($to, $subject, $body, $header);
} else {
$result = @mail($to, $subject, $body, $header, $params);
@@ -654,7 +701,6 @@
}
return $result;
}
-
/**
* Output debugging info via user-defined method.
* Only generates output if SMTP debug output is enabled (@see
SMTP::$do_debug).
@@ -689,7 +735,7 @@
case 'echo':
default:
//Normalize line breaks
- $str = preg_replace('/(\r\n|\r|\n)/ms', "\n", $str);
+ $str = preg_replace('/\r\n?/ms', "\n", $str);
echo gmdate('Y-m-d H:i:s') . "\t" . str_replace(
"\n",
"\n \t ",
@@ -764,82 +810,128 @@
/**
* Add a "To" address.
- * @param string $address
+ * @param string $address The email address to send to
* @param string $name
- * @return boolean true on success, false if address already used
+ * @return boolean true on success, false if address already used or
invalid in some way
*/
public function addAddress($address, $name = '')
{
- return $this->addAnAddress('to', $address, $name);
+ return $this->addOrEnqueueAnAddress('to', $address, $name);
}
/**
* Add a "CC" address.
* @note: This function works with the SMTP mailer on win32, not with the
"mail" mailer.
- * @param string $address
+ * @param string $address The email address to send to
* @param string $name
- * @return boolean true on success, false if address already used
+ * @return boolean true on success, false if address already used or
invalid in some way
*/
public function addCC($address, $name = '')
{
- return $this->addAnAddress('cc', $address, $name);
+ return $this->addOrEnqueueAnAddress('cc', $address, $name);
}
/**
* Add a "BCC" address.
* @note: This function works with the SMTP mailer on win32, not with the
"mail" mailer.
- * @param string $address
+ * @param string $address The email address to send to
* @param string $name
- * @return boolean true on success, false if address already used
+ * @return boolean true on success, false if address already used or
invalid in some way
*/
public function addBCC($address, $name = '')
{
- return $this->addAnAddress('bcc', $address, $name);
+ return $this->addOrEnqueueAnAddress('bcc', $address, $name);
}
/**
- * Add a "Reply-to" address.
- * @param string $address
+ * Add a "Reply-To" address.
+ * @param string $address The email address to reply to
* @param string $name
- * @return boolean
+ * @return boolean true on success, false if address already used or
invalid in some way
*/
public function addReplyTo($address, $name = '')
{
- return $this->addAnAddress('Reply-To', $address, $name);
+ return $this->addOrEnqueueAnAddress('Reply-To', $address, $name);
}
/**
- * Add an address to one of the recipient arrays.
- * Addresses that have been added already return false, but do not throw
exceptions
- * @param string $kind One of 'to', 'cc', 'bcc', 'ReplyTo'
- * @param string $address The email address to send to
+ * Add an address to one of the recipient arrays or to the ReplyTo array.
Because PHPMailer
+ * can't validate addresses with an IDN without knowing the
PHPMailer::$CharSet (that can still
+ * be modified after calling this function), addition of such addresses is
delayed until send().
+ * Addresses that have been added already return false, but do not throw
exceptions.
+ * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+ * @param string $address The email address to send, resp. to reply to
* @param string $name
* @throws phpmailerException
* @return boolean true on success, false if address already used or
invalid in some way
* @access protected
*/
+ protected function addOrEnqueueAnAddress($kind, $address, $name)
+ {
+ $address = trim($address);
+ $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and
trim
+ if (($pos = strrpos($address, '@')) === false) {
+ // At-sign is misssing.
+ $error_message = $this->lang('invalid_address') . " (addAnAddress
$kind): $address";
+ $this->setError($error_message);
+ $this->edebug($error_message);
+ if ($this->exceptions) {
+ throw new phpmailerException($error_message);
+ }
+ return false;
+ }
+ $params = array($kind, $address, $name);
+ // Enqueue addresses with IDN until we know the PHPMailer::$CharSet.
+ if ($this->has8bitChars(substr($address, ++$pos)) and
$this->idnSupported()) {
+ if ($kind != 'Reply-To') {
+ if (!array_key_exists($address, $this->RecipientsQueue)) {
+ $this->RecipientsQueue[$address] = $params;
+ return true;
+ }
+ } else {
+ if (!array_key_exists($address, $this->ReplyToQueue)) {
+ $this->ReplyToQueue[$address] = $params;
+ return true;
+ }
+ }
+ return false;
+ }
+ // Immediately add standard addresses without IDN.
+ return call_user_func_array(array($this, 'addAnAddress'), $params);
+ }
+
+ /**
+ * Add an address to one of the recipient arrays or to the ReplyTo array.
+ * Addresses that have been added already return false, but do not throw
exceptions.
+ * @param string $kind One of 'to', 'cc', 'bcc', or 'ReplyTo'
+ * @param string $address The email address to send, resp. to reply to
+ * @param string $name
+ * @throws phpmailerException
+ * @return boolean true on success, false if address already used or
invalid in some way
+ * @access protected
+ */
protected function addAnAddress($kind, $address, $name = '')
{
- if (!preg_match('/^(to|cc|bcc|Reply-To)$/', $kind)) {
- $this->setError($this->lang('Invalid recipient array') . ': ' .
$kind);
- $this->edebug($this->lang('Invalid recipient array') . ': ' .
$kind);
+ if (!in_array($kind, array('to', 'cc', 'bcc', 'Reply-To'))) {
+ $error_message = $this->lang('Invalid recipient kind: ') . $kind;
+ $this->setError($error_message);
+ $this->edebug($error_message);
if ($this->exceptions) {
- throw new phpmailerException('Invalid recipient array: ' .
$kind);
+ throw new phpmailerException($error_message);
}
return false;
}
- $address = trim($address);
- $name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and
trim
if (!$this->validateAddress($address)) {
- $this->setError($this->lang('invalid_address') . ': ' . $address);
- $this->edebug($this->lang('invalid_address') . ': ' . $address);
+ $error_message = $this->lang('invalid_address') . " (addAnAddress
$kind): $address";
+ $this->setError($error_message);
+ $this->edebug($error_message);
if ($this->exceptions) {
- throw new phpmailerException($this->lang('invalid_address') .
': ' . $address);
+ throw new phpmailerException($error_message);
}
return false;
}
if ($kind != 'Reply-To') {
- if (!isset($this->all_recipients[strtolower($address)])) {
+ if (!array_key_exists(strtolower($address),
$this->all_recipients)) {
array_push($this->$kind, array($address, $name));
$this->all_recipients[strtolower($address)] = true;
return true;
@@ -920,11 +1012,15 @@
{
$address = trim($address);
$name = trim(preg_replace('/[\r\n]+/', '', $name)); //Strip breaks and
trim
- if (!$this->validateAddress($address)) {
- $this->setError($this->lang('invalid_address') . ': ' . $address);
- $this->edebug($this->lang('invalid_address') . ': ' . $address);
+ // Don't validate now addresses with IDN. Will be done in send().
+ if (($pos = strrpos($address, '@')) === false or
+ (!$this->has8bitChars(substr($address, ++$pos)) or
!$this->idnSupported()) and
+ !$this->validateAddress($address)) {
+ $error_message = $this->lang('invalid_address') . " (setFrom)
$address";
+ $this->setError($error_message);
+ $this->edebug($error_message);
if ($this->exceptions) {
- throw new phpmailerException($this->lang('invalid_address') .
': ' . $address);
+ throw new phpmailerException($error_message);
}
return false;
}
@@ -953,19 +1049,34 @@
/**
* Check that a string looks like an email address.
* @param string $address The email address to check
- * @param string $patternselect A selector for the validation pattern to
use :
- * * `auto` Pick strictest one automatically;
+ * @param string|callable $patternselect A selector for the validation
pattern to use :
+ * * `auto` Pick best pattern automatically;
* * `pcre8` Use the squiloople.com pattern, requires PCRE > 8.0, PHP >=
5.3.2, 5.2.14;
* * `pcre` Use old PCRE implementation;
- * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL; same as pcre8 but does
not allow 'dotless' domains;
+ * * `php` Use PHP built-in FILTER_VALIDATE_EMAIL;
* * `html5` Use the pattern given by the HTML5 spec for 'email' type form
input elements.
* * `noregex` Don't use a regex: super fast, really dumb.
+ * Alternatively you may pass in a callable to inject your own validator,
for example:
+ * PHPMailer::validateAddress('address@hidden', function($address) {
+ * return (strpos($address, '@') !== false);
+ * });
+ * You can also set the PHPMailer::$validator static to a callable,
allowing built-in methods to use your validator.
* @return boolean
* @static
* @access public
*/
- public static function validateAddress($address, $patternselect = 'auto')
+ public static function validateAddress($address, $patternselect = null)
{
+ if (is_null($patternselect)) {
+ $patternselect = self::$validator;
+ }
+ if (is_callable($patternselect)) {
+ return call_user_func($patternselect, $address);
+ }
+ //Reject line breaks in addresses; it's valid RFC5322, but not RFC5321
+ if (strpos($address, "\n") !== false or strpos($address, "\r") !==
false) {
+ return false;
+ }
if (!$patternselect or $patternselect == 'auto') {
//Check this constant first so it works when extension_loaded() is
disabled by safe mode
//Constant was added in PHP 5.2.4
@@ -1046,6 +1157,48 @@
}
/**
+ * Tells whether IDNs (Internationalized Domain Names) are supported or
not. This requires the
+ * "intl" and "mbstring" PHP extensions.
+ * @return bool "true" if required functions for IDN support are present
+ */
+ public function idnSupported()
+ {
+ // @TODO: Write our own "idn_to_ascii" function for PHP <= 5.2.
+ return function_exists('idn_to_ascii') and
function_exists('mb_convert_encoding');
+ }
+
+ /**
+ * Converts IDN in given email address to its ASCII form, also known as
punycode, if possible.
+ * Important: Address must be passed in same encoding as currently set in
PHPMailer::$CharSet.
+ * This function silently returns unmodified address if:
+ * - No conversion is necessary (i.e. domain name is not an IDN, or is
already in ASCII form)
+ * - Conversion to punycode is impossible (e.g. required PHP functions are
not available)
+ * or fails for any reason (e.g. domain has characters not allowed in an
IDN)
+ * @see PHPMailer::$CharSet
+ * @param string $address The email address to convert
+ * @return string The encoded address in ASCII form
+ */
+ public function punyencodeAddress($address)
+ {
+ // Verify we have required functions, CharSet, and at-sign.
+ if ($this->idnSupported() and
+ !empty($this->CharSet) and
+ ($pos = strrpos($address, '@')) !== false) {
+ $domain = substr($address, ++$pos);
+ // Verify CharSet string is a valid one, and domain properly
encoded in this CharSet.
+ if ($this->has8bitChars($domain) and @mb_check_encoding($domain,
$this->CharSet)) {
+ $domain = mb_convert_encoding($domain, 'UTF-8',
$this->CharSet);
+ if (($punycode = defined('INTL_IDNA_VARIANT_UTS46') ?
+ idn_to_ascii($domain, 0, INTL_IDNA_VARIANT_UTS46) :
+ idn_to_ascii($domain)) !== false) {
+ return substr($address, 0, $pos) . $punycode;
+ }
+ }
+ }
+ return $address;
+ }
+
+ /**
* Create a message and send it.
* Uses the sending method specified by $Mailer.
* @throws phpmailerException
@@ -1076,17 +1229,41 @@
public function preSend()
{
try {
+ $this->error_count = 0; // Reset errors
$this->mailHeader = '';
+
+ // Dequeue recipient and Reply-To addresses with IDN
+ foreach (array_merge($this->RecipientsQueue, $this->ReplyToQueue)
as $params) {
+ $params[1] = $this->punyencodeAddress($params[1]);
+ call_user_func_array(array($this, 'addAnAddress'), $params);
+ }
if ((count($this->to) + count($this->cc) + count($this->bcc)) < 1)
{
throw new phpmailerException($this->lang('provide_address'),
self::STOP_CRITICAL);
}
+ // Validate From, Sender, and ConfirmReadingTo addresses
+ foreach (array('From', 'Sender', 'ConfirmReadingTo') as
$address_kind) {
+ $this->$address_kind = trim($this->$address_kind);
+ if (empty($this->$address_kind)) {
+ continue;
+ }
+ $this->$address_kind =
$this->punyencodeAddress($this->$address_kind);
+ if (!$this->validateAddress($this->$address_kind)) {
+ $error_message = $this->lang('invalid_address') . '
(punyEncode) ' . $this->$address_kind;
+ $this->setError($error_message);
+ $this->edebug($error_message);
+ if ($this->exceptions) {
+ throw new phpmailerException($error_message);
+ }
+ return false;
+ }
+ }
+
// Set whether the message is multipart/alternative
- if (!empty($this->AltBody)) {
+ if ($this->alternativeExists()) {
$this->ContentType = 'multipart/alternative';
}
- $this->error_count = 0; // Reset errors
$this->setMessageType();
// Refuse to send an empty message unless we are specifically
allowing it
if (!$this->AllowEmpty and empty($this->Body)) {
@@ -1117,9 +1294,11 @@
// Sign with DKIM if enabled
if (!empty($this->DKIM_domain)
- && !empty($this->DKIM_private)
&& !empty($this->DKIM_selector)
- && file_exists($this->DKIM_private)) {
+ && (!empty($this->DKIM_private_string)
+ || (!empty($this->DKIM_private) &&
file_exists($this->DKIM_private))
+ )
+ ) {
$header_dkim = $this->DKIM_Add(
$this->MIMEHeader . $this->mailHeader,
$this->encodeHeader($this->secureHeader($this->Subject)),
@@ -1185,19 +1364,24 @@
*/
protected function sendmailSend($header, $body)
{
- if ($this->Sender != '') {
+ // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters will be
escaped.
+ if (!empty($this->Sender) and self::isShellSafe($this->Sender)) {
if ($this->Mailer == 'qmail') {
- $sendmail = sprintf('%s -f%s',
escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+ $sendmailFmt = '%s -f%s';
} else {
- $sendmail = sprintf('%s -oi -f%s -t',
escapeshellcmd($this->Sendmail), escapeshellarg($this->Sender));
+ $sendmailFmt = '%s -oi -f%s -t';
}
} else {
if ($this->Mailer == 'qmail') {
- $sendmail = sprintf('%s', escapeshellcmd($this->Sendmail));
+ $sendmailFmt = '%s';
} else {
- $sendmail = sprintf('%s -oi -t',
escapeshellcmd($this->Sendmail));
+ $sendmailFmt = '%s -oi -t';
}
}
+
+ // TODO: If possible, this should be changed to escapeshellarg. Needs
thorough testing.
+ $sendmail = sprintf($sendmailFmt, escapeshellcmd($this->Sendmail),
$this->Sender);
+
if ($this->SingleTo) {
foreach ($this->SingleToArray as $toAddr) {
if (address@hidden = popen($sendmail, 'w')) {
@@ -1227,7 +1411,15 @@
fputs($mail, $header);
fputs($mail, $body);
$result = pclose($mail);
- $this->doCallback(($result == 0), $this->to, $this->cc,
$this->bcc, $this->Subject, $body, $this->From);
+ $this->doCallback(
+ ($result == 0),
+ $this->to,
+ $this->cc,
+ $this->bcc,
+ $this->Subject,
+ $body,
+ $this->From
+ );
if ($result != 0) {
throw new phpmailerException($this->lang('execute') .
$this->Sendmail, self::STOP_CRITICAL);
}
@@ -1236,6 +1428,40 @@
}
/**
+ * Fix CVE-2016-10033 and CVE-2016-10045 by disallowing potentially unsafe
shell characters.
+ *
+ * Note that escapeshellarg and escapeshellcmd are inadequate for our
purposes, especially on Windows.
+ * @param string $string The string to be validated
+ * @see https://github.com/PHPMailer/PHPMailer/issues/924 CVE-2016-10045
bug report
+ * @access protected
+ * @return boolean
+ */
+ protected static function isShellSafe($string)
+ {
+ // Future-proof
+ if (escapeshellcmd($string) !== $string
+ or !in_array(escapeshellarg($string), array("'$string'",
"\"$string\""))
+ ) {
+ return false;
+ }
+
+ $length = strlen($string);
+
+ for ($i = 0; $i < $length; $i++) {
+ $c = $string[$i];
+
+ // All other characters have a special meaning in at least one
common shell, including = and +.
+ // Full stop (.) has a special meaning in cmd.exe, but its impact
should be negligible here.
+ // Note that this does permit non-Latin alphanumeric characters
based on the current locale.
+ if (!ctype_alnum($c) && strpos('@_-.', $c) === false) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ /**
* Send mail using the PHP mail() function.
* @param string $header The message headers
* @param string $body The message body
@@ -1252,17 +1478,20 @@
}
$to = implode(', ', $toArr);
- if (empty($this->Sender)) {
- $params = ' ';
- } else {
- $params = sprintf('-f%s', $this->Sender);
+ $params = null;
+ //This sets the SMTP envelope sender which gets turned into a
return-path header by the receiver
+ if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
+ // CVE-2016-10033, CVE-2016-10045: Don't pass -f if characters
will be escaped.
+ if (self::isShellSafe($this->Sender)) {
+ $params = sprintf('-f%s', $this->Sender);
+ }
}
- if ($this->Sender != '' and !ini_get('safe_mode')) {
+ if (!empty($this->Sender) and !ini_get('safe_mode') and
$this->validateAddress($this->Sender)) {
$old_from = ini_get('sendmail_from');
ini_set('sendmail_from', $this->Sender);
}
$result = false;
- if ($this->SingleTo && count($toArr) > 1) {
+ if ($this->SingleTo and count($toArr) > 1) {
foreach ($toArr as $toAddr) {
$result = $this->mailPassthru($toAddr, $this->Subject, $body,
$header, $params);
$this->doCallback($result, array($toAddr), $this->cc,
$this->bcc, $this->Subject, $body, $this->From);
@@ -1311,10 +1540,10 @@
if (!$this->smtpConnect($this->SMTPOptions)) {
throw new phpmailerException($this->lang('smtp_connect_failed'),
self::STOP_CRITICAL);
}
- if ('' == $this->Sender) {
+ if (!empty($this->Sender) and $this->validateAddress($this->Sender)) {
+ $smtp_from = $this->Sender;
+ } else {
$smtp_from = $this->From;
- } else {
- $smtp_from = $this->Sender;
}
if (!$this->smtp->mail($smtp_from)) {
$this->setError($this->lang('from_failed') . $smtp_from . ' : ' .
implode(',', $this->smtp->getError()));
@@ -1368,12 +1597,17 @@
* @throws phpmailerException
* @return boolean
*/
- public function smtpConnect($options = array())
+ public function smtpConnect($options = null)
{
if (is_null($this->smtp)) {
$this->smtp = $this->getSMTPInstance();
}
+ //If no options are provided, use whatever is set in the instance
+ if (is_null($options)) {
+ $options = $this->SMTPOptions;
+ }
+
// Already connected?
if ($this->smtp->connected()) {
return true;
@@ -1443,7 +1677,7 @@
if (!$this->smtp->startTLS()) {
throw new
phpmailerException($this->lang('connect_host'));
}
- // We must resend HELO after tls negotiation
+ // We must resend EHLO after TLS negotiation
$this->smtp->hello($hello);
}
if ($this->SMTPAuth) {
@@ -1482,7 +1716,7 @@
*/
public function smtpClose()
{
- if ($this->smtp !== null) {
+ if (is_a($this->smtp, 'SMTP')) {
if ($this->smtp->connected()) {
$this->smtp->quit();
$this->smtp->close();
@@ -1501,6 +1735,19 @@
*/
public function setLanguage($langcode = 'en', $lang_path = '')
{
+ // Backwards compatibility for renamed language codes
+ $renamed_langcodes = array(
+ 'br' => 'pt_br',
+ 'cz' => 'cs',
+ 'dk' => 'da',
+ 'no' => 'nb',
+ 'se' => 'sv',
+ );
+
+ if (isset($renamed_langcodes[$langcode])) {
+ $langcode = $renamed_langcodes[$langcode];
+ }
+
// Define full set of translatable strings in English
$PHPMAILER_LANG = array(
'authenticate' => 'SMTP Error: Could not authenticate.',
@@ -1513,7 +1760,7 @@
'file_open' => 'File Error: Could not open file: ',
'from_failed' => 'The following From address failed: ',
'instantiate' => 'Could not instantiate mail function.',
- 'invalid_address' => 'Invalid address',
+ 'invalid_address' => 'Invalid address: ',
'mailer_not_supported' => ' mailer is not supported.',
'provide_address' => 'You must provide at least one recipient
email address.',
'recipients_failed' => 'SMTP Error: The following recipients
failed: ',
@@ -1527,6 +1774,10 @@
// Calculate an absolute path so it can work if CWD is not here
$lang_path = dirname(__FILE__). DIRECTORY_SEPARATOR . 'language'.
DIRECTORY_SEPARATOR;
}
+ //Validate $langcode
+ if (!preg_match('/^[a-z]{2}(?:_[a-zA-Z]{2})?$/', $langcode)) {
+ $langcode = 'en';
+ }
$foundlang = true;
$lang_file = $lang_path . 'phpmailer.lang-' . $langcode . '.php';
// There is no English translation file
@@ -1778,7 +2029,6 @@
}
$result .= $this->headerLine('Date', $this->MessageDate);
-
// To be created automatically by mail()
if ($this->SingleTo) {
if ($this->Mailer != 'mail') {
@@ -1821,10 +2071,12 @@
$result .= $this->headerLine('Subject',
$this->encodeHeader($this->secureHeader($this->Subject)));
}
- if ($this->MessageID != '') {
+ // Only allow a custom message ID if it conforms to RFC 5322 section
3.6.4
+ // https://tools.ietf.org/html/rfc5322#section-3.6.4
+ if ('' != $this->MessageID and preg_match('/^<address@hidden>$/',
$this->MessageID)) {
$this->lastMessageID = $this->MessageID;
} else {
- $this->lastMessageID = sprintf('<address@hidden>',
$this->uniqueid, $this->ServerHostname());
+ $this->lastMessageID = sprintf('<address@hidden>',
$this->uniqueid, $this->serverHostname());
}
$result .= $this->headerLine('Message-ID', $this->lastMessageID);
if (!is_null($this->Priority)) {
@@ -1833,7 +2085,7 @@
if ($this->XMailer == '') {
$result .= $this->headerLine(
'X-Mailer',
- 'PHPMailer ' . $this->Version . '
(https://github.com/PHPMailer/PHPMailer/)'
+ 'PHPMailer ' . $this->Version . '
(https://github.com/PHPMailer/PHPMailer)'
);
} else {
$myXmailer = trim($this->XMailer);
@@ -1843,7 +2095,7 @@
}
if ($this->ConfirmReadingTo != '') {
- $result .= $this->headerLine('Disposition-Notification-To', '<' .
trim($this->ConfirmReadingTo) . '>');
+ $result .= $this->headerLine('Disposition-Notification-To', '<' .
$this->ConfirmReadingTo . '>');
}
// Add custom headers
@@ -1923,10 +2175,18 @@
*/
public function getSentMIMEMessage()
{
- return $this->MIMEHeader . $this->mailHeader . self::CRLF .
$this->MIMEBody;
+ return rtrim($this->MIMEHeader . $this->mailHeader, "\n\r") .
self::CRLF . self::CRLF . $this->MIMEBody;
}
/**
+ * Create unique ID
+ * @return string
+ */
+ protected function generateId() {
+ return md5(uniqid(time()));
+ }
+
+ /**
* Assemble the message body.
* Returns an empty string on failure.
* @access public
@@ -1937,7 +2197,7 @@
{
$body = '';
//Create unique IDs and preset boundaries
- $this->uniqueid = md5(uniqid(time()));
+ $this->uniqueid = $this->generateId();
$this->boundary[1] = 'b1_' . $this->uniqueid;
$this->boundary[2] = 'b2_' . $this->uniqueid;
$this->boundary[3] = 'b3_' . $this->uniqueid;
@@ -1953,12 +2213,12 @@
//Can we do a 7-bit downgrade?
if ($bodyEncoding == '8bit' and !$this->has8bitChars($this->Body)) {
$bodyEncoding = '7bit';
+ //All ISO 8859, Windows codepage and UTF-8 charsets are ascii
compatible up to 7-bit
$bodyCharSet = 'us-ascii';
}
//If lines are too long, and we're not already using an encoding that
will shorten them,
- //change to quoted-printable transfer encoding
+ //change to quoted-printable transfer encoding for the body part only
if ('base64' != $this->Encoding and
self::hasLineLongerThanMax($this->Body)) {
- $this->Encoding = 'quoted-printable';
$bodyEncoding = 'quoted-printable';
}
@@ -1967,10 +2227,12 @@
//Can we do a 7-bit downgrade?
if ($altBodyEncoding == '8bit' and
!$this->has8bitChars($this->AltBody)) {
$altBodyEncoding = '7bit';
+ //All ISO 8859, Windows codepage and UTF-8 charsets are ascii
compatible up to 7-bit
$altBodyCharSet = 'us-ascii';
}
- //If lines are too long, change to quoted-printable transfer encoding
- if (self::hasLineLongerThanMax($this->AltBody)) {
+ //If lines are too long, and we're not already using an encoding that
will shorten them,
+ //change to quoted-printable transfer encoding for the alt body part
only
+ if ('base64' != $altBodyEncoding and
self::hasLineLongerThanMax($this->AltBody)) {
$altBodyEncoding = 'quoted-printable';
}
//Use this as a preamble in all multipart message types
@@ -2073,8 +2335,10 @@
$body .= $this->attachAll('attachment', $this->boundary[1]);
break;
default:
- // catch case 'plain' and case ''
- $body .= $this->encodeString($this->Body, $bodyEncoding);
+ // Catch case 'plain' and case '', applies to simple
`text/plain` and `text/html` body content types
+ //Reset the `Encoding` property in case we changed it for line
length reasons
+ $this->Encoding = $bodyEncoding;
+ $body .= $this->encodeString($this->Body, $this->Encoding);
break;
}
@@ -2180,8 +2444,7 @@
/**
* Set the message type.
- * PHPMailer only supports some preset message types,
- * not arbitrary MIME structures.
+ * PHPMailer only supports some preset message types, not arbitrary MIME
structures.
* @access protected
* @return void
*/
@@ -2199,6 +2462,7 @@
}
$this->message_type = implode('_', $type);
if ($this->message_type == '') {
+ //The 'plain' message_type refers to the message having a single
body element, not that it is plain-text
$this->message_type = 'plain';
}
}
@@ -2228,6 +2492,7 @@
/**
* Add an attachment from a path on the filesystem.
+ * Never use a user-supplied path to a file!
* Returns false if the file could not be found or read.
* @param string $path Path to the attachment.
* @param string $name Overrides the attachment name.
@@ -2324,18 +2589,27 @@
$type = $attachment[4];
$disposition = $attachment[6];
$cid = $attachment[7];
- if ($disposition == 'inline' && isset($cidUniq[$cid])) {
+ if ($disposition == 'inline' && array_key_exists($cid,
$cidUniq)) {
continue;
}
$cidUniq[$cid] = true;
$mime[] = sprintf('--%s%s', $boundary, $this->LE);
- $mime[] = sprintf(
- 'Content-Type: %s; name="%s"%s',
- $type,
- $this->encodeHeader($this->secureHeader($name)),
- $this->LE
- );
+ //Only include a filename property if we have one
+ if (!empty($name)) {
+ $mime[] = sprintf(
+ 'Content-Type: %s; name="%s"%s',
+ $type,
+ $this->encodeHeader($this->secureHeader($name)),
+ $this->LE
+ );
+ } else {
+ $mime[] = sprintf(
+ 'Content-Type: %s%s',
+ $type,
+ $this->LE
+ );
+ }
// RFC1341 part 5 says 7bit is assumed if not specified
if ($encoding != '7bit') {
$mime[] = sprintf('Content-Transfer-Encoding: %s%s',
$encoding, $this->LE);
@@ -2359,12 +2633,20 @@
$this->LE . $this->LE
);
} else {
- $mime[] = sprintf(
- 'Content-Disposition: %s; filename=%s%s',
- $disposition,
- $encoded_name,
- $this->LE . $this->LE
- );
+ if (!empty($encoded_name)) {
+ $mime[] = sprintf(
+ 'Content-Disposition: %s; filename=%s%s',
+ $disposition,
+ $encoded_name,
+ $this->LE . $this->LE
+ );
+ } else {
+ $mime[] = sprintf(
+ 'Content-Disposition: %s%s',
+ $disposition,
+ $this->LE . $this->LE
+ );
+ }
}
} else {
$mime[] = $this->LE;
@@ -2398,7 +2680,6 @@
* @param string $path The full path to the file
* @param string $encoding The encoding to use; one of 'base64', '7bit',
'8bit', 'binary', 'quoted-printable'
* @throws phpmailerException
- * @see EncodeFile(encodeFile
* @access protected
* @return string
*/
@@ -2695,7 +2976,6 @@
return str_replace(' ', '_', $encoded);
}
-
/**
* Add a string or binary attachment (non-filesystem).
* This method can be used to attach ascii or binary data,
@@ -2738,6 +3018,7 @@
* displayed inline with the message, not just attached for download.
* This is used in HTML messages that embed the images
* the HTML refers to using the $cid value.
+ * Never use a user-supplied path to a file!
* @param string $path Path to the attachment.
* @param string $cid Content ID of the attachment; Use this to reference
* the content when using an embedded image in HTML.
@@ -2801,7 +3082,7 @@
$disposition = 'inline'
) {
// If a MIME type is not specified, try to work it out from the name
- if ($type == '') {
+ if ($type == '' and !empty($name)) {
$type = self::filenameToType($name);
}
@@ -2858,6 +3139,22 @@
}
/**
+ * Clear queued addresses of given kind.
+ * @access protected
+ * @param string $kind 'to', 'cc', or 'bcc'
+ * @return void
+ */
+ public function clearQueuedAddresses($kind)
+ {
+ $RecipientsQueue = $this->RecipientsQueue;
+ foreach ($RecipientsQueue as $address => $params) {
+ if ($params[0] == $kind) {
+ unset($this->RecipientsQueue[$address]);
+ }
+ }
+ }
+
+ /**
* Clear all To recipients.
* @return void
*/
@@ -2867,6 +3164,7 @@
unset($this->all_recipients[strtolower($to[0])]);
}
$this->to = array();
+ $this->clearQueuedAddresses('to');
}
/**
@@ -2879,6 +3177,7 @@
unset($this->all_recipients[strtolower($cc[0])]);
}
$this->cc = array();
+ $this->clearQueuedAddresses('cc');
}
/**
@@ -2891,6 +3190,7 @@
unset($this->all_recipients[strtolower($bcc[0])]);
}
$this->bcc = array();
+ $this->clearQueuedAddresses('bcc');
}
/**
@@ -2900,6 +3200,7 @@
public function clearReplyTos()
{
$this->ReplyTo = array();
+ $this->ReplyToQueue = array();
}
/**
@@ -2912,6 +3213,7 @@
$this->cc = array();
$this->bcc = array();
$this->all_recipients = array();
+ $this->RecipientsQueue = array();
}
/**
@@ -3068,8 +3370,7 @@
}
/**
- * Returns all custom headers
- *
+ * Returns all custom headers.
* @return array
*/
public function getCustomHeaders()
@@ -3078,21 +3379,29 @@
}
/**
- * Create a message from an HTML string.
- * Automatically makes modifications for inline images and backgrounds
- * and creates a plain-text version by converting the HTML.
- * Overwrites any existing values in $this->Body and $this->AltBody
+ * Create a message body from an HTML string.
+ * Automatically inlines images and creates a plain-text version by
converting the HTML,
+ * overwriting any existing values in Body and AltBody.
+ * Do not source $message content from user input!
+ * $basedir is prepended when handling relative URLs, e.g. <img
src="/images/a.png"> and must not be empty
+ * will look for an image file in $basedir/images/a.png and convert it to
inline.
+ * If you don't provide a $basedir, relative paths will be left untouched
(and thus probably break in email)
+ * If you don't want to apply these transformations to your HTML, just set
Body and AltBody directly.
* @access public
* @param string $message HTML message string
- * @param string $basedir baseline directory for path
+ * @param string $basedir Absolute path to a base directory to prepend to
relative paths to images
* @param boolean|callable $advanced Whether to use the internal HTML to
text converter
- * or your own custom converter @see html2text()
- * @return string $message
+ * or your own custom converter @see PHPMailer::html2text()
+ * @return string $message The transformed message Body
*/
public function msgHTML($message, $basedir = '', $advanced = false)
{
preg_match_all('/(src|background)=["\'](.*)["\']/Ui', $message,
$images);
- if (isset($images[2])) {
+ if (array_key_exists(2, $images)) {
+ if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
+ // Ensure $basedir has a trailing /
+ $basedir .= '/';
+ }
foreach ($images[2] as $imgindex => $url) {
// Convert data URIs into embedded images
if (preg_match('#^data:(image[^;,]*)(;base64)?,#', $url,
$match)) {
@@ -3103,7 +3412,7 @@
$data = rawurldecode($data);
}
$cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
- if ($this->addStringEmbeddedImage($data, $cid, '',
'base64', $match[1])) {
+ if ($this->addStringEmbeddedImage($data, $cid, 'embed' .
$imgindex, 'base64', $match[1])) {
$message = str_replace(
$images[0][$imgindex],
$images[1][$imgindex] . '="cid:' . $cid . '"',
@@ -3110,8 +3419,18 @@
$message
);
}
- } elseif (!preg_match('#^[A-z]+://#', $url)) {
- // Do not change urls for absolute images (thanks to
corvuscorax)
+ continue;
+ }
+ if (
+ // Only process relative URLs if a basedir is provided
(i.e. no absolute local paths)
+ !empty($basedir)
+ // Ignore URLs containing parent dir traversal (..)
+ && (strpos($url, '..') === false)
+ // Do not change urls that are already inline images
+ && substr($url, 0, 4) !== 'cid:'
+ // Do not change absolute URLs, including anonymous
protocol
+ && !preg_match('#^[a-z][a-z0-9+.-]*:?//#i', $url)
+ ) {
$filename = basename($url);
$directory = dirname($url);
if ($directory == '.') {
@@ -3118,9 +3437,6 @@
$directory = '';
}
$cid = md5($url) . '@phpmailer.0'; // RFC2392 S 2
- if (strlen($basedir) > 1 && substr($basedir, -1) != '/') {
- $basedir .= '/';
- }
if (strlen($directory) > 1 && substr($directory, -1) !=
'/') {
$directory .= '/';
}
@@ -3145,7 +3461,7 @@
// Convert all message body line breaks to CRLF, makes
quoted-printable encoding work much better
$this->Body = $this->normalizeBreaks($message);
$this->AltBody = $this->normalizeBreaks($this->html2text($message,
$advanced));
- if (empty($this->AltBody)) {
+ if (!$this->alternativeExists()) {
$this->AltBody = 'To view this email message, open it in a program
that understands HTML!' .
self::CRLF . self::CRLF;
}
@@ -3156,7 +3472,7 @@
* Convert an HTML string into plain text.
* This is used by msgHTML().
* Note - older versions of this function used a bundled advanced converter
- * which was been removed for license reasons in #232
+ * which was been removed for license reasons in #232.
* Example usage:
* <code>
* // Use default conversion
@@ -3415,7 +3731,6 @@
return preg_replace('/(\r\n|\r|\n)/ms', $breaktype, $text);
}
-
/**
* Set the public and private key files and password for S/MIME signing.
* @access public
@@ -3457,7 +3772,7 @@
* @access public
* @param string $signHeader
* @throws phpmailerException
- * @return string
+ * @return string The DKIM signature value
*/
public function DKIM_Sign($signHeader)
{
@@ -3467,15 +3782,35 @@
}
return '';
}
- $privKeyStr = file_get_contents($this->DKIM_private);
- if ($this->DKIM_passphrase != '') {
+ $privKeyStr = !empty($this->DKIM_private_string) ?
$this->DKIM_private_string : file_get_contents($this->DKIM_private);
+ if ('' != $this->DKIM_passphrase) {
$privKey = openssl_pkey_get_private($privKeyStr,
$this->DKIM_passphrase);
} else {
- $privKey = $privKeyStr;
+ $privKey = openssl_pkey_get_private($privKeyStr);
}
- if (openssl_sign($signHeader, $signature, $privKey)) {
- return base64_encode($signature);
+ //Workaround for missing digest algorithms in old PHP & OpenSSL
versions
+ //@link http://stackoverflow.com/a/11117338/333340
+ if (version_compare(PHP_VERSION, '5.3.0') >= 0 and
+ in_array('sha256WithRSAEncryption', openssl_get_md_methods(true)))
{
+ if (openssl_sign($signHeader, $signature, $privKey,
'sha256WithRSAEncryption')) {
+ openssl_pkey_free($privKey);
+ return base64_encode($signature);
+ }
+ } else {
+ $pinfo = openssl_pkey_get_details($privKey);
+ $hash = hash('sha256', $signHeader);
+ //'Magic' constant for SHA256 from RFC3447
+ //@link https://tools.ietf.org/html/rfc3447#page-43
+ $t = '3031300d060960864801650304020105000420' . $hash;
+ $pslen = $pinfo['bits'] / 8 - (strlen($t) / 2 + 3);
+ $eb = pack('H*', '0001' . str_repeat('FF', $pslen) . '00' . $t);
+
+ if (openssl_private_encrypt($eb, $signature, $privKey,
OPENSSL_NO_PADDING)) {
+ openssl_pkey_free($privKey);
+ return base64_encode($signature);
+ }
}
+ openssl_pkey_free($privKey);
return '';
}
@@ -3492,7 +3827,7 @@
foreach ($lines as $key => $line) {
list($heading, $value) = explode(':', $line, 2);
$heading = strtolower($heading);
- $value = preg_replace('/\s+/', ' ', $value); // Compress useless
spaces
+ $value = preg_replace('/\s{2,}/', ' ', $value); // Compress
useless spaces
$lines[$key] = $heading . ':' . trim($value); // Don't forget to
remove WSP around the value
}
$signHeader = implode("\r\n", $lines);
@@ -3530,7 +3865,7 @@
*/
public function DKIM_Add($headers_line, $subject, $body)
{
- $DKIMsignatureType = 'rsa-sha1'; // Signature & hash algorithms
+ $DKIMsignatureType = 'rsa-sha256'; // Signature & hash algorithms
$DKIMcanonicalization = 'relaxed/simple'; // Canonicalization of
header/body
$DKIMquery = 'dns/txt'; // Query method
$DKIMtime = time(); // Signature Timestamp = seconds since 00:00:00 -
Jan 1, 1970 (UTC time zone)
@@ -3538,6 +3873,7 @@
$headers = explode($this->LE, $headers_line);
$from_header = '';
$to_header = '';
+ $date_header = '';
$current = '';
foreach ($headers as $header) {
if (strpos($header, 'From:') === 0) {
@@ -3546,6 +3882,9 @@
} elseif (strpos($header, 'To:') === 0) {
$to_header = $header;
$current = 'to_header';
+ } elseif (strpos($header, 'Date:') === 0) {
+ $date_header = $header;
+ $current = 'date_header';
} else {
if (!empty($$current) && strpos($header, ' =?') === 0) {
$$current .= $header;
@@ -3556,6 +3895,7 @@
}
$from = str_replace('|', '=7C', $this->DKIM_QP($from_header));
$to = str_replace('|', '=7C', $this->DKIM_QP($to_header));
+ $date = str_replace('|', '=7C', $this->DKIM_QP($date_header));
$subject = str_replace(
'|',
'=7C',
@@ -3563,7 +3903,7 @@
); // Copied header fields (dkim-quoted-printable)
$body = $this->DKIM_BodyC($body);
$DKIMlen = strlen($body); // Length of body
- $DKIMb64 = base64_encode(pack('H*', sha1($body))); // Base64 of packed
binary SHA-1 hash of body
+ $DKIMb64 = base64_encode(pack('H*', hash('sha256', $body))); // Base64
of packed binary SHA-256 hash of body
if ('' == $this->DKIM_identity) {
$ident = '';
} else {
@@ -3576,15 +3916,20 @@
$this->DKIM_selector .
";\r\n" .
"\tt=" . $DKIMtime . '; c=' . $DKIMcanonicalization . ";\r\n" .
- "\th=From:To:Subject;\r\n" .
+ "\th=From:To:Date:Subject;\r\n" .
"\td=" . $this->DKIM_domain . ';' . $ident . "\r\n" .
"\tz=$from\r\n" .
"\t|$to\r\n" .
+ "\t|$date\r\n" .
"\t|$subject;\r\n" .
"\tbh=" . $DKIMb64 . ";\r\n" .
"\tb=";
$toSign = $this->DKIM_HeaderC(
- $from_header . "\r\n" . $to_header . "\r\n" . $subject_header .
"\r\n" . $dkimhdrs
+ $from_header . "\r\n" .
+ $to_header . "\r\n" .
+ $date_header . "\r\n" .
+ $subject_header . "\r\n" .
+ $dkimhdrs
);
$signed = $this->DKIM_Sign($toSign);
return $dkimhdrs . $signed . "\r\n";
@@ -3604,6 +3949,7 @@
/**
* Allows for public read access to 'to' property.
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not
yet included.
* @access public
* @return array
*/
@@ -3614,6 +3960,7 @@
/**
* Allows for public read access to 'cc' property.
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not
yet included.
* @access public
* @return array
*/
@@ -3624,6 +3971,7 @@
/**
* Allows for public read access to 'bcc' property.
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not
yet included.
* @access public
* @return array
*/
@@ -3634,6 +3982,7 @@
/**
* Allows for public read access to 'ReplyTo' property.
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not
yet included.
* @access public
* @return array
*/
@@ -3644,6 +3993,7 @@
/**
* Allows for public read access to 'all_recipients' property.
+ * @note: Before the send() call, queued addresses (i.e. with IDN) are not
yet included.
* @access public
* @return array
*/
Copied:
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauth.php
(from rev 16449, trunk/phpgwapi/inc/phpmailer/class.phpmaileroauth.php)
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauth.php
(rev 0)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauth.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -0,0 +1,197 @@
+<?php
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5.4
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) <address@hidden>
+ * @author Jim Jagielski (jimjag) <address@hidden>
+ * @author Andy Prevost (codeworxtech) <address@hidden>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2014 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public
License
+ * @note This program is distributed in the hope that it will be useful -
WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/**
+ * PHPMailerOAuth - PHPMailer subclass adding OAuth support.
+ * @package PHPMailer
+ * @author @sherryl4george
+ * @author Marcus Bointon (@Synchro) <address@hidden>
+ */
+class PHPMailerOAuth extends PHPMailer
+{
+ /**
+ * The OAuth user's email address
+ * @var string
+ */
+ public $oauthUserEmail = '';
+
+ /**
+ * The OAuth refresh token
+ * @var string
+ */
+ public $oauthRefreshToken = '';
+
+ /**
+ * The OAuth client ID
+ * @var string
+ */
+ public $oauthClientId = '';
+
+ /**
+ * The OAuth client secret
+ * @var string
+ */
+ public $oauthClientSecret = '';
+
+ /**
+ * An instance of the PHPMailerOAuthGoogle class.
+ * @var PHPMailerOAuthGoogle
+ * @access protected
+ */
+ protected $oauth = null;
+
+ /**
+ * Get a PHPMailerOAuthGoogle instance to use.
+ * @return PHPMailerOAuthGoogle
+ */
+ public function getOAUTHInstance()
+ {
+ if (!is_object($this->oauth)) {
+ $this->oauth = new PHPMailerOAuthGoogle(
+ $this->oauthUserEmail,
+ $this->oauthClientSecret,
+ $this->oauthClientId,
+ $this->oauthRefreshToken
+ );
+ }
+ return $this->oauth;
+ }
+
+ /**
+ * Initiate a connection to an SMTP server.
+ * Overrides the original smtpConnect method to add support for OAuth.
+ * @param array $options An array of options compatible with
stream_context_create()
+ * @uses SMTP
+ * @access public
+ * @return bool
+ * @throws phpmailerException
+ */
+ public function smtpConnect($options = array())
+ {
+ if (is_null($this->smtp)) {
+ $this->smtp = $this->getSMTPInstance();
+ }
+
+ if (is_null($this->oauth)) {
+ $this->oauth = $this->getOAUTHInstance();
+ }
+
+ // Already connected?
+ if ($this->smtp->connected()) {
+ return true;
+ }
+
+ $this->smtp->setTimeout($this->Timeout);
+ $this->smtp->setDebugLevel($this->SMTPDebug);
+ $this->smtp->setDebugOutput($this->Debugoutput);
+ $this->smtp->setVerp($this->do_verp);
+ $hosts = explode(';', $this->Host);
+ $lastexception = null;
+
+ foreach ($hosts as $hostentry) {
+ $hostinfo = array();
+ if
(!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/',
trim($hostentry), $hostinfo)) {
+ // Not a valid host entry
+ continue;
+ }
+ // $hostinfo[2]: optional ssl or tls prefix
+ // $hostinfo[3]: the hostname
+ // $hostinfo[4]: optional port number
+ // The host string prefix can temporarily override the current
setting for SMTPSecure
+ // If it's not specified, the default value is used
+ $prefix = '';
+ $secure = $this->SMTPSecure;
+ $tls = ($this->SMTPSecure == 'tls');
+ if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' ==
$this->SMTPSecure)) {
+ $prefix = 'ssl://';
+ $tls = false; // Can't have SSL and TLS at the same time
+ $secure = 'ssl';
+ } elseif ($hostinfo[2] == 'tls') {
+ $tls = true;
+ // tls doesn't use a prefix
+ $secure = 'tls';
+ }
+ //Do we need the OpenSSL extension?
+ $sslext = defined('OPENSSL_ALGO_SHA1');
+ if ('tls' === $secure or 'ssl' === $secure) {
+ //Check for an OpenSSL constant rather than using
extension_loaded, which is sometimes disabled
+ if (!$sslext) {
+ throw new
phpmailerException($this->lang('extension_missing').'openssl',
self::STOP_CRITICAL);
+ }
+ }
+ $host = $hostinfo[3];
+ $port = $this->Port;
+ $tport = (integer)$hostinfo[4];
+ if ($tport > 0 and $tport < 65536) {
+ $port = $tport;
+ }
+ if ($this->smtp->connect($prefix . $host, $port, $this->Timeout,
$options)) {
+ try {
+ if ($this->Helo) {
+ $hello = $this->Helo;
+ } else {
+ $hello = $this->serverHostname();
+ }
+ $this->smtp->hello($hello);
+ //Automatically enable TLS encryption if:
+ // * it's not disabled
+ // * we have openssl extension
+ // * we are not already using SSL
+ // * the server offers STARTTLS
+ if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl'
and $this->smtp->getServerExt('STARTTLS')) {
+ $tls = true;
+ }
+ if ($tls) {
+ if (!$this->smtp->startTLS()) {
+ throw new
phpmailerException($this->lang('connect_host'));
+ }
+ // We must resend HELO after tls negotiation
+ $this->smtp->hello($hello);
+ }
+ if ($this->SMTPAuth) {
+ if (!$this->smtp->authenticate(
+ $this->Username,
+ $this->Password,
+ $this->AuthType,
+ $this->Realm,
+ $this->Workstation,
+ $this->oauth
+ )
+ ) {
+ throw new
phpmailerException($this->lang('authenticate'));
+ }
+ }
+ return true;
+ } catch (phpmailerException $exc) {
+ $lastexception = $exc;
+ $this->edebug($exc->getMessage());
+ // We must have connected, but then failed TLS or Auth, so
close connection nicely
+ $this->smtp->quit();
+ }
+ }
+ }
+ // If we get here, all connection attempts have failed, so close
connection hard
+ $this->smtp->close();
+ // As we've caught all exceptions, just report whatever the last one
was
+ if ($this->exceptions and !is_null($lastexception)) {
+ throw $lastexception;
+ }
+ return false;
+ }
+}
Copied:
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauthgoogle.php
(from rev 16449, trunk/phpgwapi/inc/phpmailer/class.phpmaileroauthgoogle.php)
===================================================================
---
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauthgoogle.php
(rev 0)
+++
branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.phpmaileroauthgoogle.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -0,0 +1,77 @@
+<?php
+/**
+ * PHPMailer - PHP email creation and transport class.
+ * PHP Version 5.4
+ * @package PHPMailer
+ * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project
+ * @author Marcus Bointon (Synchro/coolbru) <address@hidden>
+ * @author Jim Jagielski (jimjag) <address@hidden>
+ * @author Andy Prevost (codeworxtech) <address@hidden>
+ * @author Brent R. Matzelle (original founder)
+ * @copyright 2012 - 2014 Marcus Bointon
+ * @copyright 2010 - 2012 Jim Jagielski
+ * @copyright 2004 - 2009 Andy Prevost
+ * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public
License
+ * @note This program is distributed in the hope that it will be useful -
WITHOUT
+ * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
+ * FITNESS FOR A PARTICULAR PURPOSE.
+ */
+
+/**
+ * PHPMailerOAuthGoogle - Wrapper for League OAuth2 Google provider.
+ * @package PHPMailer
+ * @author @sherryl4george
+ * @author Marcus Bointon (@Synchro) <address@hidden>
+ * @link https://github.com/thephpleague/oauth2-client
+ */
+class PHPMailerOAuthGoogle
+{
+ private $oauthUserEmail = '';
+ private $oauthRefreshToken = '';
+ private $oauthClientId = '';
+ private $oauthClientSecret = '';
+
+ /**
+ * @param string $UserEmail
+ * @param string $ClientSecret
+ * @param string $ClientId
+ * @param string $RefreshToken
+ */
+ public function __construct(
+ $UserEmail,
+ $ClientSecret,
+ $ClientId,
+ $RefreshToken
+ ) {
+ $this->oauthClientId = $ClientId;
+ $this->oauthClientSecret = $ClientSecret;
+ $this->oauthRefreshToken = $RefreshToken;
+ $this->oauthUserEmail = $UserEmail;
+ }
+
+ private function getProvider()
+ {
+ return new League\OAuth2\Client\Provider\Google([
+ 'clientId' => $this->oauthClientId,
+ 'clientSecret' => $this->oauthClientSecret
+ ]);
+ }
+
+ private function getGrant()
+ {
+ return new \League\OAuth2\Client\Grant\RefreshToken();
+ }
+
+ private function getToken()
+ {
+ $provider = $this->getProvider();
+ $grant = $this->getGrant();
+ return $provider->getAccessToken($grant, ['refresh_token' =>
$this->oauthRefreshToken]);
+ }
+
+ public function getOauth64()
+ {
+ $token = $this->getToken();
+ return base64_encode("user=" . $this->oauthUserEmail .
"\001auth=Bearer " . $token . "\001\001");
+ }
+}
Modified: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.pop3.php
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.pop3.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.pop3.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -31,14 +31,14 @@
{
/**
* The POP3 PHPMailer Version number.
- * @type string
+ * @var string
* @access public
*/
- public $Version = '5.2.10';
+ public $Version = '5.2.23';
/**
* Default POP3 port number.
- * @type integer
+ * @var integer
* @access public
*/
public $POP3_PORT = 110;
@@ -45,7 +45,7 @@
/**
* Default timeout in seconds.
- * @type integer
+ * @var integer
* @access public
*/
public $POP3_TIMEOUT = 30;
@@ -52,7 +52,7 @@
/**
* POP3 Carriage Return + Line Feed.
- * @type string
+ * @var string
* @access public
* @deprecated Use the constant instead
*/
@@ -61,7 +61,7 @@
/**
* Debug display level.
* Options: 0 = no, 1+ = yes
- * @type integer
+ * @var integer
* @access public
*/
public $do_debug = 0;
@@ -68,7 +68,7 @@
/**
* POP3 mail server hostname.
- * @type string
+ * @var string
* @access public
*/
public $host;
@@ -75,7 +75,7 @@
/**
* POP3 port number.
- * @type integer
+ * @var integer
* @access public
*/
public $port;
@@ -82,7 +82,7 @@
/**
* POP3 Timeout Value in seconds.
- * @type integer
+ * @var integer
* @access public
*/
public $tval;
@@ -89,7 +89,7 @@
/**
* POP3 username
- * @type string
+ * @var string
* @access public
*/
public $username;
@@ -96,7 +96,7 @@
/**
* POP3 password.
- * @type string
+ * @var string
* @access public
*/
public $password;
@@ -103,24 +103,24 @@
/**
* Resource handle for the POP3 connection socket.
- * @type resource
- * @access private
+ * @var resource
+ * @access protected
*/
- private $pop_conn;
+ protected $pop_conn;
/**
* Are we connected?
- * @type boolean
- * @access private
+ * @var boolean
+ * @access protected
*/
- private $connected = false;
+ protected $connected = false;
/**
* Error container.
- * @type array
- * @access private
+ * @var array
+ * @access protected
*/
- private $errors = array();
+ protected $errors = array();
/**
* Line break constant
@@ -310,9 +310,9 @@
* $size is the maximum number of bytes to retrieve
* @param integer $size
* @return string
- * @access private
+ * @access protected
*/
- private function getResponse($size = 128)
+ protected function getResponse($size = 128)
{
$response = fgets($this->pop_conn, $size);
if ($this->do_debug >= 1) {
@@ -325,9 +325,9 @@
* Send raw data to the POP3 server.
* @param string $string
* @return integer
- * @access private
+ * @access protected
*/
- private function sendString($string)
+ protected function sendString($string)
{
if ($this->pop_conn) {
if ($this->do_debug >= 2) { //Show client messages when debug >= 2
@@ -343,9 +343,9 @@
* Looks for for +OK or -ERR.
* @param string $string
* @return boolean
- * @access private
+ * @access protected
*/
- private function checkResponse($string)
+ protected function checkResponse($string)
{
if (substr($string, 0, 3) !== '+OK') {
$this->setError(array(
@@ -363,8 +363,9 @@
* Add an error to the internal error store.
* Also display debug output if it's enabled.
* @param $error
+ * @access protected
*/
- private function setError($error)
+ protected function setError($error)
{
$this->errors[] = $error;
if ($this->do_debug >= 1) {
@@ -377,14 +378,23 @@
}
/**
+ * Get an array of error messages, if any.
+ * @return array
+ */
+ public function getErrors()
+ {
+ return $this->errors;
+ }
+
+ /**
* POP3 connection error handler.
* @param integer $errno
* @param string $errstr
* @param string $errfile
* @param integer $errline
- * @access private
+ * @access protected
*/
- private function catchWarning($errno, $errstr, $errfile, $errline)
+ protected function catchWarning($errno, $errstr, $errfile, $errline)
{
$this->setError(array(
'error' => "Connecting to the POP3 server raised a PHP warning: ",
Modified: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.smtp.php
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.smtp.php
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/class.smtp.php
2017-03-17 15:58:52 UTC (rev 16450)
@@ -28,25 +28,25 @@
{
/**
* The PHPMailer SMTP version number.
- * @type string
+ * @var string
*/
- const VERSION = '5.2.10';
+ const VERSION = '5.2.23';
/**
* SMTP line break constant.
- * @type string
+ * @var string
*/
const CRLF = "\r\n";
/**
* The SMTP port to use if one is not specified.
- * @type integer
+ * @var integer
*/
const DEFAULT_SMTP_PORT = 25;
/**
* The maximum line length allowed by RFC 2822 section 2.1.1
- * @type integer
+ * @var integer
*/
const MAX_LINE_LENGTH = 998;
@@ -77,15 +77,15 @@
/**
* The PHPMailer SMTP Version number.
- * @type string
+ * @var string
* @deprecated Use the `VERSION` constant instead
* @see SMTP::VERSION
*/
- public $Version = '5.2.10';
+ public $Version = '5.2.23';
/**
* SMTP server port number.
- * @type integer
+ * @var integer
* @deprecated This is only ever used as a default value, so use the
`DEFAULT_SMTP_PORT` constant instead
* @see SMTP::DEFAULT_SMTP_PORT
*/
@@ -93,7 +93,7 @@
/**
* SMTP reply line ending.
- * @type string
+ * @var string
* @deprecated Use the `CRLF` constant instead
* @see SMTP::CRLF
*/
@@ -107,7 +107,7 @@
* * self::DEBUG_SERVER (`2`) Client commands and server responses
* * self::DEBUG_CONNECTION (`3`) As DEBUG_SERVER plus connection status
* * self::DEBUG_LOWLEVEL (`4`) Low-level data output, all messages
- * @type integer
+ * @var integer
*/
public $do_debug = self::DEBUG_OFF;
@@ -122,7 +122,7 @@
* <code>
* $smtp->Debugoutput = function($str, $level) {echo "debug level $level;
message: $str";};
* </code>
- * @type string|callable
+ * @var string|callable
*/
public $Debugoutput = 'echo';
@@ -130,7 +130,7 @@
* Whether to use VERP.
* @link http://en.wikipedia.org/wiki/Variable_envelope_return_path
* @link http://www.postfix.org/VERP_README.html Info on VERP
- * @type boolean
+ * @var boolean
*/
public $do_verp = false;
@@ -139,7 +139,7 @@
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
* This needs to be quite high to function correctly with hosts using
greetdelay as an anti-spam measure.
* @link http://tools.ietf.org/html/rfc2821#section-4.5.3.2
- * @type integer
+ * @var integer
*/
public $Timeout = 300;
@@ -146,19 +146,30 @@
/**
* How long to wait for commands to complete, in seconds.
* Default of 5 minutes (300sec) is from RFC2821 section 4.5.3.2
- * @type integer
+ * @var integer
*/
public $Timelimit = 300;
/**
+ * @var array patterns to extract smtp transaction id from smtp reply
+ * Only first capture group will be use, use non-capturing group to deal
with it
+ * Extend this class to override this property to fulfil your needs.
+ */
+ protected $smtp_transaction_id_patterns = array(
+ 'exim' => '/[0-9]{3} OK id=(.*)/',
+ 'sendmail' => '/[0-9]{3} 2.0.0 (.*) Message/',
+ 'postfix' => '/[0-9]{3} 2.0.0 Ok: queued as (.*)/'
+ );
+
+ /**
* The socket for the server connection.
- * @type resource
+ * @var resource
*/
protected $smtp_conn;
/**
* Error information, if any, for the last SMTP command.
- * @type array
+ * @var array
*/
protected $error = array(
'error' => '',
@@ -170,7 +181,7 @@
/**
* The reply the server sent to us for HELO.
* If null, no HELO string has yet been received.
- * @type string|null
+ * @var string|null
*/
protected $helo_rply = null;
@@ -181,13 +192,13 @@
* represents the server name. In case of HELO it is the only element of
the array.
* Other values can be boolean TRUE or an array containing extension
options.
* If null, no HELO/EHLO string has yet been received.
- * @type array|null
+ * @var array|null
*/
protected $server_caps = null;
/**
* The most recent reply received from the server.
- * @type string
+ * @var string
*/
protected $last_reply = '';
@@ -206,7 +217,7 @@
}
//Avoid clash with built-in function names
if (!in_array($this->Debugoutput, array('error_log', 'html', 'echo'))
and is_callable($this->Debugoutput)) {
- call_user_func($this->Debugoutput, $str, $this->do_debug);
+ call_user_func($this->Debugoutput, $str, $level);
return;
}
switch ($this->Debugoutput) {
@@ -220,8 +231,7 @@
preg_replace('/[\r\n]+/', '', $str),
ENT_QUOTES,
'UTF-8'
- )
- . "<br>\n";
+ ) . "<br>\n";
break;
case 'echo':
default:
@@ -231,7 +241,7 @@
"\n",
"\n \t ",
trim($str)
- )."\n";
+ ) . "\n";
}
}
@@ -265,7 +275,8 @@
}
// Connect to the SMTP server
$this->edebug(
- "Connection: opening to $host:$port, timeout=$timeout,
options=".var_export($options, true),
+ "Connection: opening to $host:$port, timeout=$timeout, options=" .
+ var_export($options, true),
self::DEBUG_CONNECTION
);
$errno = 0;
@@ -272,8 +283,8 @@
$errstr = '';
if ($streamok) {
$socket_context = stream_context_create($options);
- //Suppress errors; connection failures are handled at a higher
level
- $this->smtp_conn = @stream_socket_client(
+ set_error_handler(array($this, 'errorHandler'));
+ $this->smtp_conn = stream_socket_client(
$host . ":" . $port,
$errno,
$errstr,
@@ -281,6 +292,7 @@
STREAM_CLIENT_CONNECT,
$socket_context
);
+ restore_error_handler();
} else {
//Fall back to fsockopen which should work in more places, but is
missing some features
$this->edebug(
@@ -287,6 +299,7 @@
"Connection: stream_socket_client not available, falling back
to fsockopen",
self::DEBUG_CONNECTION
);
+ set_error_handler(array($this, 'errorHandler'));
$this->smtp_conn = fsockopen(
$host,
$port,
@@ -294,6 +307,7 @@
$errstr,
$timeout
);
+ restore_error_handler();
}
// Verify we connected properly
if (!is_resource($this->smtp_conn)) {
@@ -336,15 +350,26 @@
if (!$this->sendCommand('STARTTLS', 'STARTTLS', 220)) {
return false;
}
+
+ //Allow the best TLS version(s) we can
+ $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT;
+
+ //PHP 5.6.7 dropped inclusion of TLS 1.1 and 1.2 in
STREAM_CRYPTO_METHOD_TLS_CLIENT
+ //so add them back in manually if we can
+ if (defined('STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT')) {
+ $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
+ $crypto_method |= STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT;
+ }
+
// Begin encrypted connection
- if (!stream_socket_enable_crypto(
+ set_error_handler(array($this, 'errorHandler'));
+ $crypto_ok = stream_socket_enable_crypto(
$this->smtp_conn,
true,
- STREAM_CRYPTO_METHOD_TLS_CLIENT
- )) {
- return false;
- }
- return true;
+ $crypto_method
+ );
+ restore_error_handler();
+ return $crypto_ok;
}
/**
@@ -351,13 +376,13 @@
* Perform SMTP authentication.
* Must be run after hello().
* @see hello()
- * @param string $username The user name
- * @param string $password The password
- * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5)
- * @param string $realm The auth realm for NTLM
+ * @param string $username The user name
+ * @param string $password The password
+ * @param string $authtype The auth type (PLAIN, LOGIN, NTLM, CRAM-MD5,
XOAUTH2)
+ * @param string $realm The auth realm for NTLM
* @param string $workstation The auth workstation for NTLM
- * @access public
- * @return boolean True if successfully authenticated.
+ * @param null|OAuth $OAuth An optional OAuth instance (@see
PHPMailerOAuth)
+ * @return bool True if successfully authenticated.* @access public
*/
public function authenticate(
$username,
@@ -364,7 +389,8 @@
$password,
$authtype = null,
$realm = '',
- $workstation = ''
+ $workstation = '',
+ $OAuth = null
) {
if (!$this->server_caps) {
$this->setError('Authentication is not allowed before HELO/EHLO');
@@ -372,8 +398,7 @@
}
if (array_key_exists('EHLO', $this->server_caps)) {
- // SMTP extensions are available. Let's try to find a proper
authentication method
-
+ // SMTP extensions are available; try to find a proper
authentication method
if (!array_key_exists('AUTH', $this->server_caps)) {
$this->setError('Authentication is not allowed at this stage');
// 'at this stage' means that auth may be allowed after the
stage changes
@@ -388,7 +413,7 @@
);
if (empty($authtype)) {
- foreach (array('LOGIN', 'CRAM-MD5', 'NTLM', 'PLAIN') as
$method) {
+ foreach (array('CRAM-MD5', 'LOGIN', 'PLAIN', 'NTLM',
'XOAUTH2') as $method) {
if (in_array($method, $this->server_caps['AUTH'])) {
$authtype = $method;
break;
@@ -398,7 +423,7 @@
$this->setError('No supported authentication methods
found');
return false;
}
- self::edebug('Auth method selected: '.$authtype,
self::DEBUG_LOWLEVEL);
+ self::edebug('Auth method selected: ' . $authtype,
self::DEBUG_LOWLEVEL);
}
if (!in_array($authtype, $this->server_caps['AUTH'])) {
@@ -436,6 +461,19 @@
return false;
}
break;
+ case 'XOAUTH2':
+ //If the OAuth Instance is not set. Can be a case when
PHPMailer is used
+ //instead of PHPMailerOAuth
+ if (is_null($OAuth)) {
+ return false;
+ }
+ $oauth = $OAuth->getOauth64();
+
+ // Start authentication
+ if (!$this->sendCommand('AUTH', 'AUTH XOAUTH2 ' . $oauth,
235)) {
+ return false;
+ }
+ break;
case 'NTLM':
/*
* ntlm_sasl_client.php
@@ -449,7 +487,7 @@
$temp = new stdClass;
$ntlm_client = new ntlm_sasl_client_class;
//Check that functions are available
- if (!$ntlm_client->Initialize($temp)) {
+ if (!$ntlm_client->initialize($temp)) {
$this->setError($temp->error);
$this->edebug(
'You need to enable some modules in your php.ini file:
'
@@ -459,7 +497,7 @@
return false;
}
//msg1
- $msg1 = $ntlm_client->TypeMsg1($realm, $workstation); //msg1
+ $msg1 = $ntlm_client->typeMsg1($realm, $workstation); //msg1
if (!$this->sendCommand(
'AUTH NTLM',
@@ -478,7 +516,7 @@
$password
);
//msg3
- $msg3 = $ntlm_client->TypeMsg3(
+ $msg3 = $ntlm_client->typeMsg3(
$ntlm_res,
$username,
$realm,
@@ -511,7 +549,7 @@
* Works like hash_hmac('md5', $data, $key)
* in case that function is not available
* @param string $data The data to hash
- * @param string $key The key to hash with
+ * @param string $key The key to hash with
* @access protected
* @return string
*/
@@ -722,7 +760,7 @@
protected function parseHelloFields($type)
{
$this->server_caps = array();
- $lines = explode("\n", $this->last_reply);
+ $lines = explode("\n", $this->helo_rply);
foreach ($lines as $n => $s) {
//First 4 chars contain response code followed by - or space
@@ -800,15 +838,15 @@
* Sets the TO argument to $toaddr.
* Returns true if the recipient was accepted false if it was rejected.
* Implements from rfc 821: RCPT <SP> TO:<forward-path> <CRLF>
- * @param string $toaddr The address the message is being sent to
+ * @param string $address The address the message is being sent to
* @access public
* @return boolean
*/
- public function recipient($toaddr)
+ public function recipient($address)
{
return $this->sendCommand(
'RCPT TO',
- 'RCPT TO:<' . $toaddr . '>',
+ 'RCPT TO:<' . $address . '>',
array(250, 251)
);
}
@@ -827,9 +865,9 @@
/**
* Send a command to an SMTP server and check its return code.
- * @param string $command The command name - not sent to the server
+ * @param string $command The command name - not sent to the server
* @param string $commandstring The actual command to send
- * @param integer|array $expect One or more expected integer success
codes
+ * @param integer|array $expect One or more expected integer success codes
* @access protected
* @return boolean True on success.
*/
@@ -839,6 +877,11 @@
$this->setError("Called $command without being connected");
return false;
}
+ //Reject line breaks in all commands
+ if (strpos($commandstring, "\n") !== false or strpos($commandstring,
"\r") !== false) {
+ $this->setError("Command '$command' contained line breaks");
+ return false;
+ }
$this->client_send($commandstring . self::CRLF);
$this->last_reply = $this->get_lines();
@@ -849,7 +892,8 @@
$code_ex = (count($matches) > 2 ? $matches[2] : null);
// Cut off error code from each response line
$detail = preg_replace(
- "/{$code}[ -]".($code_ex ? str_replace('.', '\\.', $code_ex).'
' : '')."/m",
+ "/{$code}[ -]" .
+ ($code_ex ? str_replace('.', '\\.', $code_ex) . ' ' : '') .
"/m",
'',
$this->last_reply
);
@@ -1061,7 +1105,7 @@
// Now check if reads took too long
if ($endtime and time() > $endtime) {
$this->edebug(
- 'SMTP -> get_lines(): timelimit reached ('.
+ 'SMTP -> get_lines(): timelimit reached (' .
$this->Timelimit . ' sec)',
self::DEBUG_LOWLEVEL
);
@@ -1159,4 +1203,49 @@
{
return $this->Timeout;
}
+
+ /**
+ * Reports an error number and string.
+ * @param integer $errno The error number returned by PHP.
+ * @param string $errmsg The error message returned by PHP.
+ * @param string $errfile The file the error occurred in
+ * @param integer $errline The line number the error occurred on
+ */
+ protected function errorHandler($errno, $errmsg, $errfile = '', $errline =
0)
+ {
+ $notice = 'Connection failed.';
+ $this->setError(
+ $notice,
+ $errno,
+ $errmsg
+ );
+ $this->edebug(
+ $notice . ' Error #' . $errno . ': ' . $errmsg . " [$errfile line
$errline]",
+ self::DEBUG_CONNECTION
+ );
+ }
+
+ /**
+ * Will return the ID of the last smtp transaction based on a list of
patterns provided
+ * in SMTP::$smtp_transaction_id_patterns.
+ * If no reply has been received yet, it will return null.
+ * If no pattern has been matched, it will return false.
+ * @return bool|null|string
+ */
+ public function getLastTransactionID()
+ {
+ $reply = $this->getLastReply();
+
+ if (empty($reply)) {
+ return null;
+ }
+
+ foreach ($this->smtp_transaction_id_patterns as
$smtp_transaction_id_pattern) {
+ if (preg_match($smtp_transaction_id_pattern, $reply, $matches)) {
+ return $matches[1];
+ }
+ }
+
+ return false;
+ }
}
Modified: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.json
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.json
2017-03-17 15:56:12 UTC (rev 16449)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.json
2017-03-17 15:58:52 UTC (rev 16450)
@@ -23,12 +23,33 @@
"php": ">=5.0.0"
},
"require-dev": {
- "phpdocumentor/phpdocumentor": "*",
- "phpunit/phpunit": "4.3.*"
+ "doctrine/annotations": "1.2.*",
+ "jms/serializer": "0.16.*",
+ "phpdocumentor/phpdocumentor": "2.*",
+ "phpunit/phpunit": "4.8.*",
+ "symfony/debug": "2.8.*",
+ "symfony/filesystem": "2.8.*",
+ "symfony/translation": "2.8.*",
+ "symfony/yaml": "2.8.*",
+ "zendframework/zend-cache": "2.5.1",
+ "zendframework/zend-config": "2.5.1",
+ "zendframework/zend-eventmanager": "2.5.1",
+ "zendframework/zend-filter": "2.5.1",
+ "zendframework/zend-i18n": "2.5.1",
+ "zendframework/zend-json": "2.5.1",
+ "zendframework/zend-math": "2.5.1",
+ "zendframework/zend-serializer": "2.5.*",
+ "zendframework/zend-servicemanager": "2.5.*",
+ "zendframework/zend-stdlib": "2.5.1"
},
+ "suggest": {
+ "league/oauth2-google": "Needed for Google XOAUTH2 authentication"
+ },
"autoload": {
"classmap": [
"class.phpmailer.php",
+ "class.phpmaileroauth.php",
+ "class.phpmaileroauthgoogle.php",
"class.smtp.php",
"class.pop3.php",
"extras/EasyPeasyICS.php",
@@ -36,4 +57,4 @@
]
},
"license": "LGPL-2.1"
-}
\ No newline at end of file
+}
Copied: branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.lock (from
rev 16449, trunk/phpgwapi/inc/phpmailer/composer.lock)
===================================================================
--- branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.lock
(rev 0)
+++ branches/Version-2_0-branch/phpgwapi/inc/phpmailer/composer.lock
2017-03-17 15:58:52 UTC (rev 16450)
@@ -0,0 +1,3593 @@
+{
+ "_readme": [
+ "This file locks the dependencies of your project to a known state",
+ "Read more about it at
https://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file",
+ "This file is @generated automatically"
+ ],
+ "content-hash": "7e4b1bef833056eed0df39fad5399d7a",
+ "packages": [],
+ "packages-dev": [
+ {
+ "name": "cilex/cilex",
+ "version": "1.1.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Cilex/Cilex.git",
+ "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/Cilex/Cilex/zipball/7acd965a609a56d0345e8b6071c261fbdb926cb5",
+ "reference": "7acd965a609a56d0345e8b6071c261fbdb926cb5",
+ "shasum": ""
+ },
+ "require": {
+ "cilex/console-service-provider": "1.*",
+ "php": ">=5.3.3",
+ "pimple/pimple": "~1.0",
+ "symfony/finder": "~2.1",
+ "symfony/process": "~2.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "3.7.*",
+ "symfony/validator": "~2.1"
+ },
+ "suggest": {
+ "monolog/monolog": ">=1.0.0",
+ "symfony/validator": ">=1.0.0",
+ "symfony/yaml": ">=1.0.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Cilex": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "The PHP micro-framework for Command line tools
based on the Symfony2 Components",
+ "homepage": "http://cilex.github.com",
+ "keywords": [
+ "cli",
+ "microframework"
+ ],
+ "time": "2014-03-29T14:03:13+00:00"
+ },
+ {
+ "name": "cilex/console-service-provider",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Cilex/console-service-provider.git",
+ "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/Cilex/console-service-provider/zipball/25ee3d1875243d38e1a3448ff94bdf944f70d24e",
+ "reference": "25ee3d1875243d38e1a3448ff94bdf944f70d24e",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "pimple/pimple": "address@hidden",
+ "symfony/console": "~2.1"
+ },
+ "require-dev": {
+ "cilex/cilex": "address@hidden",
+ "silex/silex": "address@hidden"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Cilex\\Provider\\Console": "src"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Beau Simensen",
+ "email": "address@hidden",
+ "homepage": "http://beausimensen.com"
+ },
+ {
+ "name": "Mike van Riel",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Console Service Provider",
+ "keywords": [
+ "cilex",
+ "console",
+ "pimple",
+ "service-provider",
+ "silex"
+ ],
+ "time": "2012-12-19T10:50:58+00:00"
+ },
+ {
+ "name": "doctrine/annotations",
+ "version": "v1.2.7",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/annotations.git",
+ "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/doctrine/annotations/zipball/f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
+ "reference": "f25c8aab83e0c3e976fd7d19875f198ccf2f7535",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/lexer": "1.*",
+ "php": ">=5.3.2"
+ },
+ "require-dev": {
+ "doctrine/cache": "1.*",
+ "phpunit/phpunit": "4.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Annotations\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Benjamin Eberlei",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Jonathan Wage",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Docblock Annotations Parser",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "annotations",
+ "docblock",
+ "parser"
+ ],
+ "time": "2015-08-31T12:32:49+00:00"
+ },
+ {
+ "name": "doctrine/instantiator",
+ "version": "1.0.5",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/instantiator.git",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/doctrine/instantiator/zipball/8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "reference": "8e884e78f9f0eb1329e445619e04456e64d8051d",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3,<8.0-DEV"
+ },
+ "require-dev": {
+ "athletic/athletic": "~0.1.8",
+ "ext-pdo": "*",
+ "ext-phar": "*",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~2.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Doctrine\\Instantiator\\": "src/Doctrine/Instantiator/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Marco Pivetta",
+ "email": "address@hidden",
+ "homepage": "http://ocramius.github.com/"
+ }
+ ],
+ "description": "A small, lightweight utility to instantiate
objects in PHP without invoking their constructors",
+ "homepage": "https://github.com/doctrine/instantiator",
+ "keywords": [
+ "constructor",
+ "instantiate"
+ ],
+ "time": "2015-06-14T21:17:01+00:00"
+ },
+ {
+ "name": "doctrine/lexer",
+ "version": "v1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/doctrine/lexer.git",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/doctrine/lexer/zipball/83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "reference": "83893c552fd2045dd78aef794c31e694c37c0b8c",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.2"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Doctrine\\Common\\Lexer\\": "lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Roman Borschel",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Guilherme Blanco",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Johannes Schmitt",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Base library for a lexer that can be used in
Top-Down, Recursive Descent Parsers.",
+ "homepage": "http://www.doctrine-project.org",
+ "keywords": [
+ "lexer",
+ "parser"
+ ],
+ "time": "2014-09-09T13:34:57+00:00"
+ },
+ {
+ "name": "erusev/parsedown",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/erusev/parsedown.git",
+ "reference": "20ff8bbb57205368b4b42d094642a3e52dac85fb"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/erusev/parsedown/zipball/20ff8bbb57205368b4b42d094642a3e52dac85fb",
+ "reference": "20ff8bbb57205368b4b42d094642a3e52dac85fb",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "Parsedown": ""
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Emanuil Rusev",
+ "email": "address@hidden",
+ "homepage": "http://erusev.com"
+ }
+ ],
+ "description": "Parser for Markdown.",
+ "homepage": "http://parsedown.org",
+ "keywords": [
+ "markdown",
+ "parser"
+ ],
+ "time": "2016-11-02T15:56:58+00:00"
+ },
+ {
+ "name": "herrera-io/json",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kherge-php/json.git",
+ "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/kherge-php/json/zipball/60c696c9370a1e5136816ca557c17f82a6fa83f1",
+ "reference": "60c696c9370a1e5136816ca557c17f82a6fa83f1",
+ "shasum": ""
+ },
+ "require": {
+ "ext-json": "*",
+ "justinrainbow/json-schema": ">=1.0,<2.0-dev",
+ "php": ">=5.3.3",
+ "seld/jsonlint": ">=1.0,<2.0-dev"
+ },
+ "require-dev": {
+ "herrera-io/phpunit-test-case": "1.*",
+ "mikey179/vfsstream": "1.1.0",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/lib/json_version.php"
+ ],
+ "psr-0": {
+ "Herrera\\Json": "src/lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Herrera",
+ "email": "address@hidden",
+ "homepage": "http://kevin.herrera.io/",
+ "role": "Developer"
+ }
+ ],
+ "description": "A library for simplifying JSON linting and
validation.",
+ "homepage": "http://herrera-io.github.com/php-json",
+ "keywords": [
+ "json",
+ "lint",
+ "schema",
+ "validate"
+ ],
+ "abandoned": "kherge/json",
+ "time": "2013-10-30T16:51:34+00:00"
+ },
+ {
+ "name": "herrera-io/phar-update",
+ "version": "1.0.3",
+ "source": {
+ "type": "git",
+ "url":
"https://github.com/kherge-abandoned/php-phar-update.git",
+ "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/kherge-abandoned/php-phar-update/zipball/00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b",
+ "reference": "00a79e1d5b8cf3c080a2e3becf1ddf7a7fea025b",
+ "shasum": ""
+ },
+ "require": {
+ "herrera-io/json": "1.*",
+ "kherge/version": "1.*",
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "herrera-io/phpunit-test-case": "1.*",
+ "mikey179/vfsstream": "1.1.0",
+ "phpunit/phpunit": "3.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "src/lib/constants.php"
+ ],
+ "psr-0": {
+ "Herrera\\Phar\\Update": "src/lib"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Herrera",
+ "email": "address@hidden",
+ "homepage": "http://kevin.herrera.io/",
+ "role": "Developer"
+ }
+ ],
+ "description": "A library for self-updating Phars.",
+ "homepage": "http://herrera-io.github.com/php-phar-update",
+ "keywords": [
+ "phar",
+ "update"
+ ],
+ "abandoned": true,
+ "time": "2013-10-30T17:23:01+00:00"
+ },
+ {
+ "name": "jms/metadata",
+ "version": "1.6.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/metadata.git",
+ "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/schmittjoh/metadata/zipball/6a06970a10e0a532fb52d3959547123b84a3b3ab",
+ "reference": "6a06970a10e0a532fb52d3959547123b84a3b3ab",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "doctrine/cache": "~1.0",
+ "symfony/cache": "~3.1"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.5.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Metadata\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache-2.0"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Class/method/property metadata management in PHP",
+ "keywords": [
+ "annotations",
+ "metadata",
+ "xml",
+ "yaml"
+ ],
+ "time": "2016-12-05T10:18:33+00:00"
+ },
+ {
+ "name": "jms/parser-lib",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/parser-lib.git",
+ "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/schmittjoh/parser-lib/zipball/c509473bc1b4866415627af0e1c6cc8ac97fa51d",
+ "reference": "c509473bc1b4866415627af0e1c6cc8ac97fa51d",
+ "shasum": ""
+ },
+ "require": {
+ "phpoption/phpoption": ">=0.9,<2.0-dev"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "JMS\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache2"
+ ],
+ "description": "A library for easily creating recursive-descent
parsers.",
+ "time": "2012-11-18T18:08:43+00:00"
+ },
+ {
+ "name": "jms/serializer",
+ "version": "0.16.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/serializer.git",
+ "reference": "c8a171357ca92b6706e395c757f334902d430ea9"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/schmittjoh/serializer/zipball/c8a171357ca92b6706e395c757f334902d430ea9",
+ "reference": "c8a171357ca92b6706e395c757f334902d430ea9",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/annotations": "1.*",
+ "jms/metadata": "~1.1",
+ "jms/parser-lib": "1.*",
+ "php": ">=5.3.2",
+ "phpcollection/phpcollection": "~0.1"
+ },
+ "require-dev": {
+ "doctrine/orm": "~2.1",
+ "doctrine/phpcr-odm": "~1.0.1",
+ "jackalope/jackalope-doctrine-dbal": "1.0.*",
+ "propel/propel1": "~1.7",
+ "symfony/filesystem": "2.*",
+ "symfony/form": "~2.1",
+ "symfony/translation": "~2.0",
+ "symfony/validator": "~2.0",
+ "symfony/yaml": "2.*",
+ "twig/twig": ">=1.8,<2.0-dev"
+ },
+ "suggest": {
+ "symfony/yaml": "Required if you'd like to serialize data to
YAML format."
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.15-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "JMS\\Serializer": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache2"
+ ],
+ "authors": [
+ {
+ "name": "Johannes Schmitt",
+ "email": "address@hidden",
+ "homepage": "https://github.com/schmittjoh",
+ "role": "Developer of wrapped JMSSerializerBundle"
+ }
+ ],
+ "description": "Library for (de-)serializing data of any
complexity; supports XML, JSON, and YAML.",
+ "homepage": "http://jmsyst.com/libs/serializer",
+ "keywords": [
+ "deserialization",
+ "jaxb",
+ "json",
+ "serialization",
+ "xml"
+ ],
+ "time": "2014-03-18T08:39:00+00:00"
+ },
+ {
+ "name": "justinrainbow/json-schema",
+ "version": "1.6.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/justinrainbow/json-schema.git",
+ "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/justinrainbow/json-schema/zipball/cc84765fb7317f6b07bd8ac78364747f95b86341",
+ "reference": "cc84765fb7317f6b07bd8ac78364747f95b86341",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.29"
+ },
+ "require-dev": {
+ "json-schema/json-schema-test-suite": "1.1.0",
+ "phpdocumentor/phpdocumentor": "~2",
+ "phpunit/phpunit": "~3.7"
+ },
+ "bin": [
+ "bin/validate-json"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "JsonSchema\\": "src/JsonSchema/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Bruno Prieto Reis",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Justin Rainbow",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Igor Wiedler",
+ "email": "address@hidden"
+ },
+ {
+ "name": "Robert Schönthal",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "A library to validate a json schema.",
+ "homepage": "https://github.com/justinrainbow/json-schema",
+ "keywords": [
+ "json",
+ "schema"
+ ],
+ "time": "2016-01-25T15:43:01+00:00"
+ },
+ {
+ "name": "kherge/version",
+ "version": "1.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/kherge-abandoned/Version.git",
+ "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/kherge-abandoned/Version/zipball/f07cf83f8ce533be8f93d2893d96d674bbeb7e30",
+ "reference": "f07cf83f8ce533be8f93d2893d96d674bbeb7e30",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "KevinGH\\Version": "src/lib/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Kevin Herrera",
+ "email": "address@hidden",
+ "homepage": "http://www.kevingh.com/"
+ }
+ ],
+ "description": "A parsing and comparison library for semantic
versioning.",
+ "homepage": "http://github.com/kherge/Version",
+ "abandoned": true,
+ "time": "2012-08-16T17:13:03+00:00"
+ },
+ {
+ "name": "monolog/monolog",
+ "version": "1.22.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/Seldaek/monolog.git",
+ "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/Seldaek/monolog/zipball/1e044bc4b34e91743943479f1be7a1d5eb93add0",
+ "reference": "1e044bc4b34e91743943479f1be7a1d5eb93add0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0",
+ "psr/log": "~1.0"
+ },
+ "provide": {
+ "psr/log-implementation": "1.0.0"
+ },
+ "require-dev": {
+ "aws/aws-sdk-php": "^2.4.9 || ^3.0",
+ "doctrine/couchdb": "address@hidden",
+ "graylog2/gelf-php": "~1.0",
+ "jakub-onderka/php-parallel-lint": "0.9",
+ "php-amqplib/php-amqplib": "~2.4",
+ "php-console/php-console": "^3.1.3",
+ "phpunit/phpunit": "~4.5",
+ "phpunit/phpunit-mock-objects": "2.3.0",
+ "ruflin/elastica": ">=0.90 <3.0",
+ "sentry/sentry": "^0.13",
+ "swiftmailer/swiftmailer": "~5.3"
+ },
+ "suggest": {
+ "aws/aws-sdk-php": "Allow sending log messages to AWS services
like DynamoDB",
+ "doctrine/couchdb": "Allow sending log messages to a CouchDB
server",
+ "ext-amqp": "Allow sending log messages to an AMQP server
(1.0+ required)",
+ "ext-mongo": "Allow sending log messages to a MongoDB server",
+ "graylog2/gelf-php": "Allow sending log messages to a GrayLog2
server",
+ "mongodb/mongodb": "Allow sending log messages to a MongoDB
server via PHP Driver",
+ "php-amqplib/php-amqplib": "Allow sending log messages to an
AMQP server using php-amqplib",
+ "php-console/php-console": "Allow sending log messages to
Google Chrome",
+ "rollbar/rollbar": "Allow sending log messages to Rollbar",
+ "ruflin/elastica": "Allow sending log messages to an Elastic
Search server",
+ "sentry/sentry": "Allow sending log messages to a Sentry
server"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-4": {
+ "Monolog\\": "src/Monolog"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Jordi Boggiano",
+ "email": "address@hidden",
+ "homepage": "http://seld.be"
+ }
+ ],
+ "description": "Sends your logs to files, sockets, inboxes,
databases and various web services",
+ "homepage": "http://github.com/Seldaek/monolog",
+ "keywords": [
+ "log",
+ "logging",
+ "psr-3"
+ ],
+ "time": "2017-03-13T07:08:03+00:00"
+ },
+ {
+ "name": "nikic/php-parser",
+ "version": "v1.4.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/nikic/PHP-Parser.git",
+ "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/nikic/PHP-Parser/zipball/f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51",
+ "reference": "f78af2c9c86107aa1a34cd1dbb5bbe9eeb0d9f51",
+ "shasum": ""
+ },
+ "require": {
+ "ext-tokenizer": "*",
+ "php": ">=5.3"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.4-dev"
+ }
+ },
+ "autoload": {
+ "files": [
+ "lib/bootstrap.php"
+ ]
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "BSD-3-Clause"
+ ],
+ "authors": [
+ {
+ "name": "Nikita Popov"
+ }
+ ],
+ "description": "A PHP parser written in PHP",
+ "keywords": [
+ "parser",
+ "php"
+ ],
+ "time": "2015-09-19T14:15:08+00:00"
+ },
+ {
+ "name": "phpcollection/phpcollection",
+ "version": "0.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-collection.git",
+ "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/schmittjoh/php-collection/zipball/f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
+ "reference": "f2bcff45c0da7c27991bbc1f90f47c4b7fb434a6",
+ "shasum": ""
+ },
+ "require": {
+ "phpoption/phpoption": "1.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "0.4-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "PhpCollection": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache2"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "General-Purpose Collection Library for PHP",
+ "keywords": [
+ "collection",
+ "list",
+ "map",
+ "sequence",
+ "set"
+ ],
+ "time": "2015-05-17T12:39:23+00:00"
+ },
+ {
+ "name": "phpdocumentor/fileset",
+ "version": "1.0.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/Fileset.git",
+ "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpDocumentor/Fileset/zipball/bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0",
+ "reference": "bfa78d8fa9763dfce6d0e5d3730c1d8ab25d34b0",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3",
+ "symfony/finder": "~2.1"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~3.7"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/",
+ "tests/unit/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Fileset component for collecting a set of files
given directories and file paths",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "files",
+ "fileset",
+ "phpdoc"
+ ],
+ "time": "2013-08-06T21:07:42+00:00"
+ },
+ {
+ "name": "phpdocumentor/graphviz",
+ "version": "1.0.4",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/GraphViz.git",
+ "reference": "a906a90a9f230535f25ea31caf81b2323956283f"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpDocumentor/GraphViz/zipball/a906a90a9f230535f25ea31caf81b2323956283f",
+ "reference": "a906a90a9f230535f25ea31caf81b2323956283f",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/",
+ "tests/unit"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "address@hidden"
+ }
+ ],
+ "time": "2016-02-02T13:00:08+00:00"
+ },
+ {
+ "name": "phpdocumentor/phpdocumentor",
+ "version": "v2.9.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/phpDocumentor2.git",
+ "reference": "be607da0eef9b9249c43c5b4820d25d631c73667"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpDocumentor/phpDocumentor2/zipball/be607da0eef9b9249c43c5b4820d25d631c73667",
+ "reference": "be607da0eef9b9249c43c5b4820d25d631c73667",
+ "shasum": ""
+ },
+ "require": {
+ "cilex/cilex": "~1.0",
+ "erusev/parsedown": "~1.0",
+ "herrera-io/phar-update": "1.0.3",
+ "jms/serializer": ">=0.12",
+ "monolog/monolog": "~1.6",
+ "php": ">=5.3.3",
+ "phpdocumentor/fileset": "~1.0",
+ "phpdocumentor/graphviz": "~1.0",
+ "phpdocumentor/reflection": "^3.0",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "symfony/config": "~2.3",
+ "symfony/console": "~2.3",
+ "symfony/event-dispatcher": "~2.1",
+ "symfony/process": "~2.0",
+ "symfony/stopwatch": "~2.3",
+ "symfony/validator": "~2.2",
+ "twig/twig": "~1.3",
+ "zendframework/zend-cache": "~2.1",
+ "zendframework/zend-config": "~2.1",
+ "zendframework/zend-filter": "~2.1",
+ "zendframework/zend-i18n": "~2.1",
+ "zendframework/zend-serializer": "~2.1",
+ "zendframework/zend-servicemanager": "~2.1",
+ "zendframework/zend-stdlib": "~2.1",
+ "zetacomponents/document": ">=1.3.1"
+ },
+ "require-dev": {
+ "behat/behat": "~3.0",
+ "mikey179/vfsstream": "~1.2",
+ "mockery/mockery": "address@hidden",
+ "phpunit/phpunit": "~4.0",
+ "squizlabs/php_codesniffer": "~1.4",
+ "symfony/expression-language": "~2.4"
+ },
+ "suggest": {
+ "ext-twig": "Enabling the twig extension improves the
generation of twig based templates.",
+ "ext-xslcache": "Enabling the XSLCache extension improves the
generation of xml based templates."
+ },
+ "bin": [
+ "bin/phpdoc.php",
+ "bin/phpdoc"
+ ],
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-develop": "2.9-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/",
+ "tests/unit/"
+ ],
+ "Cilex\\Provider": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Documentation Generator for PHP",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "api",
+ "application",
+ "dga",
+ "documentation",
+ "phpdoc"
+ ],
+ "time": "2016-05-22T09:50:56+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection",
+ "version": "3.0.1",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpDocumentor/Reflection.git",
+ "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpDocumentor/Reflection/zipball/793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d",
+ "reference": "793bfd92d9a0fc96ae9608fb3e947c3f59fb3a0d",
+ "shasum": ""
+ },
+ "require": {
+ "nikic/php-parser": "^1.0",
+ "php": ">=5.3.3",
+ "phpdocumentor/reflection-docblock": "~2.0",
+ "psr/log": "~1.0"
+ },
+ "require-dev": {
+ "behat/behat": "~2.4",
+ "mockery/mockery": "~0.8",
+ "phpunit/phpunit": "~4.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/",
+ "tests/unit/",
+ "tests/mocks/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "description": "Reflection library to do Static Analysis for PHP
Projects",
+ "homepage": "http://www.phpdoc.org",
+ "keywords": [
+ "phpDocumentor",
+ "phpdoc",
+ "reflection",
+ "static analysis"
+ ],
+ "time": "2016-05-21T08:42:32+00:00"
+ },
+ {
+ "name": "phpdocumentor/reflection-docblock",
+ "version": "2.0.4",
+ "source": {
+ "type": "git",
+ "url":
"https://github.com/phpDocumentor/ReflectionDocBlock.git",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpDocumentor/ReflectionDocBlock/zipball/d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "reference": "d68dbdc53dc358a816f00b300704702b2eaff7b8",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.3"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "~4.0"
+ },
+ "suggest": {
+ "dflydev/markdown": "~1.0",
+ "erusev/parsedown": "~1.0"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "2.0.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "phpDocumentor": [
+ "src/"
+ ]
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Mike van Riel",
+ "email": "address@hidden"
+ }
+ ],
+ "time": "2015-02-03T12:10:50+00:00"
+ },
+ {
+ "name": "phpoption/phpoption",
+ "version": "1.5.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/schmittjoh/php-option.git",
+ "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/schmittjoh/php-option/zipball/94e644f7d2051a5f0fcf77d81605f152eecff0ed",
+ "reference": "94e644f7d2051a5f0fcf77d81605f152eecff0ed",
+ "shasum": ""
+ },
+ "require": {
+ "php": ">=5.3.0"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "4.7.*"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.3-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "PhpOption\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "Apache2"
+ ],
+ "authors": [
+ {
+ "name": "Johannes M. Schmitt",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Option Type for PHP",
+ "keywords": [
+ "language",
+ "option",
+ "php",
+ "type"
+ ],
+ "time": "2015-07-25T16:39:46+00:00"
+ },
+ {
+ "name": "phpspec/prophecy",
+ "version": "v1.7.0",
+ "source": {
+ "type": "git",
+ "url": "https://github.com/phpspec/prophecy.git",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073"
+ },
+ "dist": {
+ "type": "zip",
+ "url":
"https://api.github.com/repos/phpspec/prophecy/zipball/93d39f1f7f9326d746203c7c056f300f7f126073",
+ "reference": "93d39f1f7f9326d746203c7c056f300f7f126073",
+ "shasum": ""
+ },
+ "require": {
+ "doctrine/instantiator": "^1.0.2",
+ "php": "^5.3|^7.0",
+ "phpdocumentor/reflection-docblock": "^2.0|^3.0.2",
+ "sebastian/comparator": "^1.1|^2.0",
+ "sebastian/recursion-context": "^1.0|^2.0|^3.0"
+ },
+ "require-dev": {
+ "phpspec/phpspec": "^2.5|^3.2",
+ "phpunit/phpunit": "^4.8 || ^5.6.5"
+ },
+ "type": "library",
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.6.x-dev"
+ }
+ },
+ "autoload": {
+ "psr-0": {
+ "Prophecy\\": "src/"
+ }
+ },
+ "notification-url": "https://packagist.org/downloads/",
+ "license": [
+ "MIT"
+ ],
+ "authors": [
+ {
+ "name": "Konstantin Kudryashov",
+ "email": "address@hidden",
+ "homepage": "http://everzet.com"
+ },
+ {
+ "name": "Marcello Duarte",
+ "email": "address@hidden"
+ }
+ ],
+ "description": "Highly opinionated mocking framework for PHP 5.3+",
+ "homepage": "https://github.com/phpspec/prophecy",
+ "keywords": [
+ "Double",
+ "Dummy",
+ "fake",
+ "mock",
+ "spy",
+ "stub"
+ ],
+ "time": "2017-03-02T20:05:34+00:00"
+ },
+ {
+ "name": "phpunit/php-code-coverage",
+ "version": "2.2.4",
+ "source": {
+ "type": "git",
+ "url":
"https://github.com/sebastianbergmann/php-code-coverage.git",
@@ Diff output truncated at 153600 characters. @@
[Prev in Thread] |
Current Thread |
[Next in Thread] |
- [Fmsystem-commits] [16450] Stable: Merge 16447:16449 from trunk,
sigurdne <=