summaryrefslogtreecommitdiff
path: root/www/wiki/vendor/pear
diff options
context:
space:
mode:
authorYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
committerYaco <franco@reevo.org>2020-06-04 11:01:00 -0300
commitfc7369835258467bf97eb64f184b93691f9a9fd5 (patch)
treedaabd60089d2dd76d9f5fb416b005fbe159c799d /www/wiki/vendor/pear
first commit
Diffstat (limited to 'www/wiki/vendor/pear')
-rw-r--r--www/wiki/vendor/pear/console_getopt/.gitignore6
-rw-r--r--www/wiki/vendor/pear/console_getopt/.travis.yml9
-rw-r--r--www/wiki/vendor/pear/console_getopt/Console/Getopt.php365
-rw-r--r--www/wiki/vendor/pear/console_getopt/LICENSE25
-rw-r--r--www/wiki/vendor/pear/console_getopt/README.rst26
-rw-r--r--www/wiki/vendor/pear/console_getopt/composer.json35
-rw-r--r--www/wiki/vendor/pear/console_getopt/package.xml284
-rw-r--r--www/wiki/vendor/pear/console_getopt/tests/001-getopt.phpt63
-rw-r--r--www/wiki/vendor/pear/console_getopt/tests/bug10557.phpt22
-rw-r--r--www/wiki/vendor/pear/console_getopt/tests/bug11068.phpt44
-rw-r--r--www/wiki/vendor/pear/console_getopt/tests/bug13140.phpt75
-rw-r--r--www/wiki/vendor/pear/mail/LICENSE29
-rw-r--r--www/wiki/vendor/pear/mail/Mail.php267
-rw-r--r--www/wiki/vendor/pear/mail/Mail/RFC822.php929
-rw-r--r--www/wiki/vendor/pear/mail/Mail/mail.php168
-rw-r--r--www/wiki/vendor/pear/mail/Mail/mock.php142
-rw-r--r--www/wiki/vendor/pear/mail/Mail/null.php85
-rw-r--r--www/wiki/vendor/pear/mail/Mail/sendmail.php199
-rw-r--r--www/wiki/vendor/pear/mail/Mail/smtp.php461
-rw-r--r--www/wiki/vendor/pear/mail/Mail/smtpmx.php504
-rw-r--r--www/wiki/vendor/pear/mail/README.rst53
-rw-r--r--www/wiki/vendor/pear/mail/composer.json46
-rw-r--r--www/wiki/vendor/pear/mail/package.xml79
-rw-r--r--www/wiki/vendor/pear/mail/tests/13659.phpt25
-rw-r--r--www/wiki/vendor/pear/mail/tests/9137.phpt33
-rw-r--r--www/wiki/vendor/pear/mail/tests/9137_2.phpt35
-rw-r--r--www/wiki/vendor/pear/mail/tests/Makefile8
-rwxr-xr-xwww/wiki/vendor/pear/mail/tests/bug17178.phpt11
-rwxr-xr-xwww/wiki/vendor/pear/mail/tests/bug17317.phpt19
-rw-r--r--www/wiki/vendor/pear/mail/tests/rfc822.phpt107
-rw-r--r--www/wiki/vendor/pear/mail/tests/smtp_error.phpt30
-rw-r--r--www/wiki/vendor/pear/mail/tests/validateQuotedString.php17
-rw-r--r--www/wiki/vendor/pear/mail_mime/Mail/mime.php1612
-rw-r--r--www/wiki/vendor/pear/mail_mime/Mail/mimePart.php1276
-rw-r--r--www/wiki/vendor/pear/mail_mime/README19
-rw-r--r--www/wiki/vendor/pear/mail_mime/composer.json34
-rw-r--r--www/wiki/vendor/pear/mail_mime/package.xml865
-rwxr-xr-xwww/wiki/vendor/pear/mail_mime/scripts/phail.php47
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/Makefile8
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/class-filename.phpt13
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/encoding_case.phpt13
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/headers_with_mbstring.phpt148
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/headers_without_mbstring.phpt149
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt28
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt27
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_10596_1.phpt17
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_10816_1.phpt23
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_10999_1.phpt27
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_11381.phpt27
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_11731.phpt20
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_12165.phpt14
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_12385_1.phpt32
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_12411.phpt25
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_12466.phpt23
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_13032.phpt21
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_13444.phpt30
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_13962.phpt19
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_14529.phpt21
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_14779.phpt25
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_14780.phpt22
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_15320.phpt21
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_16539.phpt49
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_17025.phpt15
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_17175.phpt24
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_18083.phpt23
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_18772.phpt46
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_19497.phpt22
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_20226.phpt14
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_20273.phpt13
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_20563.phpt23
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_20564.phpt14
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_21098.phpt17
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_21205.phpt38
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_21206.phpt28
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_21255.phpt19
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_1.phpt20
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_2.phpt21
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_3.phpt23
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_7561_1.phpt24
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_8386_1.phpt22
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_8541_1.phpt19
-rw-r--r--www/wiki/vendor/pear/mail_mime/tests/test_Bug_9722_1.phpt24
-rw-r--r--www/wiki/vendor/pear/net_smtp/LICENSE69
-rw-r--r--www/wiki/vendor/pear/net_smtp/Net/SMTP.php1256
-rw-r--r--www/wiki/vendor/pear/net_smtp/composer.json48
-rw-r--r--www/wiki/vendor/pear/net_smtp/docs/docutils.conf16
-rw-r--r--www/wiki/vendor/pear/net_smtp/docs/docutils.css108
-rw-r--r--www/wiki/vendor/pear/net_smtp/docs/guide.txt267
-rw-r--r--www/wiki/vendor/pear/net_smtp/examples/basic.php39
-rw-r--r--www/wiki/vendor/pear/net_smtp/package.xml77
-rwxr-xr-xwww/wiki/vendor/pear/net_smtp/phpdoc.sh3
-rw-r--r--www/wiki/vendor/pear/net_smtp/tests/auth.phpt28
-rw-r--r--www/wiki/vendor/pear/net_smtp/tests/basic.phpt42
-rw-r--r--www/wiki/vendor/pear/net_smtp/tests/config.php.dist15
-rw-r--r--www/wiki/vendor/pear/net_smtp/tests/quotedata.phpt70
-rw-r--r--www/wiki/vendor/pear/net_socket/.gitignore4
-rw-r--r--www/wiki/vendor/pear/net_socket/.travis.yml6
-rw-r--r--www/wiki/vendor/pear/net_socket/Net/Socket.php686
-rw-r--r--www/wiki/vendor/pear/net_socket/composer.json41
-rw-r--r--www/wiki/vendor/pear/net_socket/package.xml58
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/README.rst26
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/composer.json32
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/src/OS/Guess.php337
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/src/PEAR.php1113
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/src/PEAR/Error.php14
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php979
-rw-r--r--www/wiki/vendor/pear/pear-core-minimal/src/System.php628
-rw-r--r--www/wiki/vendor/pear/pear_exception/LICENSE27
-rw-r--r--www/wiki/vendor/pear/pear_exception/PEAR/Exception.php456
-rw-r--r--www/wiki/vendor/pear/pear_exception/composer.json43
-rw-r--r--www/wiki/vendor/pear/pear_exception/package.xml120
-rw-r--r--www/wiki/vendor/pear/pear_exception/tests/PEAR/ExceptionTest.php78
112 files changed, 15991 insertions, 0 deletions
diff --git a/www/wiki/vendor/pear/console_getopt/.gitignore b/www/wiki/vendor/pear/console_getopt/.gitignore
new file mode 100644
index 00000000..78358281
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/.gitignore
@@ -0,0 +1,6 @@
+# composer related
+composer.lock
+composer.phar
+vendor
+README.html
+dist/
diff --git a/www/wiki/vendor/pear/console_getopt/.travis.yml b/www/wiki/vendor/pear/console_getopt/.travis.yml
new file mode 100644
index 00000000..2711415f
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/.travis.yml
@@ -0,0 +1,9 @@
+language: php
+php:
+ - 7
+ - 5.6
+ - 5.5
+ - 5.4
+sudo: false
+script:
+ - pear run-tests -r tests/
diff --git a/www/wiki/vendor/pear/console_getopt/Console/Getopt.php b/www/wiki/vendor/pear/console_getopt/Console/Getopt.php
new file mode 100644
index 00000000..f8df71ce
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/Console/Getopt.php
@@ -0,0 +1,365 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4: */
+/**
+ * PHP Version 5
+ *
+ * Copyright (c) 2001-2015, The PEAR developers
+ *
+ * This source file is subject to the BSD-2-Clause license,
+ * that is bundled with this package in the file LICENSE, and is
+ * available through the world-wide-web at the following url:
+ * http://opensource.org/licenses/bsd-license.php.
+ *
+ * @category Console
+ * @package Console_Getopt
+ * @author Andrei Zmievski <andrei@php.net>
+ * @license http://opensource.org/licenses/bsd-license.php BSD-2-Clause
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Console_Getopt
+ */
+
+require_once 'PEAR.php';
+
+/**
+ * Command-line options parsing class.
+ *
+ * @category Console
+ * @package Console_Getopt
+ * @author Andrei Zmievski <andrei@php.net>
+ * @license http://opensource.org/licenses/bsd-license.php BSD-2-Clause
+ * @link http://pear.php.net/package/Console_Getopt
+ */
+class Console_Getopt
+{
+
+ /**
+ * Parses the command-line options.
+ *
+ * The first parameter to this function should be the list of command-line
+ * arguments without the leading reference to the running program.
+ *
+ * The second parameter is a string of allowed short options. Each of the
+ * option letters can be followed by a colon ':' to specify that the option
+ * requires an argument, or a double colon '::' to specify that the option
+ * takes an optional argument.
+ *
+ * The third argument is an optional array of allowed long options. The
+ * leading '--' should not be included in the option name. Options that
+ * require an argument should be followed by '=', and options that take an
+ * option argument should be followed by '=='.
+ *
+ * The return value is an array of two elements: the list of parsed
+ * options and the list of non-option command-line arguments. Each entry in
+ * the list of parsed options is a pair of elements - the first one
+ * specifies the option, and the second one specifies the option argument,
+ * if there was one.
+ *
+ * Long and short options can be mixed.
+ *
+ * Most of the semantics of this function are based on GNU getopt_long().
+ *
+ * @param array $args an array of command-line arguments
+ * @param string $short_options specifies the list of allowed short options
+ * @param array $long_options specifies the list of allowed long options
+ * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
+ *
+ * @return array two-element array containing the list of parsed options and
+ * the non-option arguments
+ */
+ public static function getopt2($args, $short_options, $long_options = null, $skip_unknown = false)
+ {
+ return Console_Getopt::doGetopt(2, $args, $short_options, $long_options, $skip_unknown);
+ }
+
+ /**
+ * This function expects $args to start with the script name (POSIX-style).
+ * Preserved for backwards compatibility.
+ *
+ * @param array $args an array of command-line arguments
+ * @param string $short_options specifies the list of allowed short options
+ * @param array $long_options specifies the list of allowed long options
+ *
+ * @see getopt2()
+ * @return array two-element array containing the list of parsed options and
+ * the non-option arguments
+ */
+ public static function getopt($args, $short_options, $long_options = null, $skip_unknown = false)
+ {
+ return Console_Getopt::doGetopt(1, $args, $short_options, $long_options, $skip_unknown);
+ }
+
+ /**
+ * The actual implementation of the argument parsing code.
+ *
+ * @param int $version Version to use
+ * @param array $args an array of command-line arguments
+ * @param string $short_options specifies the list of allowed short options
+ * @param array $long_options specifies the list of allowed long options
+ * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
+ *
+ * @return array
+ */
+ public static function doGetopt($version, $args, $short_options, $long_options = null, $skip_unknown = false)
+ {
+ // in case you pass directly readPHPArgv() as the first arg
+ if (PEAR::isError($args)) {
+ return $args;
+ }
+
+ if (empty($args)) {
+ return array(array(), array());
+ }
+
+ $non_opts = $opts = array();
+
+ settype($args, 'array');
+
+ if ($long_options) {
+ sort($long_options);
+ }
+
+ /*
+ * Preserve backwards compatibility with callers that relied on
+ * erroneous POSIX fix.
+ */
+ if ($version < 2) {
+ if (isset($args[0]{0}) && $args[0]{0} != '-') {
+ array_shift($args);
+ }
+ }
+
+ for ($i = 0; $i < count($args); $i++) {
+ $arg = $args[$i];
+ /* The special element '--' means explicit end of
+ options. Treat the rest of the arguments as non-options
+ and end the loop. */
+ if ($arg == '--') {
+ $non_opts = array_merge($non_opts, array_slice($args, $i + 1));
+ break;
+ }
+
+ if ($arg{0} != '-' || (strlen($arg) > 1 && $arg{1} == '-' && !$long_options)) {
+ $non_opts = array_merge($non_opts, array_slice($args, $i));
+ break;
+ } elseif (strlen($arg) > 1 && $arg{1} == '-') {
+ $error = Console_Getopt::_parseLongOption(substr($arg, 2),
+ $long_options,
+ $opts,
+ $i,
+ $args,
+ $skip_unknown);
+ if (PEAR::isError($error)) {
+ return $error;
+ }
+ } elseif ($arg == '-') {
+ // - is stdin
+ $non_opts = array_merge($non_opts, array_slice($args, $i));
+ break;
+ } else {
+ $error = Console_Getopt::_parseShortOption(substr($arg, 1),
+ $short_options,
+ $opts,
+ $i,
+ $args,
+ $skip_unknown);
+ if (PEAR::isError($error)) {
+ return $error;
+ }
+ }
+ }
+
+ return array($opts, $non_opts);
+ }
+
+ /**
+ * Parse short option
+ *
+ * @param string $arg Argument
+ * @param string[] $short_options Available short options
+ * @param string[][] &$opts
+ * @param int &$argIdx
+ * @param string[] $args
+ * @param boolean $skip_unknown suppresses Console_Getopt: unrecognized option
+ *
+ * @return void
+ */
+ protected static function _parseShortOption($arg, $short_options, &$opts, &$argIdx, $args, $skip_unknown)
+ {
+ for ($i = 0; $i < strlen($arg); $i++) {
+ $opt = $arg{$i};
+ $opt_arg = null;
+
+ /* Try to find the short option in the specifier string. */
+ if (($spec = strstr($short_options, $opt)) === false || $arg{$i} == ':') {
+ if ($skip_unknown === true) {
+ break;
+ }
+
+ $msg = "Console_Getopt: unrecognized option -- $opt";
+ return PEAR::raiseError($msg);
+ }
+
+ if (strlen($spec) > 1 && $spec{1} == ':') {
+ if (strlen($spec) > 2 && $spec{2} == ':') {
+ if ($i + 1 < strlen($arg)) {
+ /* Option takes an optional argument. Use the remainder of
+ the arg string if there is anything left. */
+ $opts[] = array($opt, substr($arg, $i + 1));
+ break;
+ }
+ } else {
+ /* Option requires an argument. Use the remainder of the arg
+ string if there is anything left. */
+ if ($i + 1 < strlen($arg)) {
+ $opts[] = array($opt, substr($arg, $i + 1));
+ break;
+ } else if (isset($args[++$argIdx])) {
+ $opt_arg = $args[$argIdx];
+ /* Else use the next argument. */;
+ if (Console_Getopt::_isShortOpt($opt_arg)
+ || Console_Getopt::_isLongOpt($opt_arg)) {
+ $msg = "option requires an argument --$opt";
+ return PEAR::raiseError("Console_Getopt: " . $msg);
+ }
+ } else {
+ $msg = "option requires an argument --$opt";
+ return PEAR::raiseError("Console_Getopt: " . $msg);
+ }
+ }
+ }
+
+ $opts[] = array($opt, $opt_arg);
+ }
+ }
+
+ /**
+ * Checks if an argument is a short option
+ *
+ * @param string $arg Argument to check
+ *
+ * @return bool
+ */
+ protected static function _isShortOpt($arg)
+ {
+ return strlen($arg) == 2 && $arg[0] == '-'
+ && preg_match('/[a-zA-Z]/', $arg[1]);
+ }
+
+ /**
+ * Checks if an argument is a long option
+ *
+ * @param string $arg Argument to check
+ *
+ * @return bool
+ */
+ protected static function _isLongOpt($arg)
+ {
+ return strlen($arg) > 2 && $arg[0] == '-' && $arg[1] == '-' &&
+ preg_match('/[a-zA-Z]+$/', substr($arg, 2));
+ }
+
+ /**
+ * Parse long option
+ *
+ * @param string $arg Argument
+ * @param string[] $long_options Available long options
+ * @param string[][] &$opts
+ * @param int &$argIdx
+ * @param string[] $args
+ *
+ * @return void|PEAR_Error
+ */
+ protected static function _parseLongOption($arg, $long_options, &$opts, &$argIdx, $args, $skip_unknown)
+ {
+ @list($opt, $opt_arg) = explode('=', $arg, 2);
+
+ $opt_len = strlen($opt);
+
+ for ($i = 0; $i < count($long_options); $i++) {
+ $long_opt = $long_options[$i];
+ $opt_start = substr($long_opt, 0, $opt_len);
+
+ $long_opt_name = str_replace('=', '', $long_opt);
+
+ /* Option doesn't match. Go on to the next one. */
+ if ($long_opt_name != $opt) {
+ continue;
+ }
+
+ $opt_rest = substr($long_opt, $opt_len);
+
+ /* Check that the options uniquely matches one of the allowed
+ options. */
+ if ($i + 1 < count($long_options)) {
+ $next_option_rest = substr($long_options[$i + 1], $opt_len);
+ } else {
+ $next_option_rest = '';
+ }
+
+ if ($opt_rest != '' && $opt{0} != '=' &&
+ $i + 1 < count($long_options) &&
+ $opt == substr($long_options[$i+1], 0, $opt_len) &&
+ $next_option_rest != '' &&
+ $next_option_rest{0} != '=') {
+
+ $msg = "Console_Getopt: option --$opt is ambiguous";
+ return PEAR::raiseError($msg);
+ }
+
+ if (substr($long_opt, -1) == '=') {
+ if (substr($long_opt, -2) != '==') {
+ /* Long option requires an argument.
+ Take the next argument if one wasn't specified. */;
+ if (!strlen($opt_arg)) {
+ if (!isset($args[++$argIdx])) {
+ $msg = "Console_Getopt: option requires an argument --$opt";
+ return PEAR::raiseError($msg);
+ }
+ $opt_arg = $args[$argIdx];
+ }
+
+ if (Console_Getopt::_isShortOpt($opt_arg)
+ || Console_Getopt::_isLongOpt($opt_arg)) {
+ $msg = "Console_Getopt: option requires an argument --$opt";
+ return PEAR::raiseError($msg);
+ }
+ }
+ } else if ($opt_arg) {
+ $msg = "Console_Getopt: option --$opt doesn't allow an argument";
+ return PEAR::raiseError($msg);
+ }
+
+ $opts[] = array('--' . $opt, $opt_arg);
+ return;
+ }
+
+ if ($skip_unknown === true) {
+ return;
+ }
+
+ return PEAR::raiseError("Console_Getopt: unrecognized option --$opt");
+ }
+
+ /**
+ * Safely read the $argv PHP array across different PHP configurations.
+ * Will take care on register_globals and register_argc_argv ini directives
+ *
+ * @return mixed the $argv PHP array or PEAR error if not registered
+ */
+ public static function readPHPArgv()
+ {
+ global $argv;
+ if (!is_array($argv)) {
+ if (!@is_array($_SERVER['argv'])) {
+ if (!@is_array($GLOBALS['HTTP_SERVER_VARS']['argv'])) {
+ $msg = "Could not read cmd args (register_argc_argv=Off?)";
+ return PEAR::raiseError("Console_Getopt: " . $msg);
+ }
+ return $GLOBALS['HTTP_SERVER_VARS']['argv'];
+ }
+ return $_SERVER['argv'];
+ }
+ return $argv;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/console_getopt/LICENSE b/www/wiki/vendor/pear/console_getopt/LICENSE
new file mode 100644
index 00000000..452b0883
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/LICENSE
@@ -0,0 +1,25 @@
+Copyright (c) 2001-2015, The PEAR developers
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are
+met:
+
+1. Redistributions of source code must retain the above copyright
+notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+notice, this list of conditions and the following disclaimer in the
+documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/www/wiki/vendor/pear/console_getopt/README.rst b/www/wiki/vendor/pear/console_getopt/README.rst
new file mode 100644
index 00000000..64e5b41b
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/README.rst
@@ -0,0 +1,26 @@
+*******************************************
+Console_Getopt - Command-line option parser
+*******************************************
+
+This is a PHP implementation of "getopt" supporting both short and long options.
+It helps parsing command line options in your PHP script.
+
+Homepage: http://pear.php.net/package/Console_Getopt
+
+.. image:: https://travis-ci.org/pear/Console_Getopt.svg?branch=master
+ :target: https://travis-ci.org/pear/Console_Getopt
+
+
+Alternatives
+============
+
+* Console_CommandLine__ (recommended)
+* Console_GetoptPlus__
+
+__ http://pear.php.net/package/Console_CommandLine
+__ http://pear.php.net/package/Console_GetoptPlus
+
+
+License
+=======
+BSD-2-Clause
diff --git a/www/wiki/vendor/pear/console_getopt/composer.json b/www/wiki/vendor/pear/console_getopt/composer.json
new file mode 100644
index 00000000..4dc7e7cc
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/composer.json
@@ -0,0 +1,35 @@
+{
+ "authors": [
+ {
+ "email": "andrei@php.net",
+ "name": "Andrei Zmievski",
+ "role": "Lead"
+ },
+ {
+ "email": "stig@php.net",
+ "name": "Stig Bakken",
+ "role": "Developer"
+ },
+ {
+ "email": "cellog@php.net",
+ "name": "Greg Beaver",
+ "role": "Helper"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Console": "./"
+ }
+ },
+ "description": "More info available on: http://pear.php.net/package/Console_Getopt",
+ "include-path": [
+ "./"
+ ],
+ "license": "BSD-2-Clause",
+ "name": "pear/console_getopt",
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Console_Getopt",
+ "source": "https://github.com/pear/Console_Getopt"
+ },
+ "type": "library"
+}
diff --git a/www/wiki/vendor/pear/console_getopt/package.xml b/www/wiki/vendor/pear/console_getopt/package.xml
new file mode 100644
index 00000000..3c8da769
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/package.xml
@@ -0,0 +1,284 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.2" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Console_Getopt</name>
+ <channel>pear.php.net</channel>
+ <summary>Command-line option parser</summary>
+ <description>This is a PHP implementation of &quot;getopt&quot; supporting both
+short and long options.</description>
+ <lead>
+ <name>Andrei Zmievski</name>
+ <user>andrei</user>
+ <email>andrei@php.net</email>
+ <active>no</active>
+ </lead>
+ <developer>
+ <name>Stig Bakken</name>
+ <user>ssb</user>
+ <email>stig@php.net</email>
+ <active>no</active>
+ </developer>
+ <helper>
+ <name>Greg Beaver</name>
+ <user>cellog</user>
+ <email>cellog@php.net</email>
+ <active>no</active>
+ </helper>
+
+ <date>2019-02-06</date>
+ <version>
+ <release>1.4.2</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
+
+ <notes>
+* Remove use of each(), which is removed in PHP 8
+ </notes>
+
+ <contents>
+ <dir name="/">
+ <dir name="Console">
+ <file name="Getopt.php" role="php" />
+ </dir>
+ <dir name="tests">
+ <file role="test" name="001-getopt.phpt" />
+ <file role="test" name="bug10557.phpt" />
+ <file role="test" name="bug11068.phpt" />
+ <file role="test" name="bug13140.phpt" />
+ </dir>
+ </dir>
+ </contents>
+
+ <compatible>
+ <name>PEAR</name>
+ <channel>pear.php.net</channel>
+ <min>1.4.0</min>
+ <max>1.999.999</max>
+ </compatible>
+
+ <dependencies>
+ <required>
+ <php>
+ <min>5.4.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.8.0</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+
+ <phprelease />
+
+ <changelog>
+
+ <release>
+ <date>2019-02-06</date>
+ <version>
+ <release>1.4.2</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
+ <notes>
+ * Remove use of each(), which is removed in PHP 8
+ </notes>
+ </release>
+
+ <release>
+ <date>2015-07-20</date>
+ <version>
+ <release>1.4.1</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
+ <notes>
+ * Fix unit test on PHP 7 [cweiske]
+ </notes>
+ </release>
+
+ <release>
+ <date>2015-02-22</date>
+ <version>
+ <release>1.4.0</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://opensource.org/licenses/bsd-license.php">BSD-2-Clause</license>
+ <notes>
+ * Change license to BSD-2-Clause
+ * Set minimum PHP version to 5.4.0
+ * Mark static methods with "static" keyword
+ </notes>
+ </release>
+
+ <release>
+ <date>2011-03-07</date>
+ <version>
+ <release>1.3.1</release>
+ <api>1.3.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+ * Change the minimum PEAR installer dep to be lower
+ </notes>
+ </release>
+
+ <release>
+ <date>2010-12-11</date>
+ <time>20:20:13</time>
+ <version>
+ <release>1.3.0</release>
+ <api>1.3.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+ * Implement Request #13140: [PATCH] to skip unknown parameters. [patch by rquadling, improved on by dufuz]
+ </notes>
+ </release>
+
+ <release>
+ <date>2007-06-12</date>
+ <version>
+ <release>1.2.3</release>
+ <api>1.2.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+* fix Bug #11068: No way to read plain &quot;-&quot; option [cardoe]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.2.2</release>
+ <api>1.2.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-02-17</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+* fix Bug #4475: An ambiguous error occurred when specifying similar longoption name.
+* fix Bug #10055: Not failing properly on short options missing required values
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.2.1</release>
+ <api>1.2.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2006-12-08</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Fixed bugs #4448 (Long parameter values truncated with longoption parameter) and #7444 (Trailing spaces after php closing tag)
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.2</release>
+ <api>1.2</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2003-12-11</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Fix to preserve BC with 1.0 and allow correct behaviour for new users
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.0</release>
+ <api>1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2002-09-13</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Stable release
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.11</release>
+ <api>0.11</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2002-05-26</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+POSIX getopt compatibility fix: treat first element of args
+ array as command name
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.10</release>
+ <api>0.10</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2002-05-12</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Packaging fix
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>0.9</release>
+ <api>0.9</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2002-05-12</date>
+ <license uri="http://www.php.net/license">PHP License</license>
+ <notes>
+Initial release
+ </notes>
+ </release>
+ </changelog>
+</package>
diff --git a/www/wiki/vendor/pear/console_getopt/tests/001-getopt.phpt b/www/wiki/vendor/pear/console_getopt/tests/001-getopt.phpt
new file mode 100644
index 00000000..75ae8481
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/tests/001-getopt.phpt
@@ -0,0 +1,63 @@
+--TEST--
+Console_Getopt
+--FILE--
+<?php
+require_once 'Console/Getopt.php';
+PEAR::setErrorHandling(PEAR_ERROR_PRINT, "%s\n\n");
+
+function test($argstr, $optstr) {
+ $argv = preg_split('/[[:space:]]+/', $argstr);
+ if (PEAR::isError($options = Console_Getopt::getopt($argv, $optstr))) {
+ return;
+ }
+ $opts = $options[0];
+ $non_opts = $options[1];
+ $i = 0;
+ print "options: ";
+ foreach ($opts as $o => $d) {
+ if ($i++ > 0) {
+ print ", ";
+ }
+ print $d[0] . '=' . $d[1];
+ }
+ print "\n";
+ print "params: " . implode(", ", $non_opts) . "\n";
+ print "\n";
+}
+
+test("-abc", "abc");
+test("-abc foo", "abc");
+test("-abc foo", "abc:");
+test("-abc foo bar gazonk", "abc");
+test("-abc foo bar gazonk", "abc:");
+test("-a -b -c", "abc");
+test("-a -b -c", "abc:");
+test("-abc", "ab:c");
+test("-abc foo -bar gazonk", "abc");
+?>
+--EXPECT--
+options: a=, b=, c=
+params:
+
+options: a=, b=, c=
+params: foo
+
+options: a=, b=, c=foo
+params:
+
+options: a=, b=, c=
+params: foo, bar, gazonk
+
+options: a=, b=, c=foo
+params: bar, gazonk
+
+options: a=, b=, c=
+params:
+
+Console_Getopt: option requires an argument --c
+
+options: a=, b=c
+params:
+
+options: a=, b=, c=
+params: foo, -bar, gazonk
diff --git a/www/wiki/vendor/pear/console_getopt/tests/bug10557.phpt b/www/wiki/vendor/pear/console_getopt/tests/bug10557.phpt
new file mode 100644
index 00000000..08b72ac8
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/tests/bug10557.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Console_Getopt [bug 10557]
+--SKIPIF--
+--FILE--
+<?php
+$_SERVER['argv'] =
+$argv = array('hi', '-fjjohnston@mail.com', '--to', '--mailpack', '--debug');
+require_once 'Console/Getopt.php';
+$ret = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), 'f:t:',
+array('from=','to=','mailpack=','direction=','verbose','debug'));
+if(PEAR::isError($ret))
+{
+ echo $ret->getMessage()."\n";
+ echo 'FATAL';
+ exit;
+}
+
+print_r($ret);
+?>
+--EXPECT--
+Console_Getopt: option requires an argument --to
+FATAL \ No newline at end of file
diff --git a/www/wiki/vendor/pear/console_getopt/tests/bug11068.phpt b/www/wiki/vendor/pear/console_getopt/tests/bug11068.phpt
new file mode 100644
index 00000000..8bbe4bfc
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/tests/bug11068.phpt
@@ -0,0 +1,44 @@
+--TEST--
+Console_Getopt [bug 11068]
+--SKIPIF--
+--FILE--
+<?php
+$_SERVER['argv'] =
+$argv = array('hi', '-fjjohnston@mail.com', '--to', 'hi', '-');
+require_once 'Console/Getopt.php';
+$ret = Console_Getopt::getopt(Console_Getopt::readPHPArgv(), 'f:t:',
+array('from=','to=','mailpack=','direction=','verbose','debug'));
+if(PEAR::isError($ret))
+{
+ echo $ret->getMessage()."\n";
+ echo 'FATAL';
+ exit;
+}
+
+print_r($ret);
+?>
+--EXPECT--
+Array
+(
+ [0] => Array
+ (
+ [0] => Array
+ (
+ [0] => f
+ [1] => jjohnston@mail.com
+ )
+
+ [1] => Array
+ (
+ [0] => --to
+ [1] => hi
+ )
+
+ )
+
+ [1] => Array
+ (
+ [0] => -
+ )
+
+) \ No newline at end of file
diff --git a/www/wiki/vendor/pear/console_getopt/tests/bug13140.phpt b/www/wiki/vendor/pear/console_getopt/tests/bug13140.phpt
new file mode 100644
index 00000000..4ce13bbf
--- /dev/null
+++ b/www/wiki/vendor/pear/console_getopt/tests/bug13140.phpt
@@ -0,0 +1,75 @@
+--TEST--
+Console_Getopt [bug 13140]
+--SKIPIF--
+--FILE--
+<?php
+$_SERVER['argv'] = $argv =
+ array('--bob', '--foo' , '-bar', '--test', '-rq', 'thisshouldbehere');
+
+require_once 'Console/Getopt.php';
+$cg = new Console_GetOpt();
+
+print_r($cg->getopt2($cg->readPHPArgv(), 't', array('test'), true));
+print_r($cg->getopt2($cg->readPHPArgv(), 'bar', array('foo'), true));
+?>
+--EXPECT--
+Array
+(
+ [0] => Array
+ (
+ [0] => Array
+ (
+ [0] => --test
+ [1] =>
+ )
+
+ )
+
+ [1] => Array
+ (
+ [0] => thisshouldbehere
+ )
+
+)
+Array
+(
+ [0] => Array
+ (
+ [0] => Array
+ (
+ [0] => --foo
+ [1] =>
+ )
+
+ [1] => Array
+ (
+ [0] => b
+ [1] =>
+ )
+
+ [2] => Array
+ (
+ [0] => a
+ [1] =>
+ )
+
+ [3] => Array
+ (
+ [0] => r
+ [1] =>
+ )
+
+ [4] => Array
+ (
+ [0] => r
+ [1] =>
+ )
+
+ )
+
+ [1] => Array
+ (
+ [0] => thisshouldbehere
+ )
+
+)
diff --git a/www/wiki/vendor/pear/mail/LICENSE b/www/wiki/vendor/pear/mail/LICENSE
new file mode 100644
index 00000000..9aee685e
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/LICENSE
@@ -0,0 +1,29 @@
+Copyright (c) 1997-2017, Chuck Hagenbuch
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+3. Neither the name of the copyright holder nor the names of its
+ contributors may be used to endorse or promote products derived from
+ this software without specific prior written permission.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/www/wiki/vendor/pear/mail/Mail.php b/www/wiki/vendor/pear/mail/Mail.php
new file mode 100644
index 00000000..b04bc01c
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail.php
@@ -0,0 +1,267 @@
+<?php
+/**
+ * PEAR's Mail:: interface.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 1997-2017, Chuck Hagenbuch & Richard Heyes
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 1997-2017 Chuck Hagenbuch
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+require_once 'PEAR.php';
+
+/**
+ * PEAR's Mail:: interface. Defines the interface for implementing
+ * mailers under the PEAR hierarchy, and provides supporting functions
+ * useful in multiple mailer backends.
+ *
+ * @version $Revision$
+ * @package Mail
+ */
+class Mail
+{
+ /**
+ * Line terminator used for separating header lines.
+ * @var string
+ */
+ public $sep = "\r\n";
+
+ /**
+ * Provides an interface for generating Mail:: objects of various
+ * types
+ *
+ * @param string $driver The kind of Mail:: object to instantiate.
+ * @param array $params The parameters to pass to the Mail:: object.
+ *
+ * @return object Mail a instance of the driver class or if fails a PEAR Error
+ */
+ public static function factory($driver, $params = array())
+ {
+ $driver = strtolower($driver);
+ @include_once 'Mail/' . $driver . '.php';
+ $class = 'Mail_' . $driver;
+ if (class_exists($class)) {
+ $mailer = new $class($params);
+ return $mailer;
+ } else {
+ return PEAR::raiseError('Unable to find class for driver ' . $driver);
+ }
+ }
+
+ /**
+ * Implements Mail::send() function using php's built-in mail()
+ * command.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (ie, 'Subject'), and the array value
+ * is the header value (ie, 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * Mime parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ *
+ * @deprecated use Mail_mail::send instead
+ */
+ public function send($recipients, $headers, $body)
+ {
+ if (!is_array($headers)) {
+ return PEAR::raiseError('$headers must be an array');
+ }
+
+ $result = $this->_sanitizeHeaders($headers);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ // if we're passed an array of recipients, implode it.
+ if (is_array($recipients)) {
+ $recipients = implode(', ', $recipients);
+ }
+
+ // get the Subject out of the headers array so that we can
+ // pass it as a seperate argument to mail().
+ $subject = '';
+ if (isset($headers['Subject'])) {
+ $subject = $headers['Subject'];
+ unset($headers['Subject']);
+ }
+
+ // flatten the headers out.
+ list(, $text_headers) = Mail::prepareHeaders($headers);
+
+ return mail($recipients, $subject, $body, $text_headers);
+ }
+
+ /**
+ * Sanitize an array of mail headers by removing any additional header
+ * strings present in a legitimate header's value. The goal of this
+ * filter is to prevent mail injection attacks.
+ *
+ * @param array $headers The associative array of headers to sanitize.
+ */
+ protected function _sanitizeHeaders(&$headers)
+ {
+ foreach ($headers as $key => $value) {
+ $headers[$key] =
+ preg_replace('=((<CR>|<LF>|0x0A/%0A|0x0D/%0D|\\n|\\r)\S).*=i',
+ null, $value);
+ }
+ }
+
+ /**
+ * Take an array of mail headers and return a string containing
+ * text usable in sending a message.
+ *
+ * @param array $headers The array of headers to prepare, in an associative
+ * array, where the array key is the header name (ie,
+ * 'Subject'), and the array value is the header
+ * value (ie, 'test'). The header produced from those
+ * values would be 'Subject: test'.
+ *
+ * @return mixed Returns false if it encounters a bad address,
+ * otherwise returns an array containing two
+ * elements: Any From: address found in the headers,
+ * and the plain text version of the headers.
+ */
+ protected function prepareHeaders($headers)
+ {
+ $lines = array();
+ $from = null;
+
+ foreach ($headers as $key => $value) {
+ if (strcasecmp($key, 'From') === 0) {
+ include_once 'Mail/RFC822.php';
+ $parser = new Mail_RFC822();
+ $addresses = $parser->parseAddressList($value, 'localhost', false);
+ if (is_a($addresses, 'PEAR_Error')) {
+ return $addresses;
+ }
+
+ $from = $addresses[0]->mailbox . '@' . $addresses[0]->host;
+
+ // Reject envelope From: addresses with spaces.
+ if (strstr($from, ' ')) {
+ return false;
+ }
+
+ $lines[] = $key . ': ' . $value;
+ } elseif (strcasecmp($key, 'Received') === 0) {
+ $received = array();
+ if (is_array($value)) {
+ foreach ($value as $line) {
+ $received[] = $key . ': ' . $line;
+ }
+ }
+ else {
+ $received[] = $key . ': ' . $value;
+ }
+ // Put Received: headers at the top. Spam detectors often
+ // flag messages with Received: headers after the Subject:
+ // as spam.
+ $lines = array_merge($received, $lines);
+ } else {
+ // If $value is an array (i.e., a list of addresses), convert
+ // it to a comma-delimited string of its elements (addresses).
+ if (is_array($value)) {
+ $value = implode(', ', $value);
+ }
+ $lines[] = $key . ': ' . $value;
+ }
+ }
+
+ return array($from, join($this->sep, $lines));
+ }
+
+ /**
+ * Take a set of recipients and parse them, returning an array of
+ * bare addresses (forward paths) that can be passed to sendmail
+ * or an smtp server with the rcpt to: command.
+ *
+ * @param mixed Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid.
+ *
+ * @return mixed An array of forward paths (bare addresses) or a PEAR_Error
+ * object if the address list could not be parsed.
+ */
+ protected function parseRecipients($recipients)
+ {
+ include_once 'Mail/RFC822.php';
+
+ // if we're passed an array, assume addresses are valid and
+ // implode them before parsing.
+ if (is_array($recipients)) {
+ $recipients = implode(', ', $recipients);
+ }
+
+ // Parse recipients, leaving out all personal info. This is
+ // for smtp recipients, etc. All relevant personal information
+ // should already be in the headers.
+ $Mail_RFC822 = new Mail_RFC822();
+ $addresses = $Mail_RFC822->parseAddressList($recipients, 'localhost', false);
+
+ // If parseAddressList() returned a PEAR_Error object, just return it.
+ if (is_a($addresses, 'PEAR_Error')) {
+ return $addresses;
+ }
+
+ $recipients = array();
+ if (is_array($addresses)) {
+ foreach ($addresses as $ob) {
+ $recipients[] = $ob->mailbox . '@' . $ob->host;
+ }
+ }
+
+ return $recipients;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/RFC822.php b/www/wiki/vendor/pear/mail/Mail/RFC822.php
new file mode 100644
index 00000000..e0748f58
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/RFC822.php
@@ -0,0 +1,929 @@
+<?php
+/**
+ * RFC 822 Email address list validation Utility
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2001-2017, Chuck Hagenbuch & Richard Heyes
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Chuck Hagenbuch <chuck@horde.org
+ * @copyright 2001-2017 Richard Heyes
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/**
+ * RFC 822 Email address list validation Utility
+ *
+ * What is it?
+ *
+ * This class will take an address string, and parse it into it's consituent
+ * parts, be that either addresses, groups, or combinations. Nested groups
+ * are not supported. The structure it returns is pretty straight forward,
+ * and is similar to that provided by the imap_rfc822_parse_adrlist(). Use
+ * print_r() to view the structure.
+ *
+ * How do I use it?
+ *
+ * $address_string = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
+ * $structure = Mail_RFC822::parseAddressList($address_string, 'example.com', true)
+ * print_r($structure);
+ *
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @version $Revision$
+ * @license BSD
+ * @package Mail
+ */
+class Mail_RFC822 {
+
+ /**
+ * The address being parsed by the RFC822 object.
+ * @var string $address
+ */
+ var $address = '';
+
+ /**
+ * The default domain to use for unqualified addresses.
+ * @var string $default_domain
+ */
+ var $default_domain = 'localhost';
+
+ /**
+ * Should we return a nested array showing groups, or flatten everything?
+ * @var boolean $nestGroups
+ */
+ var $nestGroups = true;
+
+ /**
+ * Whether or not to validate atoms for non-ascii characters.
+ * @var boolean $validate
+ */
+ var $validate = true;
+
+ /**
+ * The array of raw addresses built up as we parse.
+ * @var array $addresses
+ */
+ var $addresses = array();
+
+ /**
+ * The final array of parsed address information that we build up.
+ * @var array $structure
+ */
+ var $structure = array();
+
+ /**
+ * The current error message, if any.
+ * @var string $error
+ */
+ var $error = null;
+
+ /**
+ * An internal counter/pointer.
+ * @var integer $index
+ */
+ var $index = null;
+
+ /**
+ * The number of groups that have been found in the address list.
+ * @var integer $num_groups
+ * @access public
+ */
+ var $num_groups = 0;
+
+ /**
+ * A variable so that we can tell whether or not we're inside a
+ * Mail_RFC822 object.
+ * @var boolean $mailRFC822
+ */
+ var $mailRFC822 = true;
+
+ /**
+ * A limit after which processing stops
+ * @var int $limit
+ */
+ var $limit = null;
+
+ /**
+ * Sets up the object. The address must either be set here or when
+ * calling parseAddressList(). One or the other.
+ *
+ * @param string $address The address(es) to validate.
+ * @param string $default_domain Default domain/host etc. If not supplied, will be set to localhost.
+ * @param boolean $nest_groups Whether to return the structure with groups nested for easier viewing.
+ * @param boolean $validate Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
+ *
+ * @return object Mail_RFC822 A new Mail_RFC822 object.
+ */
+ public function __construct($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
+ {
+ if (isset($address)) $this->address = $address;
+ if (isset($default_domain)) $this->default_domain = $default_domain;
+ if (isset($nest_groups)) $this->nestGroups = $nest_groups;
+ if (isset($validate)) $this->validate = $validate;
+ if (isset($limit)) $this->limit = $limit;
+ }
+
+ /**
+ * Starts the whole process. The address must either be set here
+ * or when creating the object. One or the other.
+ *
+ * @param string $address The address(es) to validate.
+ * @param string $default_domain Default domain/host etc.
+ * @param boolean $nest_groups Whether to return the structure with groups nested for easier viewing.
+ * @param boolean $validate Whether to validate atoms. Turn this off if you need to run addresses through before encoding the personal names, for instance.
+ *
+ * @return array A structured array of addresses.
+ */
+ public function parseAddressList($address = null, $default_domain = null, $nest_groups = null, $validate = null, $limit = null)
+ {
+ if (!isset($this) || !isset($this->mailRFC822)) {
+ $obj = new Mail_RFC822($address, $default_domain, $nest_groups, $validate, $limit);
+ return $obj->parseAddressList();
+ }
+
+ if (isset($address)) $this->address = $address;
+ if (isset($default_domain)) $this->default_domain = $default_domain;
+ if (isset($nest_groups)) $this->nestGroups = $nest_groups;
+ if (isset($validate)) $this->validate = $validate;
+ if (isset($limit)) $this->limit = $limit;
+
+ $this->structure = array();
+ $this->addresses = array();
+ $this->error = null;
+ $this->index = null;
+
+ // Unfold any long lines in $this->address.
+ $this->address = preg_replace('/\r?\n/', "\r\n", $this->address);
+ $this->address = preg_replace('/\r\n(\t| )+/', ' ', $this->address);
+
+ while ($this->address = $this->_splitAddresses($this->address));
+
+ if ($this->address === false || isset($this->error)) {
+ require_once 'PEAR.php';
+ return PEAR::raiseError($this->error);
+ }
+
+ // Validate each address individually. If we encounter an invalid
+ // address, stop iterating and return an error immediately.
+ foreach ($this->addresses as $address) {
+ $valid = $this->_validateAddress($address);
+
+ if ($valid === false || isset($this->error)) {
+ require_once 'PEAR.php';
+ return PEAR::raiseError($this->error);
+ }
+
+ if (!$this->nestGroups) {
+ $this->structure = array_merge($this->structure, $valid);
+ } else {
+ $this->structure[] = $valid;
+ }
+ }
+
+ return $this->structure;
+ }
+
+ /**
+ * Splits an address into separate addresses.
+ *
+ * @param string $address The addresses to split.
+ * @return boolean Success or failure.
+ */
+ protected function _splitAddresses($address)
+ {
+ if (!empty($this->limit) && count($this->addresses) == $this->limit) {
+ return '';
+ }
+
+ if ($this->_isGroup($address) && !isset($this->error)) {
+ $split_char = ';';
+ $is_group = true;
+ } elseif (!isset($this->error)) {
+ $split_char = ',';
+ $is_group = false;
+ } elseif (isset($this->error)) {
+ return false;
+ }
+
+ // Split the string based on the above ten or so lines.
+ $parts = explode($split_char, $address);
+ $string = $this->_splitCheck($parts, $split_char);
+
+ // If a group...
+ if ($is_group) {
+ // If $string does not contain a colon outside of
+ // brackets/quotes etc then something's fubar.
+
+ // First check there's a colon at all:
+ if (strpos($string, ':') === false) {
+ $this->error = 'Invalid address: ' . $string;
+ return false;
+ }
+
+ // Now check it's outside of brackets/quotes:
+ if (!$this->_splitCheck(explode(':', $string), ':')) {
+ return false;
+ }
+
+ // We must have a group at this point, so increase the counter:
+ $this->num_groups++;
+ }
+
+ // $string now contains the first full address/group.
+ // Add to the addresses array.
+ $this->addresses[] = array(
+ 'address' => trim($string),
+ 'group' => $is_group
+ );
+
+ // Remove the now stored address from the initial line, the +1
+ // is to account for the explode character.
+ $address = trim(substr($address, strlen($string) + 1));
+
+ // If the next char is a comma and this was a group, then
+ // there are more addresses, otherwise, if there are any more
+ // chars, then there is another address.
+ if ($is_group && substr($address, 0, 1) == ','){
+ $address = trim(substr($address, 1));
+ return $address;
+
+ } elseif (strlen($address) > 0) {
+ return $address;
+
+ } else {
+ return '';
+ }
+
+ // If you got here then something's off
+ return false;
+ }
+
+ /**
+ * Checks for a group at the start of the string.
+ *
+ * @param string $address The address to check.
+ * @return boolean Whether or not there is a group at the start of the string.
+ */
+ protected function _isGroup($address)
+ {
+ // First comma not in quotes, angles or escaped:
+ $parts = explode(',', $address);
+ $string = $this->_splitCheck($parts, ',');
+
+ // Now we have the first address, we can reliably check for a
+ // group by searching for a colon that's not escaped or in
+ // quotes or angle brackets.
+ if (count($parts = explode(':', $string)) > 1) {
+ $string2 = $this->_splitCheck($parts, ':');
+ return ($string2 !== $string);
+ } else {
+ return false;
+ }
+ }
+
+ /**
+ * A common function that will check an exploded string.
+ *
+ * @param array $parts The exloded string.
+ * @param string $char The char that was exploded on.
+ * @return mixed False if the string contains unclosed quotes/brackets, or the string on success.
+ */
+ protected function _splitCheck($parts, $char)
+ {
+ $string = $parts[0];
+
+ for ($i = 0; $i < count($parts); $i++) {
+ if ($this->_hasUnclosedQuotes($string)
+ || $this->_hasUnclosedBrackets($string, '<>')
+ || $this->_hasUnclosedBrackets($string, '[]')
+ || $this->_hasUnclosedBrackets($string, '()')
+ || substr($string, -1) == '\\') {
+ if (isset($parts[$i + 1])) {
+ $string = $string . $char . $parts[$i + 1];
+ } else {
+ $this->error = 'Invalid address spec. Unclosed bracket or quotes';
+ return false;
+ }
+ } else {
+ $this->index = $i;
+ break;
+ }
+ }
+
+ return $string;
+ }
+
+ /**
+ * Checks if a string has unclosed quotes or not.
+ *
+ * @param string $string The string to check.
+ * @return boolean True if there are unclosed quotes inside the string,
+ * false otherwise.
+ */
+ protected function _hasUnclosedQuotes($string)
+ {
+ $string = trim($string);
+ $iMax = strlen($string);
+ $in_quote = false;
+ $i = $slashes = 0;
+
+ for (; $i < $iMax; ++$i) {
+ switch ($string[$i]) {
+ case '\\':
+ ++$slashes;
+ break;
+
+ case '"':
+ if ($slashes % 2 == 0) {
+ $in_quote = !$in_quote;
+ }
+ // Fall through to default action below.
+
+ default:
+ $slashes = 0;
+ break;
+ }
+ }
+
+ return $in_quote;
+ }
+
+ /**
+ * Checks if a string has an unclosed brackets or not. IMPORTANT:
+ * This function handles both angle brackets and square brackets;
+ *
+ * @param string $string The string to check.
+ * @param string $chars The characters to check for.
+ * @return boolean True if there are unclosed brackets inside the string, false otherwise.
+ */
+ protected function _hasUnclosedBrackets($string, $chars)
+ {
+ $num_angle_start = substr_count($string, $chars[0]);
+ $num_angle_end = substr_count($string, $chars[1]);
+
+ $this->_hasUnclosedBracketsSub($string, $num_angle_start, $chars[0]);
+ $this->_hasUnclosedBracketsSub($string, $num_angle_end, $chars[1]);
+
+ if ($num_angle_start < $num_angle_end) {
+ $this->error = 'Invalid address spec. Unmatched quote or bracket (' . $chars . ')';
+ return false;
+ } else {
+ return ($num_angle_start > $num_angle_end);
+ }
+ }
+
+ /**
+ * Sub function that is used only by hasUnclosedBrackets().
+ *
+ * @param string $string The string to check.
+ * @param integer &$num The number of occurences.
+ * @param string $char The character to count.
+ * @return integer The number of occurences of $char in $string, adjusted for backslashes.
+ */
+ protected function _hasUnclosedBracketsSub($string, &$num, $char)
+ {
+ $parts = explode($char, $string);
+ for ($i = 0; $i < count($parts); $i++){
+ if (substr($parts[$i], -1) == '\\' || $this->_hasUnclosedQuotes($parts[$i]))
+ $num--;
+ if (isset($parts[$i + 1]))
+ $parts[$i + 1] = $parts[$i] . $char . $parts[$i + 1];
+ }
+
+ return $num;
+ }
+
+ /**
+ * Function to begin checking the address.
+ *
+ * @param string $address The address to validate.
+ * @return mixed False on failure, or a structured array of address information on success.
+ */
+ protected function _validateAddress($address)
+ {
+ $is_group = false;
+ $addresses = array();
+
+ if ($address['group']) {
+ $is_group = true;
+
+ // Get the group part of the name
+ $parts = explode(':', $address['address']);
+ $groupname = $this->_splitCheck($parts, ':');
+ $structure = array();
+
+ // And validate the group part of the name.
+ if (!$this->_validatePhrase($groupname)){
+ $this->error = 'Group name did not validate.';
+ return false;
+ } else {
+ // Don't include groups if we are not nesting
+ // them. This avoids returning invalid addresses.
+ if ($this->nestGroups) {
+ $structure = new stdClass;
+ $structure->groupname = $groupname;
+ }
+ }
+
+ $address['address'] = ltrim(substr($address['address'], strlen($groupname . ':')));
+ }
+
+ // If a group then split on comma and put into an array.
+ // Otherwise, Just put the whole address in an array.
+ if ($is_group) {
+ while (strlen($address['address']) > 0) {
+ $parts = explode(',', $address['address']);
+ $addresses[] = $this->_splitCheck($parts, ',');
+ $address['address'] = trim(substr($address['address'], strlen(end($addresses) . ',')));
+ }
+ } else {
+ $addresses[] = $address['address'];
+ }
+
+ // Trim the whitespace from all of the address strings.
+ array_map('trim', $addresses);
+
+ // Validate each mailbox.
+ // Format could be one of: name <geezer@domain.com>
+ // geezer@domain.com
+ // geezer
+ // ... or any other format valid by RFC 822.
+ for ($i = 0; $i < count($addresses); $i++) {
+ if (!$this->validateMailbox($addresses[$i])) {
+ if (empty($this->error)) {
+ $this->error = 'Validation failed for: ' . $addresses[$i];
+ }
+ return false;
+ }
+ }
+
+ // Nested format
+ if ($this->nestGroups) {
+ if ($is_group) {
+ $structure->addresses = $addresses;
+ } else {
+ $structure = $addresses[0];
+ }
+
+ // Flat format
+ } else {
+ if ($is_group) {
+ $structure = array_merge($structure, $addresses);
+ } else {
+ $structure = $addresses;
+ }
+ }
+
+ return $structure;
+ }
+
+ /**
+ * Function to validate a phrase.
+ *
+ * @param string $phrase The phrase to check.
+ * @return boolean Success or failure.
+ */
+ protected function _validatePhrase($phrase)
+ {
+ // Splits on one or more Tab or space.
+ $parts = preg_split('/[ \\x09]+/', $phrase, -1, PREG_SPLIT_NO_EMPTY);
+
+ $phrase_parts = array();
+ while (count($parts) > 0){
+ $phrase_parts[] = $this->_splitCheck($parts, ' ');
+ for ($i = 0; $i < $this->index + 1; $i++)
+ array_shift($parts);
+ }
+
+ foreach ($phrase_parts as $part) {
+ // If quoted string:
+ if (substr($part, 0, 1) == '"') {
+ if (!$this->_validateQuotedString($part)) {
+ return false;
+ }
+ continue;
+ }
+
+ // Otherwise it's an atom:
+ if (!$this->_validateAtom($part)) return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Function to validate an atom which from rfc822 is:
+ * atom = 1*<any CHAR except specials, SPACE and CTLs>
+ *
+ * If validation ($this->validate) has been turned off, then
+ * validateAtom() doesn't actually check anything. This is so that you
+ * can split a list of addresses up before encoding personal names
+ * (umlauts, etc.), for example.
+ *
+ * @param string $atom The string to check.
+ * @return boolean Success or failure.
+ */
+ protected function _validateAtom($atom)
+ {
+ if (!$this->validate) {
+ // Validation has been turned off; assume the atom is okay.
+ return true;
+ }
+
+ // Check for any char from ASCII 0 - ASCII 127
+ if (!preg_match('/^[\\x00-\\x7E]+$/i', $atom, $matches)) {
+ return false;
+ }
+
+ // Check for specials:
+ if (preg_match('/[][()<>@,;\\:". ]/', $atom)) {
+ return false;
+ }
+
+ // Check for control characters (ASCII 0-31):
+ if (preg_match('/[\\x00-\\x1F]+/', $atom)) {
+ return false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Function to validate quoted string, which is:
+ * quoted-string = <"> *(qtext/quoted-pair) <">
+ *
+ * @param string $qstring The string to check
+ * @return boolean Success or failure.
+ */
+ protected function _validateQuotedString($qstring)
+ {
+ // Leading and trailing "
+ $qstring = substr($qstring, 1, -1);
+
+ // Perform check, removing quoted characters first.
+ return !preg_match('/[\x0D\\\\"]/', preg_replace('/\\\\./', '', $qstring));
+ }
+
+ /**
+ * Function to validate a mailbox, which is:
+ * mailbox = addr-spec ; simple address
+ * / phrase route-addr ; name and route-addr
+ *
+ * @param string &$mailbox The string to check.
+ * @return boolean Success or failure.
+ */
+ public function validateMailbox(&$mailbox)
+ {
+ // A couple of defaults.
+ $phrase = '';
+ $comment = '';
+ $comments = array();
+
+ // Catch any RFC822 comments and store them separately.
+ $_mailbox = $mailbox;
+ while (strlen(trim($_mailbox)) > 0) {
+ $parts = explode('(', $_mailbox);
+ $before_comment = $this->_splitCheck($parts, '(');
+ if ($before_comment != $_mailbox) {
+ // First char should be a (.
+ $comment = substr(str_replace($before_comment, '', $_mailbox), 1);
+ $parts = explode(')', $comment);
+ $comment = $this->_splitCheck($parts, ')');
+ $comments[] = $comment;
+
+ // +2 is for the brackets
+ $_mailbox = substr($_mailbox, strpos($_mailbox, '('.$comment)+strlen($comment)+2);
+ } else {
+ break;
+ }
+ }
+
+ foreach ($comments as $comment) {
+ $mailbox = str_replace("($comment)", '', $mailbox);
+ }
+
+ $mailbox = trim($mailbox);
+
+ // Check for name + route-addr
+ if (substr($mailbox, -1) == '>' && substr($mailbox, 0, 1) != '<') {
+ $parts = explode('<', $mailbox);
+ $name = $this->_splitCheck($parts, '<');
+
+ $phrase = trim($name);
+ $route_addr = trim(substr($mailbox, strlen($name.'<'), -1));
+
+ if ($this->_validatePhrase($phrase) === false || ($route_addr = $this->_validateRouteAddr($route_addr)) === false) {
+ return false;
+ }
+
+ // Only got addr-spec
+ } else {
+ // First snip angle brackets if present.
+ if (substr($mailbox, 0, 1) == '<' && substr($mailbox, -1) == '>') {
+ $addr_spec = substr($mailbox, 1, -1);
+ } else {
+ $addr_spec = $mailbox;
+ }
+
+ if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
+ return false;
+ }
+ }
+
+ // Construct the object that will be returned.
+ $mbox = new stdClass();
+
+ // Add the phrase (even if empty) and comments
+ $mbox->personal = $phrase;
+ $mbox->comment = isset($comments) ? $comments : array();
+
+ if (isset($route_addr)) {
+ $mbox->mailbox = $route_addr['local_part'];
+ $mbox->host = $route_addr['domain'];
+ $route_addr['adl'] !== '' ? $mbox->adl = $route_addr['adl'] : '';
+ } else {
+ $mbox->mailbox = $addr_spec['local_part'];
+ $mbox->host = $addr_spec['domain'];
+ }
+
+ $mailbox = $mbox;
+ return true;
+ }
+
+ /**
+ * This function validates a route-addr which is:
+ * route-addr = "<" [route] addr-spec ">"
+ *
+ * Angle brackets have already been removed at the point of
+ * getting to this function.
+ *
+ * @param string $route_addr The string to check.
+ * @return mixed False on failure, or an array containing validated address/route information on success.
+ */
+ protected function _validateRouteAddr($route_addr)
+ {
+ // Check for colon.
+ if (strpos($route_addr, ':') !== false) {
+ $parts = explode(':', $route_addr);
+ $route = $this->_splitCheck($parts, ':');
+ } else {
+ $route = $route_addr;
+ }
+
+ // If $route is same as $route_addr then the colon was in
+ // quotes or brackets or, of course, non existent.
+ if ($route === $route_addr){
+ unset($route);
+ $addr_spec = $route_addr;
+ if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
+ return false;
+ }
+ } else {
+ // Validate route part.
+ if (($route = $this->_validateRoute($route)) === false) {
+ return false;
+ }
+
+ $addr_spec = substr($route_addr, strlen($route . ':'));
+
+ // Validate addr-spec part.
+ if (($addr_spec = $this->_validateAddrSpec($addr_spec)) === false) {
+ return false;
+ }
+ }
+
+ if (isset($route)) {
+ $return['adl'] = $route;
+ } else {
+ $return['adl'] = '';
+ }
+
+ $return = array_merge($return, $addr_spec);
+ return $return;
+ }
+
+ /**
+ * Function to validate a route, which is:
+ * route = 1#("@" domain) ":"
+ *
+ * @param string $route The string to check.
+ * @return mixed False on failure, or the validated $route on success.
+ */
+ protected function _validateRoute($route)
+ {
+ // Split on comma.
+ $domains = explode(',', trim($route));
+
+ foreach ($domains as $domain) {
+ $domain = str_replace('@', '', trim($domain));
+ if (!$this->_validateDomain($domain)) return false;
+ }
+
+ return $route;
+ }
+
+ /**
+ * Function to validate a domain, though this is not quite what
+ * you expect of a strict internet domain.
+ *
+ * domain = sub-domain *("." sub-domain)
+ *
+ * @param string $domain The string to check.
+ * @return mixed False on failure, or the validated domain on success.
+ */
+ protected function _validateDomain($domain)
+ {
+ // Note the different use of $subdomains and $sub_domains
+ $subdomains = explode('.', $domain);
+
+ while (count($subdomains) > 0) {
+ $sub_domains[] = $this->_splitCheck($subdomains, '.');
+ for ($i = 0; $i < $this->index + 1; $i++)
+ array_shift($subdomains);
+ }
+
+ foreach ($sub_domains as $sub_domain) {
+ if (!$this->_validateSubdomain(trim($sub_domain)))
+ return false;
+ }
+
+ // Managed to get here, so return input.
+ return $domain;
+ }
+
+ /**
+ * Function to validate a subdomain:
+ * subdomain = domain-ref / domain-literal
+ *
+ * @param string $subdomain The string to check.
+ * @return boolean Success or failure.
+ */
+ protected function _validateSubdomain($subdomain)
+ {
+ if (preg_match('|^\[(.*)]$|', $subdomain, $arr)){
+ if (!$this->_validateDliteral($arr[1])) return false;
+ } else {
+ if (!$this->_validateAtom($subdomain)) return false;
+ }
+
+ // Got here, so return successful.
+ return true;
+ }
+
+ /**
+ * Function to validate a domain literal:
+ * domain-literal = "[" *(dtext / quoted-pair) "]"
+ *
+ * @param string $dliteral The string to check.
+ * @return boolean Success or failure.
+ */
+ protected function _validateDliteral($dliteral)
+ {
+ return !preg_match('/(.)[][\x0D\\\\]/', $dliteral, $matches) && ((! isset($matches[1])) || $matches[1] != '\\');
+ }
+
+ /**
+ * Function to validate an addr-spec.
+ *
+ * addr-spec = local-part "@" domain
+ *
+ * @param string $addr_spec The string to check.
+ * @return mixed False on failure, or the validated addr-spec on success.
+ */
+ protected function _validateAddrSpec($addr_spec)
+ {
+ $addr_spec = trim($addr_spec);
+
+ // Split on @ sign if there is one.
+ if (strpos($addr_spec, '@') !== false) {
+ $parts = explode('@', $addr_spec);
+ $local_part = $this->_splitCheck($parts, '@');
+ $domain = substr($addr_spec, strlen($local_part . '@'));
+
+ // No @ sign so assume the default domain.
+ } else {
+ $local_part = $addr_spec;
+ $domain = $this->default_domain;
+ }
+
+ if (($local_part = $this->_validateLocalPart($local_part)) === false) return false;
+ if (($domain = $this->_validateDomain($domain)) === false) return false;
+
+ // Got here so return successful.
+ return array('local_part' => $local_part, 'domain' => $domain);
+ }
+
+ /**
+ * Function to validate the local part of an address:
+ * local-part = word *("." word)
+ *
+ * @param string $local_part
+ * @return mixed False on failure, or the validated local part on success.
+ */
+ protected function _validateLocalPart($local_part)
+ {
+ $parts = explode('.', $local_part);
+ $words = array();
+
+ // Split the local_part into words.
+ while (count($parts) > 0) {
+ $words[] = $this->_splitCheck($parts, '.');
+ for ($i = 0; $i < $this->index + 1; $i++) {
+ array_shift($parts);
+ }
+ }
+
+ // Validate each word.
+ foreach ($words as $word) {
+ // word cannot be empty (#17317)
+ if ($word === '') {
+ return false;
+ }
+ // If this word contains an unquoted space, it is invalid. (6.2.4)
+ if (strpos($word, ' ') && $word[0] !== '"')
+ {
+ return false;
+ }
+
+ if ($this->_validatePhrase(trim($word)) === false) return false;
+ }
+
+ // Managed to get here, so return the input.
+ return $local_part;
+ }
+
+ /**
+ * Returns an approximate count of how many addresses are in the
+ * given string. This is APPROXIMATE as it only splits based on a
+ * comma which has no preceding backslash. Could be useful as
+ * large amounts of addresses will end up producing *large*
+ * structures when used with parseAddressList().
+ *
+ * @param string $data Addresses to count
+ * @return int Approximate count
+ */
+ public function approximateCount($data)
+ {
+ return count(preg_split('/(?<!\\\\),/', $data));
+ }
+
+ /**
+ * This is a email validating function separate to the rest of the
+ * class. It simply validates whether an email is of the common
+ * internet form: <user>@<domain>. This can be sufficient for most
+ * people. Optional stricter mode can be utilised which restricts
+ * mailbox characters allowed to alphanumeric, full stop, hyphen
+ * and underscore.
+ *
+ * @param string $data Address to check
+ * @param boolean $strict Optional stricter mode
+ * @return mixed False if it fails, an indexed array
+ * username/domain if it matches
+ */
+ public function isValidInetAddress($data, $strict = false)
+ {
+ $regex = $strict ? '/^([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i' : '/^([*+!.&#$|\'\\%\/0-9a-z^_`{}=?~:-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})$/i';
+ if (preg_match($regex, trim($data), $matches)) {
+ return array($matches[1], $matches[2]);
+ } else {
+ return false;
+ }
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/mail.php b/www/wiki/vendor/pear/mail/Mail/mail.php
new file mode 100644
index 00000000..ee1ecef5
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/mail.php
@@ -0,0 +1,168 @@
+<?php
+/**
+ * internal PHP-mail() implementation of the PEAR Mail:: interface.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017, Chuck Hagenbuch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 2010-2017 Chuck Hagenbuch
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/**
+ * internal PHP-mail() implementation of the PEAR Mail:: interface.
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_mail extends Mail {
+
+ /**
+ * Any arguments to pass to the mail() function.
+ * @var string
+ */
+ var $_params = '';
+
+ /**
+ * Constructor.
+ *
+ * Instantiates a new Mail_mail:: object based on the parameters
+ * passed in.
+ *
+ * @param array $params Extra arguments for the mail() function.
+ */
+ public function __construct($params = null)
+ {
+ // The other mail implementations accept parameters as arrays.
+ // In the interest of being consistent, explode an array into
+ // a string of parameter arguments.
+ if (is_array($params)) {
+ $this->_params = join(' ', $params);
+ } else {
+ $this->_params = $params;
+ }
+
+ /* Because the mail() function may pass headers as command
+ * line arguments, we can't guarantee the use of the standard
+ * "\r\n" separator. Instead, we use the system's native line
+ * separator. */
+ if (defined('PHP_EOL')) {
+ $this->sep = PHP_EOL;
+ } else {
+ $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
+ }
+ }
+
+ /**
+ * Implements Mail_mail::send() function using php's built-in mail()
+ * command.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (ie, 'Subject'), and the array value
+ * is the header value (ie, 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * Mime parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ */
+ public function send($recipients, $headers, $body)
+ {
+ if (!is_array($headers)) {
+ return PEAR::raiseError('$headers must be an array');
+ }
+
+ $result = $this->_sanitizeHeaders($headers);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ // If we're passed an array of recipients, implode it.
+ if (is_array($recipients)) {
+ $recipients = implode(', ', $recipients);
+ }
+
+ // Get the Subject out of the headers array so that we can
+ // pass it as a seperate argument to mail().
+ $subject = '';
+ if (isset($headers['Subject'])) {
+ $subject = $headers['Subject'];
+ unset($headers['Subject']);
+ }
+
+ // Also remove the To: header. The mail() function will add its own
+ // To: header based on the contents of $recipients.
+ unset($headers['To']);
+
+ // Flatten the headers out.
+ $headerElements = $this->prepareHeaders($headers);
+ if (is_a($headerElements, 'PEAR_Error')) {
+ return $headerElements;
+ }
+ list(, $text_headers) = $headerElements;
+
+ // We only use mail()'s optional fifth parameter if the additional
+ // parameters have been provided and we're not running in safe mode.
+ if (empty($this->_params) || ini_get('safe_mode')) {
+ $result = mail($recipients, $subject, $body, $text_headers);
+ } else {
+ $result = mail($recipients, $subject, $body, $text_headers,
+ $this->_params);
+ }
+
+ // If the mail() function returned failure, we need to create a
+ // PEAR_Error object and return it instead of the boolean result.
+ if ($result === false) {
+ $result = PEAR::raiseError('mail() returned failure');
+ }
+
+ return $result;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/mock.php b/www/wiki/vendor/pear/mail/Mail/mock.php
new file mode 100644
index 00000000..24d46a85
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/mock.php
@@ -0,0 +1,142 @@
+<?php
+/**
+ * Mock implementation
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017, Chuck Hagenbuch
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 2010-2017 Chuck Hagenbuch
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/**
+ * Mock implementation of the PEAR Mail:: interface for testing.
+ * @access public
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_mock extends Mail {
+
+ /**
+ * Array of messages that have been sent with the mock.
+ *
+ * @var array
+ */
+ public $sentMessages = array();
+
+ /**
+ * Callback before sending mail.
+ *
+ * @var callback
+ */
+ protected $_preSendCallback;
+
+ /**
+ * Callback after sending mai.
+ *
+ * @var callback
+ */
+ protected $_postSendCallback;
+
+ /**
+ * Constructor.
+ *
+ * Instantiates a new Mail_mock:: object based on the parameters
+ * passed in. It looks for the following parameters, both optional:
+ * preSendCallback Called before an email would be sent.
+ * postSendCallback Called after an email would have been sent.
+ *
+ * @param array Hash containing any parameters.
+ */
+ public function __construct($params)
+ {
+ if (isset($params['preSendCallback']) &&
+ is_callable($params['preSendCallback'])) {
+ $this->_preSendCallback = $params['preSendCallback'];
+ }
+
+ if (isset($params['postSendCallback']) &&
+ is_callable($params['postSendCallback'])) {
+ $this->_postSendCallback = $params['postSendCallback'];
+ }
+ }
+
+ /**
+ * Implements Mail_mock::send() function. Silently discards all
+ * mail.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (ie, 'Subject'), and the array value
+ * is the header value (ie, 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * Mime parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ */
+ public function send($recipients, $headers, $body)
+ {
+ if ($this->_preSendCallback) {
+ call_user_func_array($this->_preSendCallback,
+ array(&$this, $recipients, $headers, $body));
+ }
+
+ $entry = array('recipients' => $recipients, 'headers' => $headers, 'body' => $body);
+ $this->sentMessages[] = $entry;
+
+ if ($this->_postSendCallback) {
+ call_user_func_array($this->_postSendCallback,
+ array(&$this, $recipients, $headers, $body));
+ }
+
+ return true;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/null.php b/www/wiki/vendor/pear/mail/Mail/null.php
new file mode 100644
index 00000000..5e3ecb6f
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/null.php
@@ -0,0 +1,85 @@
+<?php
+/**
+ * Null implementation of the PEAR Mail interface
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017, Phil Kernick
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Phil Kernick <philk@rotfl.com.au>
+ * @copyright 2010-2017 Phil Kernick
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/**
+ * Null implementation of the PEAR Mail:: interface.
+ * @access public
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_null extends Mail {
+
+ /**
+ * Implements Mail_null::send() function. Silently discards all
+ * mail.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (ie, 'Subject'), and the array value
+ * is the header value (ie, 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * Mime parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ */
+ public function send($recipients, $headers, $body)
+ {
+ return true;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/sendmail.php b/www/wiki/vendor/pear/mail/Mail/sendmail.php
new file mode 100644
index 00000000..7e8f8048
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/sendmail.php
@@ -0,0 +1,199 @@
+<?php
+/**
+ * Sendmail implementation of the PEAR Mail interface.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail
+ * @author Jon Parise <jon@php.net>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 2010-2017 Chuck Hagenbuch
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/**
+ * Sendmail implementation of the PEAR Mail:: interface.
+ * @access public
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_sendmail extends Mail {
+
+ /**
+ * The location of the sendmail or sendmail wrapper binary on the
+ * filesystem.
+ * @var string
+ */
+ var $sendmail_path = '/usr/sbin/sendmail';
+
+ /**
+ * Any extra command-line parameters to pass to the sendmail or
+ * sendmail wrapper binary.
+ * @var string
+ */
+ var $sendmail_args = '-i';
+
+ /**
+ * Constructor.
+ *
+ * Instantiates a new Mail_sendmail:: object based on the parameters
+ * passed in. It looks for the following parameters:
+ * sendmail_path The location of the sendmail binary on the
+ * filesystem. Defaults to '/usr/sbin/sendmail'.
+ *
+ * sendmail_args Any extra parameters to pass to the sendmail
+ * or sendmail wrapper binary.
+ *
+ * If a parameter is present in the $params array, it replaces the
+ * default.
+ *
+ * @param array $params Hash containing any parameters different from the
+ * defaults.
+ */
+ public function __construct($params)
+ {
+ if (isset($params['sendmail_path'])) {
+ $this->sendmail_path = $params['sendmail_path'];
+ }
+ if (isset($params['sendmail_args'])) {
+ $this->sendmail_args = $params['sendmail_args'];
+ }
+
+ /*
+ * Because we need to pass message headers to the sendmail program on
+ * the commandline, we can't guarantee the use of the standard "\r\n"
+ * separator. Instead, we use the system's native line separator.
+ */
+ if (defined('PHP_EOL')) {
+ $this->sep = PHP_EOL;
+ } else {
+ $this->sep = (strpos(PHP_OS, 'WIN') === false) ? "\n" : "\r\n";
+ }
+ }
+
+ /**
+ * Implements Mail::send() function using the sendmail
+ * command-line binary.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (ie, 'Subject'), and the array value
+ * is the header value (ie, 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * Mime parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ */
+ public function send($recipients, $headers, $body)
+ {
+ if (!is_array($headers)) {
+ return PEAR::raiseError('$headers must be an array');
+ }
+
+ $result = $this->_sanitizeHeaders($headers);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ $recipients = $this->parseRecipients($recipients);
+ if (is_a($recipients, 'PEAR_Error')) {
+ return $recipients;
+ }
+ $recipients = implode(' ', array_map('escapeshellarg', $recipients));
+
+ $headerElements = $this->prepareHeaders($headers);
+ if (is_a($headerElements, 'PEAR_Error')) {
+ return $headerElements;
+ }
+ list($from, $text_headers) = $headerElements;
+
+ /* Since few MTAs are going to allow this header to be forged
+ * unless it's in the MAIL FROM: exchange, we'll use
+ * Return-Path instead of From: if it's set. */
+ if (!empty($headers['Return-Path'])) {
+ $from = $headers['Return-Path'];
+ }
+
+ if (!isset($from)) {
+ return PEAR::raiseError('No from address given.');
+ } elseif (strpos($from, ' ') !== false ||
+ strpos($from, ';') !== false ||
+ strpos($from, '&') !== false ||
+ strpos($from, '`') !== false) {
+ return PEAR::raiseError('From address specified with dangerous characters.');
+ }
+
+ $from = escapeshellarg($from); // Security bug #16200
+
+ $mail = @popen($this->sendmail_path . (!empty($this->sendmail_args) ? ' ' . $this->sendmail_args : '') . " -f$from -- $recipients", 'w');
+ if (!$mail) {
+ return PEAR::raiseError('Failed to open sendmail [' . $this->sendmail_path . '] for execution.');
+ }
+
+ // Write the headers following by two newlines: one to end the headers
+ // section and a second to separate the headers block from the body.
+ fputs($mail, $text_headers . $this->sep . $this->sep);
+
+ fputs($mail, $body);
+ $result = pclose($mail);
+ if (version_compare(phpversion(), '4.2.3') == -1) {
+ // With older php versions, we need to shift the pclose
+ // result to get the exit code.
+ $result = $result >> 8 & 0xFF;
+ }
+
+ if ($result != 0) {
+ return PEAR::raiseError('sendmail returned error code ' . $result,
+ $result);
+ }
+
+ return true;
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/smtp.php b/www/wiki/vendor/pear/mail/Mail/smtp.php
new file mode 100644
index 00000000..5e698fee
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/smtp.php
@@ -0,0 +1,461 @@
+<?php
+/**
+ * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017, Chuck Hagenbuch & Jon Parise
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category HTTP
+ * @package HTTP_Request
+ * @author Jon Parise <jon@php.net>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 2010-2017 Chuck Hagenbuch
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+/** Error: Failed to create a Net_SMTP object */
+define('PEAR_MAIL_SMTP_ERROR_CREATE', 10000);
+
+/** Error: Failed to connect to SMTP server */
+define('PEAR_MAIL_SMTP_ERROR_CONNECT', 10001);
+
+/** Error: SMTP authentication failure */
+define('PEAR_MAIL_SMTP_ERROR_AUTH', 10002);
+
+/** Error: No From: address has been provided */
+define('PEAR_MAIL_SMTP_ERROR_FROM', 10003);
+
+/** Error: Failed to set sender */
+define('PEAR_MAIL_SMTP_ERROR_SENDER', 10004);
+
+/** Error: Failed to add recipient */
+define('PEAR_MAIL_SMTP_ERROR_RECIPIENT', 10005);
+
+/** Error: Failed to send data */
+define('PEAR_MAIL_SMTP_ERROR_DATA', 10006);
+
+/**
+ * SMTP implementation of the PEAR Mail interface. Requires the Net_SMTP class.
+ * @access public
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_smtp extends Mail {
+
+ /**
+ * SMTP connection object.
+ *
+ * @var object
+ * @access private
+ */
+ var $_smtp = null;
+
+ /**
+ * The list of service extension parameters to pass to the Net_SMTP
+ * mailFrom() command.
+ *
+ * @var array
+ */
+ var $_extparams = array();
+
+ /**
+ * The SMTP host to connect to.
+ *
+ * @var string
+ */
+ var $host = 'localhost';
+
+ /**
+ * The port the SMTP server is on.
+ *
+ * @var integer
+ */
+ var $port = 25;
+
+ /**
+ * Should SMTP authentication be used?
+ *
+ * This value may be set to true, false or the name of a specific
+ * authentication method.
+ *
+ * If the value is set to true, the Net_SMTP package will attempt to use
+ * the best authentication method advertised by the remote SMTP server.
+ *
+ * @var mixed
+ */
+ var $auth = false;
+
+ /**
+ * The username to use if the SMTP server requires authentication.
+ *
+ * @var string
+ */
+ var $username = '';
+
+ /**
+ * The password to use if the SMTP server requires authentication.
+ *
+ * @var string
+ */
+ var $password = '';
+
+ /**
+ * Hostname or domain that will be sent to the remote SMTP server in the
+ * HELO / EHLO message.
+ *
+ * @var string
+ */
+ var $localhost = 'localhost';
+
+ /**
+ * SMTP connection timeout value. NULL indicates no timeout.
+ *
+ * @var integer
+ */
+ var $timeout = null;
+
+ /**
+ * Turn on Net_SMTP debugging?
+ *
+ * @var boolean $debug
+ */
+ var $debug = false;
+
+ /**
+ * Indicates whether or not the SMTP connection should persist over
+ * multiple calls to the send() method.
+ *
+ * @var boolean
+ */
+ var $persist = false;
+
+ /**
+ * Use SMTP command pipelining (specified in RFC 2920) if the SMTP server
+ * supports it. This speeds up delivery over high-latency connections. By
+ * default, use the default value supplied by Net_SMTP.
+ *
+ * @var boolean
+ */
+ var $pipelining;
+
+ /**
+ * The list of socket options
+ *
+ * @var array
+ */
+ var $socket_options = array();
+
+ /**
+ * Constructor.
+ *
+ * Instantiates a new Mail_smtp:: object based on the parameters
+ * passed in. It looks for the following parameters:
+ * host The server to connect to. Defaults to localhost.
+ * port The port to connect to. Defaults to 25.
+ * auth SMTP authentication. Defaults to none.
+ * username The username to use for SMTP auth. No default.
+ * password The password to use for SMTP auth. No default.
+ * localhost The local hostname / domain. Defaults to localhost.
+ * timeout The SMTP connection timeout. Defaults to none.
+ * verp Whether to use VERP or not. Defaults to false.
+ * DEPRECATED as of 1.2.0 (use setMailParams()).
+ * debug Activate SMTP debug mode? Defaults to false.
+ * persist Should the SMTP connection persist?
+ * pipelining Use SMTP command pipelining
+ *
+ * If a parameter is present in the $params array, it replaces the
+ * default.
+ *
+ * @param array Hash containing any parameters different from the
+ * defaults.
+ */
+ public function __construct($params)
+ {
+ if (isset($params['host'])) $this->host = $params['host'];
+ if (isset($params['port'])) $this->port = $params['port'];
+ if (isset($params['auth'])) $this->auth = $params['auth'];
+ if (isset($params['username'])) $this->username = $params['username'];
+ if (isset($params['password'])) $this->password = $params['password'];
+ if (isset($params['localhost'])) $this->localhost = $params['localhost'];
+ if (isset($params['timeout'])) $this->timeout = $params['timeout'];
+ if (isset($params['debug'])) $this->debug = (bool)$params['debug'];
+ if (isset($params['persist'])) $this->persist = (bool)$params['persist'];
+ if (isset($params['pipelining'])) $this->pipelining = (bool)$params['pipelining'];
+ if (isset($params['socket_options'])) $this->socket_options = $params['socket_options'];
+ // Deprecated options
+ if (isset($params['verp'])) {
+ $this->addServiceExtensionParameter('XVERP', is_bool($params['verp']) ? null : $params['verp']);
+ }
+ }
+
+ /**
+ * Destructor implementation to ensure that we disconnect from any
+ * potentially-alive persistent SMTP connections.
+ */
+ public function __destruct()
+ {
+ $this->disconnect();
+ }
+
+ /**
+ * Implements Mail::send() function using SMTP.
+ *
+ * @param mixed $recipients Either a comma-seperated list of recipients
+ * (RFC822 compliant), or an array of recipients,
+ * each RFC822 valid. This may contain recipients not
+ * specified in the headers, for Bcc:, resending
+ * messages, etc.
+ *
+ * @param array $headers The array of headers to send with the mail, in an
+ * associative array, where the array key is the
+ * header name (e.g., 'Subject'), and the array value
+ * is the header value (e.g., 'test'). The header
+ * produced from those values would be 'Subject:
+ * test'.
+ *
+ * @param string $body The full text of the message body, including any
+ * MIME parts, etc.
+ *
+ * @return mixed Returns true on success, or a PEAR_Error
+ * containing a descriptive error message on
+ * failure.
+ */
+ public function send($recipients, $headers, $body)
+ {
+ $result = $this->send_or_fail($recipients, $headers, $body);
+
+ /* If persistent connections are disabled, destroy our SMTP object. */
+ if ($this->persist === false) {
+ $this->disconnect();
+ }
+
+ return $result;
+ }
+
+ protected function send_or_fail($recipients, $headers, $body)
+ {
+ /* If we don't already have an SMTP object, create one. */
+ $result = $this->getSMTPObject();
+ if (PEAR::isError($result)) {
+ return $result;
+ }
+
+ if (!is_array($headers)) {
+ return PEAR::raiseError('$headers must be an array');
+ }
+
+ $this->_sanitizeHeaders($headers);
+
+ $headerElements = $this->prepareHeaders($headers);
+ if (is_a($headerElements, 'PEAR_Error')) {
+ $this->_smtp->rset();
+ return $headerElements;
+ }
+ list($from, $textHeaders) = $headerElements;
+
+ /* Since few MTAs are going to allow this header to be forged
+ * unless it's in the MAIL FROM: exchange, we'll use
+ * Return-Path instead of From: if it's set. */
+ if (!empty($headers['Return-Path'])) {
+ $from = $headers['Return-Path'];
+ }
+
+ if (!isset($from)) {
+ $this->_smtp->rset();
+ return PEAR::raiseError('No From: address has been provided',
+ PEAR_MAIL_SMTP_ERROR_FROM);
+ }
+
+ $params = null;
+ if (!empty($this->_extparams)) {
+ foreach ($this->_extparams as $key => $val) {
+ $params .= ' ' . $key . (is_null($val) ? '' : '=' . $val);
+ }
+ }
+ if (PEAR::isError($res = $this->_smtp->mailFrom($from, ltrim($params)))) {
+ $error = $this->_error("Failed to set sender: $from", $res);
+ $this->_smtp->rset();
+ return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_SENDER);
+ }
+
+ $recipients = $this->parseRecipients($recipients);
+ if (is_a($recipients, 'PEAR_Error')) {
+ $this->_smtp->rset();
+ return $recipients;
+ }
+
+ foreach ($recipients as $recipient) {
+ $res = $this->_smtp->rcptTo($recipient);
+ if (is_a($res, 'PEAR_Error')) {
+ $error = $this->_error("Failed to add recipient: $recipient", $res);
+ $this->_smtp->rset();
+ return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_RECIPIENT);
+ }
+ }
+
+ /* Send the message's headers and the body as SMTP data. */
+ $res = $this->_smtp->data($body, $textHeaders);
+ list(,$args) = $this->_smtp->getResponse();
+
+ if (preg_match("/ queued as (.*)/", $args, $queued)) {
+ $this->queued_as = $queued[1];
+ }
+
+ /* we need the greeting; from it we can extract the authorative name of the mail server we've really connected to.
+ * ideal if we're connecting to a round-robin of relay servers and need to track which exact one took the email */
+ $this->greeting = $this->_smtp->getGreeting();
+
+ if (is_a($res, 'PEAR_Error')) {
+ $error = $this->_error('Failed to send data', $res);
+ $this->_smtp->rset();
+ return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_DATA);
+ }
+
+ return true;
+ }
+
+ /**
+ * Connect to the SMTP server by instantiating a Net_SMTP object.
+ *
+ * @return mixed Returns a reference to the Net_SMTP object on success, or
+ * a PEAR_Error containing a descriptive error message on
+ * failure.
+ *
+ * @since 1.2.0
+ */
+ public function getSMTPObject()
+ {
+ if (is_object($this->_smtp) !== false) {
+ return $this->_smtp;
+ }
+
+ include_once 'Net/SMTP.php';
+ $this->_smtp = new Net_SMTP($this->host,
+ $this->port,
+ $this->localhost,
+ $this->pipelining,
+ 0,
+ $this->socket_options);
+
+ /* If we still don't have an SMTP object at this point, fail. */
+ if (is_object($this->_smtp) === false) {
+ return PEAR::raiseError('Failed to create a Net_SMTP object',
+ PEAR_MAIL_SMTP_ERROR_CREATE);
+ }
+
+ /* Configure the SMTP connection. */
+ if ($this->debug) {
+ $this->_smtp->setDebug(true);
+ }
+
+ /* Attempt to connect to the configured SMTP server. */
+ if (PEAR::isError($res = $this->_smtp->connect($this->timeout))) {
+ $error = $this->_error('Failed to connect to ' .
+ $this->host . ':' . $this->port,
+ $res);
+ return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_CONNECT);
+ }
+
+ /* Attempt to authenticate if authentication has been enabled. */
+ if ($this->auth) {
+ $method = is_string($this->auth) ? $this->auth : '';
+
+ if (PEAR::isError($res = $this->_smtp->auth($this->username,
+ $this->password,
+ $method))) {
+ $error = $this->_error("$method authentication failure",
+ $res);
+ $this->_smtp->rset();
+ return PEAR::raiseError($error, PEAR_MAIL_SMTP_ERROR_AUTH);
+ }
+ }
+
+ return $this->_smtp;
+ }
+
+ /**
+ * Add parameter associated with a SMTP service extension.
+ *
+ * @param string Extension keyword.
+ * @param string Any value the keyword needs.
+ *
+ * @since 1.2.0
+ */
+ public function addServiceExtensionParameter($keyword, $value = null)
+ {
+ $this->_extparams[$keyword] = $value;
+ }
+
+ /**
+ * Disconnect and destroy the current SMTP connection.
+ *
+ * @return boolean True if the SMTP connection no longer exists.
+ *
+ * @since 1.1.9
+ */
+ public function disconnect()
+ {
+ /* If we have an SMTP object, disconnect and destroy it. */
+ if (is_object($this->_smtp) && $this->_smtp->disconnect()) {
+ $this->_smtp = null;
+ }
+
+ /* We are disconnected if we no longer have an SMTP object. */
+ return ($this->_smtp === null);
+ }
+
+ /**
+ * Build a standardized string describing the current SMTP error.
+ *
+ * @param string $text Custom string describing the error context.
+ * @param object $error Reference to the current PEAR_Error object.
+ *
+ * @return string A string describing the current SMTP error.
+ *
+ * @since 1.1.7
+ */
+ protected function _error($text, $error)
+ {
+ /* Split the SMTP response into a code and a response string. */
+ list($code, $response) = $this->_smtp->getResponse();
+
+ /* Build our standardized error string. */
+ return $text
+ . ' [SMTP: ' . $error->getMessage()
+ . " (code: $code, response: $response)]";
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/Mail/smtpmx.php b/www/wiki/vendor/pear/mail/Mail/smtpmx.php
new file mode 100644
index 00000000..e26db1be
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/Mail/smtpmx.php
@@ -0,0 +1,504 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
+
+/**
+ * SMTP MX
+ *
+ * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
+ *
+ * PHP version 5
+ *
+ * LICENSE:
+ *
+ * Copyright (c) 2010-2017 gERD Schaufelberger
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of the copyright holder nor the names of its
+ * contributors may be used to endorse or promote products derived from
+ * this software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
+ * HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail_smtpmx
+ * @author gERD Schaufelberger <gerd@php-tools.net>
+ * @copyright 2010-2017 gERD Schaufelberger
+ * @license http://opensource.org/licenses/BSD-3-Clause New BSD License
+ * @version CVS: $Id$
+ * @link http://pear.php.net/package/Mail/
+ */
+
+require_once 'Net/SMTP.php';
+
+/**
+ * SMTP MX implementation of the PEAR Mail interface. Requires the Net_SMTP class.
+ *
+ *
+ * @access public
+ * @author gERD Schaufelberger <gerd@php-tools.net>
+ * @package Mail
+ * @version $Revision$
+ */
+class Mail_smtpmx extends Mail {
+
+ /**
+ * SMTP connection object.
+ *
+ * @var object
+ * @access private
+ */
+ var $_smtp = null;
+
+ /**
+ * The port the SMTP server is on.
+ * @var integer
+ * @see getservicebyname()
+ */
+ var $port = 25;
+
+ /**
+ * Hostname or domain that will be sent to the remote SMTP server in the
+ * HELO / EHLO message.
+ *
+ * @var string
+ * @see posix_uname()
+ */
+ var $mailname = 'localhost';
+
+ /**
+ * SMTP connection timeout value. NULL indicates no timeout.
+ *
+ * @var integer
+ */
+ var $timeout = 10;
+
+ /**
+ * use either PEAR:Net_DNS or getmxrr
+ *
+ * @var boolean
+ */
+ var $withNetDns = true;
+
+ /**
+ * PEAR:Net_DNS_Resolver
+ *
+ * @var object
+ */
+ var $resolver;
+
+ /**
+ * Whether to use VERP or not. If not a boolean, the string value
+ * will be used as the VERP separators.
+ *
+ * @var mixed boolean or string
+ */
+ var $verp = false;
+
+ /**
+ * Whether to use VRFY or not.
+ *
+ * @var boolean $vrfy
+ */
+ var $vrfy = false;
+
+ /**
+ * Switch to test mode - don't send emails for real
+ *
+ * @var boolean $debug
+ */
+ var $test = false;
+
+ /**
+ * Turn on Net_SMTP debugging?
+ *
+ * @var boolean $peardebug
+ */
+ var $debug = false;
+
+ /**
+ * internal error codes
+ *
+ * translate internal error identifier to PEAR-Error codes and human
+ * readable messages.
+ *
+ * @var boolean $debug
+ * @todo as I need unique error-codes to identify what exactly went wrond
+ * I did not use intergers as it should be. Instead I added a "namespace"
+ * for each code. This avoids conflicts with error codes from different
+ * classes. How can I use unique error codes and stay conform with PEAR?
+ */
+ var $errorCode = array(
+ 'not_connected' => array(
+ 'code' => 1,
+ 'msg' => 'Could not connect to any mail server ({HOST}) at port {PORT} to send mail to {RCPT}.'
+ ),
+ 'failed_vrfy_rcpt' => array(
+ 'code' => 2,
+ 'msg' => 'Recipient "{RCPT}" could not be veryfied.'
+ ),
+ 'failed_set_from' => array(
+ 'code' => 3,
+ 'msg' => 'Failed to set sender: {FROM}.'
+ ),
+ 'failed_set_rcpt' => array(
+ 'code' => 4,
+ 'msg' => 'Failed to set recipient: {RCPT}.'
+ ),
+ 'failed_send_data' => array(
+ 'code' => 5,
+ 'msg' => 'Failed to send mail to: {RCPT}.'
+ ),
+ 'no_from' => array(
+ 'code' => 5,
+ 'msg' => 'No from address has be provided.'
+ ),
+ 'send_data' => array(
+ 'code' => 7,
+ 'msg' => 'Failed to create Net_SMTP object.'
+ ),
+ 'no_mx' => array(
+ 'code' => 8,
+ 'msg' => 'No MX-record for {RCPT} found.'
+ ),
+ 'no_resolver' => array(
+ 'code' => 9,
+ 'msg' => 'Could not start resolver! Install PEAR:Net_DNS or switch off "netdns"'
+ ),
+ 'failed_rset' => array(
+ 'code' => 10,
+ 'msg' => 'RSET command failed, SMTP-connection corrupt.'
+ ),
+ );
+
+ /**
+ * Constructor.
+ *
+ * Instantiates a new Mail_smtp:: object based on the parameters
+ * passed in. It looks for the following parameters:
+ * mailname The name of the local mail system (a valid hostname which matches the reverse lookup)
+ * port smtp-port - the default comes from getservicebyname() and should work fine
+ * timeout The SMTP connection timeout. Defaults to 30 seconds.
+ * vrfy Whether to use VRFY or not. Defaults to false.
+ * verp Whether to use VERP or not. Defaults to false.
+ * test Activate test mode? Defaults to false.
+ * debug Activate SMTP and Net_DNS debug mode? Defaults to false.
+ * netdns whether to use PEAR:Net_DNS or the PHP build in function getmxrr, default is true
+ *
+ * If a parameter is present in the $params array, it replaces the
+ * default.
+ *
+ * @access public
+ * @param array Hash containing any parameters different from the
+ * defaults.
+ * @see _Mail_smtpmx()
+ */
+ function __construct($params)
+ {
+ if (isset($params['mailname'])) {
+ $this->mailname = $params['mailname'];
+ } else {
+ // try to find a valid mailname
+ if (function_exists('posix_uname')) {
+ $uname = posix_uname();
+ $this->mailname = $uname['nodename'];
+ }
+ }
+
+ // port number
+ if (isset($params['port'])) {
+ $this->_port = $params['port'];
+ } else {
+ $this->_port = getservbyname('smtp', 'tcp');
+ }
+
+ if (isset($params['timeout'])) $this->timeout = $params['timeout'];
+ if (isset($params['verp'])) $this->verp = $params['verp'];
+ if (isset($params['test'])) $this->test = $params['test'];
+ if (isset($params['peardebug'])) $this->test = $params['peardebug'];
+ if (isset($params['netdns'])) $this->withNetDns = $params['netdns'];
+ }
+
+ /**
+ * Constructor wrapper for PHP4
+ *
+ * @access public
+ * @param array Hash containing any parameters different from the defaults
+ * @see __construct()
+ */
+ function Mail_smtpmx($params)
+ {
+ $this->__construct($params);
+ register_shutdown_function(array(&$this, '__destruct'));
+ }
+
+ /**
+ * Destructor implementation to ensure that we disconnect from any
+ * potentially-alive persistent SMTP connections.
+ */
+ function __destruct()
+ {
+ if (is_object($this->_smtp)) {
+ $this->_smtp->disconnect();
+ $this->_smtp = null;
+ }
+ }
+
+ /**
+ * Implements Mail::send() function using SMTP direct delivery
+ *
+ * @access public
+ * @param mixed $recipients in RFC822 style or array
+ * @param array $headers The array of headers to send with the mail.
+ * @param string $body The full text of the message body,
+ * @return mixed Returns true on success, or a PEAR_Error
+ */
+ function send($recipients, $headers, $body)
+ {
+ if (!is_array($headers)) {
+ return PEAR::raiseError('$headers must be an array');
+ }
+
+ $result = $this->_sanitizeHeaders($headers);
+ if (is_a($result, 'PEAR_Error')) {
+ return $result;
+ }
+
+ // Prepare headers
+ $headerElements = $this->prepareHeaders($headers);
+ if (is_a($headerElements, 'PEAR_Error')) {
+ return $headerElements;
+ }
+ list($from, $textHeaders) = $headerElements;
+
+ // use 'Return-Path' if possible
+ if (!empty($headers['Return-Path'])) {
+ $from = $headers['Return-Path'];
+ }
+ if (!isset($from)) {
+ return $this->_raiseError('no_from');
+ }
+
+ // Prepare recipients
+ $recipients = $this->parseRecipients($recipients);
+ if (is_a($recipients, 'PEAR_Error')) {
+ return $recipients;
+ }
+
+ foreach ($recipients as $rcpt) {
+ list($user, $host) = explode('@', $rcpt);
+
+ $mx = $this->_getMx($host);
+ if (is_a($mx, 'PEAR_Error')) {
+ return $mx;
+ }
+
+ if (empty($mx)) {
+ $info = array('rcpt' => $rcpt);
+ return $this->_raiseError('no_mx', $info);
+ }
+
+ $connected = false;
+ foreach ($mx as $mserver => $mpriority) {
+ $this->_smtp = new Net_SMTP($mserver, $this->port, $this->mailname);
+
+ // configure the SMTP connection.
+ if ($this->debug) {
+ $this->_smtp->setDebug(true);
+ }
+
+ // attempt to connect to the configured SMTP server.
+ $res = $this->_smtp->connect($this->timeout);
+ if (is_a($res, 'PEAR_Error')) {
+ $this->_smtp = null;
+ continue;
+ }
+
+ // connection established
+ if ($res) {
+ $connected = true;
+ break;
+ }
+ }
+
+ if (!$connected) {
+ $info = array(
+ 'host' => implode(', ', array_keys($mx)),
+ 'port' => $this->port,
+ 'rcpt' => $rcpt,
+ );
+ return $this->_raiseError('not_connected', $info);
+ }
+
+ // Verify recipient
+ if ($this->vrfy) {
+ $res = $this->_smtp->vrfy($rcpt);
+ if (is_a($res, 'PEAR_Error')) {
+ $info = array('rcpt' => $rcpt);
+ return $this->_raiseError('failed_vrfy_rcpt', $info);
+ }
+ }
+
+ // mail from:
+ $args['verp'] = $this->verp;
+ $res = $this->_smtp->mailFrom($from, $args);
+ if (is_a($res, 'PEAR_Error')) {
+ $info = array('from' => $from);
+ return $this->_raiseError('failed_set_from', $info);
+ }
+
+ // rcpt to:
+ $res = $this->_smtp->rcptTo($rcpt);
+ if (is_a($res, 'PEAR_Error')) {
+ $info = array('rcpt' => $rcpt);
+ return $this->_raiseError('failed_set_rcpt', $info);
+ }
+
+ // Don't send anything in test mode
+ if ($this->test) {
+ $result = $this->_smtp->rset();
+ $res = $this->_smtp->rset();
+ if (is_a($res, 'PEAR_Error')) {
+ return $this->_raiseError('failed_rset');
+ }
+
+ $this->_smtp->disconnect();
+ $this->_smtp = null;
+ return true;
+ }
+
+ // Send data
+ $res = $this->_smtp->data($body, $textHeaders);
+ if (is_a($res, 'PEAR_Error')) {
+ $info = array('rcpt' => $rcpt);
+ return $this->_raiseError('failed_send_data', $info);
+ }
+
+ $this->_smtp->disconnect();
+ $this->_smtp = null;
+ }
+
+ return true;
+ }
+
+ /**
+ * Recieve mx rexords for a spciefied host
+ *
+ * The MX records
+ *
+ * @access private
+ * @param string $host mail host
+ * @return mixed sorted
+ */
+ function _getMx($host)
+ {
+ $mx = array();
+
+ if ($this->withNetDns) {
+ $res = $this->_loadNetDns();
+ if (is_a($res, 'PEAR_Error')) {
+ return $res;
+ }
+
+ $response = $this->resolver->query($host, 'MX');
+ if (!$response) {
+ return false;
+ }
+
+ foreach ($response->answer as $rr) {
+ if ($rr->type == 'MX') {
+ $mx[$rr->exchange] = $rr->preference;
+ }
+ }
+ } else {
+ $mxHost = array();
+ $mxWeight = array();
+
+ if (!getmxrr($host, $mxHost, $mxWeight)) {
+ return false;
+ }
+ for ($i = 0; $i < count($mxHost); ++$i) {
+ $mx[$mxHost[$i]] = $mxWeight[$i];
+ }
+ }
+
+ asort($mx);
+ return $mx;
+ }
+
+ /**
+ * initialize PEAR:Net_DNS_Resolver
+ *
+ * @access private
+ * @return boolean true on success
+ */
+ function _loadNetDns()
+ {
+ if (is_object($this->resolver)) {
+ return true;
+ }
+
+ if (!include_once 'Net/DNS.php') {
+ return $this->_raiseError('no_resolver');
+ }
+
+ $this->resolver = new Net_DNS_Resolver();
+ if ($this->debug) {
+ $this->resolver->test = 1;
+ }
+
+ return true;
+ }
+
+ /**
+ * raise standardized error
+ *
+ * include additional information in error message
+ *
+ * @access private
+ * @param string $id maps error ids to codes and message
+ * @param array $info optional information in associative array
+ * @see _errorCode
+ */
+ function _raiseError($id, $info = array())
+ {
+ $code = $this->errorCode[$id]['code'];
+ $msg = $this->errorCode[$id]['msg'];
+
+ // include info to messages
+ if (!empty($info)) {
+ $search = array();
+ $replace = array();
+
+ foreach ($info as $key => $value) {
+ array_push($search, '{' . strtoupper($key) . '}');
+ array_push($replace, $value);
+ }
+
+ $msg = str_replace($search, $replace, $msg);
+ }
+
+ return PEAR::raiseError($msg, $code);
+ }
+
+}
diff --git a/www/wiki/vendor/pear/mail/README.rst b/www/wiki/vendor/pear/mail/README.rst
new file mode 100644
index 00000000..9697e631
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/README.rst
@@ -0,0 +1,53 @@
+****
+Mail
+****
+Class that provides multiple interfaces for sending emails.
+
+PEAR's Mail package defines an interface for implementing mailers under the
+PEAR hierarchy.
+It also provides supporting functions useful to multiple mailer backends.
+
+Currently supported backends include:
+
+- PHP's native ``mail()`` function
+- sendmail
+- SMTP
+
+This package also provides a `RFC 822`__ email address list validation utility class.
+
+Use Mail in combination with `Mail_Mime`__ to send HTML emails or emails with
+attachments - have a look at the example__.
+
+__ https://tools.ietf.org/html/rfc822
+__ http://pear.php.net/package/Mail_Mime
+__ http://pear.php.net/manual/en/package.mail.mail-mime.example.php
+
+============
+Installation
+============
+
+PEAR
+====
+::
+
+ $ pear install mail
+
+Composer
+========
+::
+
+ $ composer require pear/mail
+
+=====
+Links
+=====
+Homepage
+ http://pear.php.net/package/Mail
+Source code
+ https://github.com/pear/Mail
+Issue tracker
+ http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Mail
+Unit test status
+ https://travis-ci.org/pear/Mail
+Packagist
+ https://packagist.org/packages/pear/mail
diff --git a/www/wiki/vendor/pear/mail/composer.json b/www/wiki/vendor/pear/mail/composer.json
new file mode 100644
index 00000000..a167cc66
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/composer.json
@@ -0,0 +1,46 @@
+{
+ "authors": [
+ {
+ "email": "chuck@horde.org",
+ "name": "Chuck Hagenbuch",
+ "role": "Lead"
+ },
+ {
+ "email": "richard@phpguru.org",
+ "name": "Richard Heyes",
+ "role": "Developer"
+ },
+ {
+ "email": "alec@alec.pl",
+ "name": "Aleksander Machniak",
+ "role": "Developer"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Mail": "./"
+ }
+ },
+ "description": "Class that provides multiple interfaces for sending emails.",
+ "homepage": "http://pear.php.net/package/Mail",
+ "include-path": [
+ "./"
+ ],
+ "license": "BSD-2-Clause",
+ "name": "pear/mail",
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Mail",
+ "source": "https://github.com/pear/Mail"
+ },
+ "type": "library",
+ "require": {
+ "php": ">=5.2.1",
+ "pear/pear-core-minimal": "~1.9"
+ },
+ "require-dev": {
+ "pear/pear": "*"
+ },
+ "suggest": {
+ "pear/net_smtp": "Install optionally via your project's composer.json"
+ }
+}
diff --git a/www/wiki/vendor/pear/mail/package.xml b/www/wiki/vendor/pear/mail/package.xml
new file mode 100644
index 00000000..d08c12c6
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/package.xml
@@ -0,0 +1,79 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.0" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Mail</name>
+ <channel>pear.php.net</channel>
+ <summary>Class that provides multiple interfaces for sending emails</summary>
+ <description>PEAR&apos;s Mail package defines an interface for implementing mailers under the PEAR hierarchy. It also provides supporting functions useful to multiple mailer backends. Currently supported backends include: PHP&apos;s native mail() function, sendmail, and SMTP. This package also provides a RFC822 email address list validation utility class.</description>
+ <lead>
+ <name>Chuck Hagenbuch</name>
+ <user>chagenbu</user>
+ <email>chuck@horde.org</email>
+ <active>no</active>
+ </lead>
+ <developer>
+ <name>Richard Heyes</name>
+ <user>richard</user>
+ <email>richard@phpguru.org</email>
+ <active>no</active>
+ </developer>
+ <developer>
+ <name>Aleksander Machniak</name>
+ <user>alec</user>
+ <email>alec@alec.pl</email>
+ <active>yes</active>
+ </developer>
+ <date>2017-04-11</date>
+ <version>
+ <release>1.4.1</release>
+ <api>1.3.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="https://opensource.org/licenses/BSD-3-Clause">New BSD License</license>
+ <notes>
+* Loosen recognition of "queued as" server response (PR #10)
+
+* Bug #20463: domain-literal parsing error
+* Bug #20513: Mail_smtp::send() doesn't close socket for smtp connection
+ </notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file baseinstalldir="/" name="LICENSE" role="doc" />
+ <file baseinstalldir="/" name="Mail/mail.php" role="php" />
+ <file baseinstalldir="/" name="Mail/mock.php" role="php" />
+ <file baseinstalldir="/" name="Mail/null.php" role="php" />
+ <file baseinstalldir="/" name="Mail/RFC822.php" role="php" />
+ <file baseinstalldir="/" name="Mail/sendmail.php" role="php" />
+ <file baseinstalldir="/" name="Mail/smtp.php" role="php" />
+ <file baseinstalldir="/" name="Mail/smtpmx.php" role="php" />
+ <file baseinstalldir="/" name="Mail.php" role="php" />
+ <file baseinstalldir="/" name="tests/9137.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/9137_2.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/13659.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/bug17178.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/bug17317.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/rfc822.phpt" role="test" />
+ <file baseinstalldir="/" name="tests/smtp_error.phpt" role="test" />
+ </dir>
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.2.1</min>
+ </php>
+ <pearinstaller>
+ <min>1.5.6</min>
+ </pearinstaller>
+ </required>
+ <optional>
+ <package>
+ <name>Net_SMTP</name>
+ <channel>pear.php.net</channel>
+ <min>1.4.1</min>
+ </package>
+ </optional>
+ </dependencies>
+ <phprelease />
+</package>
diff --git a/www/wiki/vendor/pear/mail/tests/13659.phpt b/www/wiki/vendor/pear/mail/tests/13659.phpt
new file mode 100644
index 00000000..0b57a72d
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/13659.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Mail: Test for bug #13659
+--FILE--
+<?php
+//require_once dirname(__FILE__) . '/../Mail/RFC822.php';
+require_once 'Mail/RFC822.php';
+require_once 'PEAR.php';
+
+$address = '"Test Student" <test@mydomain.com> (test)';
+$parser = new Mail_RFC822();
+$result = $parser->parseAddressList($address, 'anydomain.com', TRUE);
+
+if (!PEAR::isError($result) && is_array($result) && is_object($result[0]))
+ if ($result[0]->personal == '"Test Student"' &&
+ $result[0]->mailbox == "test" &&
+ $result[0]->host == "mydomain.com" &&
+ is_array($result[0]->comment) && $result[0]->comment[0] == 'test')
+ {
+ print("OK");
+ }
+
+
+?>
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail/tests/9137.phpt b/www/wiki/vendor/pear/mail/tests/9137.phpt
new file mode 100644
index 00000000..ba54c056
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/9137.phpt
@@ -0,0 +1,33 @@
+--TEST--
+Mail: Test for bug #9137
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/../Mail/RFC822.php';
+require_once 'PEAR.php';
+
+$addresses = array(
+ array('name' => 'John Doe', 'email' => 'test@example.com'),
+ array('name' => 'John Doe\\', 'email' => 'test@example.com'),
+ array('name' => 'John "Doe', 'email' => 'test@example.com'),
+ array('name' => 'John "Doe\\', 'email' => 'test@example.com'),
+);
+
+for ($i = 0; $i < count($addresses); $i++) {
+ // construct the address
+ $address = "\"" . addslashes($addresses[$i]['name']) . "\" ".
+ "<".$addresses[$i]['email'].">";
+
+ $parsedAddresses = Mail_RFC822::parseAddressList($address);
+ if (is_a($parsedAddresses, 'PEAR_Error')) {
+ echo $address." :: Failed to validate\n";
+ } else {
+ echo $address." :: Parsed\n";
+ }
+}
+
+--EXPECT--
+"John Doe" <test@example.com> :: Parsed
+"John Doe\\" <test@example.com> :: Parsed
+"John \"Doe" <test@example.com> :: Parsed
+"John \"Doe\\" <test@example.com> :: Parsed
diff --git a/www/wiki/vendor/pear/mail/tests/9137_2.phpt b/www/wiki/vendor/pear/mail/tests/9137_2.phpt
new file mode 100644
index 00000000..cc9dcbce
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/9137_2.phpt
@@ -0,0 +1,35 @@
+--TEST--
+Mail: Test for bug #9137, take 2
+--FILE--
+<?php
+
+require_once dirname(__FILE__) . '/../Mail/RFC822.php';
+require_once 'PEAR.php';
+
+$addresses = array(
+ array('raw' => '"John Doe" <test@example.com>'),
+ array('raw' => '"John Doe' . chr(92) . '" <test@example.com>'),
+ array('raw' => '"John Doe' . chr(92) . chr(92) . '" <test@example.com>'),
+ array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
+ array('raw' => '"John Doe' . chr(92) . chr(92) . chr(92) . chr(92) . '" <test@example.com>'),
+ array('raw' => '"John Doe <test@example.com>'),
+);
+
+for ($i = 0; $i < count($addresses); $i++) {
+ // construct the address
+ $address = $addresses[$i]['raw'];
+ $parsedAddresses = Mail_RFC822::parseAddressList($address);
+ if (PEAR::isError($parsedAddresses)) {
+ echo $address." :: Failed to validate\n";
+ } else {
+ echo $address." :: Parsed\n";
+ }
+}
+
+--EXPECT--
+"John Doe" <test@example.com> :: Parsed
+"John Doe\" <test@example.com> :: Failed to validate
+"John Doe\\" <test@example.com> :: Parsed
+"John Doe\\\" <test@example.com> :: Failed to validate
+"John Doe\\\\" <test@example.com> :: Parsed
+"John Doe <test@example.com> :: Failed to validate
diff --git a/www/wiki/vendor/pear/mail/tests/Makefile b/www/wiki/vendor/pear/mail/tests/Makefile
new file mode 100644
index 00000000..bb6b1be4
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/Makefile
@@ -0,0 +1,8 @@
+
+clean:
+ rm -f *.log *.php *.diff *.exp *.out
+
+
+
+test:
+ cd .. && pear run-tests tests/*.phpt && cd tests;
diff --git a/www/wiki/vendor/pear/mail/tests/bug17178.phpt b/www/wiki/vendor/pear/mail/tests/bug17178.phpt
new file mode 100755
index 00000000..4572dda1
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/bug17178.phpt
@@ -0,0 +1,11 @@
+--TEST--
+Mail_RFC822::parseAddressList does not accept RFC-valid group syntax
+--FILE--
+<?php
+require "Mail/RFC822.php";
+
+var_dump(Mail_RFC822::parseAddressList("empty-group:;","invalid",false,false));
+
+--EXPECT--
+array(0) {
+}
diff --git a/www/wiki/vendor/pear/mail/tests/bug17317.phpt b/www/wiki/vendor/pear/mail/tests/bug17317.phpt
new file mode 100755
index 00000000..331e8033
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/bug17317.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Mail_RFC822::parseAddressList invalid periods in mail address
+--FILE--
+<?php
+require "Mail/RFC822.php";
+
+$result[] = Mail_RFC822::parseAddressList('.name@example.com');
+$result[] = Mail_RFC822::parseAddressList('name.@example.com');
+$result[] = Mail_RFC822::parseAddressList('name..name@example.com');
+
+foreach ($result as $r) {
+ if (is_a($r, 'PEAR_Error')) {
+ echo "OK\n";
+ }
+}
+--EXPECT--
+OK
+OK
+OK
diff --git a/www/wiki/vendor/pear/mail/tests/rfc822.phpt b/www/wiki/vendor/pear/mail/tests/rfc822.phpt
new file mode 100644
index 00000000..5ba8e3c5
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/rfc822.phpt
@@ -0,0 +1,107 @@
+--TEST--
+Mail_RFC822: Address Parsing
+--FILE--
+<?php
+require_once 'Mail/RFC822.php';
+
+$parser = new Mail_RFC822();
+
+/* A simple, bare address. */
+$address = 'user@example.com';
+print_r($parser->parseAddressList($address, null, true, true));
+
+/* Address groups. */
+$address = 'My Group: "Richard" <richard@localhost> (A comment), ted@example.com (Ted Bloggs), Barney;';
+print_r($parser->parseAddressList($address, null, true, true));
+
+/* A valid address with spaces in the local part. */
+$address = '<"Jon Parise"@php.net>';
+print_r($parser->parseAddressList($address, null, true, true));
+
+/* An invalid address with spaces in the local part. */
+$address = '<Jon Parise@php.net>';
+$result = $parser->parseAddressList($address, null, true, true);
+if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";
+
+/* A valid address with an uncommon TLD. */
+$address = 'jon@host.longtld';
+$result = $parser->parseAddressList($address, null, true, true);
+if (is_a($result, 'PEAR_Error')) echo $result->getMessage() . "\n";
+
+--EXPECT--
+Array
+(
+ [0] => stdClass Object
+ (
+ [personal] =>
+ [comment] => Array
+ (
+ )
+
+ [mailbox] => user
+ [host] => example.com
+ )
+
+)
+Array
+(
+ [0] => stdClass Object
+ (
+ [groupname] => My Group
+ [addresses] => Array
+ (
+ [0] => stdClass Object
+ (
+ [personal] => "Richard"
+ [comment] => Array
+ (
+ [0] => A comment
+ )
+
+ [mailbox] => richard
+ [host] => localhost
+ )
+
+ [1] => stdClass Object
+ (
+ [personal] =>
+ [comment] => Array
+ (
+ [0] => Ted Bloggs
+ )
+
+ [mailbox] => ted
+ [host] => example.com
+ )
+
+ [2] => stdClass Object
+ (
+ [personal] =>
+ [comment] => Array
+ (
+ )
+
+ [mailbox] => Barney
+ [host] => localhost
+ )
+
+ )
+
+ )
+
+)
+Array
+(
+ [0] => stdClass Object
+ (
+ [personal] =>
+ [comment] => Array
+ (
+ )
+
+ [mailbox] => "Jon Parise"
+ [host] => php.net
+ )
+
+)
+Validation failed for: <Jon Parise@php.net>
diff --git a/www/wiki/vendor/pear/mail/tests/smtp_error.phpt b/www/wiki/vendor/pear/mail/tests/smtp_error.phpt
new file mode 100644
index 00000000..4e8e5a6a
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/smtp_error.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Mail: SMTP Error Reporting
+--SKIPIF--
+<?php
+
+require_once 'PEAR/Registry.php';
+$registry = new PEAR_Registry();
+
+if (!$registry->packageExists('Net_SMTP')) die("skip\n");
+--FILE--
+<?php
+require_once 'Mail.php';
+
+/* Reference a bogus SMTP server address to guarantee a connection failure. */
+$params = array('host' => 'bogus.host.tld');
+
+/* Create our SMTP-based mailer object. */
+$mailer = Mail::factory('smtp', $params);
+
+/* Attempt to send an empty message in order to trigger an error. */
+$e = $mailer->send(array(), array(), '');
+if (is_a($e, 'PEAR_Error')) {
+ $err = $e->getMessage();
+ if (preg_match('/Failed to connect to bogus.host.tld:25 \[SMTP: Failed to connect socket:.*/i', $err)) {
+ echo "OK";
+ }
+}
+
+--EXPECT--
+OK \ No newline at end of file
diff --git a/www/wiki/vendor/pear/mail/tests/validateQuotedString.php b/www/wiki/vendor/pear/mail/tests/validateQuotedString.php
new file mode 100644
index 00000000..bc9a8f4b
--- /dev/null
+++ b/www/wiki/vendor/pear/mail/tests/validateQuotedString.php
@@ -0,0 +1,17 @@
+<?php
+require_once '../Mail/RFC822.php';
+$address_string = '"Joe Doe \(from Somewhere\)" <doe@example.com>, postmaster@example.com, root';
+// $address_string = "Joe Doe from Somewhere <doe@example.com>, postmaster@example.com, root";
+echo $address_string . "\n";
+
+$address_array = Mail_RFC822::parseAddressList($address_string, "example.com");
+if (!is_array($address_array) || count($address_array) < 1) {
+ die("something is wrong\n");
+}
+
+foreach ($address_array as $val) {
+ echo "mailbox : " . $val->mailbox . "\n";
+ echo "host : " . $val->host . "\n";
+ echo "personal: " . $val->personal . "\n";
+}
+print_r($address_array);
diff --git a/www/wiki/vendor/pear/mail_mime/Mail/mime.php b/www/wiki/vendor/pear/mail_mime/Mail/mime.php
new file mode 100644
index 00000000..f96a3900
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/Mail/mime.php
@@ -0,0 +1,1612 @@
+<?php
+
+/**
+ * The Mail_Mime class is used to create MIME E-mail messages
+ *
+ * The Mail_Mime class provides an OO interface to create MIME
+ * enabled email messages. This way you can create emails that
+ * contain plain-text bodies, HTML bodies, attachments, inline
+ * images and specific headers.
+ *
+ * Compatible with PHP version 5 and 7
+ *
+ * LICENSE: This LICENSE is in the BSD license style.
+ * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
+ * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of the authors, nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail_Mime
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Cipriano Groenendal <cipri@php.net>
+ * @author Sean Coates <sean@php.net>
+ * @author Aleksander Machniak <alec@php.net>
+ * @copyright 2003-2006 PEAR <pear-group@php.net>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Mail_mime
+ *
+ * This class is based on HTML Mime Mail class from
+ * Richard Heyes <richard@phpguru.org> which was based also
+ * in the mime_mail.class by Tobias Ratschiller <tobias@dnet.it>
+ * and Sascha Schumann <sascha@schumann.cx>
+ */
+
+
+require_once 'PEAR.php';
+require_once 'Mail/mimePart.php';
+
+
+/**
+ * The Mail_Mime class provides an OO interface to create MIME
+ * enabled email messages. This way you can create emails that
+ * contain plain-text bodies, HTML bodies, attachments, inline
+ * images and specific headers.
+ *
+ * @category Mail
+ * @package Mail_Mime
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Cipriano Groenendal <cipri@php.net>
+ * @author Sean Coates <sean@php.net>
+ * @copyright 2003-2006 PEAR <pear-group@php.net>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Mail_mime
+ */
+class Mail_mime
+{
+ /**
+ * Contains the plain text part of the email
+ *
+ * @var string
+ */
+ protected $txtbody;
+
+ /**
+ * Contains the html part of the email
+ *
+ * @var string
+ */
+ protected $htmlbody;
+
+ /**
+ * Contains the text/calendar part of the email
+ *
+ * @var string
+ */
+ protected $calbody;
+
+ /**
+ * List of the attached images
+ *
+ * @var array
+ */
+ protected $html_images = array();
+
+ /**
+ * List of the attachements
+ *
+ * @var array
+ */
+ protected $parts = array();
+
+ /**
+ * Headers for the mail
+ *
+ * @var array
+ */
+ protected $headers = array();
+
+ /**
+ * Build parameters
+ *
+ * @var array
+ */
+ protected $build_params = array(
+ // What encoding to use for the headers
+ // Options: quoted-printable or base64
+ 'head_encoding' => 'quoted-printable',
+ // What encoding to use for plain text
+ // Options: 7bit, 8bit, base64, or quoted-printable
+ 'text_encoding' => 'quoted-printable',
+ // What encoding to use for html
+ // Options: 7bit, 8bit, base64, or quoted-printable
+ 'html_encoding' => 'quoted-printable',
+ // What encoding to use for calendar part
+ // Options: 7bit, 8bit, base64, or quoted-printable
+ 'calendar_encoding' => 'quoted-printable',
+ // The character set to use for html
+ 'html_charset' => 'ISO-8859-1',
+ // The character set to use for text
+ 'text_charset' => 'ISO-8859-1',
+ // The character set to use for calendar part
+ 'calendar_charset' => 'UTF-8',
+ // The character set to use for headers
+ 'head_charset' => 'ISO-8859-1',
+ // End-of-line sequence
+ 'eol' => "\r\n",
+ // Delay attachment files IO until building the message
+ 'delay_file_io' => false,
+ // Default calendar method
+ 'calendar_method' => 'request',
+ // multipart part preamble (RFC2046 5.1.1)
+ 'preamble' => '',
+ );
+
+
+ /**
+ * Constructor function
+ *
+ * @param mixed $params Build parameters that change the way the email
+ * is built. Should be an associative array.
+ * See $_build_params.
+ *
+ * @return void
+ */
+ public function __construct($params = array())
+ {
+ // Backward-compatible EOL setting
+ if (is_string($params)) {
+ $this->build_params['eol'] = $params;
+ } else if (defined('MAIL_MIME_CRLF') && !isset($params['eol'])) {
+ $this->build_params['eol'] = MAIL_MIME_CRLF;
+ }
+
+ // Update build parameters
+ if (!empty($params) && is_array($params)) {
+ $this->build_params = array_merge($this->build_params, $params);
+ }
+ }
+
+ /**
+ * Set build parameter value
+ *
+ * @param string $name Parameter name
+ * @param string $value Parameter value
+ *
+ * @return void
+ * @since 1.6.0
+ */
+ public function setParam($name, $value)
+ {
+ $this->build_params[$name] = $value;
+ }
+
+ /**
+ * Get build parameter value
+ *
+ * @param string $name Parameter name
+ *
+ * @return mixed Parameter value
+ * @since 1.6.0
+ */
+ public function getParam($name)
+ {
+ return isset($this->build_params[$name]) ? $this->build_params[$name] : null;
+ }
+
+ /**
+ * Accessor function to set the body text. Body text is used if
+ * it's not an html mail being sent or else is used to fill the
+ * text/plain part that emails clients who don't support
+ * html should show.
+ *
+ * @param string $data Either a string or the file name with the contents
+ * @param bool $isfile If true the first param should be treated
+ * as a file name, else as a string (default)
+ * @param bool $append If true the text or file is appended to
+ * the existing body, else the old body is
+ * overwritten
+ *
+ * @return mixed True on success or PEAR_Error object
+ */
+ public function setTXTBody($data, $isfile = false, $append = false)
+ {
+ return $this->setBody('txtbody', $data, $isfile, $append);
+ }
+
+ /**
+ * Get message text body
+ *
+ * @return string Text body
+ * @since 1.6.0
+ */
+ public function getTXTBody()
+ {
+ return $this->txtbody;
+ }
+
+ /**
+ * Adds a html part to the mail.
+ *
+ * @param string $data Either a string or the file name with the contents
+ * @param bool $isfile A flag that determines whether $data is a
+ * filename, or a string(false, default)
+ *
+ * @return bool True on success or PEAR_Error object
+ */
+ public function setHTMLBody($data, $isfile = false)
+ {
+ return $this->setBody('htmlbody', $data, $isfile);
+ }
+
+ /**
+ * Get message HTML body
+ *
+ * @return string HTML body
+ * @since 1.6.0
+ */
+ public function getHTMLBody()
+ {
+ return $this->htmlbody;
+ }
+
+ /**
+ * Function to set a body of text/calendar part (not attachment)
+ *
+ * @param string $data Either a string or the file name with the contents
+ * @param bool $isfile If true the first param should be treated
+ * as a file name, else as a string (default)
+ * @param bool $append If true the text or file is appended to
+ * the existing body, else the old body is
+ * overwritten
+ * @param string $method iCalendar object method
+ * @param string $charset iCalendar character set
+ * @param string $encoding Transfer encoding
+ *
+ * @return mixed True on success or PEAR_Error object
+ * @since 1.9.0
+ */
+ public function setCalendarBody($data, $isfile = false, $append = false,
+ $method = 'request', $charset = 'UTF-8', $encoding = 'quoted-printable'
+ ) {
+ $result = $this->setBody('calbody', $data, $isfile, $append);
+
+ if ($result === true) {
+ $this->build_params['calendar_method'] = $method;
+ $this->build_params['calendar_charset'] = $charset;
+ $this->build_params['calendar_encoding'] = $encoding;
+ }
+ }
+
+ /**
+ * Get body of calendar part
+ *
+ * @return string Calendar part body
+ * @since 1.9.0
+ */
+ public function getCalendarBody()
+ {
+ return $this->calbody;
+ }
+
+ /**
+ * Adds an image to the list of embedded images.
+ * Images added this way will be added as related parts of the HTML message.
+ *
+ * To correctly match the HTML image with the related attachment
+ * HTML should refer to it by a filename (specified in $file or $name
+ * arguments) or by cid:<content-id> (specified in $content_id arg).
+ *
+ * @param string $file The image file name OR image data itself
+ * @param string $c_type The content type
+ * @param string $name The filename of the image. Used to find
+ * the image in HTML content.
+ * @param bool $isfile Whether $file is a filename or not.
+ * Defaults to true
+ * @param string $content_id Desired Content-ID of MIME part
+ * Defaults to generated unique ID
+ *
+ * @return bool True on success
+ */
+ public function addHTMLImage($file,
+ $c_type = 'application/octet-stream',
+ $name = '',
+ $isfile = true,
+ $content_id = null
+ ) {
+ $bodyfile = null;
+
+ if ($isfile) {
+ // Don't load file into memory
+ if ($this->build_params['delay_file_io']) {
+ $filedata = null;
+ $bodyfile = $file;
+ } else {
+ if (self::isError($filedata = $this->file2str($file))) {
+ return $filedata;
+ }
+ }
+
+ $filename = $name ? $name : $file;
+ } else {
+ $filedata = $file;
+ $filename = $name;
+ }
+
+ if (!$content_id) {
+ $content_id = preg_replace('/[^0-9a-zA-Z]/', '', uniqid(time(), true));
+ }
+
+ $this->html_images[] = array(
+ 'body' => $filedata,
+ 'body_file' => $bodyfile,
+ 'name' => $filename,
+ 'c_type' => $c_type,
+ 'cid' => $content_id
+ );
+
+ return true;
+ }
+
+ /**
+ * Adds a file to the list of attachments.
+ *
+ * @param mixed $file The file name or the file contents itself,
+ * it can be also Mail_mimePart object
+ * @param string $c_type The content type
+ * @param string $name The filename of the attachment
+ * Only use if $file is the contents
+ * @param bool $isfile Whether $file is a filename or not. Defaults to true
+ * @param string $encoding The type of encoding to use. Defaults to base64.
+ * Possible values: 7bit, 8bit, base64 or quoted-printable.
+ * @param string $disposition The content-disposition of this file
+ * Defaults to attachment.
+ * Possible values: attachment, inline.
+ * @param string $charset The character set of attachment's content.
+ * @param string $language The language of the attachment
+ * @param string $location The RFC 2557.4 location of the attachment
+ * @param string $n_encoding Encoding of the attachment's name in Content-Type
+ * By default filenames are encoded using RFC2231 method
+ * Here you can set RFC2047 encoding (quoted-printable
+ * or base64) instead
+ * @param string $f_encoding Encoding of the attachment's filename
+ * in Content-Disposition header.
+ * @param string $description Content-Description header
+ * @param string $h_charset The character set of the headers e.g. filename
+ * If not specified, $charset will be used
+ * @param array $add_headers Additional part headers. Array keys can be in form
+ * of <header_name>:<parameter_name>
+ *
+ * @return mixed True on success or PEAR_Error object
+ */
+ public function addAttachment($file,
+ $c_type = 'application/octet-stream',
+ $name = '',
+ $isfile = true,
+ $encoding = 'base64',
+ $disposition = 'attachment',
+ $charset = '',
+ $language = '',
+ $location = '',
+ $n_encoding = null,
+ $f_encoding = null,
+ $description = '',
+ $h_charset = null,
+ $add_headers = array()
+ ) {
+ if ($file instanceof Mail_mimePart) {
+ $this->parts[] = $file;
+ return true;
+ }
+
+ $bodyfile = null;
+
+ if ($isfile) {
+ // Don't load file into memory
+ if ($this->build_params['delay_file_io']) {
+ $filedata = null;
+ $bodyfile = $file;
+ } else {
+ if (self::isError($filedata = $this->file2str($file))) {
+ return $filedata;
+ }
+ }
+ // Force the name the user supplied, otherwise use $file
+ $filename = ($name ? $name : $this->basename($file));
+ } else {
+ $filedata = $file;
+ $filename = $name;
+ }
+
+ if (!strlen($filename)) {
+ $msg = "The supplied filename for the attachment can't be empty";
+ return self::raiseError($msg);
+ }
+
+ $this->parts[] = array(
+ 'body' => $filedata,
+ 'body_file' => $bodyfile,
+ 'name' => $filename,
+ 'c_type' => $c_type,
+ 'charset' => $charset,
+ 'encoding' => $encoding,
+ 'language' => $language,
+ 'location' => $location,
+ 'disposition' => $disposition,
+ 'description' => $description,
+ 'add_headers' => $add_headers,
+ 'name_encoding' => $n_encoding,
+ 'filename_encoding' => $f_encoding,
+ 'headers_charset' => $h_charset,
+ );
+
+ return true;
+ }
+
+ /**
+ * Checks if the current message has many parts
+ *
+ * @return bool True if the message has many parts, False otherwise.
+ * @since 1.9.0
+ */
+ public function isMultipart()
+ {
+ return count($this->parts) > 0 || count($this->html_images) > 0
+ || (strlen($this->htmlbody) > 0 && strlen($this->txtbody) > 0);
+ }
+
+ /**
+ * Get the contents of the given file name as string
+ *
+ * @param string $file_name Path of file to process
+ *
+ * @return string Contents of $file_name
+ */
+ protected function file2str($file_name)
+ {
+ // Check state of file and raise an error properly
+ if (!file_exists($file_name)) {
+ return self::raiseError('File not found: ' . $file_name);
+ }
+ if (!is_file($file_name)) {
+ return self::raiseError('Not a regular file: ' . $file_name);
+ }
+ if (!is_readable($file_name)) {
+ return self::raiseError('File is not readable: ' . $file_name);
+ }
+
+ // Temporarily reset magic_quotes_runtime and read file contents
+ if ($magic_quote_setting = get_magic_quotes_runtime()) {
+ @ini_set('magic_quotes_runtime', 0);
+ }
+
+ $cont = file_get_contents($file_name);
+
+ if ($magic_quote_setting) {
+ @ini_set('magic_quotes_runtime', $magic_quote_setting);
+ }
+
+ return $cont;
+ }
+
+ /**
+ * Adds a text subpart to the mimePart object and
+ * returns it during the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created.
+ *
+ * @return object The text mimePart object
+ */
+ protected function addTextPart($obj = null)
+ {
+ return $this->addBodyPart($obj, $this->txtbody, 'text/plain', 'text');
+ }
+
+ /**
+ * Adds a html subpart to the mimePart object and
+ * returns it during the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created.
+ *
+ * @return object The html mimePart object
+ */
+ protected function addHtmlPart($obj = null)
+ {
+ return $this->addBodyPart($obj, $this->htmlbody, 'text/html', 'html');
+ }
+
+ /**
+ * Adds a calendar subpart to the mimePart object and
+ * returns it during the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created.
+ *
+ * @return object The text mimePart object
+ */
+ protected function addCalendarPart($obj = null)
+ {
+ $ctype = 'text/calendar; method='. $this->build_params['calendar_method'];
+
+ return $this->addBodyPart($obj, $this->calbody, $ctype, 'calendar');
+ }
+
+ /**
+ * Creates a new mimePart object, using multipart/mixed as
+ * the initial content-type and returns it during the
+ * build process.
+ *
+ * @param array $params Additional part parameters
+ *
+ * @return object The multipart/mixed mimePart object
+ */
+ protected function addMixedPart($params = array())
+ {
+ $params['content_type'] = 'multipart/mixed';
+ $params['eol'] = $this->build_params['eol'];
+
+ // Create empty multipart/mixed Mail_mimePart object to return
+ return new Mail_mimePart('', $params);
+ }
+
+ /**
+ * Adds a multipart/alternative part to a mimePart
+ * object (or creates one), and returns it during
+ * the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created.
+ *
+ * @return object The multipart/mixed mimePart object
+ */
+ protected function addAlternativePart($obj = null)
+ {
+ $params['content_type'] = 'multipart/alternative';
+ $params['eol'] = $this->build_params['eol'];
+
+ if (is_object($obj)) {
+ $ret = $obj->addSubpart('', $params);
+ } else {
+ $ret = new Mail_mimePart('', $params);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Adds a multipart/related part to a mimePart
+ * object (or creates one), and returns it during
+ * the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created
+ *
+ * @return object The multipart/mixed mimePart object
+ */
+ protected function addRelatedPart($obj = null)
+ {
+ $params['content_type'] = 'multipart/related';
+ $params['eol'] = $this->build_params['eol'];
+
+ if (is_object($obj)) {
+ $ret = $obj->addSubpart('', $params);
+ } else {
+ $ret = new Mail_mimePart('', $params);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Adds an html image subpart to a mimePart object
+ * and returns it during the build process.
+ *
+ * @param object $obj The mimePart to add the image to
+ * @param array $value The image information
+ *
+ * @return object The image mimePart object
+ */
+ protected function addHtmlImagePart($obj, $value)
+ {
+ $params['content_type'] = $value['c_type'];
+ $params['encoding'] = 'base64';
+ $params['disposition'] = 'inline';
+ $params['filename'] = $value['name'];
+ $params['cid'] = $value['cid'];
+ $params['body_file'] = $value['body_file'];
+ $params['eol'] = $this->build_params['eol'];
+
+ if (!empty($value['name_encoding'])) {
+ $params['name_encoding'] = $value['name_encoding'];
+ }
+ if (!empty($value['filename_encoding'])) {
+ $params['filename_encoding'] = $value['filename_encoding'];
+ }
+
+ return $obj->addSubpart($value['body'], $params);
+ }
+
+ /**
+ * Adds an attachment subpart to a mimePart object
+ * and returns it during the build process.
+ *
+ * @param object $obj The mimePart to add the image to
+ * @param mixed $value The attachment information array or Mail_mimePart object
+ *
+ * @return object The image mimePart object
+ */
+ protected function addAttachmentPart($obj, $value)
+ {
+ if ($value instanceof Mail_mimePart) {
+ return $obj->addSubpart($value);
+ }
+
+ $params['eol'] = $this->build_params['eol'];
+ $params['filename'] = $value['name'];
+ $params['encoding'] = $value['encoding'];
+ $params['content_type'] = $value['c_type'];
+ $params['body_file'] = $value['body_file'];
+ $params['disposition'] = isset($value['disposition']) ?
+ $value['disposition'] : 'attachment';
+
+ // content charset
+ if (!empty($value['charset'])) {
+ $params['charset'] = $value['charset'];
+ }
+ // headers charset (filename, description)
+ if (!empty($value['headers_charset'])) {
+ $params['headers_charset'] = $value['headers_charset'];
+ }
+ if (!empty($value['language'])) {
+ $params['language'] = $value['language'];
+ }
+ if (!empty($value['location'])) {
+ $params['location'] = $value['location'];
+ }
+ if (!empty($value['name_encoding'])) {
+ $params['name_encoding'] = $value['name_encoding'];
+ }
+ if (!empty($value['filename_encoding'])) {
+ $params['filename_encoding'] = $value['filename_encoding'];
+ }
+ if (!empty($value['description'])) {
+ $params['description'] = $value['description'];
+ }
+ if (is_array($value['add_headers'])) {
+ $params['headers'] = $value['add_headers'];
+ }
+
+ return $obj->addSubpart($value['body'], $params);
+ }
+
+ /**
+ * Returns the complete e-mail, ready to send using an alternative
+ * mail delivery method. Note that only the mailpart that is made
+ * with Mail_Mime is created. This means that,
+ * YOU WILL HAVE NO TO: HEADERS UNLESS YOU SET IT YOURSELF
+ * using the $headers parameter!
+ *
+ * @param string $separation The separation between these two parts.
+ * @param array $params The Build parameters passed to the
+ * get() function. See get() for more info.
+ * @param array $headers The extra headers that should be passed
+ * to the headers() method.
+ * See that function for more info.
+ * @param bool $overwrite Overwrite the existing headers with new.
+ *
+ * @return mixed The complete e-mail or PEAR error object
+ */
+ public function getMessage($separation = null, $params = null, $headers = null,
+ $overwrite = false
+ ) {
+ if ($separation === null) {
+ $separation = $this->build_params['eol'];
+ }
+
+ $body = $this->get($params);
+
+ if (self::isError($body)) {
+ return $body;
+ }
+
+ return $this->txtHeaders($headers, $overwrite) . $separation . $body;
+ }
+
+ /**
+ * Returns the complete e-mail body, ready to send using an alternative
+ * mail delivery method.
+ *
+ * @param array $params The Build parameters passed to the
+ * get() method. See get() for more info.
+ *
+ * @return mixed The e-mail body or PEAR error object
+ * @since 1.6.0
+ */
+ public function getMessageBody($params = null)
+ {
+ return $this->get($params, null, true);
+ }
+
+ /**
+ * Writes (appends) the complete e-mail into file.
+ *
+ * @param string $filename Output file location
+ * @param array $params The Build parameters passed to the
+ * get() method. See get() for more info.
+ * @param array $headers The extra headers that should be passed
+ * to the headers() function.
+ * See that function for more info.
+ * @param bool $overwrite Overwrite the existing headers with new.
+ *
+ * @return mixed True or PEAR error object
+ * @since 1.6.0
+ */
+ public function saveMessage($filename, $params = null, $headers = null, $overwrite = false)
+ {
+ // Check state of file and raise an error properly
+ if (file_exists($filename) && !is_writable($filename)) {
+ return self::raiseError('File is not writable: ' . $filename);
+ }
+
+ // Temporarily reset magic_quotes_runtime and read file contents
+ if ($magic_quote_setting = get_magic_quotes_runtime()) {
+ @ini_set('magic_quotes_runtime', 0);
+ }
+
+ if (!($fh = fopen($filename, 'ab'))) {
+ return self::raiseError('Unable to open file: ' . $filename);
+ }
+
+ // Write message headers into file (skipping Content-* headers)
+ $head = $this->txtHeaders($headers, $overwrite, true);
+ if (fwrite($fh, $head) === false) {
+ return self::raiseError('Error writing to file: ' . $filename);
+ }
+
+ fclose($fh);
+
+ if ($magic_quote_setting) {
+ @ini_set('magic_quotes_runtime', $magic_quote_setting);
+ }
+
+ // Write the rest of the message into file
+ $res = $this->get($params, $filename);
+
+ return $res ? $res : true;
+ }
+
+ /**
+ * Writes (appends) the complete e-mail body into file or stream.
+ *
+ * @param mixed $filename Output filename or file pointer where to save
+ * the message instead of returning it
+ * @param array $params The Build parameters passed to the
+ * get() method. See get() for more info.
+ *
+ * @return mixed True or PEAR error object
+ * @since 1.6.0
+ */
+ public function saveMessageBody($filename, $params = null)
+ {
+ if (!is_resource($filename)) {
+ // Check state of file and raise an error properly
+ if (!file_exists($filename) || !is_writable($filename)) {
+ return self::raiseError('File is not writable: ' . $filename);
+ }
+
+ if (!($fh = fopen($filename, 'ab'))) {
+ return self::raiseError('Unable to open file: ' . $filename);
+ }
+ } else {
+ $fh = $filename;
+ }
+
+ // Temporarily reset magic_quotes_runtime and read file contents
+ if ($magic_quote_setting = get_magic_quotes_runtime()) {
+ @ini_set('magic_quotes_runtime', 0);
+ }
+
+ // Write the rest of the message into file
+ $res = $this->get($params, $fh, true);
+
+ if (!is_resource($filename)) {
+ fclose($fh);
+ }
+
+ if ($magic_quote_setting) {
+ @ini_set('magic_quotes_runtime', $magic_quote_setting);
+ }
+
+ return $res ? $res : true;
+ }
+
+ /**
+ * Builds the multipart message from the list ($this->parts) and
+ * returns the mime content.
+ *
+ * @param array $params Build parameters that change the way the email
+ * is built. Should be associative. See $_build_params.
+ * @param mixed $filename Output filename or file pointer where to save
+ * the message instead of returning it
+ * @param boolean $skip_head True if you want to return/save only the message
+ * without headers
+ *
+ * @return mixed The MIME message content string, null or PEAR error object
+ */
+ public function get($params = null, $filename = null, $skip_head = false)
+ {
+ if (!empty($params) && is_array($params)) {
+ $this->build_params = array_merge($this->build_params, $params);
+ }
+
+ if (isset($this->headers['From'])) {
+ // Bug #11381: Illegal characters in domain ID
+ if (preg_match('#(@[0-9a-zA-Z\-\.]+)#', $this->headers['From'], $matches)) {
+ $domainID = $matches[1];
+ } else {
+ $domainID = '@localhost';
+ }
+
+ foreach ($this->html_images as $i => $img) {
+ $cid = $this->html_images[$i]['cid'];
+ if (!preg_match('#'.preg_quote($domainID).'$#', $cid)) {
+ $this->html_images[$i]['cid'] = $cid . $domainID;
+ }
+ }
+ }
+
+ if (count($this->html_images) && isset($this->htmlbody)) {
+ foreach ($this->html_images as $key => $value) {
+ $rval = preg_quote($value['name'], '#');
+ $regex = array(
+ '#(\s)((?i)src|background|href(?-i))\s*=\s*(["\']?)' . $rval . '\3#',
+ '#(?i)url(?-i)\(\s*(["\']?)' . $rval . '\1\s*\)#',
+ );
+
+ $rep = array(
+ '\1\2=\3cid:' . $value['cid'] .'\3',
+ 'url(\1cid:' . $value['cid'] . '\1)',
+ );
+
+ $this->htmlbody = preg_replace($regex, $rep, $this->htmlbody);
+ $this->html_images[$key]['name']
+ = $this->basename($this->html_images[$key]['name']);
+ }
+ }
+
+ $this->checkParams();
+
+ $attachments = count($this->parts) > 0;
+ $html_images = count($this->html_images) > 0;
+ $html = strlen($this->htmlbody) > 0;
+ $calendar = strlen($this->calbody) > 0;
+ $has_text = strlen($this->txtbody) > 0;
+ $text = !$html && $has_text;
+ $mixed_params = array('preamble' => $this->build_params['preamble']);
+
+ switch (true) {
+ case $calendar && !$attachments && !$text && !$html:
+ $message = $this->addCalendarPart();
+ break;
+
+ case $calendar && !$attachments:
+ $message = $this->addAlternativePart($mixed_params);
+ if ($has_text) {
+ $this->addTextPart($message);
+ }
+ if ($html) {
+ $this->addHtmlPart($message);
+ }
+ $this->addCalendarPart($message);
+ break;
+
+ case $text && !$attachments:
+ $message = $this->addTextPart();
+ break;
+
+ case !$text && !$html && $attachments:
+ $message = $this->addMixedPart($mixed_params);
+ for ($i = 0; $i < count($this->parts); $i++) {
+ $this->addAttachmentPart($message, $this->parts[$i]);
+ }
+ break;
+
+ case $text && $attachments:
+ $message = $this->addMixedPart($mixed_params);
+ $this->addTextPart($message);
+ for ($i = 0; $i < count($this->parts); $i++) {
+ $this->addAttachmentPart($message, $this->parts[$i]);
+ }
+ break;
+
+ case $html && !$attachments && !$html_images:
+ if ($has_text) {
+ $message = $this->addAlternativePart();
+ $this->addTextPart($message);
+ $this->addHtmlPart($message);
+ } else {
+ $message = $this->addHtmlPart();
+ }
+ break;
+
+ case $html && !$attachments && $html_images:
+ // * Content-Type: multipart/alternative;
+ // * text
+ // * Content-Type: multipart/related;
+ // * html
+ // * image...
+ if ($has_text) {
+ $message = $this->addAlternativePart();
+ $this->addTextPart($message);
+
+ $ht = $this->addRelatedPart($message);
+ $this->addHtmlPart($ht);
+ for ($i = 0; $i < count($this->html_images); $i++) {
+ $this->addHtmlImagePart($ht, $this->html_images[$i]);
+ }
+ } else {
+ // * Content-Type: multipart/related;
+ // * html
+ // * image...
+ $message = $this->addRelatedPart();
+ $this->addHtmlPart($message);
+ for ($i = 0; $i < count($this->html_images); $i++) {
+ $this->addHtmlImagePart($message, $this->html_images[$i]);
+ }
+ }
+ /*
+ // #13444, #9725: the code below was a non-RFC compliant hack
+ // * Content-Type: multipart/related;
+ // * Content-Type: multipart/alternative;
+ // * text
+ // * html
+ // * image...
+ $message = $this->addRelatedPart();
+ if ($has_text) {
+ $alt = $this->addAlternativePart($message);
+ $this->addTextPart($alt);
+ $this->addHtmlPart($alt);
+ } else {
+ $this->addHtmlPart($message);
+ }
+ for ($i = 0; $i < count($this->html_images); $i++) {
+ $this->addHtmlImagePart($message, $this->html_images[$i]);
+ }
+ */
+ break;
+
+ case $html && $attachments && !$html_images:
+ $message = $this->addMixedPart($mixed_params);
+ if ($has_text) {
+ $alt = $this->addAlternativePart($message);
+ $this->addTextPart($alt);
+ $this->addHtmlPart($alt);
+ } else {
+ $this->addHtmlPart($message);
+ }
+ for ($i = 0; $i < count($this->parts); $i++) {
+ $this->addAttachmentPart($message, $this->parts[$i]);
+ }
+ break;
+
+ case $html && $attachments && $html_images:
+ $message = $this->addMixedPart($mixed_params);
+ if ($has_text) {
+ $alt = $this->addAlternativePart($message);
+ $this->addTextPart($alt);
+ $rel = $this->addRelatedPart($alt);
+ } else {
+ $rel = $this->addRelatedPart($message);
+ }
+ $this->addHtmlPart($rel);
+ for ($i = 0; $i < count($this->html_images); $i++) {
+ $this->addHtmlImagePart($rel, $this->html_images[$i]);
+ }
+ for ($i = 0; $i < count($this->parts); $i++) {
+ $this->addAttachmentPart($message, $this->parts[$i]);
+ }
+ break;
+ }
+
+ if (!isset($message)) {
+ return null;
+ }
+
+ // Use saved boundary
+ if (!empty($this->build_params['boundary'])) {
+ $boundary = $this->build_params['boundary'];
+ } else {
+ $boundary = null;
+ }
+
+ // Write output to file
+ if ($filename) {
+ // Append mimePart message headers and body into file
+ $headers = $message->encodeToFile($filename, $boundary, $skip_head);
+ if (self::isError($headers)) {
+ return $headers;
+ }
+ $this->headers = array_merge($this->headers, $headers);
+ return null;
+ } else {
+ $output = $message->encode($boundary, $skip_head);
+ if (self::isError($output)) {
+ return $output;
+ }
+ $this->headers = array_merge($this->headers, $output['headers']);
+ return $output['body'];
+ }
+ }
+
+ /**
+ * Returns an array with the headers needed to prepend to the email
+ * (MIME-Version and Content-Type). Format of argument is:
+ * $array['header-name'] = 'header-value';
+ *
+ * @param array $xtra_headers Assoc array with any extra headers (optional)
+ * (Don't set Content-Type for multipart messages here!)
+ * @param bool $overwrite Overwrite already existing headers.
+ * @param bool $skip_content Don't return content headers: Content-Type,
+ * Content-Disposition and Content-Transfer-Encoding
+ *
+ * @return array Assoc array with the mime headers
+ */
+ public function headers($xtra_headers = null, $overwrite = false, $skip_content = false)
+ {
+ // Add mime version header
+ $headers['MIME-Version'] = '1.0';
+
+ // Content-Type and Content-Transfer-Encoding headers should already
+ // be present if get() was called, but we'll re-set them to make sure
+ // we got them when called before get() or something in the message
+ // has been changed after get() [#14780]
+ if (!$skip_content) {
+ $headers += $this->contentHeaders();
+ }
+
+ if (!empty($xtra_headers)) {
+ $headers = array_merge($headers, $xtra_headers);
+ }
+
+ if ($overwrite) {
+ $this->headers = array_merge($this->headers, $headers);
+ } else {
+ $this->headers = array_merge($headers, $this->headers);
+ }
+
+ $headers = $this->headers;
+
+ if ($skip_content) {
+ unset($headers['Content-Type']);
+ unset($headers['Content-Transfer-Encoding']);
+ unset($headers['Content-Disposition']);
+ } else if (!empty($this->build_params['ctype'])) {
+ $headers['Content-Type'] = $this->build_params['ctype'];
+ }
+
+ $encodedHeaders = $this->encodeHeaders($headers);
+ return $encodedHeaders;
+ }
+
+ /**
+ * Get the text version of the headers
+ * (usefull if you want to use the PHP mail() function)
+ *
+ * @param array $xtra_headers Assoc array with any extra headers (optional)
+ * (Don't set Content-Type for multipart messages here!)
+ * @param bool $overwrite Overwrite the existing headers with new.
+ * @param bool $skip_content Don't return content headers: Content-Type,
+ * Content-Disposition and Content-Transfer-Encoding
+ *
+ * @return string Plain text headers
+ */
+ public function txtHeaders($xtra_headers = null, $overwrite = false, $skip_content = false)
+ {
+ $headers = $this->headers($xtra_headers, $overwrite, $skip_content);
+
+ // Place Received: headers at the beginning of the message
+ // Spam detectors often flag messages with it after the Subject: as spam
+ if (isset($headers['Received'])) {
+ $received = $headers['Received'];
+ unset($headers['Received']);
+ $headers = array('Received' => $received) + $headers;
+ }
+
+ $ret = '';
+ $eol = $this->build_params['eol'];
+
+ foreach ($headers as $key => $val) {
+ if (is_array($val)) {
+ foreach ($val as $value) {
+ $ret .= "$key: $value" . $eol;
+ }
+ } else {
+ $ret .= "$key: $val" . $eol;
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Sets message Content-Type header.
+ * Use it to build messages with various content-types e.g. miltipart/raport
+ * not supported by contentHeaders() function.
+ *
+ * @param string $type Type name
+ * @param array $params Hash array of header parameters
+ *
+ * @return void
+ * @since 1.7.0
+ */
+ public function setContentType($type, $params = array())
+ {
+ $header = $type;
+
+ $eol = !empty($this->build_params['eol']) ? $this->build_params['eol'] : "\r\n";
+
+ // add parameters
+ $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
+
+ if (is_array($params)) {
+ foreach ($params as $name => $value) {
+ if ($name == 'boundary') {
+ $this->build_params['boundary'] = $value;
+ } else if (!preg_match($token_regexp, $value)) {
+ $header .= ";$eol $name=$value";
+ } else {
+ $value = addcslashes($value, '\\"');
+ $header .= ";$eol $name=\"$value\"";
+ }
+ }
+ }
+
+ // add required boundary parameter if not defined
+ if (stripos($type, 'multipart/') === 0) {
+ if (empty($this->build_params['boundary'])) {
+ $this->build_params['boundary'] = '=_' . md5(rand() . microtime());
+ }
+
+ $header .= ";$eol boundary=\"".$this->build_params['boundary']."\"";
+ }
+
+ $this->build_params['ctype'] = $header;
+ }
+
+ /**
+ * Sets the Subject header
+ *
+ * @param string $subject String to set the subject to.
+ *
+ * @return void
+ */
+ public function setSubject($subject)
+ {
+ $this->headers['Subject'] = $subject;
+ }
+
+ /**
+ * Set an email to the From (the sender) header
+ *
+ * @param string $email The email address to use
+ *
+ * @return void
+ */
+ public function setFrom($email)
+ {
+ $this->headers['From'] = $email;
+ }
+
+ /**
+ * Add an email to the To header
+ * (multiple calls to this method are allowed)
+ *
+ * @param string $email The email direction to add
+ *
+ * @return void
+ */
+ public function addTo($email)
+ {
+ if (isset($this->headers['To'])) {
+ $this->headers['To'] .= ", $email";
+ } else {
+ $this->headers['To'] = $email;
+ }
+ }
+
+ /**
+ * Add an email to the Cc (carbon copy) header
+ * (multiple calls to this method are allowed)
+ *
+ * @param string $email The email direction to add
+ *
+ * @return void
+ */
+ public function addCc($email)
+ {
+ if (isset($this->headers['Cc'])) {
+ $this->headers['Cc'] .= ", $email";
+ } else {
+ $this->headers['Cc'] = $email;
+ }
+ }
+
+ /**
+ * Add an email to the Bcc (blank carbon copy) header
+ * (multiple calls to this method are allowed)
+ *
+ * @param string $email The email direction to add
+ *
+ * @return void
+ */
+ public function addBcc($email)
+ {
+ if (isset($this->headers['Bcc'])) {
+ $this->headers['Bcc'] .= ", $email";
+ } else {
+ $this->headers['Bcc'] = $email;
+ }
+ }
+
+ /**
+ * Since the PHP send function requires you to specify
+ * recipients (To: header) separately from the other
+ * headers, the To: header is not properly encoded.
+ * To fix this, you can use this public method to encode
+ * your recipients before sending to the send function.
+ *
+ * @param string $recipients A comma-delimited list of recipients
+ *
+ * @return string Encoded data
+ */
+ public function encodeRecipients($recipients)
+ {
+ $input = array('To' => $recipients);
+ $retval = $this->encodeHeaders($input);
+
+ return $retval['To'] ;
+ }
+
+ /**
+ * Encodes headers as per RFC2047
+ *
+ * @param array $input The header data to encode
+ * @param array $params Extra build parameters
+ *
+ * @return array Encoded data
+ */
+ protected function encodeHeaders($input, $params = array())
+ {
+ $build_params = $this->build_params;
+
+ if (!empty($params)) {
+ $build_params = array_merge($build_params, $params);
+ }
+
+ foreach ($input as $hdr_name => $hdr_value) {
+ if (is_array($hdr_value)) {
+ foreach ($hdr_value as $idx => $value) {
+ $input[$hdr_name][$idx] = $this->encodeHeader(
+ $hdr_name, $value,
+ $build_params['head_charset'], $build_params['head_encoding']
+ );
+ }
+ } else if ($hdr_value !== null) {
+ $input[$hdr_name] = $this->encodeHeader(
+ $hdr_name, $hdr_value,
+ $build_params['head_charset'], $build_params['head_encoding']
+ );
+ } else {
+ unset($input[$hdr_name]);
+ }
+ }
+
+ return $input;
+ }
+
+ /**
+ * Encodes a header as per RFC2047
+ *
+ * @param string $name The header name
+ * @param string $value The header data to encode
+ * @param string $charset Character set name
+ * @param string $encoding Encoding name (base64 or quoted-printable)
+ *
+ * @return string Encoded header data (without a name)
+ * @since 1.5.3
+ */
+ public function encodeHeader($name, $value, $charset, $encoding)
+ {
+ return Mail_mimePart::encodeHeader(
+ $name, $value, $charset, $encoding, $this->build_params['eol']
+ );
+ }
+
+ /**
+ * Get file's basename (locale independent)
+ *
+ * @param string $filename Filename
+ *
+ * @return string Basename
+ */
+ protected function basename($filename)
+ {
+ // basename() is not unicode safe and locale dependent
+ if (stristr(PHP_OS, 'win') || stristr(PHP_OS, 'netware')) {
+ return preg_replace('/^.*[\\\\\\/]/', '', $filename);
+ } else {
+ return preg_replace('/^.*[\/]/', '', $filename);
+ }
+ }
+
+ /**
+ * Get Content-Type and Content-Transfer-Encoding headers of the message
+ *
+ * @return array Headers array
+ */
+ protected function contentHeaders()
+ {
+ $attachments = count($this->parts) > 0;
+ $html_images = count($this->html_images) > 0;
+ $html = strlen($this->htmlbody) > 0;
+ $calendar = strlen($this->calbody) > 0;
+ $has_text = strlen($this->txtbody) > 0;
+ $text = !$html && $has_text;
+ $headers = array();
+
+ // See get()
+ switch (true) {
+ case $calendar && !$attachments && !$html && !$has_text:
+ $headers['Content-Type'] = 'text/calendar';
+ break;
+
+ case $calendar && !$attachments:
+ $headers['Content-Type'] = 'multipart/alternative';
+ break;
+
+ case $text && !$attachments:
+ $headers['Content-Type'] = 'text/plain';
+ break;
+
+ case !$text && !$html && $attachments:
+ case $text && $attachments:
+ case $html && $attachments && !$html_images:
+ case $html && $attachments && $html_images:
+ $headers['Content-Type'] = 'multipart/mixed';
+ break;
+
+ case $html && !$attachments && !$html_images && $has_text:
+ case $html && !$attachments && $html_images && $has_text:
+ $headers['Content-Type'] = 'multipart/alternative';
+ break;
+
+ case $html && !$attachments && !$html_images && !$has_text:
+ $headers['Content-Type'] = 'text/html';
+ break;
+
+ case $html && !$attachments && $html_images && !$has_text:
+ $headers['Content-Type'] = 'multipart/related';
+ break;
+
+ default:
+ return $headers;
+ }
+
+ $this->checkParams();
+
+ $eol = !empty($this->build_params['eol'])
+ ? $this->build_params['eol'] : "\r\n";
+
+ if ($headers['Content-Type'] == 'text/plain') {
+ // single-part message: add charset and encoding
+ if ($this->build_params['text_charset']) {
+ $charset = 'charset=' . $this->build_params['text_charset'];
+ // place charset parameter in the same line, if possible
+ // 26 = strlen("Content-Type: text/plain; ")
+ $headers['Content-Type']
+ .= (strlen($charset) + 26 <= 76) ? "; $charset" : ";$eol $charset";
+ }
+
+ $headers['Content-Transfer-Encoding']
+ = $this->build_params['text_encoding'];
+ } else if ($headers['Content-Type'] == 'text/html') {
+ // single-part message: add charset and encoding
+ if ($this->build_params['html_charset']) {
+ $charset = 'charset=' . $this->build_params['html_charset'];
+ // place charset parameter in the same line, if possible
+ $headers['Content-Type']
+ .= (strlen($charset) + 25 <= 76) ? "; $charset" : ";$eol $charset";
+ }
+ $headers['Content-Transfer-Encoding']
+ = $this->build_params['html_encoding'];
+ } else if ($headers['Content-Type'] == 'text/calendar') {
+ // single-part message: add charset and encoding
+ if ($this->build_params['calendar_charset']) {
+ $charset = 'charset=' . $this->build_params['calendar_charset'];
+ $headers['Content-Type'] .= "; $charset";
+ }
+
+ if ($this->build_params['calendar_method']) {
+ $method = 'method=' . $this->build_params['calendar_method'];
+ $headers['Content-Type'] .= "; $method";
+ }
+
+ $headers['Content-Transfer-Encoding']
+ = $this->build_params['calendar_encoding'];
+ } else {
+ // multipart message: and boundary
+ if (!empty($this->build_params['boundary'])) {
+ $boundary = $this->build_params['boundary'];
+ } else if (!empty($this->headers['Content-Type'])
+ && preg_match('/boundary="([^"]+)"/', $this->headers['Content-Type'], $m)
+ ) {
+ $boundary = $m[1];
+ } else {
+ $boundary = '=_' . md5(rand() . microtime());
+ }
+
+ $this->build_params['boundary'] = $boundary;
+ $headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
+ }
+
+ return $headers;
+ }
+
+ /**
+ * Validate and set build parameters
+ *
+ * @return void
+ */
+ protected function checkParams()
+ {
+ $encodings = array('7bit', '8bit', 'base64', 'quoted-printable');
+
+ $this->build_params['text_encoding']
+ = strtolower($this->build_params['text_encoding']);
+ $this->build_params['html_encoding']
+ = strtolower($this->build_params['html_encoding']);
+ $this->build_params['calendar_encoding']
+ = strtolower($this->build_params['calendar_encoding']);
+
+ if (!in_array($this->build_params['text_encoding'], $encodings)) {
+ $this->build_params['text_encoding'] = '7bit';
+ }
+ if (!in_array($this->build_params['html_encoding'], $encodings)) {
+ $this->build_params['html_encoding'] = '7bit';
+ }
+ if (!in_array($this->build_params['calendar_encoding'], $encodings)) {
+ $this->build_params['calendar_encoding'] = '7bit';
+ }
+
+ // text body
+ if ($this->build_params['text_encoding'] == '7bit'
+ && !preg_match('/ascii/i', $this->build_params['text_charset'])
+ && preg_match('/[^\x00-\x7F]/', $this->txtbody)
+ ) {
+ $this->build_params['text_encoding'] = 'quoted-printable';
+ }
+ // html body
+ if ($this->build_params['html_encoding'] == '7bit'
+ && !preg_match('/ascii/i', $this->build_params['html_charset'])
+ && preg_match('/[^\x00-\x7F]/', $this->htmlbody)
+ ) {
+ $this->build_params['html_encoding'] = 'quoted-printable';
+ }
+ // calendar body
+ if ($this->build_params['calendar_encoding'] == '7bit'
+ && !preg_match('/ascii/i', $this->build_params['calendar_charset'])
+ && preg_match('/[^\x00-\x7F]/', $this->calbody)
+ ) {
+ $this->build_params['calendar_encoding'] = 'quoted-printable';
+ }
+ }
+
+ /**
+ * Set body of specified message part
+ *
+ * @param string $type One of: txtbody, calbody, htmlbody
+ * @param string $data Either a string or the file name with the contents
+ * @param bool $isfile If true the first param should be treated
+ * as a file name, else as a string (default)
+ * @param bool $append If true the text or file is appended to
+ * the existing body, else the old body is
+ * overwritten
+ *
+ * @return mixed True on success or PEAR_Error object
+ */
+ protected function setBody($type, $data, $isfile = false, $append = false)
+ {
+ if ($isfile) {
+ $data = $this->file2str($data);
+ if (self::isError($data)) {
+ return $data;
+ }
+ }
+
+ if (!$append) {
+ $this->{$type} = $data;
+ } else {
+ $this->{$type} .= $data;
+ }
+
+ return true;
+ }
+
+ /**
+ * Adds a subpart to the mimePart object and
+ * returns it during the build process.
+ *
+ * @param mixed $obj The object to add the part to, or
+ * anything else if a new object is to be created.
+ * @param string $body Part body
+ * @param string $ctype Part content type
+ * @param string $type Internal part type
+ *
+ * @return object The mimePart object
+ */
+ protected function addBodyPart($obj, $body, $ctype, $type)
+ {
+ $params['content_type'] = $ctype;
+ $params['encoding'] = $this->build_params[$type . '_encoding'];
+ $params['charset'] = $this->build_params[$type . '_charset'];
+ $params['eol'] = $this->build_params['eol'];
+
+ if (is_object($obj)) {
+ $ret = $obj->addSubpart($body, $params);
+ } else {
+ $ret = new Mail_mimePart($body, $params);
+ }
+
+ return $ret;
+ }
+
+ /**
+ * PEAR::isError implementation
+ *
+ * @param mixed $data Object
+ *
+ * @return bool True if object is an instance of PEAR_Error
+ */
+ public static function isError($data)
+ {
+ // PEAR::isError() is not PHP 5.4 compatible (see Bug #19473)
+ if (is_a($data, 'PEAR_Error')) {
+ return true;
+ }
+
+ return false;
+ }
+
+ /**
+ * PEAR::raiseError implementation
+ *
+ * @param string $message A text error message
+ *
+ * @return PEAR_Error Instance of PEAR_Error
+ */
+ public static function raiseError($message)
+ {
+ // PEAR::raiseError() is not PHP 5.4 compatible
+ return new PEAR_Error($message);
+ }
+}
diff --git a/www/wiki/vendor/pear/mail_mime/Mail/mimePart.php b/www/wiki/vendor/pear/mail_mime/Mail/mimePart.php
new file mode 100644
index 00000000..47e546bd
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/Mail/mimePart.php
@@ -0,0 +1,1276 @@
+<?php
+/**
+ * The Mail_mimePart class is used to create MIME E-mail messages
+ *
+ * This class enables you to manipulate and build a mime email
+ * from the ground up. The Mail_Mime class is a userfriendly api
+ * to this class for people who aren't interested in the internals
+ * of mime mail.
+ * This class however allows full control over the email.
+ *
+ * Compatible with PHP version 5 and 7
+ *
+ * LICENSE: This LICENSE is in the BSD license style.
+ * Copyright (c) 2002-2003, Richard Heyes <richard@phpguru.org>
+ * Copyright (c) 2003-2006, PEAR <pear-group@php.net>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or
+ * without modification, are permitted provided that the following
+ * conditions are met:
+ *
+ * - Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * - Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * - Neither the name of the authors, nor the names of its contributors
+ * may be used to endorse or promote products derived from this
+ * software without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+ * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
+ * THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ * @category Mail
+ * @package Mail_Mime
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Cipriano Groenendal <cipri@php.net>
+ * @author Sean Coates <sean@php.net>
+ * @author Aleksander Machniak <alec@php.net>
+ * @copyright 2003-2006 PEAR <pear-group@php.net>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Mail_mime
+ */
+
+/**
+ * Require PEAR
+ *
+ * This package depends on PEAR to raise errors.
+ */
+require_once 'PEAR.php';
+
+/**
+ * The Mail_mimePart class is used to create MIME E-mail messages
+ *
+ * This class enables you to manipulate and build a mime email
+ * from the ground up. The Mail_Mime class is a userfriendly api
+ * to this class for people who aren't interested in the internals
+ * of mime mail.
+ * This class however allows full control over the email.
+ *
+ * @category Mail
+ * @package Mail_Mime
+ * @author Richard Heyes <richard@phpguru.org>
+ * @author Cipriano Groenendal <cipri@php.net>
+ * @author Sean Coates <sean@php.net>
+ * @author Aleksander Machniak <alec@php.net>
+ * @copyright 2003-2006 PEAR <pear-group@php.net>
+ * @license http://www.opensource.org/licenses/bsd-license.php BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/Mail_mime
+ */
+class Mail_mimePart
+{
+ /**
+ * The encoding type of this part
+ *
+ * @var string
+ */
+ protected $encoding;
+
+ /**
+ * An array of subparts
+ *
+ * @var array
+ */
+ protected $subparts = array();
+
+ /**
+ * The output of this part after being built
+ *
+ * @var string
+ */
+ protected $encoded;
+
+ /**
+ * Headers for this part
+ *
+ * @var array
+ */
+ protected $headers = array();
+
+ /**
+ * The body of this part (not encoded)
+ *
+ * @var string
+ */
+ protected $body;
+
+ /**
+ * The location of file with body of this part (not encoded)
+ *
+ * @var string
+ */
+ protected $body_file;
+
+ /**
+ * The short text of multipart part preamble (RFC2046 5.1.1)
+ *
+ * @var string
+ */
+ protected $preamble;
+
+ /**
+ * The end-of-line sequence
+ *
+ * @var string
+ */
+ protected $eol = "\r\n";
+
+
+ /**
+ * Constructor.
+ *
+ * Sets up the object.
+ *
+ * @param string $body The body of the mime part if any.
+ * @param array $params An associative array of optional parameters:
+ * content_type - The content type for this part eg multipart/mixed
+ * encoding - The encoding to use, 7bit, 8bit,
+ * base64, or quoted-printable
+ * charset - Content character set
+ * cid - Content ID to apply
+ * disposition - Content disposition, inline or attachment
+ * filename - Filename parameter for content disposition
+ * description - Content description
+ * name_encoding - Encoding of the attachment name (Content-Type)
+ * By default filenames are encoded using RFC2231
+ * Here you can set RFC2047 encoding (quoted-printable
+ * or base64) instead
+ * filename_encoding - Encoding of the attachment filename (Content-Disposition)
+ * See 'name_encoding'
+ * headers_charset - Charset of the headers e.g. filename, description.
+ * If not set, 'charset' will be used
+ * eol - End of line sequence. Default: "\r\n"
+ * headers - Hash array with additional part headers. Array keys
+ * can be in form of <header_name>:<parameter_name>
+ * body_file - Location of file with part's body (instead of $body)
+ * preamble - short text of multipart part preamble (RFC2046 5.1.1)
+ */
+ public function __construct($body = '', $params = array())
+ {
+ if (!empty($params['eol'])) {
+ $this->eol = $params['eol'];
+ } else if (defined('MAIL_MIMEPART_CRLF')) { // backward-copat.
+ $this->eol = MAIL_MIMEPART_CRLF;
+ }
+
+ // Additional part headers
+ if (!empty($params['headers']) && is_array($params['headers'])) {
+ $headers = $params['headers'];
+ }
+
+ foreach ($params as $key => $value) {
+ switch ($key) {
+ case 'encoding':
+ $this->encoding = $value;
+ $headers['Content-Transfer-Encoding'] = $value;
+ break;
+
+ case 'cid':
+ $headers['Content-ID'] = '<' . $value . '>';
+ break;
+
+ case 'location':
+ $headers['Content-Location'] = $value;
+ break;
+
+ case 'body_file':
+ $this->body_file = $value;
+ break;
+
+ case 'preamble':
+ $this->preamble = $value;
+ break;
+
+ // for backward compatibility
+ case 'dfilename':
+ $params['filename'] = $value;
+ break;
+ }
+ }
+
+ // Default content-type
+ if (empty($params['content_type'])) {
+ $params['content_type'] = 'text/plain';
+ }
+
+ // Content-Type
+ $headers['Content-Type'] = $params['content_type'];
+ if (!empty($params['charset'])) {
+ $charset = "charset={$params['charset']}";
+ // place charset parameter in the same line, if possible
+ if ((strlen($headers['Content-Type']) + strlen($charset) + 16) <= 76) {
+ $headers['Content-Type'] .= '; ';
+ } else {
+ $headers['Content-Type'] .= ';' . $this->eol . ' ';
+ }
+ $headers['Content-Type'] .= $charset;
+
+ // Default headers charset
+ if (!isset($params['headers_charset'])) {
+ $params['headers_charset'] = $params['charset'];
+ }
+ }
+
+ // header values encoding parameters
+ $h_charset = !empty($params['headers_charset']) ? $params['headers_charset'] : 'US-ASCII';
+ $h_language = !empty($params['language']) ? $params['language'] : null;
+ $h_encoding = !empty($params['name_encoding']) ? $params['name_encoding'] : null;
+
+ if (!empty($params['filename'])) {
+ $headers['Content-Type'] .= ';' . $this->eol;
+ $headers['Content-Type'] .= $this->buildHeaderParam(
+ 'name', $params['filename'], $h_charset, $h_language, $h_encoding
+ );
+ }
+
+ // Content-Disposition
+ if (!empty($params['disposition'])) {
+ $headers['Content-Disposition'] = $params['disposition'];
+ if (!empty($params['filename'])) {
+ $headers['Content-Disposition'] .= ';' . $this->eol;
+ $headers['Content-Disposition'] .= $this->buildHeaderParam(
+ 'filename', $params['filename'], $h_charset, $h_language,
+ !empty($params['filename_encoding']) ? $params['filename_encoding'] : null
+ );
+ }
+
+ // add attachment size
+ $size = $this->body_file ? filesize($this->body_file) : strlen($body);
+ if ($size) {
+ $headers['Content-Disposition'] .= ';' . $this->eol . ' size=' . $size;
+ }
+ }
+
+ if (!empty($params['description'])) {
+ $headers['Content-Description'] = $this->encodeHeader(
+ 'Content-Description', $params['description'], $h_charset, $h_encoding,
+ $this->eol
+ );
+ }
+
+ // Search and add existing headers' parameters
+ foreach ($headers as $key => $value) {
+ $items = explode(':', $key);
+ if (count($items) == 2) {
+ $header = $items[0];
+ $param = $items[1];
+ if (isset($headers[$header])) {
+ $headers[$header] .= ';' . $this->eol;
+ }
+ $headers[$header] .= $this->buildHeaderParam(
+ $param, $value, $h_charset, $h_language, $h_encoding
+ );
+ unset($headers[$key]);
+ }
+ }
+
+ // Default encoding
+ if (!isset($this->encoding)) {
+ $this->encoding = '7bit';
+ }
+
+ // Assign stuff to member variables
+ $this->encoded = array();
+ $this->headers = $headers;
+ $this->body = $body;
+ }
+
+ /**
+ * Encodes and returns the email. Also stores
+ * it in the encoded member variable
+ *
+ * @param string $boundary Pre-defined boundary string
+ *
+ * @return An associative array containing two elements,
+ * body and headers. The headers element is itself
+ * an indexed array. On error returns PEAR error object.
+ */
+ public function encode($boundary=null)
+ {
+ $encoded =& $this->encoded;
+
+ if (count($this->subparts)) {
+ $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
+ $eol = $this->eol;
+
+ $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
+
+ $encoded['body'] = '';
+
+ if ($this->preamble) {
+ $encoded['body'] .= $this->preamble . $eol . $eol;
+ }
+
+ for ($i = 0; $i < count($this->subparts); $i++) {
+ $encoded['body'] .= '--' . $boundary . $eol;
+ $tmp = $this->subparts[$i]->encode();
+ if (is_a($tmp, 'PEAR_Error')) {
+ return $tmp;
+ }
+ foreach ($tmp['headers'] as $key => $value) {
+ $encoded['body'] .= $key . ': ' . $value . $eol;
+ }
+ $encoded['body'] .= $eol . $tmp['body'] . $eol;
+ }
+
+ $encoded['body'] .= '--' . $boundary . '--' . $eol;
+ } else if ($this->body) {
+ $encoded['body'] = $this->getEncodedData($this->body, $this->encoding);
+ } else if ($this->body_file) {
+ // Temporarily reset magic_quotes_runtime for file reads and writes
+ if ($magic_quote_setting = get_magic_quotes_runtime()) {
+ @ini_set('magic_quotes_runtime', 0);
+ }
+ $body = $this->getEncodedDataFromFile($this->body_file, $this->encoding);
+ if ($magic_quote_setting) {
+ @ini_set('magic_quotes_runtime', $magic_quote_setting);
+ }
+
+ if (is_a($body, 'PEAR_Error')) {
+ return $body;
+ }
+ $encoded['body'] = $body;
+ } else {
+ $encoded['body'] = '';
+ }
+
+ // Add headers to $encoded
+ $encoded['headers'] =& $this->headers;
+
+ return $encoded;
+ }
+
+ /**
+ * Encodes and saves the email into file or stream.
+ * Data will be appended to the file/stream.
+ *
+ * @param mixed $filename Existing file location
+ * or file pointer resource
+ * @param string $boundary Pre-defined boundary string
+ * @param boolean $skip_head True if you don't want to save headers
+ *
+ * @return array An associative array containing message headers
+ * or PEAR error object
+ * @since 1.6.0
+ */
+ public function encodeToFile($filename, $boundary = null, $skip_head = false)
+ {
+ if (!is_resource($filename)) {
+ if (file_exists($filename) && !is_writable($filename)) {
+ $err = self::raiseError('File is not writeable: ' . $filename);
+ return $err;
+ }
+
+ if (!($fh = fopen($filename, 'ab'))) {
+ $err = self::raiseError('Unable to open file: ' . $filename);
+ return $err;
+ }
+ } else {
+ $fh = $filename;
+ }
+
+ // Temporarily reset magic_quotes_runtime for file reads and writes
+ if ($magic_quote_setting = get_magic_quotes_runtime()) {
+ @ini_set('magic_quotes_runtime', 0);
+ }
+
+ $res = $this->encodePartToFile($fh, $boundary, $skip_head);
+
+ if (!is_resource($filename)) {
+ fclose($fh);
+ }
+
+ if ($magic_quote_setting) {
+ @ini_set('magic_quotes_runtime', $magic_quote_setting);
+ }
+
+ return is_a($res, 'PEAR_Error') ? $res : $this->headers;
+ }
+
+ /**
+ * Encodes given email part into file
+ *
+ * @param string $fh Output file handle
+ * @param string $boundary Pre-defined boundary string
+ * @param boolean $skip_head True if you don't want to save headers
+ *
+ * @return array True on sucess or PEAR error object
+ */
+ protected function encodePartToFile($fh, $boundary = null, $skip_head = false)
+ {
+ $eol = $this->eol;
+
+ if (count($this->subparts)) {
+ $boundary = $boundary ? $boundary : '=_' . md5(rand() . microtime());
+ $this->headers['Content-Type'] .= ";$eol boundary=\"$boundary\"";
+ }
+
+ if (!$skip_head) {
+ foreach ($this->headers as $key => $value) {
+ fwrite($fh, $key . ': ' . $value . $eol);
+ }
+ $f_eol = $eol;
+ } else {
+ $f_eol = '';
+ }
+
+ if (count($this->subparts)) {
+ if ($this->preamble) {
+ fwrite($fh, $f_eol . $this->preamble . $eol);
+ $f_eol = $eol;
+ }
+
+ for ($i = 0; $i < count($this->subparts); $i++) {
+ fwrite($fh, $f_eol . '--' . $boundary . $eol);
+ $res = $this->subparts[$i]->encodePartToFile($fh);
+ if (is_a($res, 'PEAR_Error')) {
+ return $res;
+ }
+ $f_eol = $eol;
+ }
+
+ fwrite($fh, $eol . '--' . $boundary . '--' . $eol);
+ } else if ($this->body) {
+ fwrite($fh, $f_eol);
+ fwrite($fh, $this->getEncodedData($this->body, $this->encoding));
+ } else if ($this->body_file) {
+ fwrite($fh, $f_eol);
+ $res = $this->getEncodedDataFromFile(
+ $this->body_file, $this->encoding, $fh
+ );
+ if (is_a($res, 'PEAR_Error')) {
+ return $res;
+ }
+ }
+
+ return true;
+ }
+
+ /**
+ * Adds a subpart to current mime part and returns
+ * a reference to it
+ *
+ * @param mixed $body The body of the subpart or Mail_mimePart object
+ * @param array $params The parameters for the subpart, same
+ * as the $params argument for constructor
+ *
+ * @return Mail_mimePart A reference to the part you just added.
+ */
+ public function addSubpart($body, $params = null)
+ {
+ if ($body instanceof Mail_mimePart) {
+ $part = $body;
+ } else {
+ $part = new Mail_mimePart($body, $params);
+ }
+
+ $this->subparts[] = $part;
+
+ return $part;
+ }
+
+ /**
+ * Returns encoded data based upon encoding passed to it
+ *
+ * @param string $data The data to encode.
+ * @param string $encoding The encoding type to use, 7bit, base64,
+ * or quoted-printable.
+ *
+ * @return string Encoded data string
+ */
+ protected function getEncodedData($data, $encoding)
+ {
+ switch ($encoding) {
+ case 'quoted-printable':
+ return self::quotedPrintableEncode($data, 76, $this->eol);
+ break;
+
+ case 'base64':
+ return rtrim(chunk_split(base64_encode($data), 76, $this->eol));
+ break;
+
+ case '8bit':
+ case '7bit':
+ default:
+ return $data;
+ }
+ }
+
+ /**
+ * Returns encoded data based upon encoding passed to it
+ *
+ * @param string $filename Data file location
+ * @param string $encoding The encoding type to use, 7bit, base64,
+ * or quoted-printable.
+ * @param resource $fh Output file handle. If set, data will be
+ * stored into it instead of returning it
+ *
+ * @return string Encoded data or PEAR error object
+ */
+ protected function getEncodedDataFromFile($filename, $encoding, $fh = null)
+ {
+ if (!is_readable($filename)) {
+ $err = self::raiseError('Unable to read file: ' . $filename);
+ return $err;
+ }
+
+ if (!($fd = fopen($filename, 'rb'))) {
+ $err = self::raiseError('Could not open file: ' . $filename);
+ return $err;
+ }
+
+ $data = '';
+
+ switch ($encoding) {
+ case 'quoted-printable':
+ while (!feof($fd)) {
+ $buffer = self::quotedPrintableEncode(fgets($fd), 76, $this->eol);
+ if ($fh) {
+ fwrite($fh, $buffer);
+ } else {
+ $data .= $buffer;
+ }
+ }
+ break;
+
+ case 'base64':
+ while (!feof($fd)) {
+ // Should read in a multiple of 57 bytes so that
+ // the output is 76 bytes per line. Don't use big chunks
+ // because base64 encoding is memory expensive
+ $buffer = fread($fd, 57 * 9198); // ca. 0.5 MB
+ $buffer = base64_encode($buffer);
+ $buffer = chunk_split($buffer, 76, $this->eol);
+ if (feof($fd)) {
+ $buffer = rtrim($buffer);
+ }
+
+ if ($fh) {
+ fwrite($fh, $buffer);
+ } else {
+ $data .= $buffer;
+ }
+ }
+ break;
+
+ case '8bit':
+ case '7bit':
+ default:
+ while (!feof($fd)) {
+ $buffer = fread($fd, 1048576); // 1 MB
+ if ($fh) {
+ fwrite($fh, $buffer);
+ } else {
+ $data .= $buffer;
+ }
+ }
+ }
+
+ fclose($fd);
+
+ if (!$fh) {
+ return $data;
+ }
+ }
+
+ /**
+ * Encodes data to quoted-printable standard.
+ *
+ * @param string $input The data to encode
+ * @param int $line_max Optional max line length. Should
+ * not be more than 76 chars
+ * @param string $eol End-of-line sequence. Default: "\r\n"
+ *
+ * @return string Encoded data
+ */
+ public static function quotedPrintableEncode($input , $line_max = 76, $eol = "\r\n")
+ {
+ /*
+ // imap_8bit() is extremely fast, but doesn't handle properly some characters
+ if (function_exists('imap_8bit') && $line_max == 76) {
+ $input = preg_replace('/\r?\n/', "\r\n", $input);
+ $input = imap_8bit($input);
+ if ($eol != "\r\n") {
+ $input = str_replace("\r\n", $eol, $input);
+ }
+ return $input;
+ }
+ */
+ $lines = preg_split("/\r?\n/", $input);
+ $escape = '=';
+ $output = '';
+
+ foreach ($lines as $idx => $line) {
+ $newline = '';
+ $i = 0;
+
+ while (isset($line[$i])) {
+ $char = $line[$i];
+ $dec = ord($char);
+ $i++;
+
+ if (($dec == 32) && (!isset($line[$i]))) {
+ // convert space at eol only
+ $char = '=20';
+ } elseif ($dec == 9 && isset($line[$i])) {
+ ; // Do nothing if a TAB is not on eol
+ } elseif (($dec == 61) || ($dec < 32) || ($dec > 126)) {
+ $char = $escape . sprintf('%02X', $dec);
+ } elseif (($dec == 46) && (($newline == '')
+ || ((strlen($newline) + strlen("=2E")) >= $line_max))
+ ) {
+ // Bug #9722: convert full-stop at bol,
+ // some Windows servers need this, won't break anything (cipri)
+ // Bug #11731: full-stop at bol also needs to be encoded
+ // if this line would push us over the line_max limit.
+ $char = '=2E';
+ }
+
+ // Note, when changing this line, also change the ($dec == 46)
+ // check line, as it mimics this line due to Bug #11731
+ // EOL is not counted
+ if ((strlen($newline) + strlen($char)) >= $line_max) {
+ // soft line break; " =\r\n" is okay
+ $output .= $newline . $escape . $eol;
+ $newline = '';
+ }
+
+ $newline .= $char;
+ } // end of for
+
+ $output .= $newline . $eol;
+ unset($lines[$idx]);
+ }
+
+ // Don't want last crlf
+ $output = substr($output, 0, -1 * strlen($eol));
+
+ return $output;
+ }
+
+ /**
+ * Encodes the parameter of a header.
+ *
+ * @param string $name The name of the header-parameter
+ * @param string $value The value of the paramter
+ * @param string $charset The characterset of $value
+ * @param string $language The language used in $value
+ * @param string $encoding Parameter encoding. If not set, parameter value
+ * is encoded according to RFC2231
+ * @param int $maxLength The maximum length of a line. Defauls to 75
+ *
+ * @return string
+ */
+ protected function buildHeaderParam($name, $value, $charset = null,
+ $language = null, $encoding = null, $maxLength = 75
+ ) {
+ // RFC 2045:
+ // value needs encoding if contains non-ASCII chars or is longer than 78 chars
+ if (!preg_match('#[^\x20-\x7E]#', $value)) {
+ $token_regexp = '#([^\x21\x23-\x27\x2A\x2B\x2D'
+ . '\x2E\x30-\x39\x41-\x5A\x5E-\x7E])#';
+ if (!preg_match($token_regexp, $value)) {
+ // token
+ if (strlen($name) + strlen($value) + 3 <= $maxLength) {
+ return " {$name}={$value}";
+ }
+ } else {
+ // quoted-string
+ $quoted = addcslashes($value, '\\"');
+ if (strlen($name) + strlen($quoted) + 5 <= $maxLength) {
+ return " {$name}=\"{$quoted}\"";
+ }
+ }
+ }
+
+ // RFC2047: use quoted-printable/base64 encoding
+ if ($encoding == 'quoted-printable' || $encoding == 'base64') {
+ return $this->buildRFC2047Param($name, $value, $charset, $encoding);
+ }
+
+ // RFC2231:
+ $encValue = preg_replace_callback(
+ '/([^\x21\x23\x24\x26\x2B\x2D\x2E\x30-\x39\x41-\x5A\x5E-\x7E])/',
+ array($this, 'encodeReplaceCallback'), $value
+ );
+ $value = "$charset'$language'$encValue";
+
+ $header = " {$name}*={$value}";
+ if (strlen($header) <= $maxLength) {
+ return $header;
+ }
+
+ $preLength = strlen(" {$name}*0*=");
+ $maxLength = max(16, $maxLength - $preLength - 3);
+ $maxLengthReg = "|(.{0,$maxLength}[^\%][^\%])|";
+
+ $headers = array();
+ $headCount = 0;
+ while ($value) {
+ $matches = array();
+ $found = preg_match($maxLengthReg, $value, $matches);
+ if ($found) {
+ $headers[] = " {$name}*{$headCount}*={$matches[0]}";
+ $value = substr($value, strlen($matches[0]));
+ } else {
+ $headers[] = " {$name}*{$headCount}*={$value}";
+ $value = '';
+ }
+ $headCount++;
+ }
+
+ $headers = implode(';' . $this->eol, $headers);
+ return $headers;
+ }
+
+ /**
+ * Encodes header parameter as per RFC2047 if needed
+ *
+ * @param string $name The parameter name
+ * @param string $value The parameter value
+ * @param string $charset The parameter charset
+ * @param string $encoding Encoding type (quoted-printable or base64)
+ * @param int $maxLength Encoded parameter max length. Default: 76
+ *
+ * @return string Parameter line
+ */
+ protected function buildRFC2047Param($name, $value, $charset,
+ $encoding = 'quoted-printable', $maxLength = 76
+ ) {
+ // WARNING: RFC 2047 says: "An 'encoded-word' MUST NOT be used in
+ // parameter of a MIME Content-Type or Content-Disposition field",
+ // but... it's supported by many clients/servers
+ $quoted = '';
+
+ if ($encoding == 'base64') {
+ $value = base64_encode($value);
+ $prefix = '=?' . $charset . '?B?';
+ $suffix = '?=';
+
+ // 2 x SPACE, 2 x '"', '=', ';'
+ $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
+ $len = $add_len + strlen($value);
+
+ while ($len > $maxLength) {
+ // We can cut base64-encoded string every 4 characters
+ $real_len = floor(($maxLength - $add_len) / 4) * 4;
+ $_quote = substr($value, 0, $real_len);
+ $value = substr($value, $real_len);
+
+ $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
+ $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
+ $len = strlen($value) + $add_len;
+ }
+ $quoted .= $prefix . $value . $suffix;
+
+ } else {
+ // quoted-printable
+ $value = $this->encodeQP($value);
+ $prefix = '=?' . $charset . '?Q?';
+ $suffix = '?=';
+
+ // 2 x SPACE, 2 x '"', '=', ';'
+ $add_len = strlen($prefix . $suffix) + strlen($name) + 6;
+ $len = $add_len + strlen($value);
+
+ while ($len > $maxLength) {
+ $length = $maxLength - $add_len;
+ // don't break any encoded letters
+ if (preg_match("/^(.{0,$length}[^\=][^\=])/", $value, $matches)) {
+ $_quote = $matches[1];
+ }
+
+ $quoted .= $prefix . $_quote . $suffix . $this->eol . ' ';
+ $value = substr($value, strlen($_quote));
+ $add_len = strlen($prefix . $suffix) + 4; // 2 x SPACE, '"', ';'
+ $len = strlen($value) + $add_len;
+ }
+
+ $quoted .= $prefix . $value . $suffix;
+ }
+
+ return " {$name}=\"{$quoted}\"";
+ }
+
+ /**
+ * Encodes a header as per RFC2047
+ *
+ * @param string $name The header name
+ * @param string $value The header data to encode
+ * @param string $charset Character set name
+ * @param string $encoding Encoding name (base64 or quoted-printable)
+ * @param string $eol End-of-line sequence. Default: "\r\n"
+ *
+ * @return string Encoded header data (without a name)
+ * @since 1.6.1
+ */
+ public static function encodeHeader($name, $value, $charset = 'ISO-8859-1',
+ $encoding = 'quoted-printable', $eol = "\r\n"
+ ) {
+ // Structured headers
+ $comma_headers = array(
+ 'from', 'to', 'cc', 'bcc', 'sender', 'reply-to',
+ 'resent-from', 'resent-to', 'resent-cc', 'resent-bcc',
+ 'resent-sender', 'resent-reply-to',
+ 'mail-reply-to', 'mail-followup-to',
+ 'return-receipt-to', 'disposition-notification-to',
+ );
+ $other_headers = array(
+ 'references', 'in-reply-to', 'message-id', 'resent-message-id',
+ );
+
+ $name = strtolower($name);
+
+ if (in_array($name, $comma_headers)) {
+ $separator = ',';
+ } else if (in_array($name, $other_headers)) {
+ $separator = ' ';
+ }
+
+ if (!$charset) {
+ $charset = 'ISO-8859-1';
+ }
+
+ // exploding quoted strings as well as some regexes below do not
+ // work properly with some charset e.g. ISO-2022-JP, we'll use UTF-8
+ $mb = $charset != 'UTF-8' && function_exists('mb_convert_encoding');
+
+ // Structured header (make sure addr-spec inside is not encoded)
+ if (!empty($separator)) {
+ // Simple e-mail address regexp
+ $email_regexp = '([^\s<]+|("[^\r\n"]+"))@\S+';
+
+ if ($mb) {
+ $value = mb_convert_encoding($value, 'UTF-8', $charset);
+ }
+
+ $parts = Mail_mimePart::explodeQuotedString("[\t$separator]", $value);
+ $value = '';
+
+ foreach ($parts as $part) {
+ $part = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $part);
+ $part = trim($part);
+
+ if (!$part) {
+ continue;
+ }
+ if ($value) {
+ $value .= $separator == ',' ? $separator . ' ' : ' ';
+ } else {
+ $value = $name . ': ';
+ }
+
+ // let's find phrase (name) and/or addr-spec
+ if (preg_match('/^<' . $email_regexp . '>$/', $part)) {
+ $value .= $part;
+ } else if (preg_match('/^' . $email_regexp . '$/', $part)) {
+ // address without brackets and without name
+ $value .= $part;
+ } else if (preg_match('/<*' . $email_regexp . '>*$/', $part, $matches)) {
+ // address with name (handle name)
+ $address = $matches[0];
+ $word = str_replace($address, '', $part);
+ $word = trim($word);
+
+ // check if phrase requires quoting
+ if ($word) {
+ // non-ASCII: require encoding
+ if (preg_match('#([^\s\x21-\x7E]){1}#', $word)) {
+ if ($word[0] == '"' && $word[strlen($word)-1] == '"') {
+ // de-quote quoted-string, encoding changes
+ // string to atom
+ $word = substr($word, 1, -1);
+ $word = preg_replace('/\\\\([\\\\"])/', '$1', $word);
+ }
+ if ($mb) {
+ $word = mb_convert_encoding($word, $charset, 'UTF-8');
+ }
+
+ // find length of last line
+ if (($pos = strrpos($value, $eol)) !== false) {
+ $last_len = strlen($value) - $pos;
+ } else {
+ $last_len = strlen($value);
+ }
+
+ $word = Mail_mimePart::encodeHeaderValue(
+ $word, $charset, $encoding, $last_len, $eol
+ );
+ } else if (($word[0] != '"' || $word[strlen($word)-1] != '"')
+ && preg_match('/[\(\)\<\>\\\.\[\]@,;:"]/', $word)
+ ) {
+ // ASCII: quote string if needed
+ $word = '"'.addcslashes($word, '\\"').'"';
+ }
+ }
+
+ $value .= $word.' '.$address;
+ } else {
+ if ($mb) {
+ $part = mb_convert_encoding($part, $charset, 'UTF-8');
+ }
+ // addr-spec not found, don't encode (?)
+ $value .= $part;
+ }
+
+ // RFC2822 recommends 78 characters limit, use 76 from RFC2047
+ $value = wordwrap($value, 76, $eol . ' ');
+ }
+
+ // remove header name prefix (there could be EOL too)
+ $value = preg_replace(
+ '/^'.$name.':('.preg_quote($eol, '/').')* /', '', $value
+ );
+ } else {
+ // Unstructured header
+ // non-ASCII: require encoding
+ if (preg_match('#([^\s\x21-\x7E]){1}#', $value)) {
+ if ($value[0] == '"' && $value[strlen($value)-1] == '"') {
+ if ($mb) {
+ $value = mb_convert_encoding($value, 'UTF-8', $charset);
+ }
+ // de-quote quoted-string, encoding changes
+ // string to atom
+ $value = substr($value, 1, -1);
+ $value = preg_replace('/\\\\([\\\\"])/', '$1', $value);
+ if ($mb) {
+ $value = mb_convert_encoding($value, $charset, 'UTF-8');
+ }
+ }
+
+ $value = Mail_mimePart::encodeHeaderValue(
+ $value, $charset, $encoding, strlen($name) + 2, $eol
+ );
+ } else if (strlen($name.': '.$value) > 78) {
+ // ASCII: check if header line isn't too long and use folding
+ $value = preg_replace('/\r?\n[\s\t]*/', $eol . ' ', $value);
+ $tmp = wordwrap($name . ': ' . $value, 78, $eol . ' ');
+ $value = preg_replace('/^' . $name . ':\s*/', '', $tmp);
+ // hard limit 998 (RFC2822)
+ $value = wordwrap($value, 998, $eol . ' ', true);
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * Explode quoted string
+ *
+ * @param string $delimiter Delimiter expression string for preg_match()
+ * @param string $string Input string
+ *
+ * @return array String tokens array
+ */
+ protected static function explodeQuotedString($delimiter, $string)
+ {
+ $result = array();
+ $strlen = strlen($string);
+ $quoted_string = '"(?:[^"\\\\]|\\\\.)*"';
+
+ for ($p=$i=0; $i < $strlen; $i++) {
+ if ($string[$i] === '"') {
+ $r = preg_match("/$quoted_string/", $string, $matches, 0, $i);
+ if (!$r || empty($matches[0])) {
+ break;
+ }
+ $i += strlen($matches[0]) - 1;
+ } else if (preg_match("/$delimiter/", $string[$i])) {
+ $result[] = substr($string, $p, $i - $p);
+ $p = $i + 1;
+ }
+ }
+ $result[] = substr($string, $p);
+ return $result;
+ }
+
+ /**
+ * Encodes a header value as per RFC2047
+ *
+ * @param string $value The header data to encode
+ * @param string $charset Character set name
+ * @param string $encoding Encoding name (base64 or quoted-printable)
+ * @param int $prefix_len Prefix length. Default: 0
+ * @param string $eol End-of-line sequence. Default: "\r\n"
+ *
+ * @return string Encoded header data
+ * @since 1.6.1
+ */
+ public static function encodeHeaderValue($value, $charset, $encoding, $prefix_len = 0, $eol = "\r\n")
+ {
+ // #17311: Use multibyte aware method (requires mbstring extension)
+ if ($result = Mail_mimePart::encodeMB($value, $charset, $encoding, $prefix_len, $eol)) {
+ return $result;
+ }
+
+ // Generate the header using the specified params and dynamicly
+ // determine the maximum length of such strings.
+ // 75 is the value specified in the RFC.
+ $encoding = $encoding == 'base64' ? 'B' : 'Q';
+ $prefix = '=?' . $charset . '?' . $encoding .'?';
+ $suffix = '?=';
+ $maxLength = 75 - strlen($prefix . $suffix);
+ $maxLength1stLine = $maxLength - $prefix_len;
+
+ if ($encoding == 'B') {
+ // Base64 encode the entire string
+ $value = base64_encode($value);
+
+ // We can cut base64 every 4 characters, so the real max
+ // we can get must be rounded down.
+ $maxLength = $maxLength - ($maxLength % 4);
+ $maxLength1stLine = $maxLength1stLine - ($maxLength1stLine % 4);
+
+ $cutpoint = $maxLength1stLine;
+ $output = '';
+
+ while ($value) {
+ // Split translated string at every $maxLength
+ $part = substr($value, 0, $cutpoint);
+ $value = substr($value, $cutpoint);
+ $cutpoint = $maxLength;
+ // RFC 2047 specifies that any split header should
+ // be separated by a CRLF SPACE.
+ if ($output) {
+ $output .= $eol . ' ';
+ }
+ $output .= $prefix . $part . $suffix;
+ }
+ $value = $output;
+ } else {
+ // quoted-printable encoding has been selected
+ $value = Mail_mimePart::encodeQP($value);
+
+ // This regexp will break QP-encoded text at every $maxLength
+ // but will not break any encoded letters.
+ $reg1st = "|(.{0,$maxLength1stLine}[^\=][^\=])|";
+ $reg2nd = "|(.{0,$maxLength}[^\=][^\=])|";
+
+ if (strlen($value) > $maxLength1stLine) {
+ // Begin with the regexp for the first line.
+ $reg = $reg1st;
+ $output = '';
+ while ($value) {
+ // Split translated string at every $maxLength
+ // But make sure not to break any translated chars.
+ $found = preg_match($reg, $value, $matches);
+
+ // After this first line, we need to use a different
+ // regexp for the first line.
+ $reg = $reg2nd;
+
+ // Save the found part and encapsulate it in the
+ // prefix & suffix. Then remove the part from the
+ // $value_out variable.
+ if ($found) {
+ $part = $matches[0];
+ $len = strlen($matches[0]);
+ $value = substr($value, $len);
+ } else {
+ $part = $value;
+ $value = '';
+ }
+
+ // RFC 2047 specifies that any split header should
+ // be separated by a CRLF SPACE
+ if ($output) {
+ $output .= $eol . ' ';
+ }
+ $output .= $prefix . $part . $suffix;
+ }
+ $value = $output;
+ } else {
+ $value = $prefix . $value . $suffix;
+ }
+ }
+
+ return $value;
+ }
+
+ /**
+ * Encodes the given string using quoted-printable
+ *
+ * @param string $str String to encode
+ *
+ * @return string Encoded string
+ * @since 1.6.0
+ */
+ public static function encodeQP($str)
+ {
+ // Bug #17226 RFC 2047 restricts some characters
+ // if the word is inside a phrase, permitted chars are only:
+ // ASCII letters, decimal digits, "!", "*", "+", "-", "/", "=", and "_"
+
+ // "=", "_", "?" must be encoded
+ $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';
+ $str = preg_replace_callback(
+ $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $str
+ );
+
+ return str_replace(' ', '_', $str);
+ }
+
+ /**
+ * Encodes the given string using base64 or quoted-printable.
+ * This method makes sure that encoded-word represents an integral
+ * number of characters as per RFC2047.
+ *
+ * @param string $str String to encode
+ * @param string $charset Character set name
+ * @param string $encoding Encoding name (base64 or quoted-printable)
+ * @param int $prefix_len Prefix length. Default: 0
+ * @param string $eol End-of-line sequence. Default: "\r\n"
+ *
+ * @return string Encoded string
+ * @since 1.8.0
+ */
+ public static function encodeMB($str, $charset, $encoding, $prefix_len=0, $eol="\r\n")
+ {
+ if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
+ return;
+ }
+
+ $encoding = $encoding == 'base64' ? 'B' : 'Q';
+ // 75 is the value specified in the RFC
+ $prefix = '=?' . $charset . '?'.$encoding.'?';
+ $suffix = '?=';
+ $maxLength = 75 - strlen($prefix . $suffix);
+
+ // A multi-octet character may not be split across adjacent encoded-words
+ // So, we'll loop over each character
+ // mb_stlen() with wrong charset will generate a warning here and return null
+ $length = mb_strlen($str, $charset);
+ $result = '';
+ $line_length = $prefix_len;
+
+ if ($encoding == 'B') {
+ // base64
+ $start = 0;
+ $prev = '';
+
+ for ($i=1; $i<=$length; $i++) {
+ // See #17311
+ $chunk = mb_substr($str, $start, $i-$start, $charset);
+ $chunk = base64_encode($chunk);
+ $chunk_len = strlen($chunk);
+
+ if ($line_length + $chunk_len == $maxLength || $i == $length) {
+ if ($result) {
+ $result .= "\n";
+ }
+ $result .= $chunk;
+ $line_length = 0;
+ $start = $i;
+ } else if ($line_length + $chunk_len > $maxLength) {
+ if ($result) {
+ $result .= "\n";
+ }
+ if ($prev) {
+ $result .= $prev;
+ }
+ $line_length = 0;
+ $start = $i - 1;
+ } else {
+ $prev = $chunk;
+ }
+ }
+ } else {
+ // quoted-printable
+ // see encodeQP()
+ $regexp = '/([\x22-\x29\x2C\x2E\x3A-\x40\x5B-\x60\x7B-\x7E\x80-\xFF])/';
+
+ for ($i=0; $i<=$length; $i++) {
+ $char = mb_substr($str, $i, 1, $charset);
+ // RFC recommends underline (instead of =20) in place of the space
+ // that's one of the reasons why we're not using iconv_mime_encode()
+ if ($char == ' ') {
+ $char = '_';
+ $char_len = 1;
+ } else {
+ $char = preg_replace_callback(
+ $regexp, array('Mail_mimePart', 'qpReplaceCallback'), $char
+ );
+ $char_len = strlen($char);
+ }
+
+ if ($line_length + $char_len > $maxLength) {
+ if ($result) {
+ $result .= "\n";
+ }
+ $line_length = 0;
+ }
+
+ $result .= $char;
+ $line_length += $char_len;
+ }
+ }
+
+ if ($result) {
+ $result = $prefix
+ .str_replace("\n", $suffix.$eol.' '.$prefix, $result).$suffix;
+ }
+
+ return $result;
+ }
+
+ /**
+ * Callback function to replace extended characters (\x80-xFF) with their
+ * ASCII values (RFC2047: quoted-printable)
+ *
+ * @param array $matches Preg_replace's matches array
+ *
+ * @return string Encoded character string
+ */
+ protected static function qpReplaceCallback($matches)
+ {
+ return sprintf('=%02X', ord($matches[1]));
+ }
+
+ /**
+ * Callback function to replace extended characters (\x80-xFF) with their
+ * ASCII values (RFC2231)
+ *
+ * @param array $matches Preg_replace's matches array
+ *
+ * @return string Encoded character string
+ */
+ protected static function encodeReplaceCallback($matches)
+ {
+ return sprintf('%%%02X', ord($matches[1]));
+ }
+
+ /**
+ * PEAR::raiseError implementation
+ *
+ * @param string $message A text error message
+ *
+ * @return PEAR_Error Instance of PEAR_Error
+ */
+ public static function raiseError($message)
+ {
+ // PEAR::raiseError() is not PHP 5.4 compatible
+ return new PEAR_Error($message);
+ }
+}
diff --git a/www/wiki/vendor/pear/mail_mime/README b/www/wiki/vendor/pear/mail_mime/README
new file mode 100644
index 00000000..d725a7f6
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/README
@@ -0,0 +1,19 @@
+This package is http://pear.php.net/package/Mail_Mime and has been migrated from http://svn.php.net/repository/pear/packages/Mail_Mime
+
+Please report all new issues via the PEAR bug tracker.
+
+If this package is marked as unmaintained and you have fixes, please submit your pull requests and start discussion on the pear-qa mailing list.
+
+To test, run either
+$ phpunit tests/
+ or
+$ pear run-tests -r
+
+To build, simply
+$ pear package
+
+To install from scratch
+$ pear install package.xml
+
+To upgrade
+$ pear upgrade -f package.xml
diff --git a/www/wiki/vendor/pear/mail_mime/composer.json b/www/wiki/vendor/pear/mail_mime/composer.json
new file mode 100644
index 00000000..08498e56
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/composer.json
@@ -0,0 +1,34 @@
+{
+ "authors": [
+ {
+ "email": "cipri@php.net",
+ "name": "Cipriano Groenendal",
+ "role": "Lead"
+ },
+ {
+ "email": "alec@php.net",
+ "name": "Aleksander Machniak",
+ "role": "Lead"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Mail": "./"
+ }
+ },
+ "description": "Mail_Mime provides classes to create MIME messages",
+ "homepage": "http://pear.php.net/package/Mail_Mime",
+ "include-path": [
+ "./"
+ ],
+ "license": "BSD-3-clause",
+ "name": "pear/mail_mime",
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Mail_Mime",
+ "source": "https://github.com/pear/Mail_Mime"
+ },
+ "type": "library",
+ "require": {
+ "pear/pear-core-minimal": "*"
+ }
+}
diff --git a/www/wiki/vendor/pear/mail_mime/package.xml b/www/wiki/vendor/pear/mail_mime/package.xml
new file mode 100644
index 00000000..908274ac
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/package.xml
@@ -0,0 +1,865 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.4" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Mail_Mime</name>
+ <channel>pear.php.net</channel>
+ <summary>Mail_Mime provides classes to create MIME messages.</summary>
+ <description>Mail_Mime provides classes to deal with the creation and manipulation of MIME messages.
+It allows people to create e-mail messages consisting of:
+* Text Parts
+* HTML Parts
+* Inline HTML Images
+* Attachments
+* Attached messages
+
+It supports big messages, base64 and quoted-printable encodings and
+non-ASCII characters in filenames, subjects, recipients, etc. encoded
+using RFC2047 and/or RFC2231.</description>
+ <lead>
+ <name>Cipriano Groenendal</name>
+ <user>cipri</user>
+ <email>cipri@php.net</email>
+ <active>no</active>
+ </lead>
+ <lead>
+ <name>Aleksander Machniak</name>
+ <user>alec</user>
+ <email>alec@php.net</email>
+ <active>yes</active>
+ </lead>
+ <date>2017-11-17</date>
+ <time>11:00:00</time>
+ <version>
+ <release>1.10.2</release>
+ <api>1.10.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fix Bug #21255: Boundary gets added twice when using setContentType() [alec]
+* PHP 7.2 compatibility fixes [alec]
+ </notes>
+ <contents>
+ <dir name="/">
+ <dir name="scripts">
+ <file baseinstalldir="Mail" name="phail.php" role="doc" />
+ </dir> <!-- /scripts -->
+ <dir name="tests">
+ <file baseinstalldir="Mail" name="class-filename.phpt" role="test" />
+ <file baseinstalldir="Mail" name="encoding_case.phpt" role="test" />
+ <file baseinstalldir="Mail" name="headers_with_mbstring.phpt" role="test" />
+ <file baseinstalldir="Mail" name="headers_without_mbstring.phpt" role="test" />
+ <file baseinstalldir="Mail" name="sleep_wakeup_EOL-bug3488-part1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="sleep_wakeup_EOL-bug3488-part2.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_3513_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_3513_2.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_3513_3.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_7561_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_8386_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_8541_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_9722_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_10596_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_10816_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_10999_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_11381.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_11731.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_12165.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_12385_1.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_12411.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_12466.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_13032.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_13444.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_13962.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_14529.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_14779.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_14780.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_15320.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_16539.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_17025.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_17175.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_18083.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_18772.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_19497.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_20226.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_20273.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_20563.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_20564.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_21098.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_21205.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_21206.phpt" role="test" />
+ <file baseinstalldir="Mail" name="test_Bug_21255.phpt" role="test" />
+ </dir> <!-- /tests -->
+ <dir name="Mail">
+ <file baseinstalldir="/" name="mime.php" role="php" />
+ <file baseinstalldir="/" name="mimePart.php" role="php" />
+ </dir>
+ </dir> <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.0.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.6.0</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <phprelease />
+ <changelog>
+ <release>
+ <version>
+ <release>1.0</release>
+ <api>1.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2001-12-28</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+This is the initial release of the Mime_Mail package.
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.1</release>
+ <api>1.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2002-04-03</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+This is a maintenance release with various bugfixes and minor enhancements.
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.2</release>
+ <api>1.2</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2002-07-14</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+* Added header encoding
+* Altered mimePart to put boundary parameter on newline
+* Changed addFrom() to setFrom()
+* Added setSubject()
+* Made mimePart inherit crlf setting from mime
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.2.1</release>
+ <api>1.2.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2002-07-27</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+* License change
+* Applied a few changes From Ilia Alshanetsky
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.3.0RC1</release>
+ <api>1.3.0RC1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <date>2005-03-20</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+* First release in over 2.5 years (!)
+* MANY bugfixes (see the bugtracker)
+* added a few tests
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.3.0</release>
+ <api>1.3.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2005-04-01</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+* First (stable) release in over 2.5 years (!)
+* MANY bugfixes (see the bugtracker)
+* added a few tests
+* one small fix after RC1 (bug #3940)
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.3.1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2005-07-13</date>
+ <license uri="http://www.php.net/license">PHP</license>
+ <notes>
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0a1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-03-08</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Changed License to BSD Style license, as that&apos;s what the code was since the beginning [cipri]
+* Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
+* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
+* Fix Bug #4696: addAttachment crash [cipri]
+* Fix Bug #5333: Only variables should be returned by reference; triggers notices since php 4.4.0 [cipri]
+* Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring overload [cipri]
+* Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
+* Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
+* Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
+* Fix Bug #9347: Notices about references [cweiske]
+* Fix Bug #9558: Broken multiline headers [cipri]
+* Fix Bug #9956: Notices being thrown [cipri]
+* Fix Bug #9976: Subject encoded twice [cipri]
+* Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
+* Implement Feature #3636: Allow specification of charsets and encoding [cipri]
+* Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
+* Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
+* Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
+* Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
+* Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0a2</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-05</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
+ platform [cipri]
+* Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
+* Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
+* Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
+* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
+* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
+* Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0a3</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-05</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
+* Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0RC1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-12</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0RC2</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-22</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #10791: Unit tests fail [cipri]
+* Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
+* Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0RC3</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-24</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0RC4</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-04-28</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">bsd style</license>
+ <notes>
+* Fix Bug #3513: support of RFC2231 in header fields. [cipri]
+* Fix Bug #10838: bad use of MIME encoding in header. [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.4.0</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-05-05</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Release notes:
+ * No more notices in PHP 5 /4.4.0.
+ * Improved inline HTML image function.
+ * Improved header encoding with foreign charsets.
+ * Improved long header rendering.
+ * More control over used Charsets and encoding schemes.
+ * More configurable attachments and inline images.
+ * Full RFC 2047 Support
+ * Full RFC 2231 Support
+ * Unit-tests
+
+Fixed bugs:
+ * Fix Bug #30: Mail_Mime: _encodeHeaders is not RFC-2047 compliant. [cipri]
+ * Fix Bug #3513: support of RFC2231 in header fields. [cipri]
+ * Fix Bug #4696: addAttachment crash [cipri]
+ * Fix Bug #5333: Only variables should be returned by reference; triggers notices since
+ php 4.4.0 [cipri]
+ * Fix Bug #5400: Do not return function reference [cipri]
+ * Fix Bug #5710: Little reference bugs [cipri]
+ * Fix Bug #5890: Only variable references should be returned by reference [cipri]
+ * Fix Bug #6260: Just a notice with PHP5 [cipri]
+ * Fix Bug #6261: php 5.1.1 upgrade [cipri]
+ * Fix Bug #6663: Notice about reference passing [cipri]
+ * Fix Bug #7561: Mail_mimePart::_quotedPrintableEncode() misbehavior with mbstring
+ overload [cipri]
+ * Fix Bug #7713: PHP5 Notice: Only variable references should be returned by reference [cipri]
+ * Fix Bug #8223: Incorrectly encoded quoted-printable headers [cipri]
+ * Fix Bug #8386: HTML body not correctly encoded if attachments present [cipri]
+ * Fix Bug #8541: mimePart.php line delimiter is \r [cipri]
+ * Fix Bug #8812: user header updates overwritten [cipri]
+ * Fix Bug #9347: Notices about references [cweiske]
+ * Fix Bug #9558: Broken multiline headers [cipri]
+ * Fix Bug #9722: _quotedPrintableEncode does not encode dot at start of line on Windows
+ platform [cipri]
+ * Fix Bug #9725: multipart/related &amp; alternative wrong order [cipri]
+ * Fix Bug #9956: Notices being thrown [cipri]
+ * Fix Bug #9976: Subject encoded twice [cipri]
+ * Fix Bug #10146: mbstring fails to recognize encodings. [cipri]
+ * Fix Bug #10158: Inline images not displayed on Mozilla Thunderbird [cipri]
+ * Fix Bug #10232: Gmail creates double line break when \r\n is used [cipri]
+ * Fix Bug #10298: Mail_mime, double Quotes and Specialchars in from and to Adress [cipri]
+ * Fix Bug #10306: Strings with Double Quotes get encoded wrongly [cipri]
+ * Fix Bug #10596: Incorrect handling of text and html &apos;0&apos; bodies [cipri]
+ * Fix Bug #10791: Unit tests fail [cipri]
+ * Fix Bug #10792: No unit tests for recently fixed bugs [cipri]
+ * Fix Bug #10793: Long headers don&apos;t get wrapped since fix for Bug #10298 [cipri]
+ * Fix Bug #10816: Unwanted linebreak at the end of output [cipri]
+ * Fix Bug #10838: bad use of MIME encoding in header. [cipri]
+Implemented Features:
+ * Implement Feature #2952: Mail_mime::headers() saves extra headers [cipri]
+ * Implement Feature #3636: Allow specification of charsets and encoding [cipri]
+ * Implement Feature #4057: Mail_Mime: Add name parameter for Content-Type [cipri]
+ * Implement Feature #4504: addHTMLImage does not work in cases when filename contains a path [cipri]
+ * Implement Feature #5837: Mail_Mime: Build message for Net_SMTP [cipri]
+ * Implement Feature #5934: Mail_Mime: choice for content disposition [cipri]
+ * Implement Feature #6568: Mail_Mime: inline images referenced in CSS definitions not replaced. [cipri]
+ * Implement Feature #10604: Put an option to specify Content-Location in the header [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.0a1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>alpha</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-06-10</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Split off mail_MimeDecode
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.0RC1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-06-10</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Split off mail_MimeDecode
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.0</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-06-17</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Split off Mail_MimeDecode
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.1</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-06-20</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fix Bug #11344: Error at line 644 in mime.php [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.2</release>
+ <api>1.3.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2007-06-21</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fix Bug #11381: domain name is attached to content-id, trailing greater-than sign is
+ not remove [cipri]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.5.3</release>
+ <api>1.3.2</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2009-12-29</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Fixed bugs:
+ * Fix Bug #14678: srand() lowers security [clockwerx]
+ * Fix Bug #12921: _file2str not binary safe [walter]
+ * Fix Bug #12385: Bad regex when replacing css style attachments [cipri]
+ * Fix Bug #16911: Excessive semicolon in MIME header [alec]
+ * Fix Bug #15320: Attachment charset is not set in Content-Type header [alec]
+ * Fix Bug #16911: Lack of semicolon separator for MIME header parameters [alec]
+ * Fix Bug #16846: Use preg_replace_callback() instead of /e modifier [alec]
+ * Fix Bug #14779: Problem with an empty attachment [alec]
+ * Fix Bug #15913: Optimize the memory used by Mail_mimePart::encode.
+ Avoid having attachments data duplicated in memory [alec]
+ * Fix Bug #16539: Headers longer than 998 characters aren&apos;t wrapped [alec]
+ * Fix Bug #11238: Wrong encoding of structured headers [alec]
+ * Fix Bug #13641: iconv_mime_encode() seems to work different/errorious than
+ the build in logic. Removed &apos;ignore_iconv&apos; param. [alec]
+ * Fix Bug #16706: Incorrect double-quotes RFC 2231-encoded parameter values [alec]
+ * Fix Bug #14232: RFC2231: tspecials encoding in _buildHeaderParam() [alec]
+Implemented Features:
+ * Implement Feature #10438: Function (encodeHeader) for encoding of given header [alec]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.6.0</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2010-01-27</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * Don&apos;t break specified headers folding [alec]
+ * Bug #17025: Wrong headers() result for long unwrapable header value [alec]
+
+Implemented Features:
+ * Allow setting Content-ID for HTML Images [alec]
+ * Added one setParam() in place of many set*() functions [alec]
+ * Added getParam(), getTXTBody(), getHTMLBody() [alec]
+ * Skip RFC2231&apos;s charset if filename contains only ASCII characters [alec]
+ * Make sure that Received: headers are returned on the top [alec]
+ * Added saveMessageBody() and getMessageBody() functions [alec]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.6.1</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2010-03-08</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * Fix encoding of Return-Receipt-To and Disposition-Notification-To headers [alec]
+
+Implemented Features:
+ * Implement Feature #12466: Build parameters validation [alec]
+ * Implement Feature #17175: Content-Description support for attachments [alec]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.6.2</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2010-03-23</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * Fix Bug #17226: Non RFC-compliant quoted-printable encoding of structured headers [alec]
+ </notes>
+ </release>
+ <release>
+ <version>
+ <release>1.7.0</release>
+ <api>1.4.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2010-04-12</date>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Implemented Features:
+ * Added Mail_mime::setContentType() function with possibility to set various
+ types in Content-Type header (also fixes problem with boundary parameter when Content-Type
+ header was specified by user) [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2010-07-29</date>
+ <version>
+ <release>1.8.0</release>
+ <api>1.4.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * Double-addition of e-mail domain to content ID in HTML images [alec]
+ * #17311: Multi-octet characters are split across adjacent &apos;encoded-word&apos;s [alec]
+ * #17573: Place charset parameter in first line of Content-Type header (if possible) [alec]
+Implemented Features:
+ * #17518: addTo() method [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2010-12-01</date>
+ <version>
+ <release>1.8.1</release>
+ <api>1.4.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * #18083: Not possible to set separate charset for attachment content and headers [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2011-08-10</date>
+ <version>
+ <release>1.8.2</release>
+ <api>1.4.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+Bugs Fixed:
+ * #18426: Fixed backward compatibility for &quot;dfilename&quot; parameter [alec]
+ * Removed xmail.dtd, xmail.xsl from the package [alec]
+ * Fixed handling of email addresses with quoted local part [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2012-03-12</date>
+ <version>
+ <release>1.8.3</release>
+ <api>1.4.1</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Request #19009: Remove error_reporting from tests [alec]
+* Fixed Bug #19094: Email addresses do not have to contain a space between the name and address part [alec]
+* Fixed Bug #19328: Wrong encoding of filenames with comma [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2012-05-17</date>
+ <version>
+ <release>1.8.4</release>
+ <api>1.4.2</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Request #19406: Allow to set individual attachment part headers [alec]
+* Fixed Bug #18982: Non-static method Mail_mimePart::encodeHeader() should not be called statically [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2012-06-09</date>
+ <version>
+ <release>1.8.5</release>
+ <api>1.4.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Added possibility to set additional parameters of message part header, e.g. attachment size [alec]
+* Added automatic setting of attachment size via Content-Disposition header size parameter [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2012-10-23</date>
+ <version>
+ <release>1.8.6</release>
+ <api>1.4.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Bug #19473: PEAR::isError() compatibility problem with PHP 5.4 [alec]
+* Bug #19497: Attachment filename is cut on slash character [alec]
+* Bug #19665: Add Mail-Reply-To and Mail-Followup-To to structured recipient headers list [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2012-12-25</date>
+ <version>
+ <release>1.8.7</release>
+ <api>1.4.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Bug #5333: Fix more return by reference errors [alec]
+* Bug #19754: Fix compatibility with PHP4 [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2013-07-05</date>
+ <version>
+ <release>1.8.8</release>
+ <api>1.4.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fixed warning/notice on (static vs. non-static) PEAR::raiseError() usage [alec]
+* Fixed Bug #19761: PHP5 warnings about return by reference [alec]
+* Fixed Bug #19770: Make cid generator more unique on Windows [alec]
+* Fixed Bug #19987: E_STRICT warning when null is passed by reference [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2014-05-14</date>
+ <version>
+ <release>1.8.9</release>
+ <api>1.4.3</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fixed Bug #20273: Incorrect handling of HTAB in encodeHeader() [alec]
+* Fixed Bug #20226: Mail_mimePart::encodeHeader does not encode ISO-2022-JP string [alec]
+* Fixed Bug #20222: Broken Compatybility with PHP4 [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2015-07-05</date>
+ <time>12:50:00</time>
+ <version>
+ <release>1.9.0RC1</release>
+ <api>2.0.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>beta</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Drop PHP4 support, Fix warnings on PHP7 [alec]
+* Request #20564: Added possibility to unset headers [alec]
+* Request #20563: Added isMultipart() method [alec]
+* Request #20565: Accept also a file pointer in Mail_mimePart::encodeToFile(),
+ Mail_mime::get() and Mail_mime::saveMessageBody() [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2015-08-06</date>
+ <time>12:00:00</time>
+ <version>
+ <release>1.9.0</release>
+ <api>1.9.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Bug #20921: Make Mail_mimePart::encodeHeaderValue() a static method [alec]
+* Bug #20931: Really remove unset headers [alec]
+* Request #18772: Added methods for creating text/calendar messages [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2015-09-13</date>
+ <time>12:00:00</time>
+ <version>
+ <release>1.10.0</release>
+ <api>1.10.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Add possibility to add externally created Mail_mimePart objects as attachments [alec]
+* Add possibility to set preamble text for multipart messages [alec]
+ </notes>
+ </release>
+ <release>
+ <date>2017-05-21</date>
+ <time>12:00:00</time>
+ <version>
+ <release>1.10.1</release>
+ <api>1.10.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.opensource.org/licenses/bsd-license.php">BSD Style</license>
+ <notes>
+* Fix Bug 21206: explodeQuotedString() does not handle quoted strings correctly [dfukagaw28]
+* Fix Bug 21205: Invalid encoding of headers with quoted multibyte strings in non-unicode charset [dfukagaw28]
+* Fix Bug 21098: Discrepancy in handling of empty (but set) plain text part [alec]
+ </notes>
+ </release>
+ </changelog>
+</package>
diff --git a/www/wiki/vendor/pear/mail_mime/scripts/phail.php b/www/wiki/vendor/pear/mail_mime/scripts/phail.php
new file mode 100755
index 00000000..e6427a58
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/scripts/phail.php
@@ -0,0 +1,47 @@
+#!@prefix@/bin/php -Cq
+<?php
+/**
+* PHAIL - stands for PHP Mail
+* @author Tomas V.V.Cox <cox@idecnet.com>
+*/
+require_once 'Mail.php';
+require_once 'Mail/mime.php';
+require_once 'Console/Getopt.php';
+
+$argv = Console_Getopt::readPHPArgv();
+$opts = Console_Getopt::getOpt($argv, 'f:c:s:t:a:b:');
+if (PEAR::isError($opts)) {
+ usage($opts->getMessage());
+}
+
+PEAR::setErrorHandling(PEAR_ERROR_DIE);
+$mime = new Mail_mime;
+foreach ($opts[0] as $opt) {
+ $param = $opt[1];
+ switch ($opt[0]) {
+ case 'f':
+ $headers['From'] = $param; break;
+ case 'c':
+ $headers['Cc'] = $param; break;
+ case 's':
+ $headers['Subject'] = $param; break;
+ case 't':
+ $to = $param; break;
+ case 'a':
+ $mime->addAttachment($param); break;
+ case 'b':
+ $isfile = @is_file($param) ? true : false;
+ $mime->setTXTBody($param, $isfile); break;
+ }
+}
+
+$mbody = $mime->get();
+$headers = $mime->headers($headers);
+$mail = Mail::factory('mail');
+$mail->send($to, $headers, $mbody);
+
+function usage($error)
+{
+ die($error);
+}
+?>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/Makefile b/www/wiki/vendor/pear/mail_mime/tests/Makefile
new file mode 100644
index 00000000..bb6b1be4
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/Makefile
@@ -0,0 +1,8 @@
+
+clean:
+ rm -f *.log *.php *.diff *.exp *.out
+
+
+
+test:
+ cd .. && pear run-tests tests/*.phpt && cd tests;
diff --git a/www/wiki/vendor/pear/mail_mime/tests/class-filename.phpt b/www/wiki/vendor/pear/mail_mime/tests/class-filename.phpt
new file mode 100644
index 00000000..e383bf88
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/class-filename.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Test class filename (bug #24)
+--SKIPIF--
+<?php
+echo "skip This will be broken until Mail_Mime2";
+?>
+--FILE--
+<?php
+@include('Mail/Mime.php');
+echo class_exists('Mail_Mime') ? 'Include OK' : 'Include failed';
+?>
+--EXPECT--
+Include OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/encoding_case.phpt b/www/wiki/vendor/pear/mail_mime/tests/encoding_case.phpt
new file mode 100644
index 00000000..819100a4
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/encoding_case.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #2364 Tabs in Mail_mimePart::quotedPrintableEncode()
+--SKIPIF--
+--FILE--
+<?php
+$test = "Here's\t\na tab\n";
+require_once('Mail/mimePart.php');
+print Mail_mimePart::quotedPrintableEncode($test, 7);
+?>
+--EXPECT--
+Here's=
+=09
+a tab
diff --git a/www/wiki/vendor/pear/mail_mime/tests/headers_with_mbstring.phpt b/www/wiki/vendor/pear/mail_mime/tests/headers_with_mbstring.phpt
new file mode 100644
index 00000000..2cc705e5
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/headers_with_mbstring.phpt
@@ -0,0 +1,148 @@
+--TEST--
+Multi-test for headers encoding using base64 and quoted-printable
+--SKIPIF--
+<?php
+if (!function_exists('mb_substr') || !function_exists('mb_strlen')) {
+ die "skip mbstring functions not found!";
+}
+?>
+--FILE--
+<?php
+include("Mail/mime.php");
+$mime = new Mail_mime();
+
+$headers = array(
+array('From', '<adresse@adresse.de>'),
+array('From', 'adresse@adresse.de'),
+array('From', 'Frank Do <adresse@adresse.de>'),
+array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
+array('From', '"Frank Do" <adresse@adresse.de>'),
+array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
+array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
+array('From', '"adresse@adresse.de" <addresse@adresse>'),
+array('From', 'adresse@adresse.de <addresse@adresse>'),
+array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
+array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
+array('Subject', 'Short ASCII subject'),
+array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
+array('Subject', 'Short Unicode ż subject'),
+array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
+array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl> <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
+array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
+array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
+array('To', 'Frank " \\Do <adresse@adresse.de>'),
+array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
+array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
+array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
+array('From', "test@nàme <user@domain.com>"),
+array('From', "Test <\"test test\"@domain.com>"),
+array('From', "\"test test\"@domain.com"),
+array('From', "<\"test test\"@domain.com>"),
+array('From', "Doe<test@domain.com>"),
+array('From', "\"John Doe\"<test@domain.com>"),
+array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
+array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
+);
+
+$i = 1;
+foreach ($headers as $header) {
+ $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'base64');
+ printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
+ $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'quoted-printable');
+ printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
+ $i++;
+}
+?>
+--EXPECT--
+[01] From: <adresse@adresse.de>
+[01] From: <adresse@adresse.de>
+[02] From: adresse@adresse.de
+[02] From: adresse@adresse.de
+[03] From: Frank Do <adresse@adresse.de>
+[03] From: Frank Do <adresse@adresse.de>
+[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
+[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
+[05] From: "Frank Do" <adresse@adresse.de>
+[05] From: "Frank Do" <adresse@adresse.de>
+[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
+ =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
+[07] Cc: <adresse@adresse.de>, =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz?=
+ =?UTF-8?Q?_D=C5=82uga_nazwa?= <cris@domain.com>
+[08] From: "adresse@adresse.de" <addresse@adresse>
+[08] From: "adresse@adresse.de" <addresse@adresse>
+[09] From: "adresse@adresse.de" <addresse@adresse>
+[09] From: "adresse@adresse.de" <addresse@adresse>
+[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
+[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
+[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
+ =?UTF-8?B?ZGU+?=
+[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
+ =?UTF-8?Q?=2Ede=3E?=
+[12] Subject: Short ASCII subject
+[12] Subject: Short ASCII subject
+[13] Subject: Long ASCII subject - multiline space separated words - too long for
+ one line
+[13] Subject: Long ASCII subject - multiline space separated words - too long for
+ one line
+[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
+[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
+[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
+ =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
+[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g?=
+ =?UTF-8?Q?=C4=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
+[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
+ <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
+[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
+ <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
+[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[18] To: "Frank \" \\Do" <adresse@adresse.de>
+[18] To: "Frank \" \\Do" <adresse@adresse.de>
+[19] To: "Frank \" \\Do" <adresse@adresse.de>
+[19] To: "Frank \" \\Do" <adresse@adresse.de>
+[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
+[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
+[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
+ =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
+ =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
+ =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7w=?=
+ =?UTF-8?B?w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBt?=
+ =?UTF-8?B?aXIgU8O8cGVyIGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVy?=
+ =?UTF-8?B?IGdyw7ZzZSB0b2xsZSBncsO8w59lIHZvbiBtaXIgU8O8cGVyIGdyw7ZzZSB0?=
+ =?UTF-8?B?b2xsZSBncsO8w59lIHZvbiBtaXIhISE/?=
+[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
+ =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCp?=
+ =?UTF-8?Q?er_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6?=
+ =?UTF-8?Q?se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr?=
+ =?UTF-8?Q?=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
+ =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von?=
+ =?UTF-8?Q?_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S?=
+ =?UTF-8?Q?=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
+[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
+ =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
+[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6?=
+ =?UTF-8?Q?sartiger_Software_3=2E6?=
+[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
+[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
+[24] From: Test <"test test"@domain.com>
+[24] From: Test <"test test"@domain.com>
+[25] From: "test test"@domain.com
+[25] From: "test test"@domain.com
+[26] From: <"test test"@domain.com>
+[26] From: <"test test"@domain.com>
+[27] From: Doe <test@domain.com>
+[27] From: Doe <test@domain.com>
+[28] From: "John Doe" <test@domain.com>
+[28] From: "John Doe" <test@domain.com>
+[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
+[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
+[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
+[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/headers_without_mbstring.phpt b/www/wiki/vendor/pear/mail_mime/tests/headers_without_mbstring.phpt
new file mode 100644
index 00000000..893847c2
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/headers_without_mbstring.phpt
@@ -0,0 +1,149 @@
+--TEST--
+Multi-test for headers encoding using base64 and quoted-printable
+--SKIPIF--
+<?php
+if (function_exists('mb_substr') && function_exists('mb_strlen')) {
+ die("skip mbstring functions found!");
+}
+?>
+--FILE--
+<?php
+include("Mail/mime.php");
+$mime = new Mail_mime();
+
+$headers = array(
+array('From', '<adresse@adresse.de>'),
+array('From', 'adresse@adresse.de'),
+array('From', 'Frank Do <adresse@adresse.de>'),
+array('To', 'Frank Do <adresse@adresse.de>, James Clark <james@domain.com>'),
+array('From', '"Frank Do" <adresse@adresse.de>'),
+array('Cc', '"Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>'),
+array('Cc', ' <adresse@adresse.de>, "Kuśmiderski Jan Krzysztof Janusz Długa nazwa" <cris@domain.com>'),
+array('From', '"adresse@adresse.de" <addresse@adresse>'),
+array('From', 'adresse@adresse.de <addresse@adresse>'),
+array('From', '"German Umlauts öäü" <adresse@adresse.de>'),
+array('Subject', 'German Umlauts öäü <adresse@adresse.de>'),
+array('Subject', 'Short ASCII subject'),
+array('Subject', 'Long ASCII subject - multiline space separated words - too long for one line'),
+array('Subject', 'Short Unicode ż subject'),
+array('Subject', 'Long Unicode subject - zażółć gęślą jaźń - too long for one line'),
+array('References', '<hglvja$jg7$1@nemesis.news.neostrada.pl> <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>'),
+array('To', '"Frank Do" <adresse@adresse.de>,, "James Clark" <james@domain.com>'),
+array('To', '"Frank \\" \\\\Do" <adresse@adresse.de>'),
+array('To', 'Frank " \\Do <adresse@adresse.de>'),
+array('Subject', "A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test"),
+array('Subject', "TEST Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir Süper gröse tolle grüße von mir!!!?"),
+array('Subject', "Update: Microsoft Windows-Tool zum Entfernen bösartiger Software 3.6"),
+array('From', "test@nàme <user@domain.com>"),
+array('From', "Test <\"test test\"@domain.com>"),
+array('From', "\"test test\"@domain.com"),
+array('From', "<\"test test\"@domain.com>"),
+array('From', "Doe<test@domain.com>"),
+array('From', "\"John Doe\"<test@domain.com>"),
+array('Mail-Reply-To', 'adresse@adresse.de <addresse@adresse>'),
+array('Mail-Reply-To', '"öäü" <adresse@adresse.de>'),
+);
+
+$i = 1;
+foreach ($headers as $header) {
+ $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'base64');
+ printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
+ $hdr = $mime->encodeHeader($header[0], $header[1], 'UTF-8', 'quoted-printable');
+ printf("[%02d] %s: %s\n", $i, $header[0], $hdr);
+ $i++;
+}
+?>
+--EXPECT--
+[01] From: <adresse@adresse.de>
+[01] From: <adresse@adresse.de>
+[02] From: adresse@adresse.de
+[02] From: adresse@adresse.de
+[03] From: Frank Do <adresse@adresse.de>
+[03] From: Frank Do <adresse@adresse.de>
+[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
+[04] To: Frank Do <adresse@adresse.de>, James Clark <james@domain.com>
+[05] From: "Frank Do" <adresse@adresse.de>
+[05] From: "Frank Do" <adresse@adresse.de>
+[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[06] Cc: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[07] Cc: <adresse@adresse.de>, =?UTF-8?B?S3XFm21pZGVyc2tpIEphbiBLcnp5c3p0b2Yg?=
+ =?UTF-8?B?SmFudXN6IETFgnVnYSBuYXp3YQ==?= <cris@domain.com>
+[07] Cc: <adresse@adresse.de>,
+ =?UTF-8?Q?Ku=C5=9Bmiderski_Jan_Krzysztof_Janusz_D?=
+ =?UTF-8?Q?=C5=82uga_nazwa?= <cris@domain.com>
+[08] From: "adresse@adresse.de" <addresse@adresse>
+[08] From: "adresse@adresse.de" <addresse@adresse>
+[09] From: "adresse@adresse.de" <addresse@adresse>
+[09] From: "adresse@adresse.de" <addresse@adresse>
+[10] From: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8?= <adresse@adresse.de>
+[10] From: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
+[11] Subject: =?UTF-8?B?R2VybWFuIFVtbGF1dHMgw7bDpMO8IDxhZHJlc3NlQGFkcmVzc2Uu?=
+ =?UTF-8?B?ZGU+?=
+[11] Subject: =?UTF-8?Q?German_Umlauts_=C3=B6=C3=A4=C3=BC_=3Cadresse=40adresse?=
+ =?UTF-8?Q?=2Ede=3E?=
+[12] Subject: Short ASCII subject
+[12] Subject: Short ASCII subject
+[13] Subject: Long ASCII subject - multiline space separated words - too long for
+ one line
+[13] Subject: Long ASCII subject - multiline space separated words - too long for
+ one line
+[14] Subject: =?UTF-8?B?U2hvcnQgVW5pY29kZSDFvCBzdWJqZWN0?=
+[14] Subject: =?UTF-8?Q?Short_Unicode_=C5=BC_subject?=
+[15] Subject: =?UTF-8?B?TG9uZyBVbmljb2RlIHN1YmplY3QgLSB6YcW8w7PFgsSHIGfEmcWb?=
+ =?UTF-8?B?bMSFIGphxbrFhCAtIHRvbyBsb25nIGZvciBvbmUgbGluZQ==?=
+[15] Subject: =?UTF-8?Q?Long_Unicode_subject_-_za=C5=BC=C3=B3=C5=82=C4=87_g=C4?=
+ =?UTF-8?Q?=99=C5=9Bl=C4=85_ja=C5=BA=C5=84_-_too_long_for_one_line?=
+[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
+ <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
+[16] References: <hglvja$jg7$1@nemesis.news.neostrada.pl>
+ <4b2e87ac$1@news.home.net.pl> <hgm5b1$3a7$1@atlantis.news.neostrada.pl>
+[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[17] To: "Frank Do" <adresse@adresse.de>, "James Clark" <james@domain.com>
+[18] To: "Frank \" \\Do" <adresse@adresse.de>
+[18] To: "Frank \" \\Do" <adresse@adresse.de>
+[19] To: "Frank \" \\Do" <adresse@adresse.de>
+[19] To: "Frank \" \\Do" <adresse@adresse.de>
+[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
+[20] Subject: A REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY
+ REALLY REALLY REALLY REALLY REALLY REALLY REALLY REALLY /REALLY/ LONG test
+[21] Subject: =?UTF-8?B?VEVTVCBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
+ =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
+ =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
+ =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zD?=
+ =?UTF-8?B?n2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1p?=
+ =?UTF-8?B?ciBTw7xwZXIgZ3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIg?=
+ =?UTF-8?B?Z3LDtnNlIHRvbGxlIGdyw7zDn2Ugdm9uIG1pciBTw7xwZXIgZ3LDtnNlIHRv?=
+ =?UTF-8?B?bGxlIGdyw7zDn2Ugdm9uIG1pciEhIT8=?=
+[21] Subject: =?UTF-8?Q?TEST_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir?=
+ =?UTF-8?Q?_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_g?=
+ =?UTF-8?Q?r=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tol?=
+ =?UTF-8?Q?le_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC?=
+ =?UTF-8?Q?=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_m?=
+ =?UTF-8?Q?ir_S=C3=BCper_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper?=
+ =?UTF-8?Q?_gr=C3=B6se_tolle_gr=C3=BC=C3=9Fe_von_mir_S=C3=BCper_gr=C3=B6se_t?=
+ =?UTF-8?Q?olle_gr=C3=BC=C3=9Fe_von_mir!!!=3F?=
+[22] Subject: =?UTF-8?B?VXBkYXRlOiBNaWNyb3NvZnQgV2luZG93cy1Ub29sIHp1bSBFbnRm?=
+ =?UTF-8?B?ZXJuZW4gYsO2c2FydGlnZXIgU29mdHdhcmUgMy42?=
+[22] Subject: =?UTF-8?Q?Update=3A_Microsoft_Windows-Tool_zum_Entfernen_b=C3=B6sa?=
+ =?UTF-8?Q?rtiger_Software_3=2E6?=
+[23] From: =?UTF-8?B?dGVzdEBuw6BtZQ==?= <user@domain.com>
+[23] From: =?UTF-8?Q?test=40n=C3=A0me?= <user@domain.com>
+[24] From: Test <"test test"@domain.com>
+[24] From: Test <"test test"@domain.com>
+[25] From: "test test"@domain.com
+[25] From: "test test"@domain.com
+[26] From: <"test test"@domain.com>
+[26] From: <"test test"@domain.com>
+[27] From: Doe <test@domain.com>
+[27] From: Doe <test@domain.com>
+[28] From: "John Doe" <test@domain.com>
+[28] From: "John Doe" <test@domain.com>
+[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
+[29] Mail-Reply-To: "adresse@adresse.de" <addresse@adresse>
+[30] Mail-Reply-To: =?UTF-8?B?w7bDpMO8?= <adresse@adresse.de>
+[30] Mail-Reply-To: =?UTF-8?Q?=C3=B6=C3=A4=C3=BC?= <adresse@adresse.de>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt b/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt
new file mode 100644
index 00000000..6405cc0d
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part1.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #3488 Sleep/Wakeup EOL Consistency - Part 1
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mime.php');
+$mm = new Mail_mime("\n");
+$mm->setHTMLBody('<html></html>');
+$mm->setTxtBody('Blah blah');
+
+if (version_compare(phpversion(), "5.0.0", '<')) {
+ $mmCopy = $mm;
+} else {
+ $mmCopy = clone($mm);
+}
+
+$mm->get();
+$x = $mm->headers();
+
+$smm = serialize(array('mm' => $mmCopy, 'header' => $x['Content-Type']));
+$fp = fopen('sleep_wakeup_data', 'w');
+fwrite($fp, $smm);
+fclose($fp);
+
+echo "Data written";
+?>
+--EXPECT--
+Data written
diff --git a/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt b/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt
new file mode 100644
index 00000000..74a87598
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/sleep_wakeup_EOL-bug3488-part2.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #3488 Sleep/Wakeup EOL Consistency - Part 2
+--SKIPIF--
+if (!is_readable('sleep_wakeup_data')) {
+ echo "skip No data. Part 1 must run first.\n";
+}
+--FILE--
+<?php
+require_once('Mail/mime.php');
+$filename = 'sleep_wakeup_data';
+$fp = fopen($filename, 'r');
+$smm = fread($fp, filesize($filename));
+fclose($fp);
+@unlink($filename);
+
+$mmData = unserialize($smm);
+$mmData['mm']->get();
+$x = $mmData['mm']->headers();
+
+list($h1) = explode("\n", $mmData['header']);
+list($h2) = explode("\n", $x['Content-Type']);
+
+echo ($h1 == $h2) ? "Match" : "No Match";
+
+?>
+--EXPECT--
+Match
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10596_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10596_1.phpt
new file mode 100644
index 00000000..769880a6
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10596_1.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug #10596 Incorrect handling of text and html '0' bodies
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+$mime = new Mail_mime();
+$mime->setTxtBody('0');
+$mime->setHTMLBody('0');
+$body = $mime->get();
+if ($body){
+ print("OK");
+}else{
+ print("NO BODY FOUND");
+}
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10816_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10816_1.phpt
new file mode 100644
index 00000000..022049c4
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10816_1.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #10816 Unwanted linebreak at the end of output
+--SKIPIF--
+--FILE--
+<?php
+$eol = "#";
+include("Mail/mime.php");
+$encoder = new Mail_mime(array('eol'=>$eol));
+$encoder->setTXTBody('test');
+$encoder->setHTMLBody('<b>test</b>');
+$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
+$body = $encoder->get();
+$taillength = -1 * strlen($eol) * 2;
+if (substr($body, $taillength) == ($eol.$eol)){
+ print("FAILED\n");
+ print("Body:\n");
+ print("..." . substr($body, -10) . "\n");
+}else{
+ print("OK\n");
+}
+--EXPECT--
+OK
+
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10999_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10999_1.phpt
new file mode 100644
index 00000000..ef0bdcbb
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_10999_1.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #10999 Bad Content-ID(cid) format
+--SKIPIF--
+--FILE--
+<?php
+$from='user@from.example.com';
+
+require_once('Mail/mime.php');
+
+$mime=new Mail_mime();
+
+$body='<img src="test.gif"/>';
+
+$mime->setHTMLBody($body);
+$mime->setFrom($from);
+$mime->addHTMLImage('','image/gif', 'test.gif', false);
+$msg=$mime->get();
+
+$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
+if (!$header){
+ print("FAIL:\n");
+ print($msg);
+}else{
+ print("OK");
+}
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11381.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11381.phpt
new file mode 100644
index 00000000..44842c27
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11381.phpt
@@ -0,0 +1,27 @@
+--TEST--
+Bug #11381 Domain name is attached to content-id, trailing greater-than sign is not removed
+--SKIPIF--
+--FILE--
+<?php
+$from='Test User <user@from.example.com>';
+
+require_once('Mail/mime.php');
+
+$mime=new Mail_mime();
+
+$body='<img src="test.gif"/>';
+
+$mime->setHTMLBody($body);
+$mime->setFrom($from);
+$mime->addHTMLImage('','image/gif', 'test.gif', false);
+$msg=$mime->get();
+
+$header = preg_match('|Content-ID: <[0-9a-fA-F]+@from.example.com>|', $msg);
+if (!$header){
+ print("FAIL:\n");
+ print($msg);
+}else{
+ print("OK");
+}
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11731.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11731.phpt
new file mode 100644
index 00000000..e0367aa2
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_11731.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #11731 Full stops after soft line breaks are not encoded
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+// Second full stop will be at the start of the second line after quoted-printable
+// encoding (full stop '=2E' + 72 characters + line-continuation '=' = 76)
+$text = '.123456789012345678901234567890123456789012345678901234567890123456789012.3456';
+$params = Array(
+ 'content_type' => 'text/plain',
+ 'encoding' => 'quoted-printable',
+);
+$mimePart = new Mail_mimePart($text, $params);
+$encoded = $mimePart->encode();
+echo $encoded['body'];
+
+--EXPECT--
+=2E123456789012345678901234567890123456789012345678901234567890123456789012=
+=2E3456
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12165.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12165.phpt
new file mode 100644
index 00000000..d8c9ddf4
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12165.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #12165 Dot at the end of the line disappeared
+--SKIPIF--
+--FILE--
+<?php
+include ("Mail/mime.php");
+$string='http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa.com';
+$mime = new Mail_mime();
+$mime->setHTMLBody($string);
+print_r($mime->get());
+
+--EXPECT--
+http://aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa=
+=2Ecom
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12385_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12385_1.phpt
new file mode 100644
index 00000000..eb49537a
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12385_1.phpt
@@ -0,0 +1,32 @@
+--TEST--
+Bug #12385 Bad regex when replacing css style attachments
+--SKIPIF--
+--FILE--
+<?php
+$from='user@from.example.com';
+
+require_once('Mail/mime.php');
+
+$mime=new Mail_mime();
+
+$body="<style>
+className {
+ background-image: url('test.gif');
+}
+</script>
+";
+
+$mime->setHTMLBody($body);
+$mime->setFrom($from);
+$mime->addHTMLImage('','image/gif', 'test.gif', false);
+$msg = $mime->get();
+
+$cidtag = preg_match("|url\('cid:[^']*'\);|", $msg);
+if (!$cidtag){
+ print("FAIL:\n");
+ print($msg);
+}else{
+ print("OK");
+}
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12411.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12411.phpt
new file mode 100644
index 00000000..9400e2f2
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12411.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #12411 RFC2047 encoded attachment filenames
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+$Mime = new Mail_mime();
+
+// some text with polish Unicode letter at the beginning
+$filename = base64_decode("xZtjaWVtYQ==");
+$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
+ 'base64', 'attachment', 'ISO-8859-1', 'pl', '',
+ 'quoted-printable', 'base64');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
+ echo implode("\n", $matches[2]);
+}
+
+?>
+--EXPECT--
+"=?ISO-8859-1?Q?=C5=9Bciema?="
+"=?ISO-8859-1?B?xZtjaWVtYQ==?=";
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12466.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12466.phpt
new file mode 100644
index 00000000..a1ce7a8a
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_12466.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #12466 Content-Transfer-Encoding checking
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$params = array(
+ 'text_encoding' => '7bit',
+ 'html_encoding' => '7bit',
+);
+$mime = new Mail_mime($params);
+$mime->setTXTBody("ż");
+$mime->setHTMLBody("z");
+$body = $mime->getMessage();
+
+preg_match_all('/Content-Transfer-Encoding: (.*)/', $body, $m);
+echo trim($m[1][0])."\n".trim($m[1][1]);
+
+?>
+--EXPECT--
+quoted-printable
+7bit
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13032.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13032.phpt
new file mode 100644
index 00000000..12675bc6
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13032.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #13032 Proper (different) boundary for nested parts
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+$mime = new Mail_mime("\r\n");
+$mime->setHTMLBody('html');
+$mime->setTXTBody('text');
+$mime->addAttachment('file.pdf', 'application/pdf', 'file.pdf', false, 'base64', 'inline');
+$msg = $mime->getMessage();
+
+if (preg_match_all('/boundary="([^"]+)"/', $msg, $matches)) {
+ if (count($matches) == 2 && count($matches[1]) == 2 &&
+ $matches[1][0] != $matches[1][1]) {
+ print('OK');
+ }
+}
+?>
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13444.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13444.phpt
new file mode 100644
index 00000000..a962aa3d
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13444.phpt
@@ -0,0 +1,30 @@
+--TEST--
+Bug #9725 multipart/related & alternative wrong order
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$mime = new Mail_mime();
+$mime->setTXTBody("test");
+$mime->setHTMLBody("test");
+$mime->addHTMLImage("test", 'application/octet-stream', '', false);
+$body = $mime->get();
+$head = $mime->headers();
+$headCT = $head['Content-Type'];
+$headCT = explode(";", $headCT);
+$headCT = $headCT[0];
+
+$ct = preg_match_all('|Content-Type: ([^;\r\n]+)|', $body, $matches);
+print($headCT);
+print("\n");
+foreach ($matches[1] as $match){
+ print($match);
+ print("\n");
+}
+--EXPECT--
+multipart/alternative
+text/plain
+multipart/related
+text/html
+application/octet-stream
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13962.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13962.phpt
new file mode 100644
index 00000000..9f732832
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_13962.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #13962 Multiple header support
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mime.php');
+
+$mime = new Mail_mime();
+
+$mime->setFrom('user@from.example.com');
+$r = $mime->txtHeaders(array('Received' => array('Received 1', 'Received 2')));
+
+print_r($r);
+?>
+--EXPECT--
+Received: Received 1
+Received: Received 2
+MIME-Version: 1.0
+From: user@from.example.com
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14529.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14529.phpt
new file mode 100644
index 00000000..c4b086a1
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14529.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #14529 basename() workaround
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$Mime = new Mail_mime();
+// some text with polish Unicode letter at the beginning
+$filename = base64_decode("xZtjaWVtYQ==");
+$Mime->addAttachment('testfile', "text/plain", $filename, FALSE, 'base64', 'attachment', 'ISO-8859-1');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
+ echo $matches[1];
+}
+?>
+--EXPECT--
+*=ISO-8859-1''%C5%9Bciema;
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14779.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14779.phpt
new file mode 100644
index 00000000..90972eb2
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14779.phpt
@@ -0,0 +1,25 @@
+--TEST--
+Bug #14779 Proper header-body separator for empty attachment
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$m = new Mail_mime();
+$m->addAttachment('', "text/plain", 'file.txt', FALSE, 'base64', 'attachment');
+$result = $m->get();
+
+if (preg_match('/(Content.*)--=.*/s', $result, $matches)) {
+ print_r($matches[1]."END");
+}
+
+?>
+--EXPECT--
+Content-Transfer-Encoding: base64
+Content-Type: text/plain;
+ name=file.txt
+Content-Disposition: attachment;
+ filename=file.txt
+
+
+END
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14780.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14780.phpt
new file mode 100644
index 00000000..da28a4ae
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_14780.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #14780 Invalid Content-Type when headers() is called before get()
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$mime = new Mail_mime();
+$mime->setTXTBody("test");
+$mime->setHTMLBody("test");
+
+$head1 = $mime->headers();
+$body = $mime->get();
+$head2 = $mime->headers();
+
+if ($head1 === $head2) {
+ echo "OK";
+}
+
+?>
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_15320.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_15320.phpt
new file mode 100644
index 00000000..2f300cc2
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_15320.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #15320 Charset parameter in Content-Type of mail parts
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$Mime = new Mail_mime();
+$Mime->addAttachment('testfile', "text/plain", 'file.txt', FALSE, 'base64', 'attachment', 'ISO-8859-1');
+
+$content = $Mime->get();
+//$content = str_replace("\n", '', $content);
+
+if (preg_match('/Content-type:([^\n]+)/i', $content, $matches)) {
+ echo $matches[1];
+}
+
+?>
+--EXPECT--
+text/plain; charset=ISO-8859-1;
+
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_16539.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_16539.phpt
new file mode 100644
index 00000000..48adc1a8
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_16539.phpt
@@ -0,0 +1,49 @@
+--TEST--
+Bug #16539 Headers longer than 998 characters
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+$mime = new Mail_mime();
+
+$headers = array(
+'To' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
+'Subject' => 'jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com',
+);
+
+echo $mime->txtHeaders($headers, true, true);
+?>
+--EXPECT--
+MIME-Version: 1.0
+To: jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com, jskibbie@schawk.com,
+ jskibbie@schawk.com, jskibbie@schawk.com
+Subject: jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.co
+ m,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com,jskibbie@schawk.com
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17025.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17025.phpt
new file mode 100644
index 00000000..c65ef3ae
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17025.phpt
@@ -0,0 +1,15 @@
+--TEST--
+Bug #16539 Headers longer than 998 characters
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$headers['From'] = 'aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh';
+# over than 76 chars
+$mime = new Mail_mime();
+$hdrs = $mime->headers($headers);
+print_r($hdrs['From']);
+?>
+--EXPECT--
+aaaaaaaaaabbbbbbbbbbccccccccccddddddddddeeeeeeeeeeffffffffffgggggggggghhhhhhhhhh
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17175.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17175.phpt
new file mode 100644
index 00000000..eb57f91b
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_17175.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #17175 Content-Description support+ecoding
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mime.php');
+
+$Mime = new Mail_Mime();
+$Mime->setTXTBody('Test message.');
+$Mime->addAttachment('test file contents', "text/plain",
+ 'test.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
+ 'desc');
+$Mime->addAttachment('test file contents', "text/plain",
+ 'test2.txt', FALSE, 'base64', NULL, 'UTF-8', NULL, NULL, NULL, NULL,
+ 'test unicode żąśź');
+
+$body = $Mime->getMessage();
+preg_match_all('/Content-Description: (.*)/', $body, $matches);
+foreach ($matches[1] as $value)
+ echo $value."\n";
+?>
+--EXPECT--
+desc
+=?UTF-8?Q?test_unicode_=C5=BC=C4=85=C5=9B=C5=BA?=
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18083.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18083.phpt
new file mode 100644
index 00000000..9c2d25af
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18083.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #18083 Separate charset for attachment's content and headers
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+$Mime = new Mail_mime();
+
+$Mime->addAttachment('testfile', "text/plain",
+ base64_decode("xZtjaWVtYQ=="), FALSE,
+ 'base64', 'attachment', 'ISO-8859-1', 'pl', '',
+ 'quoted-printable', 'base64', '', 'UTF-8');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
+ echo implode("\n", $matches[2]);
+}
+?>
+--EXPECT--
+"=?UTF-8?Q?=C5=9Bciema?="
+"=?UTF-8?B?xZtjaWVtYQ==?=";
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18772.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18772.phpt
new file mode 100644
index 00000000..bb5508f1
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_18772.phpt
@@ -0,0 +1,46 @@
+--TEST--
+Bug #18772 Text/calendar message
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$mime = new Mail_mime;
+$mime->setSubject('test');
+
+// A message with text/calendar only
+$mime->setCalendarBody('VCALENDAR');
+
+echo $mime->getMessage();
+echo "\n---\n";
+
+// A message with alternative text
+$mime->setTXTBody('vcalendar');
+$msg = $mime->getMessage();
+
+echo preg_replace('/=_[0-9a-z]+/', '*', $msg);
+--EXPECT--
+MIME-Version: 1.0
+Content-Type: text/calendar; method=request; charset=UTF-8
+Content-Transfer-Encoding: quoted-printable
+Subject: test
+
+VCALENDAR
+---
+MIME-Version: 1.0
+Content-Type: multipart/alternative;
+ boundary="*"
+Content-Transfer-Encoding: quoted-printable
+Subject: test
+
+--*
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/plain; charset=ISO-8859-1
+
+vcalendar
+--*
+Content-Transfer-Encoding: quoted-printable
+Content-Type: text/calendar; method=request; charset=UTF-8
+
+VCALENDAR
+--*--
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_19497.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_19497.phpt
new file mode 100644
index 00000000..df6b9265
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_19497.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #19497 Attachment filenames with a slash character
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+$Mime = new Mail_mime();
+
+$filename = "test/file.txt";
+$Mime->addAttachment('testfile', "text/plain", $filename, FALSE,
+ 'base64', 'attachment', 'ISO-8859-1', '', '', 'quoted-printable', 'base64');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match_all('/(name|filename)=([^\s]+)/i', $content, $matches)) {
+ echo implode("\n", $matches[2]);
+}
+?>
+--EXPECT--
+"test/file.txt"
+"test/file.txt";
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20226.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20226.phpt
new file mode 100644
index 00000000..6c32a899
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20226.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #20226 Mail_mimePart::encodeHeader() and ISO-2022-JP encoding
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mimePart.php");
+
+$subject = base64_decode("GyRCJT8lJCVIJWsbKEI=");
+$mime = new Mail_mimePart();
+
+echo $mime->encodeHeader('subject', $subject, 'ISO-2022-JP', 'base64');
+?>
+--EXPECT--
+=?ISO-2022-JP?B?GyRCJT8lJCVIJWsbKEI=?=
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20273.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20273.phpt
new file mode 100644
index 00000000..46539ffe
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20273.phpt
@@ -0,0 +1,13 @@
+--TEST--
+Bug #20273 Mail_mimePart::encodeHeader() and TAB character
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mimePart.php");
+
+$refs = "<test@domain.tld>\t<test2@domain.tld>";
+$mime = new Mail_mimePart();
+echo $mime->encodeHeader('References', $refs);
+?>
+--EXPECT--
+<test@domain.tld> <test2@domain.tld>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20563.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20563.phpt
new file mode 100644
index 00000000..a5098f7f
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20563.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #20563 isMultipart() method tests
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$mime = new Mail_mime;
+
+echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";
+
+$mime->setTXTBody('test');
+
+echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";
+
+$mime->setHTMLBody('test');
+
+echo ($mime->isMultipart() ? 'TRUE' : 'FALSE') . "\n";
+
+--EXPECT--
+FALSE
+FALSE
+TRUE
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20564.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20564.phpt
new file mode 100644
index 00000000..a266510a
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_20564.phpt
@@ -0,0 +1,14 @@
+--TEST--
+Bug #20564 Unsetting headers
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mime.php");
+
+$mime = new Mail_mime;
+$mime->setSubject('test');
+
+$headers = $mime->headers(array('Subject' => null), true);
+echo array_key_exists('Subject', $headers) ? '1' : '0';
+--EXPECT--
+0 \ No newline at end of file
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21098.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21098.phpt
new file mode 100644
index 00000000..bba6be62
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21098.phpt
@@ -0,0 +1,17 @@
+--TEST--
+Bug #21098 Handling of empty plain text parts
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$mime = new Mail_mime();
+$mime->setTxtBody('');
+$mime->setHTMLBody('<html></html>');
+
+$headers1 = $mime->txtHeaders();
+$body = $mime->get();
+$headers2 = $mime->txtHeaders();
+print strpos($headers1, 'text/html') && strpos($headers2, 'text/html') ? 'OK' : 'NOT OK';
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21205.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21205.phpt
new file mode 100644
index 00000000..c0fd2f4f
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21205.phpt
@@ -0,0 +1,38 @@
+--TEST--
+Bug #21205 Handling ISO-2022-JP headers
+--SKIPIF--
+<?php
+include "PEAR.php";
+if (!extension_loaded('mbstring')){
+ if (!PEAR::loadExtension('mbstring')){
+ print('SKIP could not load mbstring module');
+ }
+}
+--FILE--
+<?php
+require_once('Mail/mimePart.php');
+$tests = [
+ '□京都府□',
+ '∠∠∠∠',
+];
+$addr = ' <aaa@bbb.ccc>';
+$charset = 'ISO-2022-JP';
+$encoding = 'base64';
+foreach ($tests as $test) {
+ $test = mb_convert_encoding($test, $charset);
+ print Mail_mimePart::encodeHeader("subject", $test, $charset, $encoding) . PHP_EOL;
+ print Mail_mimePart::encodeHeader("to", $test.$addr, $charset, $encoding) . PHP_EOL;
+ $test = '"' . $test . '"';
+ print Mail_mimePart::encodeHeader("subject", $test, $charset, $encoding) . PHP_EOL;
+ print Mail_mimePart::encodeHeader("to", $test.$addr, $charset, $encoding) . PHP_EOL;
+}
+?>
+--EXPECT--
+=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
+=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
+=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?=
+=?ISO-2022-JP?B?GyRCIiI1fkVUSVwiIhsoQg==?= <aaa@bbb.ccc>
+=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
+=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
+=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?=
+=?ISO-2022-JP?B?GyRCIlwiXCJcIlwbKEI=?= <aaa@bbb.ccc>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21206.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21206.phpt
new file mode 100644
index 00000000..61688f6c
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21206.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Bug #21206 Handling quoted strings
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mimePart.php');
+class X extends Mail_mimePart {
+ public static function explodeQuotedString($delimiter, $string){
+ return Mail_mimePart::explodeQuotedString($delimiter, $string);
+ }
+}
+
+$tests = [
+ '"a" <a@a.a>, b <b@b.b>',
+ '"c\\\\" <c@c.c>, d <d@d.d>',
+];
+foreach ($tests as $test) {
+ $addrs = X::explodeQuotedString('[\t,]', $test);
+ foreach ($addrs as $addr) {
+ print trim($addr) . PHP_EOL;
+ }
+}
+?>
+--EXPECT--
+"a" <a@a.a>
+b <b@b.b>
+"c\\" <c@c.c>
+d <d@d.d>
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21255.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21255.phpt
new file mode 100644
index 00000000..778c6215
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_21255.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #21255 Boundary gets added twice
+--SKIPIF--
+--FILE--
+<?php
+include "Mail/mime.php";
+
+$mime = new Mail_mime("\r\n");
+$mime->setHTMLBody('html');
+$mime->setTXTBody('text');
+$mime->setContentType('multipart/alternative', array('boundary' => 'something'));
+
+$msg = $mime->getMessage();
+
+echo substr_count($msg, 'boundary=');
+
+?>
+--EXPECT--
+1
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_1.phpt
new file mode 100644
index 00000000..bf27e9e7
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_1.phpt
@@ -0,0 +1,20 @@
+--TEST--
+Bug #3513 Support of RFC2231 in header fields. (ISO-8859-1)
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mime.php');
+
+$test = "Fóóbær.txt";
+$Mime = new Mail_Mime();
+$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'ISO-8859-1');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
+ echo $matches[1];
+}
+
+--EXPECT--
+*=ISO-8859-1''F%F3%F3b%E6r.txt;
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_2.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_2.phpt
new file mode 100644
index 00000000..3b574401
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_2.phpt
@@ -0,0 +1,21 @@
+--TEST--
+Bug #3513 Support of RFC2231 in header fields. (UTF-8)
+--SKIPIF--
+--FILE--
+<?php
+require_once('Mail/mime.php');
+
+$test = "Süper gröse tolle tolle grüße.txt";
+$Mime = new Mail_Mime();
+$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'UTF-8', 'de');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match_all('/filename([^\s]+)/i', $content, $matches)) {
+ echo implode("\n", $matches[1]);
+}
+
+--EXPECT--
+*0*=UTF-8'de'S%C3%BCper%20gr%C3%B6se%20tolle%20tolle%20gr%C3%BC;
+*1*=%C3%9Fe.txt;
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_3.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_3.phpt
new file mode 100644
index 00000000..8652dce8
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_3513_3.phpt
@@ -0,0 +1,23 @@
+--TEST--
+Bug #3513 Support of RFC2231 in header fields. (ISO-2022-JP)
+--SKIPIF--
+--FILE--
+<?php
+mb_internal_encoding('ISO-2022-JP');
+$testEncoded="GyRCRnxLXDhsGyhCLnR4dA==";
+$test = base64_decode($testEncoded); // Japanese filename in ISO-2022-JP charset.
+require_once('Mail/mime.php');
+
+$Mime = new Mail_Mime();
+$Mime->addAttachment('testfile',"text/plain", $test, FALSE, 'base64', 'attachment', 'iso-2022-jp', '');
+
+$content = $Mime->get();
+$content = str_replace("\n", '', $content);
+
+if (preg_match('/filename([^\s]+)/i', $content, $matches)) {
+ echo $matches[1];
+}
+?>
+--EXPECT--
+*=iso-2022-jp''%1B$BF|K%5C8l%1B%28B.txt;
+
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_7561_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_7561_1.phpt
new file mode 100644
index 00000000..ee5d3a3b
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_7561_1.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #7561 Mail_mimePart::quotedPrintableEncode() misbehavior with mbstring overload
+--INI--
+mbstring.language=Neutral
+mbstring.func_overload=6
+mbstring.internal_encoding=UTF-8
+mbstring.http_output=UTF-8
+--SKIPIF--
+<?php
+include "PEAR.php";
+if (!extension_loaded('mbstring')){
+ if (!PEAR::loadExtension('mbstring')){
+ print('SKIP could not load mbstring module');
+ }
+}
+--FILE--
+<?php
+include("Mail/mimePart.php");
+// string is UTF-8 encoded
+$input = "Micha\xC3\xABl \xC3\x89ric St\xC3\xA9phane";
+$rv = Mail_mimePart::quotedPrintableEncode($input, 76, "\n");
+echo $rv, "\n";
+--EXPECT--
+Micha=C3=ABl =C3=89ric St=C3=A9phane
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8386_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8386_1.phpt
new file mode 100644
index 00000000..e317375b
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8386_1.phpt
@@ -0,0 +1,22 @@
+--TEST--
+Bug #8386 HTML body not correctly encoded if attachments present
+--SKIPIF--
+--FILE--
+<?php
+$eol = "\n#";
+include("Mail/mime.php");
+$encoder = new Mail_mime(array('eol'=>$eol));
+$encoder->setTXTBody('test');
+$encoder->setHTMLBody('<b>test</b>');
+$encoder->addAttachment('Just a test', 'application/octet-stream', 'test.txt', false);
+$body = $encoder->get();
+if (strpos($body, '--' . $eol . '--=')){
+ print("FAILED\n");
+ print("Single delimiter() between 2 parts found.\n");
+ print($body);
+}else{
+ print("OK");
+}
+?>
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8541_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8541_1.phpt
new file mode 100644
index 00000000..74213b43
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_8541_1.phpt
@@ -0,0 +1,19 @@
+--TEST--
+Bug #8541 mimePart.php line delimiter is \r
+--SKIPIF--
+--FILE--
+<?php
+$mime = file_get_contents('Mail/mime.php', 1);
+$mimePart = file_get_contents('Mail/mimePart.php', 1);
+if (strpos($mime, "\r")){
+ print("\\r found in mime.php\n");
+}elseif (strpos($mime, "\t")){
+ print("\\t found in mime.php\n");
+}elseif (strpos($mimePart, "\r")){
+ print("\\r found in mimePart.php\n");
+}elseif (strpos($mimePart, "\t")){
+ print("\\t found in mimePart.php\n");
+}
+print('OK');
+--EXPECT--
+OK
diff --git a/www/wiki/vendor/pear/mail_mime/tests/test_Bug_9722_1.phpt b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_9722_1.phpt
new file mode 100644
index 00000000..b85f111b
--- /dev/null
+++ b/www/wiki/vendor/pear/mail_mime/tests/test_Bug_9722_1.phpt
@@ -0,0 +1,24 @@
+--TEST--
+Bug #9722 quotedPrintableEncode does not encode dot at start of line on Windows platform
+--SKIPIF--
+--FILE--
+<?php
+include("Mail/mimePart.php");
+$text = "This
+is a
+test
+...
+ It is
+//really fun//
+to make :(";
+
+print_r(Mail_mimePart::quotedPrintableEncode($text, 76, "\n"));
+
+--EXPECT--
+This
+is a
+test
+=2E..
+ It is=20
+//really fun//
+to make :(
diff --git a/www/wiki/vendor/pear/net_smtp/LICENSE b/www/wiki/vendor/pear/net_smtp/LICENSE
new file mode 100644
index 00000000..539591cc
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/LICENSE
@@ -0,0 +1,69 @@
+--------------------------------------------------------------------
+ The PHP License, version 3.01
+ Copyright (c) 2002-2015 Jon Parise and Chuck Hagenbuch.
+ All rights reserved.
+--------------------------------------------------------------------
+
+Redistribution and use in source and binary forms, with or without
+modification, is permitted provided that the following conditions
+are met:
+
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in
+ the documentation and/or other materials provided with the
+ distribution.
+
+ 3. The name "PHP" must not be used to endorse or promote products
+ derived from this software without prior written permission. For
+ written permission, please contact group@php.net.
+
+ 4. Products derived from this software may not be called "PHP", nor
+ may "PHP" appear in their name, without prior written permission
+ from group@php.net. You may indicate that your software works in
+ conjunction with PHP by saying "Foo for PHP" instead of calling
+ it "PHP Foo" or "phpfoo"
+
+ 5. The PHP Group may publish revised and/or new versions of the
+ license from time to time. Each version will be given a
+ distinguishing version number.
+ Once covered code has been published under a particular version
+ of the license, you may always continue to use it under the terms
+ of that version. You may also choose to use such covered code
+ under the terms of any subsequent version of the license
+ published by the PHP Group. No one other than the PHP Group has
+ the right to modify the terms applicable to covered code created
+ under this License.
+
+ 6. Redistributions of any form whatsoever must retain the following
+ acknowledgment:
+ "This product includes PHP software, freely available from
+ <http://www.php.net/software/>".
+
+THIS SOFTWARE IS PROVIDED BY THE PHP DEVELOPMENT TEAM ``AS IS'' AND
+ANY EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
+THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
+PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE PHP
+DEVELOPMENT TEAM OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+OF THE POSSIBILITY OF SUCH DAMAGE.
+
+--------------------------------------------------------------------
+
+This software consists of voluntary contributions made by many
+individuals on behalf of the PHP Group.
+
+The PHP Group can be contacted via Email at group@php.net.
+
+For more information on the PHP Group and the PHP project,
+please see <http://www.php.net>.
+
+PHP includes the Zend Engine, freely available at
+<http://www.zend.com>.
diff --git a/www/wiki/vendor/pear/net_smtp/Net/SMTP.php b/www/wiki/vendor/pear/net_smtp/Net/SMTP.php
new file mode 100644
index 00000000..5593343a
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/Net/SMTP.php
@@ -0,0 +1,1256 @@
+<?php
+/** vim: set expandtab softtabstop=4 tabstop=4 shiftwidth=4: */
+// +----------------------------------------------------------------------+
+// | PHP Version 5 and 7 |
+// +----------------------------------------------------------------------+
+// | Copyright (c) 1997-2015 Jon Parise and Chuck Hagenbuch |
+// +----------------------------------------------------------------------+
+// | This source file is subject to version 3.01 of the PHP license, |
+// | that is bundled with this package in the file LICENSE, and is |
+// | available at through the world-wide-web at |
+// | http://www.php.net/license/3_01.txt. |
+// | If you did not receive a copy of the PHP license and are unable to |
+// | obtain it through the world-wide-web, please send a note to |
+// | license@php.net so we can mail you a copy immediately. |
+// +----------------------------------------------------------------------+
+// | Authors: Chuck Hagenbuch <chuck@horde.org> |
+// | Jon Parise <jon@php.net> |
+// | Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar> |
+// +----------------------------------------------------------------------+
+
+require_once 'PEAR.php';
+require_once 'Net/Socket.php';
+
+/**
+ * Provides an implementation of the SMTP protocol using PEAR's
+ * Net_Socket class.
+ *
+ * @package Net_SMTP
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @author Jon Parise <jon@php.net>
+ * @author Damian Alejandro Fernandez Sosa <damlists@cnba.uba.ar>
+ *
+ * @example basic.php A basic implementation of the Net_SMTP package.
+ */
+class Net_SMTP
+{
+ /**
+ * The server to connect to.
+ * @var string
+ */
+ public $host = 'localhost';
+
+ /**
+ * The port to connect to.
+ * @var int
+ */
+ public $port = 25;
+
+ /**
+ * The value to give when sending EHLO or HELO.
+ * @var string
+ */
+ public $localhost = 'localhost';
+
+ /**
+ * List of supported authentication methods, in preferential order.
+ * @var array
+ */
+ public $auth_methods = array();
+
+ /**
+ * Use SMTP command pipelining (specified in RFC 2920) if the SMTP
+ * server supports it.
+ *
+ * When pipeling is enabled, rcptTo(), mailFrom(), sendFrom(),
+ * somlFrom() and samlFrom() do not wait for a response from the
+ * SMTP server but return immediately.
+ *
+ * @var bool
+ */
+ public $pipelining = false;
+
+ /**
+ * Number of pipelined commands.
+ * @var int
+ */
+ protected $pipelined_commands = 0;
+
+ /**
+ * Should debugging output be enabled?
+ * @var boolean
+ */
+ protected $debug = false;
+
+ /**
+ * Debug output handler.
+ * @var callback
+ */
+ protected $debug_handler = null;
+
+ /**
+ * The socket resource being used to connect to the SMTP server.
+ * @var resource
+ */
+ protected $socket = null;
+
+ /**
+ * Array of socket options that will be passed to Net_Socket::connect().
+ * @see stream_context_create()
+ * @var array
+ */
+ protected $socket_options = null;
+
+ /**
+ * The socket I/O timeout value in seconds.
+ * @var int
+ */
+ protected $timeout = 0;
+
+ /**
+ * The most recent server response code.
+ * @var int
+ */
+ protected $code = -1;
+
+ /**
+ * The most recent server response arguments.
+ * @var array
+ */
+ protected $arguments = array();
+
+ /**
+ * Stores the SMTP server's greeting string.
+ * @var string
+ */
+ protected $greeting = null;
+
+ /**
+ * Stores detected features of the SMTP server.
+ * @var array
+ */
+ protected $esmtp = array();
+
+ /**
+ * Instantiates a new Net_SMTP object, overriding any defaults
+ * with parameters that are passed in.
+ *
+ * If you have SSL support in PHP, you can connect to a server
+ * over SSL using an 'ssl://' prefix:
+ *
+ * // 465 is a common smtps port.
+ * $smtp = new Net_SMTP('ssl://mail.host.com', 465);
+ * $smtp->connect();
+ *
+ * @param string $host The server to connect to.
+ * @param integer $port The port to connect to.
+ * @param string $localhost The value to give when sending EHLO or HELO.
+ * @param boolean $pipelining Use SMTP command pipelining
+ * @param integer $timeout Socket I/O timeout in seconds.
+ * @param array $socket_options Socket stream_context_create() options.
+ *
+ * @since 1.0
+ */
+ public function __construct($host = null, $port = null, $localhost = null,
+ $pipelining = false, $timeout = 0, $socket_options = null
+ ) {
+ if (isset($host)) {
+ $this->host = $host;
+ }
+ if (isset($port)) {
+ $this->port = $port;
+ }
+ if (isset($localhost)) {
+ $this->localhost = $localhost;
+ }
+
+ $this->pipelining = $pipelining;
+ $this->socket = new Net_Socket();
+ $this->socket_options = $socket_options;
+ $this->timeout = $timeout;
+
+ /* Include the Auth_SASL package. If the package is available, we
+ * enable the authentication methods that depend upon it. */
+ if (@include_once 'Auth/SASL.php') {
+ $this->setAuthMethod('CRAM-MD5', array($this, 'authCramMD5'));
+ $this->setAuthMethod('DIGEST-MD5', array($this, 'authDigestMD5'));
+ }
+
+ /* These standard authentication methods are always available. */
+ $this->setAuthMethod('LOGIN', array($this, 'authLogin'), false);
+ $this->setAuthMethod('PLAIN', array($this, 'authPlain'), false);
+ }
+
+ /**
+ * Set the socket I/O timeout value in seconds plus microseconds.
+ *
+ * @param integer $seconds Timeout value in seconds.
+ * @param integer $microseconds Additional value in microseconds.
+ *
+ * @since 1.5.0
+ */
+ public function setTimeout($seconds, $microseconds = 0)
+ {
+ return $this->socket->setTimeout($seconds, $microseconds);
+ }
+
+ /**
+ * Set the value of the debugging flag.
+ *
+ * @param boolean $debug New value for the debugging flag.
+ * @param callback $handler Debug handler callback
+ *
+ * @since 1.1.0
+ */
+ public function setDebug($debug, $handler = null)
+ {
+ $this->debug = $debug;
+ $this->debug_handler = $handler;
+ }
+
+ /**
+ * Write the given debug text to the current debug output handler.
+ *
+ * @param string $message Debug mesage text.
+ *
+ * @since 1.3.3
+ */
+ protected function debug($message)
+ {
+ if ($this->debug) {
+ if ($this->debug_handler) {
+ call_user_func_array(
+ $this->debug_handler, array(&$this, $message)
+ );
+ } else {
+ echo "DEBUG: $message\n";
+ }
+ }
+ }
+
+ /**
+ * Send the given string of data to the server.
+ *
+ * @param string $data The string of data to send.
+ *
+ * @return mixed The number of bytes that were actually written,
+ * or a PEAR_Error object on failure.
+ *
+ * @since 1.1.0
+ */
+ protected function send($data)
+ {
+ $this->debug("Send: $data");
+
+ $result = $this->socket->write($data);
+ if (!$result || PEAR::isError($result)) {
+ $msg = $result ? $result->getMessage() : "unknown error";
+ return PEAR::raiseError("Failed to write to socket: $msg");
+ }
+
+ return $result;
+ }
+
+ /**
+ * Send a command to the server with an optional string of
+ * arguments. A carriage return / linefeed (CRLF) sequence will
+ * be appended to each command string before it is sent to the
+ * SMTP server - an error will be thrown if the command string
+ * already contains any newline characters. Use send() for
+ * commands that must contain newlines.
+ *
+ * @param string $command The SMTP command to send to the server.
+ * @param string $args A string of optional arguments to append
+ * to the command.
+ *
+ * @return mixed The result of the send() call.
+ *
+ * @since 1.1.0
+ */
+ protected function put($command, $args = '')
+ {
+ if (!empty($args)) {
+ $command .= ' ' . $args;
+ }
+
+ if (strcspn($command, "\r\n") !== strlen($command)) {
+ return PEAR::raiseError('Commands cannot contain newlines');
+ }
+
+ return $this->send($command . "\r\n");
+ }
+
+ /**
+ * Read a reply from the SMTP server. The reply consists of a response
+ * code and a response message.
+ *
+ * @param mixed $valid The set of valid response codes. These
+ * may be specified as an array of integer
+ * values or as a single integer value.
+ * @param bool $later Do not parse the response now, but wait
+ * until the last command in the pipelined
+ * command group
+ *
+ * @return mixed True if the server returned a valid response code or
+ * a PEAR_Error object is an error condition is reached.
+ *
+ * @since 1.1.0
+ *
+ * @see getResponse
+ */
+ protected function parseResponse($valid, $later = false)
+ {
+ $this->code = -1;
+ $this->arguments = array();
+
+ if ($later) {
+ $this->pipelined_commands++;
+ return true;
+ }
+
+ for ($i = 0; $i <= $this->pipelined_commands; $i++) {
+ while ($line = $this->socket->readLine()) {
+ $this->debug("Recv: $line");
+
+ /* If we receive an empty line, the connection was closed. */
+ if (empty($line)) {
+ $this->disconnect();
+ return PEAR::raiseError('Connection was closed');
+ }
+
+ /* Read the code and store the rest in the arguments array. */
+ $code = substr($line, 0, 3);
+ $this->arguments[] = trim(substr($line, 4));
+
+ /* Check the syntax of the response code. */
+ if (is_numeric($code)) {
+ $this->code = (int)$code;
+ } else {
+ $this->code = -1;
+ break;
+ }
+
+ /* If this is not a multiline response, we're done. */
+ if (substr($line, 3, 1) != '-') {
+ break;
+ }
+ }
+ }
+
+ $this->pipelined_commands = 0;
+
+ /* Compare the server's response code with the valid code/codes. */
+ if (is_int($valid) && ($this->code === $valid)) {
+ return true;
+ } elseif (is_array($valid) && in_array($this->code, $valid, true)) {
+ return true;
+ }
+
+ return PEAR::raiseError('Invalid response code received from server', $this->code);
+ }
+
+ /**
+ * Issue an SMTP command and verify its response.
+ *
+ * @param string $command The SMTP command string or data.
+ * @param mixed $valid The set of valid response codes. These
+ * may be specified as an array of integer
+ * values or as a single integer value.
+ *
+ * @return mixed True on success or a PEAR_Error object on failure.
+ *
+ * @since 1.6.0
+ */
+ public function command($command, $valid)
+ {
+ if (PEAR::isError($error = $this->put($command))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse($valid))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Return a 2-tuple containing the last response from the SMTP server.
+ *
+ * @return array A two-element array: the first element contains the
+ * response code as an integer and the second element
+ * contains the response's arguments as a string.
+ *
+ * @since 1.1.0
+ */
+ public function getResponse()
+ {
+ return array($this->code, join("\n", $this->arguments));
+ }
+
+ /**
+ * Return the SMTP server's greeting string.
+ *
+ * @return string A string containing the greeting string, or null if
+ * a greeting has not been received.
+ *
+ * @since 1.3.3
+ */
+ public function getGreeting()
+ {
+ return $this->greeting;
+ }
+
+ /**
+ * Attempt to connect to the SMTP server.
+ *
+ * @param int $timeout The timeout value (in seconds) for the
+ * socket connection attempt.
+ * @param bool $persistent Should a persistent socket connection
+ * be used?
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function connect($timeout = null, $persistent = false)
+ {
+ $this->greeting = null;
+
+ $result = $this->socket->connect(
+ $this->host, $this->port, $persistent, $timeout, $this->socket_options
+ );
+
+ if (PEAR::isError($result)) {
+ return PEAR::raiseError(
+ 'Failed to connect socket: ' . $result->getMessage()
+ );
+ }
+
+ /*
+ * Now that we're connected, reset the socket's timeout value for
+ * future I/O operations. This allows us to have different socket
+ * timeout values for the initial connection (our $timeout parameter)
+ * and all other socket operations.
+ */
+ if ($this->timeout > 0) {
+ if (PEAR::isError($error = $this->setTimeout($this->timeout))) {
+ return $error;
+ }
+ }
+
+ if (PEAR::isError($error = $this->parseResponse(220))) {
+ return $error;
+ }
+
+ /* Extract and store a copy of the server's greeting string. */
+ list(, $this->greeting) = $this->getResponse();
+
+ if (PEAR::isError($error = $this->negotiate())) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Attempt to disconnect from the SMTP server.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function disconnect()
+ {
+ if (PEAR::isError($error = $this->put('QUIT'))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(221))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->socket->disconnect())) {
+ return PEAR::raiseError(
+ 'Failed to disconnect socket: ' . $error->getMessage()
+ );
+ }
+
+ return true;
+ }
+
+ /**
+ * Attempt to send the EHLO command and obtain a list of ESMTP
+ * extensions available, and failing that just send HELO.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ *
+ * @since 1.1.0
+ */
+ protected function negotiate()
+ {
+ if (PEAR::isError($error = $this->put('EHLO', $this->localhost))) {
+ return $error;
+ }
+
+ if (PEAR::isError($this->parseResponse(250))) {
+ /* If the EHLO failed, try the simpler HELO command. */
+ if (PEAR::isError($error = $this->put('HELO', $this->localhost))) {
+ return $error;
+ }
+ if (PEAR::isError($this->parseResponse(250))) {
+ return PEAR::raiseError('HELO was not accepted', $this->code);
+ }
+
+ return true;
+ }
+
+ foreach ($this->arguments as $argument) {
+ $verb = strtok($argument, ' ');
+ $len = strlen($verb);
+ $arguments = substr($argument, $len + 1, strlen($argument) - $len - 1);
+ $this->esmtp[$verb] = $arguments;
+ }
+
+ if (!isset($this->esmtp['PIPELINING'])) {
+ $this->pipelining = false;
+ }
+
+ return true;
+ }
+
+ /**
+ * Returns the name of the best authentication method that the server
+ * has advertised.
+ *
+ * @return mixed Returns a string containing the name of the best
+ * supported authentication method or a PEAR_Error object
+ * if a failure condition is encountered.
+ * @since 1.1.0
+ */
+ protected function getBestAuthMethod()
+ {
+ $available_methods = explode(' ', $this->esmtp['AUTH']);
+
+ foreach ($this->auth_methods as $method => $callback) {
+ if (in_array($method, $available_methods)) {
+ return $method;
+ }
+ }
+
+ return PEAR::raiseError('No supported authentication methods');
+ }
+
+ /**
+ * Attempt to do SMTP authentication.
+ *
+ * @param string $uid The userid to authenticate as.
+ * @param string $pwd The password to authenticate with.
+ * @param string $method The requested authentication method. If none is
+ * specified, the best supported method will be used.
+ * @param bool $tls Flag indicating whether or not TLS should be attempted.
+ * @param string $authz An optional authorization identifier. If specified, this
+ * identifier will be used as the authorization proxy.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function auth($uid, $pwd , $method = '', $tls = true, $authz = '')
+ {
+ /* We can only attempt a TLS connection if one has been requested,
+ * we're running PHP 5.1.0 or later, have access to the OpenSSL
+ * extension, are connected to an SMTP server which supports the
+ * STARTTLS extension, and aren't already connected over a secure
+ * (SSL) socket connection. */
+ if ($tls && version_compare(PHP_VERSION, '5.1.0', '>=')
+ && extension_loaded('openssl') && isset($this->esmtp['STARTTLS'])
+ && strncasecmp($this->host, 'ssl://', 6) !== 0
+ ) {
+ /* Start the TLS connection attempt. */
+ if (PEAR::isError($result = $this->put('STARTTLS'))) {
+ return $result;
+ }
+ if (PEAR::isError($result = $this->parseResponse(220))) {
+ return $result;
+ }
+ if (isset($this->socket_options['ssl']['crypto_method'])) {
+ $crypto_method = $this->socket_options['ssl']['crypto_method'];
+ } else {
+ /* STREAM_CRYPTO_METHOD_TLS_ANY_CLIENT constant does not exist
+ * and STREAM_CRYPTO_METHOD_SSLv23_CLIENT constant is
+ * inconsistent across PHP versions. */
+ $crypto_method = STREAM_CRYPTO_METHOD_TLS_CLIENT
+ | @STREAM_CRYPTO_METHOD_TLSv1_1_CLIENT
+ | @STREAM_CRYPTO_METHOD_TLSv1_2_CLIENT;
+ }
+ if (PEAR::isError($result = $this->socket->enableCrypto(true, $crypto_method))) {
+ return $result;
+ } elseif ($result !== true) {
+ return PEAR::raiseError('STARTTLS failed');
+ }
+
+ /* Send EHLO again to recieve the AUTH string from the
+ * SMTP server. */
+ $this->negotiate();
+ }
+
+ if (empty($this->esmtp['AUTH'])) {
+ return PEAR::raiseError('SMTP server does not support authentication');
+ }
+
+ /* If no method has been specified, get the name of the best
+ * supported method advertised by the SMTP server. */
+ if (empty($method)) {
+ if (PEAR::isError($method = $this->getBestAuthMethod())) {
+ /* Return the PEAR_Error object from _getBestAuthMethod(). */
+ return $method;
+ }
+ } else {
+ $method = strtoupper($method);
+ if (!array_key_exists($method, $this->auth_methods)) {
+ return PEAR::raiseError("$method is not a supported authentication method");
+ }
+ }
+
+ if (!isset($this->auth_methods[$method])) {
+ return PEAR::raiseError("$method is not a supported authentication method");
+ }
+
+ if (!is_callable($this->auth_methods[$method], false)) {
+ return PEAR::raiseError("$method authentication method cannot be called");
+ }
+
+ if (is_array($this->auth_methods[$method])) {
+ list($object, $method) = $this->auth_methods[$method];
+ $result = $object->{$method}($uid, $pwd, $authz, $this);
+ } else {
+ $func = $this->auth_methods[$method];
+ $result = $func($uid, $pwd, $authz, $this);
+ }
+
+ /* If an error was encountered, return the PEAR_Error object. */
+ if (PEAR::isError($result)) {
+ return $result;
+ }
+
+ return true;
+ }
+
+ /**
+ * Add a new authentication method.
+ *
+ * @param string $name The authentication method name (e.g. 'PLAIN')
+ * @param mixed $callback The authentication callback (given as the name of a
+ * function or as an (object, method name) array).
+ * @param bool $prepend Should the new method be prepended to the list of
+ * available methods? This is the default behavior,
+ * giving the new method the highest priority.
+ *
+ * @return mixed True on success or a PEAR_Error object on failure.
+ *
+ * @since 1.6.0
+ */
+ public function setAuthMethod($name, $callback, $prepend = true)
+ {
+ if (!is_string($name)) {
+ return PEAR::raiseError('Method name is not a string');
+ }
+
+ if (!is_string($callback) && !is_array($callback)) {
+ return PEAR::raiseError('Method callback must be string or array');
+ }
+
+ if (is_array($callback)) {
+ if (!is_object($callback[0]) || !is_string($callback[1])) {
+ return PEAR::raiseError('Bad mMethod callback array');
+ }
+ }
+
+ if ($prepend) {
+ $this->auth_methods = array_merge(
+ array($name => $callback), $this->auth_methods
+ );
+ } else {
+ $this->auth_methods[$name] = $callback;
+ }
+
+ return true;
+ }
+
+ /**
+ * Authenticates the user using the DIGEST-MD5 method.
+ *
+ * @param string $uid The userid to authenticate as.
+ * @param string $pwd The password to authenticate with.
+ * @param string $authz The optional authorization proxy identifier.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.1.0
+ */
+ protected function authDigestMD5($uid, $pwd, $authz = '')
+ {
+ if (PEAR::isError($error = $this->put('AUTH', 'DIGEST-MD5'))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ /* 503: Error: already authenticated */
+ if ($this->code === 503) {
+ return true;
+ }
+ return $error;
+ }
+
+ $auth_sasl = new Auth_SASL;
+ $digest = $auth_sasl->factory('digest-md5');
+ $challenge = base64_decode($this->arguments[0]);
+ $auth_str = base64_encode(
+ $digest->getResponse($uid, $pwd, $challenge, $this->host, "smtp", $authz)
+ );
+
+ if (PEAR::isError($error = $this->put($auth_str))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ return $error;
+ }
+
+ /* We don't use the protocol's third step because SMTP doesn't
+ * allow subsequent authentication, so we just silently ignore
+ * it. */
+ if (PEAR::isError($error = $this->put(''))) {
+ return $error;
+ }
+ /* 235: Authentication successful */
+ if (PEAR::isError($error = $this->parseResponse(235))) {
+ return $error;
+ }
+ }
+
+ /**
+ * Authenticates the user using the CRAM-MD5 method.
+ *
+ * @param string $uid The userid to authenticate as.
+ * @param string $pwd The password to authenticate with.
+ * @param string $authz The optional authorization proxy identifier.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.1.0
+ */
+ protected function authCRAMMD5($uid, $pwd, $authz = '')
+ {
+ if (PEAR::isError($error = $this->put('AUTH', 'CRAM-MD5'))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ /* 503: Error: already authenticated */
+ if ($this->code === 503) {
+ return true;
+ }
+ return $error;
+ }
+
+ $auth_sasl = new Auth_SASL;
+ $challenge = base64_decode($this->arguments[0]);
+ $cram = $auth_sasl->factory('cram-md5');
+ $auth_str = base64_encode($cram->getResponse($uid, $pwd, $challenge));
+
+ if (PEAR::isError($error = $this->put($auth_str))) {
+ return $error;
+ }
+
+ /* 235: Authentication successful */
+ if (PEAR::isError($error = $this->parseResponse(235))) {
+ return $error;
+ }
+ }
+
+ /**
+ * Authenticates the user using the LOGIN method.
+ *
+ * @param string $uid The userid to authenticate as.
+ * @param string $pwd The password to authenticate with.
+ * @param string $authz The optional authorization proxy identifier.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.1.0
+ */
+ protected function authLogin($uid, $pwd, $authz = '')
+ {
+ if (PEAR::isError($error = $this->put('AUTH', 'LOGIN'))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ /* 503: Error: already authenticated */
+ if ($this->code === 503) {
+ return true;
+ }
+ return $error;
+ }
+
+ if (PEAR::isError($error = $this->put(base64_encode($uid)))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ return $error;
+ }
+
+ if (PEAR::isError($error = $this->put(base64_encode($pwd)))) {
+ return $error;
+ }
+
+ /* 235: Authentication successful */
+ if (PEAR::isError($error = $this->parseResponse(235))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Authenticates the user using the PLAIN method.
+ *
+ * @param string $uid The userid to authenticate as.
+ * @param string $pwd The password to authenticate with.
+ * @param string $authz The optional authorization proxy identifier.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.1.0
+ */
+ protected function authPlain($uid, $pwd, $authz = '')
+ {
+ if (PEAR::isError($error = $this->put('AUTH', 'PLAIN'))) {
+ return $error;
+ }
+ /* 334: Continue authentication request */
+ if (PEAR::isError($error = $this->parseResponse(334))) {
+ /* 503: Error: already authenticated */
+ if ($this->code === 503) {
+ return true;
+ }
+ return $error;
+ }
+
+ $auth_str = base64_encode($authz . chr(0) . $uid . chr(0) . $pwd);
+
+ if (PEAR::isError($error = $this->put($auth_str))) {
+ return $error;
+ }
+
+ /* 235: Authentication successful */
+ if (PEAR::isError($error = $this->parseResponse(235))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the HELO command.
+ *
+ * @param string $domain The domain name to say we are.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function helo($domain)
+ {
+ if (PEAR::isError($error = $this->put('HELO', $domain))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Return the list of SMTP service extensions advertised by the server.
+ *
+ * @return array The list of SMTP service extensions.
+ * @since 1.3
+ */
+ public function getServiceExtensions()
+ {
+ return $this->esmtp;
+ }
+
+ /**
+ * Send the MAIL FROM: command.
+ *
+ * @param string $sender The sender (reverse path) to set.
+ * @param string $params String containing additional MAIL parameters,
+ * such as the NOTIFY flags defined by RFC 1891
+ * or the VERP protocol.
+ *
+ * If $params is an array, only the 'verp' option
+ * is supported. If 'verp' is true, the XVERP
+ * parameter is appended to the MAIL command.
+ * If the 'verp' value is a string, the full
+ * XVERP=value parameter is appended.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function mailFrom($sender, $params = null)
+ {
+ $args = "FROM:<$sender>";
+
+ /* Support the deprecated array form of $params. */
+ if (is_array($params) && isset($params['verp'])) {
+ if ($params['verp'] === true) {
+ $args .= ' XVERP';
+ } elseif (trim($params['verp'])) {
+ $args .= ' XVERP=' . $params['verp'];
+ }
+ } elseif (is_string($params) && !empty($params)) {
+ $args .= ' ' . $params;
+ }
+
+ if (PEAR::isError($error = $this->put('MAIL', $args))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the RCPT TO: command.
+ *
+ * @param string $recipient The recipient (forward path) to add.
+ * @param string $params String containing additional RCPT parameters,
+ * such as the NOTIFY flags defined by RFC 1891.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ *
+ * @since 1.0
+ */
+ public function rcptTo($recipient, $params = null)
+ {
+ $args = "TO:<$recipient>";
+ if (is_string($params)) {
+ $args .= ' ' . $params;
+ }
+
+ if (PEAR::isError($error = $this->put('RCPT', $args))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(array(250, 251), $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Quote the data so that it meets SMTP standards.
+ *
+ * This is provided as a separate public function to facilitate
+ * easier overloading for the cases where it is desirable to
+ * customize the quoting behavior.
+ *
+ * @param string &$data The message text to quote. The string must be passed
+ * by reference, and the text will be modified in place.
+ *
+ * @since 1.2
+ */
+ public function quotedata(&$data)
+ {
+ /* Because a single leading period (.) signifies an end to the
+ * data, legitimate leading periods need to be "doubled" ('..'). */
+ $data = preg_replace('/^\./m', '..', $data);
+
+ /* Change Unix (\n) and Mac (\r) linefeeds into CRLF's (\r\n). */
+ $data = preg_replace('/(?:\r\n|\n|\r(?!\n))/', "\r\n", $data);
+ }
+
+ /**
+ * Send the DATA command.
+ *
+ * @param mixed $data The message data, either as a string or an open
+ * file resource.
+ * @param string $headers The message headers. If $headers is provided,
+ * $data is assumed to contain only body data.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function data($data, $headers = null)
+ {
+ /* Verify that $data is a supported type. */
+ if (!is_string($data) && !is_resource($data)) {
+ return PEAR::raiseError('Expected a string or file resource');
+ }
+
+ /* Start by considering the size of the optional headers string. We
+ * also account for the addition 4 character "\r\n\r\n" separator
+ * sequence. */
+ $size = $headers_size = (is_null($headers)) ? 0 : strlen($headers) + 4;
+
+ if (is_resource($data)) {
+ $stat = fstat($data);
+ if ($stat === false) {
+ return PEAR::raiseError('Failed to get file size');
+ }
+ $size += $stat['size'];
+ } else {
+ $size += strlen($data);
+ }
+
+ /* RFC 1870, section 3, subsection 3 states "a value of zero indicates
+ * that no fixed maximum message size is in force". Furthermore, it
+ * says that if "the parameter is omitted no information is conveyed
+ * about the server's fixed maximum message size". */
+ $limit = (isset($this->esmtp['SIZE'])) ? $this->esmtp['SIZE'] : 0;
+ if ($limit > 0 && $size >= $limit) {
+ $this->disconnect();
+ return PEAR::raiseError('Message size exceeds server limit');
+ }
+
+ /* Initiate the DATA command. */
+ if (PEAR::isError($error = $this->put('DATA'))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(354))) {
+ return $error;
+ }
+
+ /* If we have a separate headers string, send it first. */
+ if (!is_null($headers)) {
+ $this->quotedata($headers);
+ if (PEAR::isError($result = $this->send($headers . "\r\n\r\n"))) {
+ return $result;
+ }
+
+ /* Subtract the headers size now that they've been sent. */
+ $size -= $headers_size;
+ }
+
+ /* Now we can send the message body data. */
+ if (is_resource($data)) {
+ /* Stream the contents of the file resource out over our socket
+ * connection, line by line. Each line must be run through the
+ * quoting routine. */
+ while (strlen($line = fread($data, 8192)) > 0) {
+ /* If the last character is an newline, we need to grab the
+ * next character to check to see if it is a period. */
+ while (!feof($data)) {
+ $char = fread($data, 1);
+ $line .= $char;
+ if ($char != "\n") {
+ break;
+ }
+ }
+ $this->quotedata($line);
+ if (PEAR::isError($result = $this->send($line))) {
+ return $result;
+ }
+ }
+
+ $last = $line;
+ } else {
+ /*
+ * Break up the data by sending one chunk (up to 512k) at a time.
+ * This approach reduces our peak memory usage.
+ */
+ for ($offset = 0; $offset < $size;) {
+ $end = $offset + 512000;
+
+ /*
+ * Ensure we don't read beyond our data size or span multiple
+ * lines. quotedata() can't properly handle character data
+ * that's split across two line break boundaries.
+ */
+ if ($end >= $size) {
+ $end = $size;
+ } else {
+ for (; $end < $size; $end++) {
+ if ($data[$end] != "\n") {
+ break;
+ }
+ }
+ }
+
+ /* Extract our chunk and run it through the quoting routine. */
+ $chunk = substr($data, $offset, $end - $offset);
+ $this->quotedata($chunk);
+
+ /* If we run into a problem along the way, abort. */
+ if (PEAR::isError($result = $this->send($chunk))) {
+ return $result;
+ }
+
+ /* Advance the offset to the end of this chunk. */
+ $offset = $end;
+ }
+
+ $last = $chunk;
+ }
+
+ /* Don't add another CRLF sequence if it's already in the data */
+ $terminator = (substr($last, -2) == "\r\n" ? '' : "\r\n") . ".\r\n";
+
+ /* Finally, send the DATA terminator sequence. */
+ if (PEAR::isError($result = $this->send($terminator))) {
+ return $result;
+ }
+
+ /* Verify that the data was successfully received by the server. */
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the SEND FROM: command.
+ *
+ * @param string $path The reverse path to send.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.2.6
+ */
+ public function sendFrom($path)
+ {
+ if (PEAR::isError($error = $this->put('SEND', "FROM:<$path>"))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the SOML FROM: command.
+ *
+ * @param string $path The reverse path to send.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.2.6
+ */
+ public function somlFrom($path)
+ {
+ if (PEAR::isError($error = $this->put('SOML', "FROM:<$path>"))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the SAML FROM: command.
+ *
+ * @param string $path The reverse path to send.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.2.6
+ */
+ public function samlFrom($path)
+ {
+ if (PEAR::isError($error = $this->put('SAML', "FROM:<$path>"))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the RSET command.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function rset()
+ {
+ if (PEAR::isError($error = $this->put('RSET'))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250, $this->pipelining))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the VRFY command.
+ *
+ * @param string $string The string to verify
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function vrfy($string)
+ {
+ /* Note: 251 is also a valid response code */
+ if (PEAR::isError($error = $this->put('VRFY', $string))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(array(250, 252)))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Send the NOOP command.
+ *
+ * @return mixed Returns a PEAR_Error with an error message on any
+ * kind of failure, or true on success.
+ * @since 1.0
+ */
+ public function noop()
+ {
+ if (PEAR::isError($error = $this->put('NOOP'))) {
+ return $error;
+ }
+ if (PEAR::isError($error = $this->parseResponse(250))) {
+ return $error;
+ }
+
+ return true;
+ }
+
+ /**
+ * Backwards-compatibility method. identifySender()'s functionality is
+ * now handled internally.
+ *
+ * @return boolean This method always return true.
+ *
+ * @since 1.0
+ */
+ public function identifySender()
+ {
+ return true;
+ }
+}
diff --git a/www/wiki/vendor/pear/net_smtp/composer.json b/www/wiki/vendor/pear/net_smtp/composer.json
new file mode 100644
index 00000000..88a39236
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/composer.json
@@ -0,0 +1,48 @@
+{
+ "authors": [
+ {
+ "email": "jon@php.net",
+ "name": "Jon Parise",
+ "homepage": "http://www.indelible.org",
+ "role": "Lead"
+ },
+ {
+ "email": "chuck@horde.org",
+ "name": "Chuck Hagenbuch",
+ "role": "Lead"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Net": "./"
+ }
+ },
+ "description": "An implementation of the SMTP protocol",
+ "keywords": [
+ "smtp",
+ "mail",
+ "email"
+ ],
+ "include-path": [
+ "./"
+ ],
+ "license": "PHP-3.01",
+ "name": "pear/net_smtp",
+ "homepage": "http://pear.github.io/Net_SMTP/",
+ "support": {
+ "issues": "https://github.com/pear/Net_SMTP/issues",
+ "source": "https://github.com/pear/Net_SMTP"
+ },
+ "type": "library",
+ "require": {
+ "php": ">=5.4.0",
+ "pear/pear-core-minimal": "*",
+ "pear/net_socket": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ },
+ "suggest": {
+ "pear/auth_sasl": "Install optionally via your project's composer.json"
+ }
+}
diff --git a/www/wiki/vendor/pear/net_smtp/docs/docutils.conf b/www/wiki/vendor/pear/net_smtp/docs/docutils.conf
new file mode 100644
index 00000000..10aeab46
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/docs/docutils.conf
@@ -0,0 +1,16 @@
+[general]
+source-link: no
+no-datestamp: yes
+generator: off
+strip-comments: yes
+toc-backlinks: no
+
+[standalone reader]
+docinfo_xform: no
+
+[html4css1 writer]
+stylesheet-path: docutils.css
+embed-stylesheet: yes
+field-name-limit: 20
+cloak-email-addresses: yes
+initial-header-level: 2
diff --git a/www/wiki/vendor/pear/net_smtp/docs/docutils.css b/www/wiki/vendor/pear/net_smtp/docs/docutils.css
new file mode 100644
index 00000000..fba72b59
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/docs/docutils.css
@@ -0,0 +1,108 @@
+body {
+ font-family: Verdana, Helvetica, Arial, sans-serif;
+ font-size: 0.8em;
+ letter-spacing: 0.01em;
+ line-height: 1.5em;
+ text-align: justify;
+ margin: 0 auto;
+ width: 48em;
+}
+
+a:link, a:visited {
+ color: #00c;
+ padding-bottom: 0;
+ text-decoration: none;
+ border-bottom: 1px solid #dbd5c5;
+}
+
+a:hover {
+ padding-bottom: 0;
+ border-bottom: 2px solid #dbd5c5;
+}
+
+h1, h2, h3 {
+ font-family: Georgia, "Times New Roman", Times, serif;
+ font-weight: normal;
+ line-height: normal;
+}
+
+h1 {
+ font-size: 2.1em;
+ letter-spacing: -0.02em;
+ margin-top: 30px;
+ text-align: center;
+}
+
+h2 {
+ font-size: 1.6em;
+ font-style: italic;
+ margin: 30px 0 10px 0;
+}
+
+h3 {
+ font-size: 1.3em;
+ font-style: italic;
+ margin-top: 20px;
+}
+
+li {
+ line-height: 135%;
+}
+
+ul, ol {
+ margin: 0 0 1em 2em;
+ padding: 0 0 0 1em;
+}
+
+hr {
+ background-color: #ccc;
+ border: 0px none;
+ color: #eee;
+ height: 1px;
+ margin: 30px 0px;
+}
+
+blockquote, pre {
+ background-color: #f9f9f9;
+ border: 1px solid #eee;
+ border-left: 2px solid #ccc;
+ padding: 1em;
+}
+
+blockquote {
+ color: #666;
+ line-height: 1.3em;
+}
+
+pre {
+ line-height: normal;
+ overflow: auto;
+}
+
+pre.code-block {
+ padding-bottom: 0;
+}
+
+tt, pre, code, samp, kbd {
+ color: #333;
+ font-family: Consolas, 'Lucida Console', monospace;
+ font-size: 13px;
+}
+
+label em {
+ font-weight: normal;
+}
+
+form {
+ margin: 0;
+ padding: 0;
+}
+
+.code-block .err { border: 1px solid #FF0000 } /* Error */
+.code-block .k,.kn { color: #369 } /* Keywords */
+.code-block .c,.cm,.cp,.c1 { color: #666; font-style: italic } /* Comments */
+.code-block .n { color: #000 } /* Names */
+.code-block .p { color: #000 } /* Punctuation */
+.code-block .nc,.nf,.nn { color: #333; font-weight: bold } /* Symbol Names */
+.code-block .s { color: #933 } /* Literal.String */
+.code-block .sd { color: #666 } /* Literal.String.Doc */
diff --git a/www/wiki/vendor/pear/net_smtp/docs/guide.txt b/www/wiki/vendor/pear/net_smtp/docs/guide.txt
new file mode 100644
index 00000000..a0e61dbd
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/docs/guide.txt
@@ -0,0 +1,267 @@
+======================
+ The Net_SMTP Package
+======================
+
+--------------------
+ User Documentation
+--------------------
+
+:Author: Jon Parise
+:Contact: jon@php.net
+
+.. contents:: Table of Contents
+.. section-numbering::
+
+Dependencies
+============
+
+The ``PEAR_Error`` Class
+------------------------
+
+The Net_SMTP package uses the `PEAR_Error`_ class for all of its `error
+handling`_.
+
+The ``Net_Socket`` Package
+--------------------------
+
+The Net_Socket_ package is used as the basis for all network communications.
+Connection options can be specified via the `$socket_options` construction
+parameter::
+
+ $socket_options = array('ssl' => array('verify_peer_name' => false));
+ $smtp = new Net_SMTP($host, null, null, false, 0, $socket_options);
+
+**Note:** PHP 5.6 introduced `OpenSSL changes`_. Peer certificate verification
+is now enabled by default. Although not recommended, `$socket_options` can be
+used to disable peer verification (as shown above).
+
+.. _OpenSSL changes: http://php.net/manual/en/migration56.openssl.php
+
+The ``Auth_SASL`` Package
+-------------------------
+
+The `Auth_SASL`_ package is an optional dependency. If it is available, the
+Net_SMTP package will be able to support the DIGEST-MD5_ and CRAM-MD5_ SMTP
+authentication methods. Otherwise, only the LOGIN_ and PLAIN_ methods will
+be available.
+
+Error Handling
+==============
+
+All of the Net_SMTP class's public methods return a PEAR_Error_ object if an
+error occurs. The standard way to check for a PEAR_Error object is by using
+`PEAR::isError()`_::
+
+ if (PEAR::isError($error = $smtp->connect())) {
+ die($error->getMessage());
+ }
+
+.. _PEAR::isError(): http://pear.php.net/manual/en/core.pear.pear.iserror.php
+
+SMTP Authentication
+===================
+
+The Net_SMTP package supports the SMTP authentication standard (as defined
+by RFC-2554_). The Net_SMTP package supports the following authentication
+methods, in order of preference:
+
+.. _RFC-2554: http://www.ietf.org/rfc/rfc2554.txt
+
+DIGEST-MD5
+----------
+
+The DIGEST-MD5 authentication method uses `RSA Data Security Inc.`_'s MD5
+Message Digest algorithm. It is considered the most secure method of SMTP
+authentication.
+
+**Note:** The DIGEST-MD5 authentication method is only supported if the
+AUTH_SASL_ package is available.
+
+.. _RSA Data Security Inc.: http://www.rsasecurity.com/
+
+CRAM-MD5
+--------
+
+The CRAM-MD5 authentication method has been superseded by the DIGEST-MD5_
+method in terms of security. It is provided here for compatibility with
+older SMTP servers that may not support the newer DIGEST-MD5 algorithm.
+
+**Note:** The CRAM-MD5 authentication method is only supported if the
+AUTH_SASL_ package is available.
+
+LOGIN
+-----
+
+The LOGIN authentication method encrypts the user's password using the
+Base64_ encoding scheme. Because decrypting a Base64-encoded string is
+trivial, LOGIN is not considered a secure authentication method and should
+be avoided.
+
+.. _Base64: http://www.php.net/manual/en/function.base64-encode.php
+
+PLAIN
+-----
+
+The PLAIN authentication method sends the user's password in plain text.
+This method of authentication is not secure and should be avoided.
+
+Secure Connections
+==================
+
+If `secure socket transports`_ have been enabled in PHP, it is possible to
+establish a secure connection to the remote SMTP server::
+
+ $smtp = new Net_SMTP('ssl://mail.example.com', 465);
+
+This example connects to ``mail.example.com`` on port 465 (a common SMTPS
+port) using the ``ssl://`` transport.
+
+.. _secure socket transports: http://www.php.net/transports
+
+Sending Data
+============
+
+Message data is sent using the ``data()`` method. The data can be supplied
+as a single string or as an open file resource.
+
+If a string is provided, it is passed through the `data quoting`_ system and
+sent to the socket connection as a single block. These operations are all
+memory-based, so sending large messages may result in high memory usage.
+
+If an open file resource is provided, the ``data()`` method will read the
+message data from the file line-by-line. Each chunk will be quoted and sent
+to the socket connection individually, reducing the overall memory overhead of
+this data sending operation.
+
+Header data can be specified separately from message body data by passing it
+as the optional second parameter to ``data()``. This is especially useful
+when an open file resource is being used to supply message data because it
+allows header fields (like *Subject:*) to be built dynamically at runtime.
+
+::
+
+ $smtp->data($fp, "Subject: My Subject");
+
+Data Quoting
+============
+
+By default, all outbound string data is quoted in accordance with SMTP
+standards. This means that all native Unix (``\n``) and Mac (``\r``) line
+endings are converted to Internet-standard CRLF (``\r\n``) line endings.
+Also, because the SMTP protocol uses a single leading period (``.``) to signal
+an end to the message data, single leading periods in the original data
+string are "doubled" (e.g. "``..``").
+
+These string transformation can be expensive when large blocks of data are
+involved. For example, the Net_SMTP package is not aware of MIME parts (it
+just sees the MIME message as one big string of characters), so it is not
+able to skip non-text attachments when searching for characters that may
+need to be quoted.
+
+Because of this, it is possible to extend the Net_SMTP class in order to
+implement your own custom quoting routine. Just create a new class based on
+the Net_SMTP class and reimplement the ``quotedata()`` method::
+
+ require 'Net_SMTP.php';
+
+ class Net_SMTP_custom extends Net_SMTP
+ {
+ function quotedata($data)
+ {
+ /* Perform custom data quoting */
+ }
+ }
+
+Note that the ``$data`` parameter will be passed to the ``quotedata()``
+function `by reference`_. This means that you can operate directly on
+``$data``. It also the overhead of copying a large ``$data`` string to and
+from the ``quotedata()`` method.
+
+.. _by reference: http://www.php.net/manual/en/language.references.pass.php
+
+Server Responses
+================
+
+The Net_SMTP package retains the server's last response for further
+inspection. The ``getResponse()`` method returns a 2-tuple (two element
+array) containing the server's response code as an integer and the response's
+arguments as a string.
+
+Upon a successful connection, the server's greeting string is available via
+the ``getGreeting()`` method.
+
+Debugging
+=========
+
+The Net_SMTP package contains built-in debugging output routines (disabled by
+default). Debugging output must be explicitly enabled via the ``setDebug()``
+method::
+
+ $smtp->setDebug(true);
+
+The debugging messages will be sent to the standard output stream by default.
+If you need more control over the output, you can optionally install your own
+debug handler.
+
+::
+
+ function debugHandler($smtp, $message)
+ {
+ echo "[$smtp->host] $message\n";
+ }
+
+ $smtp->setDebug(true, "debugHandler");
+
+
+Examples
+========
+
+Basic Use
+---------
+
+The following script demonstrates how a simple email message can be sent
+using the Net_SMTP package::
+
+ require 'Net/SMTP.php';
+
+ $host = 'mail.example.com';
+ $from = 'user@example.com';
+ $rcpt = array('recipient1@example.com', 'recipient2@example.com');
+ $subj = "Subject: Test Message\n";
+ $body = "Body Line 1\nBody Line 2";
+
+ /* Create a new Net_SMTP object. */
+ if (! ($smtp = new Net_SMTP($host))) {
+ die("Unable to instantiate Net_SMTP object\n");
+ }
+
+ /* Connect to the SMTP server. */
+ if (PEAR::isError($e = $smtp->connect())) {
+ die($e->getMessage() . "\n");
+ }
+
+ /* Send the 'MAIL FROM:' SMTP command. */
+ if (PEAR::isError($smtp->mailFrom($from))) {
+ die("Unable to set sender to <$from>\n");
+ }
+
+ /* Address the message to each of the recipients. */
+ foreach ($rcpt as $to) {
+ if (PEAR::isError($res = $smtp->rcptTo($to))) {
+ die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
+ }
+ }
+
+ /* Set the body of the message. */
+ if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
+ die("Unable to send data\n");
+ }
+
+ /* Disconnect from the SMTP server. */
+ $smtp->disconnect();
+
+.. _PEAR_Error: http://pear.php.net/manual/en/core.pear.pear-error.php
+.. _Net_Socket: http://pear.php.net/package/Net_Socket
+.. _Auth_SASL: http://pear.php.net/package/Auth_SASL
+
+.. vim: tabstop=4 shiftwidth=4 softtabstop=4 expandtab textwidth=78 ft=rst:
diff --git a/www/wiki/vendor/pear/net_smtp/examples/basic.php b/www/wiki/vendor/pear/net_smtp/examples/basic.php
new file mode 100644
index 00000000..0f09fe05
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/examples/basic.php
@@ -0,0 +1,39 @@
+<?php
+
+require 'Net/SMTP.php';
+
+$host = 'mail.example.com';
+$from = 'user@example.com';
+$rcpt = array('recipient1@example.com', 'recipient2@example.com');
+$subj = "Subject: Test Message\n";
+$body = "Body Line 1\nBody Line 2";
+
+/* Create a new Net_SMTP object. */
+if (! ($smtp = new Net_SMTP($host))) {
+ die("Unable to instantiate Net_SMTP object\n");
+}
+
+/* Connect to the SMTP server. */
+if (PEAR::isError($e = $smtp->connect())) {
+ die($e->getMessage() . "\n");
+}
+$smtp->auth('username','password');
+/* Send the 'MAIL FROM:' SMTP command. */
+if (PEAR::isError($smtp->mailFrom($from))) {
+ die("Unable to set sender to <$from>\n");
+}
+
+/* Address the message to each of the recipients. */
+foreach ($rcpt as $to) {
+ if (PEAR::isError($res = $smtp->rcptTo($to))) {
+ die("Unable to add recipient <$to>: " . $res->getMessage() . "\n");
+ }
+}
+
+/* Set the body of the message. */
+if (PEAR::isError($smtp->data($subj . "\r\n" . $body))) {
+ die("Unable to send data\n");
+}
+
+/* Disconnect from the SMTP server. */
+$smtp->disconnect();
diff --git a/www/wiki/vendor/pear/net_smtp/package.xml b/www/wiki/vendor/pear/net_smtp/package.xml
new file mode 100644
index 00000000..2183ef98
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/package.xml
@@ -0,0 +1,77 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.7.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0
+ http://pear.php.net/dtd/tasks-1.0.xsd
+ http://pear.php.net/dtd/package-2.0
+ http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Net_SMTP</name>
+ <channel>pear.php.net</channel>
+ <summary>An implementation of the SMTP protocol</summary>
+ <description>Provides an implementation of the SMTP protocol using PEAR&apos;s Net_Socket class.</description>
+ <lead>
+ <name>Jon Parise</name>
+ <user>jon</user>
+ <email>jon@php.net</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Chuck Hagenbuch</name>
+ <user>chagenbu</user>
+ <email>chuck@horde.org</email>
+ <active>yes</active>
+ </lead>
+ <date>2017-01-14</date>
+ <time>00:00:00</time>
+ <version>
+ <release>1.7.3</release>
+ <api>1.3.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license/3_01.txt">PHP License</license>
+ <notes>- Fix MIME boundary size calculation (#34)
+- Workaround E_DEPRECATED warning on Auth_SASL::factory() call (#29)
+ </notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file name="LICENSE" role="doc" />
+ <dir name="docs">
+ <file name="guide.txt" role="doc" />
+ </dir> <!-- /docs -->
+ <dir name="examples">
+ <file name="basic.php" role="doc" />
+ </dir> <!-- /examples -->
+ <dir name="tests">
+ <file name="auth.phpt" role="test" />
+ <file name="basic.phpt" role="test" />
+ <file name="config.php.dist" role="test" />
+ <file name="quotedata.phpt" role="test" />
+ </dir> <!-- /tests -->
+ <file name="Net/SMTP.php" role="php" />
+ </dir> <!-- / -->
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>5.4.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.3</min>
+ </pearinstaller>
+ <package>
+ <name>Net_Socket</name>
+ <channel>pear.php.net</channel>
+ <min>1.0.7</min>
+ </package>
+ </required>
+ <optional>
+ <package>
+ <name>Auth_SASL</name>
+ <channel>pear.php.net</channel>
+ <min>1.0.5</min>
+ </package>
+ </optional>
+ </dependencies>
+ <phprelease />
+</package>
diff --git a/www/wiki/vendor/pear/net_smtp/phpdoc.sh b/www/wiki/vendor/pear/net_smtp/phpdoc.sh
new file mode 100755
index 00000000..6d8b414c
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/phpdoc.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+phpdoc -f Net/SMTP.php -t docs/api -p -ti "Net_SMTP Package API" -dn Net_SMTP -dc Net_SMTP -ed examples
diff --git a/www/wiki/vendor/pear/net_smtp/tests/auth.phpt b/www/wiki/vendor/pear/net_smtp/tests/auth.phpt
new file mode 100644
index 00000000..e227f14c
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/tests/auth.phpt
@@ -0,0 +1,28 @@
+--TEST--
+Net_SMTP: SMTP Authentication
+--SKIPIF--
+<?php if (!@include('config.php')) die("skip\n");
+--FILE--
+<?php
+
+require_once 'Net/SMTP.php';
+require_once 'config.php';
+
+if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
+ die("Unable to instantiate Net_SMTP object\n");
+}
+
+if (PEAR::isError($e = $smtp->connect())) {
+ die($e->getMessage() . "\n");
+}
+
+if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
+ die("Authentication failure\n");
+}
+
+$smtp->disconnect();
+
+echo 'Success!';
+
+--EXPECT--
+Success!
diff --git a/www/wiki/vendor/pear/net_smtp/tests/basic.phpt b/www/wiki/vendor/pear/net_smtp/tests/basic.phpt
new file mode 100644
index 00000000..5d85d2fd
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/tests/basic.phpt
@@ -0,0 +1,42 @@
+--TEST--
+Net_SMTP: Basic Functionality
+--SKIPIF--
+<?php if (!@include('config.php')) die("skip\n");
+--FILE--
+<?php
+
+require_once 'Net/SMTP.php';
+require_once 'config.php';
+
+if (! ($smtp = new Net_SMTP(TEST_HOSTNAME, TEST_PORT, TEST_LOCALHOST))) {
+ die("Unable to instantiate Net_SMTP object\n");
+}
+
+if (PEAR::isError($e = $smtp->connect())) {
+ die($e->getMessage() . "\n");
+}
+
+if (PEAR::isError($e = $smtp->auth(TEST_AUTH_USER, TEST_AUTH_PASS))) {
+ die("Authentication failure\n");
+}
+
+if (PEAR::isError($smtp->mailFrom(TEST_FROM))) {
+ die('Unable to set sender to <' . TEST_FROM . ">\n");
+}
+
+if (PEAR::isError($res = $smtp->rcptTo(TEST_TO))) {
+ die('Unable to add recipient <' . TEST_TO . '>: ' .
+ $res->getMessage() . "\n");
+}
+
+$headers = 'Subject: ' . TEST_SUBJECT;
+if (PEAR::isError($smtp->data(TEST_BODY, $headers))) {
+ die("Unable to send data\n");
+}
+
+$smtp->disconnect();
+
+echo 'Success!';
+
+--EXPECT--
+Success!
diff --git a/www/wiki/vendor/pear/net_smtp/tests/config.php.dist b/www/wiki/vendor/pear/net_smtp/tests/config.php.dist
new file mode 100644
index 00000000..fe4a0c97
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/tests/config.php.dist
@@ -0,0 +1,15 @@
+<?php
+/**
+ * Copy this file to config.php and customize the following values to
+ * suit your configuration.
+ */
+
+define('TEST_HOSTNAME', 'localhost');
+define('TEST_PORT', 25);
+define('TEST_LOCALHOST', 'localhost');
+define('TEST_AUTH_USER', 'jon');
+define('TEST_AUTH_PASS', 'secret');
+define('TEST_FROM', 'from@example.com');
+define('TEST_TO', 'to@example.com');
+define('TEST_SUBJECT', 'Test Subject');
+define('TEST_BODY', 'Test Body');
diff --git a/www/wiki/vendor/pear/net_smtp/tests/quotedata.phpt b/www/wiki/vendor/pear/net_smtp/tests/quotedata.phpt
new file mode 100644
index 00000000..39d0d7b2
--- /dev/null
+++ b/www/wiki/vendor/pear/net_smtp/tests/quotedata.phpt
@@ -0,0 +1,70 @@
+--TEST--
+Net_SMTP: quotedata()
+--FILE--
+<?php
+
+require_once 'Net/SMTP.php';
+
+$tests = array(
+ /* Newlines */
+ "\n" => "\r\n",
+ "\r\n" => "\r\n",
+ "\nxx" => "\r\nxx",
+ "xx\n" => "xx\r\n",
+ "xx\nxx" => "xx\r\nxx",
+ "\n\nxx" => "\r\n\r\nxx",
+ "xx\n\nxx" => "xx\r\n\r\nxx",
+ "xx\n\n" => "xx\r\n\r\n",
+ "\r\nxx" => "\r\nxx",
+ "xx\r\n" => "xx\r\n",
+ "xx\r\nxx" => "xx\r\nxx",
+ "\r\n\r\nxx" => "\r\n\r\nxx",
+ "xx\r\n\r\nxx" => "xx\r\n\r\nxx",
+ "xx\r\n\r\n" => "xx\r\n\r\n",
+ "\r\n\nxx" => "\r\n\r\nxx",
+ "\n\r\nxx" => "\r\n\r\nxx",
+ "xx\r\n\nxx" => "xx\r\n\r\nxx",
+ "xx\n\r\nxx" => "xx\r\n\r\nxx",
+ "xx\r\n\n" => "xx\r\n\r\n",
+ "xx\n\r\n" => "xx\r\n\r\n",
+ "\r" => "\r\n",
+ "\rxx" => "\r\nxx",
+ "xx\rxx" => "xx\r\nxx",
+ "xx\r" => "xx\r\n",
+ "\r\r" => "\r\n\r\n",
+ "\r\rxx" => "\r\n\r\nxx",
+ "xx\r\rxx" => "xx\r\n\r\nxx",
+ "xx\r\r" => "xx\r\n\r\n",
+ "xx\rxx\nxx\r\nxx" => "xx\r\nxx\r\nxx\r\nxx",
+ "\r\r\n\n" => "\r\n\r\n\r\n",
+
+ /* Dots */
+ "." => "..",
+ "xxx\n." => "xxx\r\n..",
+ "xxx\n.\nxxx" => "xxx\r\n..\r\nxxx",
+ "xxx.\n.xxx" => "xxx.\r\n..xxx",
+);
+
+function literal($x)
+{
+ return str_replace(array("\r", "\n"), array('\r', '\n'), $x);
+}
+
+$smtp = new Net_SMTP();
+$error = false;
+foreach ($tests as $input => $expected) {
+ $output = $input;
+ $smtp->quotedata($output);
+ if ($output != $expected) {
+ printf("Error: '%s' => '%s' (expected: '%s')",
+ literal($input), literal($output), literal($expected));
+ $error = true;
+ }
+}
+
+if (!$error) {
+ echo "success\n";
+}
+
+--EXPECT--
+success
diff --git a/www/wiki/vendor/pear/net_socket/.gitignore b/www/wiki/vendor/pear/net_socket/.gitignore
new file mode 100644
index 00000000..869f4985
--- /dev/null
+++ b/www/wiki/vendor/pear/net_socket/.gitignore
@@ -0,0 +1,4 @@
+# composer related
+composer.lock
+composer.phar
+vendor
diff --git a/www/wiki/vendor/pear/net_socket/.travis.yml b/www/wiki/vendor/pear/net_socket/.travis.yml
new file mode 100644
index 00000000..2ad2f148
--- /dev/null
+++ b/www/wiki/vendor/pear/net_socket/.travis.yml
@@ -0,0 +1,6 @@
+language: php
+install:
+ - pear install package.xml
+php:
+ - 5.4
+script: pear package \ No newline at end of file
diff --git a/www/wiki/vendor/pear/net_socket/Net/Socket.php b/www/wiki/vendor/pear/net_socket/Net/Socket.php
new file mode 100644
index 00000000..1e277634
--- /dev/null
+++ b/www/wiki/vendor/pear/net_socket/Net/Socket.php
@@ -0,0 +1,686 @@
+<?php
+/**
+ * Net_Socket
+ *
+ * PHP Version 4
+ *
+ * Copyright (c) 1997-2013 The PHP Group
+ *
+ * This source file is subject to version 2.0 of the PHP license,
+ * that is bundled with this package in the file LICENSE, and is
+ * available at through the world-wide-web at
+ * http://www.php.net/license/2_02.txt.
+ * If you did not receive a copy of the PHP license and are unable to
+ * obtain it through the world-wide-web, please send a note to
+ * license@php.net so we can mail you a copy immediately.
+ *
+ * Authors: Stig Bakken <ssb@php.net>
+ * Chuck Hagenbuch <chuck@horde.org>
+ *
+ * @category Net
+ * @package Net_Socket
+ * @author Stig Bakken <ssb@php.net>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 1997-2003 The PHP Group
+ * @license http://www.php.net/license/2_02.txt PHP 2.02
+ * @link http://pear.php.net/packages/Net_Socket
+ */
+
+require_once 'PEAR.php';
+
+define('NET_SOCKET_READ', 1);
+define('NET_SOCKET_WRITE', 2);
+define('NET_SOCKET_ERROR', 4);
+
+/**
+ * Generalized Socket class.
+ *
+ * @category Net
+ * @package Net_Socket
+ * @author Stig Bakken <ssb@php.net>
+ * @author Chuck Hagenbuch <chuck@horde.org>
+ * @copyright 1997-2003 The PHP Group
+ * @license http://www.php.net/license/2_02.txt PHP 2.02
+ * @link http://pear.php.net/packages/Net_Socket
+ */
+class Net_Socket extends PEAR
+{
+ /**
+ * Socket file pointer.
+ * @var resource $fp
+ */
+ var $fp = null;
+
+ /**
+ * Whether the socket is blocking. Defaults to true.
+ * @var boolean $blocking
+ */
+ var $blocking = true;
+
+ /**
+ * Whether the socket is persistent. Defaults to false.
+ * @var boolean $persistent
+ */
+ var $persistent = false;
+
+ /**
+ * The IP address to connect to.
+ * @var string $addr
+ */
+ var $addr = '';
+
+ /**
+ * The port number to connect to.
+ * @var integer $port
+ */
+ var $port = 0;
+
+ /**
+ * Number of seconds to wait on socket operations before assuming
+ * there's no more data. Defaults to no timeout.
+ * @var integer|float $timeout
+ */
+ var $timeout = null;
+
+ /**
+ * Number of bytes to read at a time in readLine() and
+ * readAll(). Defaults to 2048.
+ * @var integer $lineLength
+ */
+ var $lineLength = 2048;
+
+ /**
+ * The string to use as a newline terminator. Usually "\r\n" or "\n".
+ * @var string $newline
+ */
+ var $newline = "\r\n";
+
+ /**
+ * Connect to the specified port. If called when the socket is
+ * already connected, it disconnects and connects again.
+ *
+ * @param string $addr IP address or host name (may be with protocol prefix).
+ * @param integer $port TCP port number.
+ * @param boolean $persistent (optional) Whether the connection is
+ * persistent (kept open between requests
+ * by the web server).
+ * @param integer $timeout (optional) Connection socket timeout.
+ * @param array $options See options for stream_context_create.
+ *
+ * @access public
+ *
+ * @return boolean|PEAR_Error True on success or a PEAR_Error on failure.
+ */
+ function connect($addr, $port = 0, $persistent = null,
+ $timeout = null, $options = null)
+ {
+ if (is_resource($this->fp)) {
+ @fclose($this->fp);
+ $this->fp = null;
+ }
+
+ if (!$addr) {
+ return $this->raiseError('$addr cannot be empty');
+ } else if (strspn($addr, ':.0123456789') == strlen($addr)) {
+ $this->addr = strpos($addr, ':') !== false ? '['.$addr.']' : $addr;
+ } else {
+ $this->addr = $addr;
+ }
+
+ $this->port = $port % 65536;
+
+ if ($persistent !== null) {
+ $this->persistent = $persistent;
+ }
+
+ $openfunc = $this->persistent ? 'pfsockopen' : 'fsockopen';
+ $errno = 0;
+ $errstr = '';
+
+ $old_track_errors = @ini_set('track_errors', 1);
+
+ if ($timeout <= 0) {
+ $timeout = @ini_get('default_socket_timeout');
+ }
+
+ if ($options && function_exists('stream_context_create')) {
+ $context = stream_context_create($options);
+
+ // Since PHP 5 fsockopen doesn't allow context specification
+ if (function_exists('stream_socket_client')) {
+ $flags = STREAM_CLIENT_CONNECT;
+
+ if ($this->persistent) {
+ $flags = STREAM_CLIENT_PERSISTENT;
+ }
+
+ $addr = $this->addr . ':' . $this->port;
+ $fp = stream_socket_client($addr, $errno, $errstr,
+ $timeout, $flags, $context);
+ } else {
+ $fp = @$openfunc($this->addr, $this->port, $errno,
+ $errstr, $timeout, $context);
+ }
+ } else {
+ $fp = @$openfunc($this->addr, $this->port, $errno, $errstr, $timeout);
+ }
+
+ if (!$fp) {
+ if ($errno == 0 && !strlen($errstr) && isset($php_errormsg)) {
+ $errstr = $php_errormsg;
+ }
+ @ini_set('track_errors', $old_track_errors);
+ return $this->raiseError($errstr, $errno);
+ }
+
+ @ini_set('track_errors', $old_track_errors);
+ $this->fp = $fp;
+ $this->setTimeout();
+ return $this->setBlocking($this->blocking);
+ }
+
+ /**
+ * Disconnects from the peer, closes the socket.
+ *
+ * @access public
+ * @return mixed true on success or a PEAR_Error instance otherwise
+ */
+ function disconnect()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ @fclose($this->fp);
+ $this->fp = null;
+ return true;
+ }
+
+ /**
+ * Set the newline character/sequence to use.
+ *
+ * @param string $newline Newline character(s)
+ * @return boolean True
+ */
+ function setNewline($newline)
+ {
+ $this->newline = $newline;
+ return true;
+ }
+
+ /**
+ * Find out if the socket is in blocking mode.
+ *
+ * @access public
+ * @return boolean The current blocking mode.
+ */
+ function isBlocking()
+ {
+ return $this->blocking;
+ }
+
+ /**
+ * Sets whether the socket connection should be blocking or
+ * not. A read call to a non-blocking socket will return immediately
+ * if there is no data available, whereas it will block until there
+ * is data for blocking sockets.
+ *
+ * @param boolean $mode True for blocking sockets, false for nonblocking.
+ *
+ * @access public
+ * @return mixed true on success or a PEAR_Error instance otherwise
+ */
+ function setBlocking($mode)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $this->blocking = $mode;
+ stream_set_blocking($this->fp, (int)$this->blocking);
+ return true;
+ }
+
+ /**
+ * Sets the timeout value on socket descriptor,
+ * expressed in the sum of seconds and microseconds
+ *
+ * @param integer $seconds Seconds.
+ * @param integer $microseconds Microseconds, optional.
+ *
+ * @access public
+ * @return mixed True on success or false on failure or
+ * a PEAR_Error instance when not connected
+ */
+ function setTimeout($seconds = null, $microseconds = null)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ if ($seconds === null && $microseconds === null) {
+ $seconds = (int) $this->timeout;
+ $microseconds = (int) (($this->timeout - $seconds) * 1000000);
+ } else {
+ $this->timeout = $seconds + $microseconds/1000000;
+ }
+
+ if ($this->timeout > 0) {
+ return stream_set_timeout($this->fp, (int) $seconds, (int) $microseconds);
+ }
+ else {
+ return false;
+ }
+ }
+
+ /**
+ * Sets the file buffering size on the stream.
+ * See php's stream_set_write_buffer for more information.
+ *
+ * @param integer $size Write buffer size.
+ *
+ * @access public
+ * @return mixed on success or an PEAR_Error object otherwise
+ */
+ function setWriteBuffer($size)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $returned = stream_set_write_buffer($this->fp, $size);
+ if ($returned == 0) {
+ return true;
+ }
+ return $this->raiseError('Cannot set write buffer.');
+ }
+
+ /**
+ * Returns information about an existing socket resource.
+ * Currently returns four entries in the result array:
+ *
+ * <p>
+ * timed_out (bool) - The socket timed out waiting for data<br>
+ * blocked (bool) - The socket was blocked<br>
+ * eof (bool) - Indicates EOF event<br>
+ * unread_bytes (int) - Number of bytes left in the socket buffer<br>
+ * </p>
+ *
+ * @access public
+ * @return mixed Array containing information about existing socket
+ * resource or a PEAR_Error instance otherwise
+ */
+ function getStatus()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ return stream_get_meta_data($this->fp);
+ }
+
+ /**
+ * Get a specified line of data
+ *
+ * @param int $size Reading ends when size - 1 bytes have been read,
+ * or a newline or an EOF (whichever comes first).
+ * If no size is specified, it will keep reading from
+ * the stream until it reaches the end of the line.
+ *
+ * @access public
+ * @return mixed $size bytes of data from the socket, or a PEAR_Error if
+ * not connected. If an error occurs, FALSE is returned.
+ */
+ function gets($size = null)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ if (is_null($size)) {
+ return @fgets($this->fp);
+ } else {
+ return @fgets($this->fp, $size);
+ }
+ }
+
+ /**
+ * Read a specified amount of data. This is guaranteed to return,
+ * and has the added benefit of getting everything in one fread()
+ * chunk; if you know the size of the data you're getting
+ * beforehand, this is definitely the way to go.
+ *
+ * @param integer $size The number of bytes to read from the socket.
+ *
+ * @access public
+ * @return $size bytes of data from the socket, or a PEAR_Error if
+ * not connected.
+ */
+ function read($size)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ return @fread($this->fp, $size);
+ }
+
+ /**
+ * Write a specified amount of data.
+ *
+ * @param string $data Data to write.
+ * @param integer $blocksize Amount of data to write at once.
+ * NULL means all at once.
+ *
+ * @access public
+ * @return mixed If the socket is not connected, returns an instance of
+ * PEAR_Error.
+ * If the write succeeds, returns the number of bytes written.
+ * If the write fails, returns false.
+ * If the socket times out, returns an instance of PEAR_Error.
+ */
+ function write($data, $blocksize = null)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ if (is_null($blocksize) && !OS_WINDOWS) {
+ $written = @fwrite($this->fp, $data);
+
+ // Check for timeout or lost connection
+ if ($written===false) {
+ $meta_data = $this->getStatus();
+
+ if (!is_array($meta_data)) {
+ return $meta_data; // PEAR_Error
+ }
+
+ if (!empty($meta_data['timed_out'])) {
+ return $this->raiseError('timed out');
+ }
+ }
+
+ return $written;
+ } else {
+ if (is_null($blocksize)) {
+ $blocksize = 1024;
+ }
+
+ $pos = 0;
+ $size = strlen($data);
+ while ($pos < $size) {
+ $written = @fwrite($this->fp, substr($data, $pos, $blocksize));
+
+ // Check for timeout or lost connection
+ if ($written===false) {
+ $meta_data = $this->getStatus();
+
+ if (!is_array($meta_data)) {
+ return $meta_data; // PEAR_Error
+ }
+
+ if (!empty($meta_data['timed_out'])) {
+ return $this->raiseError('timed out');
+ }
+
+ return $written;
+ }
+
+ $pos += $written;
+ }
+
+ return $pos;
+ }
+ }
+
+ /**
+ * Write a line of data to the socket, followed by a trailing newline.
+ *
+ * @param string $data Data to write
+ *
+ * @access public
+ * @return mixed fwrite() result, or PEAR_Error when not connected
+ */
+ function writeLine($data)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ return fwrite($this->fp, $data . $this->newline);
+ }
+
+ /**
+ * Tests for end-of-file on a socket descriptor.
+ *
+ * Also returns true if the socket is disconnected.
+ *
+ * @access public
+ * @return bool
+ */
+ function eof()
+ {
+ return (!is_resource($this->fp) || feof($this->fp));
+ }
+
+ /**
+ * Reads a byte of data
+ *
+ * @access public
+ * @return 1 byte of data from the socket, or a PEAR_Error if
+ * not connected.
+ */
+ function readByte()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ return ord(@fread($this->fp, 1));
+ }
+
+ /**
+ * Reads a word of data
+ *
+ * @access public
+ * @return 1 word of data from the socket, or a PEAR_Error if
+ * not connected.
+ */
+ function readWord()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $buf = @fread($this->fp, 2);
+ return (ord($buf[0]) + (ord($buf[1]) << 8));
+ }
+
+ /**
+ * Reads an int of data
+ *
+ * @access public
+ * @return integer 1 int of data from the socket, or a PEAR_Error if
+ * not connected.
+ */
+ function readInt()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $buf = @fread($this->fp, 4);
+ return (ord($buf[0]) + (ord($buf[1]) << 8) +
+ (ord($buf[2]) << 16) + (ord($buf[3]) << 24));
+ }
+
+ /**
+ * Reads a zero-terminated string of data
+ *
+ * @access public
+ * @return string, or a PEAR_Error if
+ * not connected.
+ */
+ function readString()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $string = '';
+ while (($char = @fread($this->fp, 1)) != "\x00") {
+ $string .= $char;
+ }
+ return $string;
+ }
+
+ /**
+ * Reads an IP Address and returns it in a dot formatted string
+ *
+ * @access public
+ * @return Dot formatted string, or a PEAR_Error if
+ * not connected.
+ */
+ function readIPAddress()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $buf = @fread($this->fp, 4);
+ return sprintf('%d.%d.%d.%d', ord($buf[0]), ord($buf[1]),
+ ord($buf[2]), ord($buf[3]));
+ }
+
+ /**
+ * Read until either the end of the socket or a newline, whichever
+ * comes first. Strips the trailing newline from the returned data.
+ *
+ * @access public
+ * @return All available data up to a newline, without that
+ * newline, or until the end of the socket, or a PEAR_Error if
+ * not connected.
+ */
+ function readLine()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $line = '';
+
+ $timeout = time() + $this->timeout;
+
+ while (!feof($this->fp) && (!$this->timeout || time() < $timeout)) {
+ $line .= @fgets($this->fp, $this->lineLength);
+ if (substr($line, -1) == "\n") {
+ return rtrim($line, $this->newline);
+ }
+ }
+ return $line;
+ }
+
+ /**
+ * Read until the socket closes, or until there is no more data in
+ * the inner PHP buffer. If the inner buffer is empty, in blocking
+ * mode we wait for at least 1 byte of data. Therefore, in
+ * blocking mode, if there is no data at all to be read, this
+ * function will never exit (unless the socket is closed on the
+ * remote end).
+ *
+ * @access public
+ *
+ * @return string All data until the socket closes, or a PEAR_Error if
+ * not connected.
+ */
+ function readAll()
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $data = '';
+ while (!feof($this->fp)) {
+ $data .= @fread($this->fp, $this->lineLength);
+ }
+ return $data;
+ }
+
+ /**
+ * Runs the equivalent of the select() system call on the socket
+ * with a timeout specified by tv_sec and tv_usec.
+ *
+ * @param integer $state Which of read/write/error to check for.
+ * @param integer $tv_sec Number of seconds for timeout.
+ * @param integer $tv_usec Number of microseconds for timeout.
+ *
+ * @access public
+ * @return False if select fails, integer describing which of read/write/error
+ * are ready, or PEAR_Error if not connected.
+ */
+ function select($state, $tv_sec, $tv_usec = 0)
+ {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+
+ $read = null;
+ $write = null;
+ $except = null;
+ if ($state & NET_SOCKET_READ) {
+ $read[] = $this->fp;
+ }
+ if ($state & NET_SOCKET_WRITE) {
+ $write[] = $this->fp;
+ }
+ if ($state & NET_SOCKET_ERROR) {
+ $except[] = $this->fp;
+ }
+ if (false === ($sr = stream_select($read, $write, $except,
+ $tv_sec, $tv_usec))) {
+ return false;
+ }
+
+ $result = 0;
+ if (count($read)) {
+ $result |= NET_SOCKET_READ;
+ }
+ if (count($write)) {
+ $result |= NET_SOCKET_WRITE;
+ }
+ if (count($except)) {
+ $result |= NET_SOCKET_ERROR;
+ }
+ return $result;
+ }
+
+ /**
+ * Turns encryption on/off on a connected socket.
+ *
+ * @param bool $enabled Set this parameter to true to enable encryption
+ * and false to disable encryption.
+ * @param integer $type Type of encryption. See stream_socket_enable_crypto()
+ * for values.
+ *
+ * @see http://se.php.net/manual/en/function.stream-socket-enable-crypto.php
+ * @access public
+ * @return false on error, true on success and 0 if there isn't enough data
+ * and the user should try again (non-blocking sockets only).
+ * A PEAR_Error object is returned if the socket is not
+ * connected
+ */
+ function enableCrypto($enabled, $type)
+ {
+ if (version_compare(phpversion(), "5.1.0", ">=")) {
+ if (!is_resource($this->fp)) {
+ return $this->raiseError('not connected');
+ }
+ return @stream_socket_enable_crypto($this->fp, $enabled, $type);
+ } else {
+ $msg = 'Net_Socket::enableCrypto() requires php version >= 5.1.0';
+ return $this->raiseError($msg);
+ }
+ }
+
+}
diff --git a/www/wiki/vendor/pear/net_socket/composer.json b/www/wiki/vendor/pear/net_socket/composer.json
new file mode 100644
index 00000000..3fb03939
--- /dev/null
+++ b/www/wiki/vendor/pear/net_socket/composer.json
@@ -0,0 +1,41 @@
+{
+ "authors": [
+ {
+ "email": "chuck@horde.org",
+ "name": "Chuck Hagenbuch",
+ "role": "Lead"
+ },
+ {
+ "email": "stig@php.net",
+ "name": "Stig Bakken",
+ "role": "Lead"
+ },
+ {
+ "email": "alec@php.net",
+ "name": "Aleksander Machniak",
+ "role": "Lead"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "Net": "./"
+ }
+ },
+ "description": "More info available on: http://pear.php.net/package/Net_Socket",
+ "include-path": [
+ "./"
+ ],
+ "license": "PHP License",
+ "name": "pear/net_socket",
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=Net_Socket",
+ "source": "https://github.com/pear/Net_Socket"
+ },
+ "type": "library",
+ "require": {
+ "pear/pear_exception": "*"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ }
+} \ No newline at end of file
diff --git a/www/wiki/vendor/pear/net_socket/package.xml b/www/wiki/vendor/pear/net_socket/package.xml
new file mode 100644
index 00000000..3927df87
--- /dev/null
+++ b/www/wiki/vendor/pear/net_socket/package.xml
@@ -0,0 +1,58 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.1" version="2.0" xmlns="http://pear.php.net/dtd/package-2.0" xmlns:tasks="http://pear.php.net/dtd/tasks-1.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd">
+ <name>Net_Socket</name>
+ <channel>pear.php.net</channel>
+ <summary>Network Socket Interface</summary>
+ <description>Net_Socket is a class interface to TCP sockets. It provides blocking
+ and non-blocking operation, with different reading and writing modes
+ (byte-wise, block-wise, line-wise and special formats like network
+ byte-order ip addresses).</description>
+ <lead>
+ <name>Chuck Hagenbuch</name>
+ <user>chagenbu</user>
+ <email>chuck@horde.org</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Stig Bakken</name>
+ <user>ssb</user>
+ <email>stig@php.net</email>
+ <active>no</active>
+ </lead>
+ <lead>
+ <name>Aleksander Machniak</name>
+ <user>alec</user>
+ <email>alec@php.net</email>
+ <active>yes</active>
+ </lead>
+ <date>2013-05-24</date>
+ <time>20:00:00</time>
+ <version>
+ <release>1.0.14</release>
+ <api>1.0.10</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://www.php.net/license/2_02.txt">PHP License</license>
+ <notes>
+- Fix connecting when host is specified with protocol prefix e.g. ssl://
+ </notes>
+ <contents>
+ <dir baseinstalldir="/" name="/">
+ <file baseinstalldir="/" md5sum="057d5c52b2dd9cfb2a458d532d95cfbb" name="Net/Socket.php" role="php" />
+ </dir>
+ </contents>
+ <dependencies>
+ <required>
+ <php>
+ <min>4.3.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.4.0b1</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+ <phprelease />
+</package>
diff --git a/www/wiki/vendor/pear/pear-core-minimal/README.rst b/www/wiki/vendor/pear/pear-core-minimal/README.rst
new file mode 100644
index 00000000..9e412fbd
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/README.rst
@@ -0,0 +1,26 @@
+******************************
+Minimal set of PEAR core files
+******************************
+
+This repository provides a set of files from ``pear-core``
+that are often used in PEAR packages.
+
+It follows the `pear-core`__ repository and gets updated whenever a new
+PEAR version is released.
+
+It's meant to be used as dependency for composer packages.
+
+__ https://github.com/pear/pear-core
+
+==============
+Included files
+==============
+- ``OS/Guess.php``
+- ``PEAR.php``
+- ``PEAR/Error.php``
+- ``PEAR/ErrorStack.php``
+- ``System.php``
+
+
+``PEAR/Error.php`` is a dummy file that only includes ``PEAR.php``,
+to make autoloaders work without problems.
diff --git a/www/wiki/vendor/pear/pear-core-minimal/composer.json b/www/wiki/vendor/pear/pear-core-minimal/composer.json
new file mode 100644
index 00000000..d805f56a
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/composer.json
@@ -0,0 +1,32 @@
+{
+ "name": "pear/pear-core-minimal",
+ "description": "Minimal set of PEAR core files to be used as composer dependency",
+ "license": "BSD-3-Clause",
+ "authors": [
+ {
+ "email": "cweiske@php.net",
+ "name": "Christian Weiske",
+ "role": "Lead"
+ }
+ ],
+ "autoload": {
+ "psr-0": {
+ "": "src/"
+ }
+ },
+ "include-path": [
+ "src/"
+ ],
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR",
+ "source": "https://github.com/pear/pear-core-minimal"
+ },
+ "type": "library",
+ "require": {
+ "pear/console_getopt": "~1.4",
+ "pear/pear_exception": "~1.0"
+ },
+ "replace": {
+ "rsky/pear-core-min": "self.version"
+ }
+}
diff --git a/www/wiki/vendor/pear/pear-core-minimal/src/OS/Guess.php b/www/wiki/vendor/pear/pear-core-minimal/src/OS/Guess.php
new file mode 100644
index 00000000..c45e84f1
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/src/OS/Guess.php
@@ -0,0 +1,337 @@
+<?php
+/**
+ * The OS_Guess class
+ *
+ * PHP versions 4 and 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since PEAR 0.1
+ */
+
+// {{{ uname examples
+
+// php_uname() without args returns the same as 'uname -a', or a PHP-custom
+// string for Windows.
+// PHP versions prior to 4.3 return the uname of the host where PHP was built,
+// as of 4.3 it returns the uname of the host running the PHP code.
+//
+// PC RedHat Linux 7.1:
+// Linux host.example.com 2.4.2-2 #1 Sun Apr 8 20:41:30 EDT 2001 i686 unknown
+//
+// PC Debian Potato:
+// Linux host 2.4.17 #2 SMP Tue Feb 12 15:10:04 CET 2002 i686 unknown
+//
+// PC FreeBSD 3.3:
+// FreeBSD host.example.com 3.3-STABLE FreeBSD 3.3-STABLE #0: Mon Feb 21 00:42:31 CET 2000 root@example.com:/usr/src/sys/compile/CONFIG i386
+//
+// PC FreeBSD 4.3:
+// FreeBSD host.example.com 4.3-RELEASE FreeBSD 4.3-RELEASE #1: Mon Jun 25 11:19:43 EDT 2001 root@example.com:/usr/src/sys/compile/CONFIG i386
+//
+// PC FreeBSD 4.5:
+// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb 6 23:59:23 CET 2002 root@example.com:/usr/src/sys/compile/CONFIG i386
+//
+// PC FreeBSD 4.5 w/uname from GNU shellutils:
+// FreeBSD host.example.com 4.5-STABLE FreeBSD 4.5-STABLE #0: Wed Feb i386 unknown
+//
+// HP 9000/712 HP-UX 10:
+// HP-UX iq B.10.10 A 9000/712 2008429113 two-user license
+//
+// HP 9000/712 HP-UX 10 w/uname from GNU shellutils:
+// HP-UX host B.10.10 A 9000/712 unknown
+//
+// IBM RS6000/550 AIX 4.3:
+// AIX host 3 4 000003531C00
+//
+// AIX 4.3 w/uname from GNU shellutils:
+// AIX host 3 4 000003531C00 unknown
+//
+// SGI Onyx IRIX 6.5 w/uname from GNU shellutils:
+// IRIX64 host 6.5 01091820 IP19 mips
+//
+// SGI Onyx IRIX 6.5:
+// IRIX64 host 6.5 01091820 IP19
+//
+// SparcStation 20 Solaris 8 w/uname from GNU shellutils:
+// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc
+//
+// SparcStation 20 Solaris 8:
+// SunOS host.example.com 5.8 Generic_108528-12 sun4m sparc SUNW,SPARCstation-20
+//
+// Mac OS X (Darwin)
+// Darwin home-eden.local 7.5.0 Darwin Kernel Version 7.5.0: Thu Aug 5 19:26:16 PDT 2004; root:xnu/xnu-517.7.21.obj~3/RELEASE_PPC Power Macintosh
+//
+// Mac OS X early versions
+//
+
+// }}}
+
+/* TODO:
+ * - define endianness, to allow matchSignature("bigend") etc.
+ */
+
+/**
+ * Retrieves information about the current operating system
+ *
+ * This class uses php_uname() to grok information about the current OS
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PEAR
+ * @since Class available since Release 0.1
+ */
+class OS_Guess
+{
+ var $sysname;
+ var $nodename;
+ var $cpu;
+ var $release;
+ var $extra;
+
+ function __construct($uname = null)
+ {
+ list($this->sysname,
+ $this->release,
+ $this->cpu,
+ $this->extra,
+ $this->nodename) = $this->parseSignature($uname);
+ }
+
+ function parseSignature($uname = null)
+ {
+ static $sysmap = array(
+ 'HP-UX' => 'hpux',
+ 'IRIX64' => 'irix',
+ );
+ static $cpumap = array(
+ 'i586' => 'i386',
+ 'i686' => 'i386',
+ 'ppc' => 'powerpc',
+ );
+ if ($uname === null) {
+ $uname = php_uname();
+ }
+ $parts = preg_split('/\s+/', trim($uname));
+ $n = count($parts);
+
+ $release = $machine = $cpu = '';
+ $sysname = $parts[0];
+ $nodename = $parts[1];
+ $cpu = $parts[$n-1];
+ $extra = '';
+ if ($cpu == 'unknown') {
+ $cpu = $parts[$n - 2];
+ }
+
+ switch ($sysname) {
+ case 'AIX' :
+ $release = "$parts[3].$parts[2]";
+ break;
+ case 'Windows' :
+ switch ($parts[1]) {
+ case '95/98':
+ $release = '9x';
+ break;
+ default:
+ $release = $parts[1];
+ break;
+ }
+ $cpu = 'i386';
+ break;
+ case 'Linux' :
+ $extra = $this->_detectGlibcVersion();
+ // use only the first two digits from the kernel version
+ $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
+ break;
+ case 'Mac' :
+ $sysname = 'darwin';
+ $nodename = $parts[2];
+ $release = $parts[3];
+ if ($cpu == 'Macintosh') {
+ if ($parts[$n - 2] == 'Power') {
+ $cpu = 'powerpc';
+ }
+ }
+ break;
+ case 'Darwin' :
+ if ($cpu == 'Macintosh') {
+ if ($parts[$n - 2] == 'Power') {
+ $cpu = 'powerpc';
+ }
+ }
+ $release = preg_replace('/^([0-9]+\.[0-9]+).*/', '\1', $parts[2]);
+ break;
+ default:
+ $release = preg_replace('/-.*/', '', $parts[2]);
+ break;
+ }
+
+ if (isset($sysmap[$sysname])) {
+ $sysname = $sysmap[$sysname];
+ } else {
+ $sysname = strtolower($sysname);
+ }
+ if (isset($cpumap[$cpu])) {
+ $cpu = $cpumap[$cpu];
+ }
+ return array($sysname, $release, $cpu, $extra, $nodename);
+ }
+
+ function _detectGlibcVersion()
+ {
+ static $glibc = false;
+ if ($glibc !== false) {
+ return $glibc; // no need to run this multiple times
+ }
+ $major = $minor = 0;
+ include_once "System.php";
+ // Use glibc's <features.h> header file to
+ // get major and minor version number:
+ if (@file_exists('/usr/include/features.h') &&
+ @is_readable('/usr/include/features.h')) {
+ if (!@file_exists('/usr/bin/cpp') || !@is_executable('/usr/bin/cpp')) {
+ $features_file = fopen('/usr/include/features.h', 'rb');
+ while (!feof($features_file)) {
+ $line = fgets($features_file, 8192);
+ if (!$line || (strpos($line, '#define') === false)) {
+ continue;
+ }
+ if (strpos($line, '__GLIBC__')) {
+ // major version number #define __GLIBC__ version
+ $line = preg_split('/\s+/', $line);
+ $glibc_major = trim($line[2]);
+ if (isset($glibc_minor)) {
+ break;
+ }
+ continue;
+ }
+
+ if (strpos($line, '__GLIBC_MINOR__')) {
+ // got the minor version number
+ // #define __GLIBC_MINOR__ version
+ $line = preg_split('/\s+/', $line);
+ $glibc_minor = trim($line[2]);
+ if (isset($glibc_major)) {
+ break;
+ }
+ continue;
+ }
+ }
+ fclose($features_file);
+ if (!isset($glibc_major) || !isset($glibc_minor)) {
+ return $glibc = '';
+ }
+ return $glibc = 'glibc' . trim($glibc_major) . "." . trim($glibc_minor) ;
+ } // no cpp
+
+ $tmpfile = System::mktemp("glibctest");
+ $fp = fopen($tmpfile, "w");
+ fwrite($fp, "#include <features.h>\n__GLIBC__ __GLIBC_MINOR__\n");
+ fclose($fp);
+ $cpp = popen("/usr/bin/cpp $tmpfile", "r");
+ while ($line = fgets($cpp, 1024)) {
+ if ($line{0} == '#' || trim($line) == '') {
+ continue;
+ }
+
+ if (list($major, $minor) = explode(' ', trim($line))) {
+ break;
+ }
+ }
+ pclose($cpp);
+ unlink($tmpfile);
+ } // features.h
+
+ if (!($major && $minor) && @is_link('/lib/libc.so.6')) {
+ // Let's try reading the libc.so.6 symlink
+ if (preg_match('/^libc-(.*)\.so$/', basename(readlink('/lib/libc.so.6')), $matches)) {
+ list($major, $minor) = explode('.', $matches[1]);
+ }
+ }
+
+ if (!($major && $minor)) {
+ return $glibc = '';
+ }
+
+ return $glibc = "glibc{$major}.{$minor}";
+ }
+
+ function getSignature()
+ {
+ if (empty($this->extra)) {
+ return "{$this->sysname}-{$this->release}-{$this->cpu}";
+ }
+ return "{$this->sysname}-{$this->release}-{$this->cpu}-{$this->extra}";
+ }
+
+ function getSysname()
+ {
+ return $this->sysname;
+ }
+
+ function getNodename()
+ {
+ return $this->nodename;
+ }
+
+ function getCpu()
+ {
+ return $this->cpu;
+ }
+
+ function getRelease()
+ {
+ return $this->release;
+ }
+
+ function getExtra()
+ {
+ return $this->extra;
+ }
+
+ function matchSignature($match)
+ {
+ $fragments = is_array($match) ? $match : explode('-', $match);
+ $n = count($fragments);
+ $matches = 0;
+ if ($n > 0) {
+ $matches += $this->_matchFragment($fragments[0], $this->sysname);
+ }
+ if ($n > 1) {
+ $matches += $this->_matchFragment($fragments[1], $this->release);
+ }
+ if ($n > 2) {
+ $matches += $this->_matchFragment($fragments[2], $this->cpu);
+ }
+ if ($n > 3) {
+ $matches += $this->_matchFragment($fragments[3], $this->extra);
+ }
+ return ($matches == $n);
+ }
+
+ function _matchFragment($fragment, $value)
+ {
+ if (strcspn($fragment, '*?') < strlen($fragment)) {
+ $reg = '/^' . str_replace(array('*', '?', '/'), array('.*', '.', '\\/'), $fragment) . '\\z/';
+ return preg_match($reg, $value);
+ }
+ return ($fragment == '*' || !strcasecmp($fragment, $value));
+ }
+
+}
+/*
+ * Local Variables:
+ * indent-tabs-mode: nil
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/www/wiki/vendor/pear/pear-core-minimal/src/PEAR.php b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR.php
new file mode 100644
index 00000000..cf9a02de
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR.php
@@ -0,0 +1,1113 @@
+<?php
+/**
+ * PEAR, the PHP Extension and Application Repository
+ *
+ * PEAR class and PEAR_Error class
+ *
+ * PHP versions 4 and 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Sterling Hughes <sterling@php.net>
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2010 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since Release 0.1
+ */
+
+/**#@+
+ * ERROR constants
+ */
+define('PEAR_ERROR_RETURN', 1);
+define('PEAR_ERROR_PRINT', 2);
+define('PEAR_ERROR_TRIGGER', 4);
+define('PEAR_ERROR_DIE', 8);
+define('PEAR_ERROR_CALLBACK', 16);
+/**
+ * WARNING: obsolete
+ * @deprecated
+ */
+define('PEAR_ERROR_EXCEPTION', 32);
+/**#@-*/
+
+if (substr(PHP_OS, 0, 3) == 'WIN') {
+ define('OS_WINDOWS', true);
+ define('OS_UNIX', false);
+ define('PEAR_OS', 'Windows');
+} else {
+ define('OS_WINDOWS', false);
+ define('OS_UNIX', true);
+ define('PEAR_OS', 'Unix'); // blatant assumption
+}
+
+$GLOBALS['_PEAR_default_error_mode'] = PEAR_ERROR_RETURN;
+$GLOBALS['_PEAR_default_error_options'] = E_USER_NOTICE;
+$GLOBALS['_PEAR_destructor_object_list'] = array();
+$GLOBALS['_PEAR_shutdown_funcs'] = array();
+$GLOBALS['_PEAR_error_handler_stack'] = array();
+
+@ini_set('track_errors', true);
+
+/**
+ * Base class for other PEAR classes. Provides rudimentary
+ * emulation of destructors.
+ *
+ * If you want a destructor in your class, inherit PEAR and make a
+ * destructor method called _yourclassname (same name as the
+ * constructor, but with a "_" prefix). Also, in your constructor you
+ * have to call the PEAR constructor: $this->PEAR();.
+ * The destructor method will be called without parameters. Note that
+ * at in some SAPI implementations (such as Apache), any output during
+ * the request shutdown (in which destructors are called) seems to be
+ * discarded. If you need to get any debug information from your
+ * destructor, use error_log(), syslog() or something similar.
+ *
+ * IMPORTANT! To use the emulated destructors you need to create the
+ * objects by reference: $obj =& new PEAR_child;
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PEAR
+ * @see PEAR_Error
+ * @since Class available since PHP 4.0.2
+ * @link http://pear.php.net/manual/en/core.pear.php#core.pear.pear
+ */
+class PEAR
+{
+ /**
+ * Whether to enable internal debug messages.
+ *
+ * @var bool
+ * @access private
+ */
+ var $_debug = false;
+
+ /**
+ * Default error mode for this object.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_mode = null;
+
+ /**
+ * Default error options used for this object when error mode
+ * is PEAR_ERROR_TRIGGER.
+ *
+ * @var int
+ * @access private
+ */
+ var $_default_error_options = null;
+
+ /**
+ * Default error handler (callback) for this object, if error mode is
+ * PEAR_ERROR_CALLBACK.
+ *
+ * @var string
+ * @access private
+ */
+ var $_default_error_handler = '';
+
+ /**
+ * Which class to use for error objects.
+ *
+ * @var string
+ * @access private
+ */
+ var $_error_class = 'PEAR_Error';
+
+ /**
+ * An array of expected errors.
+ *
+ * @var array
+ * @access private
+ */
+ var $_expected_errors = array();
+
+ /**
+ * List of methods that can be called both statically and non-statically.
+ * @var array
+ */
+ protected static $bivalentMethods = array(
+ 'setErrorHandling' => true,
+ 'raiseError' => true,
+ 'throwError' => true,
+ 'pushErrorHandling' => true,
+ 'popErrorHandling' => true,
+ );
+
+ /**
+ * Constructor. Registers this object in
+ * $_PEAR_destructor_object_list for destructor emulation if a
+ * destructor object exists.
+ *
+ * @param string $error_class (optional) which class to use for
+ * error objects, defaults to PEAR_Error.
+ * @access public
+ * @return void
+ */
+ function __construct($error_class = null)
+ {
+ $classname = strtolower(get_class($this));
+ if ($this->_debug) {
+ print "PEAR constructor called, class=$classname\n";
+ }
+
+ if ($error_class !== null) {
+ $this->_error_class = $error_class;
+ }
+
+ while ($classname && strcasecmp($classname, "pear")) {
+ $destructor = "_$classname";
+ if (method_exists($this, $destructor)) {
+ global $_PEAR_destructor_object_list;
+ $_PEAR_destructor_object_list[] = $this;
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+
+ /**
+ * Only here for backwards compatibility.
+ * E.g. Archive_Tar calls $this->PEAR() in its constructor.
+ *
+ * @param string $error_class Which class to use for error objects,
+ * defaults to PEAR_Error.
+ */
+ public function PEAR($error_class = null)
+ {
+ self::__construct($error_class);
+ }
+
+ /**
+ * Destructor (the emulated type of...). Does nothing right now,
+ * but is included for forward compatibility, so subclass
+ * destructors should always call it.
+ *
+ * See the note in the class desciption about output from
+ * destructors.
+ *
+ * @access public
+ * @return void
+ */
+ function _PEAR() {
+ if ($this->_debug) {
+ printf("PEAR destructor called, class=%s\n", strtolower(get_class($this)));
+ }
+ }
+
+ public function __call($method, $arguments)
+ {
+ if (!isset(self::$bivalentMethods[$method])) {
+ trigger_error(
+ 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
+ );
+ }
+ return call_user_func_array(
+ array(get_class(), '_' . $method),
+ array_merge(array($this), $arguments)
+ );
+ }
+
+ public static function __callStatic($method, $arguments)
+ {
+ if (!isset(self::$bivalentMethods[$method])) {
+ trigger_error(
+ 'Call to undefined method PEAR::' . $method . '()', E_USER_ERROR
+ );
+ }
+ return call_user_func_array(
+ array(get_class(), '_' . $method),
+ array_merge(array(null), $arguments)
+ );
+ }
+
+ /**
+ * If you have a class that's mostly/entirely static, and you need static
+ * properties, you can use this method to simulate them. Eg. in your method(s)
+ * do this: $myVar = &PEAR::getStaticProperty('myclass', 'myVar');
+ * You MUST use a reference, or they will not persist!
+ *
+ * @param string $class The calling classname, to prevent clashes
+ * @param string $var The variable to retrieve.
+ * @return mixed A reference to the variable. If not set it will be
+ * auto initialised to NULL.
+ */
+ public static function &getStaticProperty($class, $var)
+ {
+ static $properties;
+ if (!isset($properties[$class])) {
+ $properties[$class] = array();
+ }
+
+ if (!array_key_exists($var, $properties[$class])) {
+ $properties[$class][$var] = null;
+ }
+
+ return $properties[$class][$var];
+ }
+
+ /**
+ * Use this function to register a shutdown method for static
+ * classes.
+ *
+ * @param mixed $func The function name (or array of class/method) to call
+ * @param mixed $args The arguments to pass to the function
+ *
+ * @return void
+ */
+ public static function registerShutdownFunc($func, $args = array())
+ {
+ // if we are called statically, there is a potential
+ // that no shutdown func is registered. Bug #6445
+ if (!isset($GLOBALS['_PEAR_SHUTDOWN_REGISTERED'])) {
+ register_shutdown_function("_PEAR_call_destructors");
+ $GLOBALS['_PEAR_SHUTDOWN_REGISTERED'] = true;
+ }
+ $GLOBALS['_PEAR_shutdown_funcs'][] = array($func, $args);
+ }
+
+ /**
+ * Tell whether a value is a PEAR error.
+ *
+ * @param mixed $data the value to test
+ * @param int $code if $data is an error object, return true
+ * only if $code is a string and
+ * $obj->getMessage() == $code or
+ * $code is an integer and $obj->getCode() == $code
+ *
+ * @return bool true if parameter is an error
+ */
+ public static function isError($data, $code = null)
+ {
+ if (!is_a($data, 'PEAR_Error')) {
+ return false;
+ }
+
+ if (is_null($code)) {
+ return true;
+ } elseif (is_string($code)) {
+ return $data->getMessage() == $code;
+ }
+
+ return $data->getCode() == $code;
+ }
+
+ /**
+ * Sets how errors generated by this object should be handled.
+ * Can be invoked both in objects and statically. If called
+ * statically, setErrorHandling sets the default behaviour for all
+ * PEAR objects. If called in an object, setErrorHandling sets
+ * the default behaviour for that object.
+ *
+ * @param object $object
+ * Object the method was called on (non-static mode)
+ *
+ * @param int $mode
+ * One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options
+ * When $mode is PEAR_ERROR_TRIGGER, this is the error level (one
+ * of E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ *
+ * When $mode is PEAR_ERROR_CALLBACK, this parameter is expected
+ * to be the callback function or method. A callback
+ * function is a string with the name of the function, a
+ * callback method is an array of two elements: the element
+ * at index 0 is the object, and the element at index 1 is
+ * the name of the method to call in the object.
+ *
+ * When $mode is PEAR_ERROR_PRINT or PEAR_ERROR_DIE, this is
+ * a printf format string used when printing the error
+ * message.
+ *
+ * @access public
+ * @return void
+ * @see PEAR_ERROR_RETURN
+ * @see PEAR_ERROR_PRINT
+ * @see PEAR_ERROR_TRIGGER
+ * @see PEAR_ERROR_DIE
+ * @see PEAR_ERROR_CALLBACK
+ * @see PEAR_ERROR_EXCEPTION
+ *
+ * @since PHP 4.0.5
+ */
+ protected static function _setErrorHandling(
+ $object, $mode = null, $options = null
+ ) {
+ if ($object !== null) {
+ $setmode = &$object->_default_error_mode;
+ $setoptions = &$object->_default_error_options;
+ } else {
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ }
+
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ }
+
+ /**
+ * This method is used to tell which errors you expect to get.
+ * Expected errors are always returned with error mode
+ * PEAR_ERROR_RETURN. Expected error codes are stored in a stack,
+ * and this method pushes a new element onto it. The list of
+ * expected errors are in effect until they are popped off the
+ * stack with the popExpect() method.
+ *
+ * Note that this method can not be called statically
+ *
+ * @param mixed $code a single error code or an array of error codes to expect
+ *
+ * @return int the new depth of the "expected errors" stack
+ * @access public
+ */
+ function expectError($code = '*')
+ {
+ if (is_array($code)) {
+ array_push($this->_expected_errors, $code);
+ } else {
+ array_push($this->_expected_errors, array($code));
+ }
+ return count($this->_expected_errors);
+ }
+
+ /**
+ * This method pops one element off the expected error codes
+ * stack.
+ *
+ * @return array the list of error codes that were popped
+ */
+ function popExpect()
+ {
+ return array_pop($this->_expected_errors);
+ }
+
+ /**
+ * This method checks unsets an error code if available
+ *
+ * @param mixed error code
+ * @return bool true if the error code was unset, false otherwise
+ * @access private
+ * @since PHP 4.3.0
+ */
+ function _checkDelExpect($error_code)
+ {
+ $deleted = false;
+ foreach ($this->_expected_errors as $key => $error_array) {
+ if (in_array($error_code, $error_array)) {
+ unset($this->_expected_errors[$key][array_search($error_code, $error_array)]);
+ $deleted = true;
+ }
+
+ // clean up empty arrays
+ if (0 == count($this->_expected_errors[$key])) {
+ unset($this->_expected_errors[$key]);
+ }
+ }
+
+ return $deleted;
+ }
+
+ /**
+ * This method deletes all occurrences of the specified element from
+ * the expected error codes stack.
+ *
+ * @param mixed $error_code error code that should be deleted
+ * @return mixed list of error codes that were deleted or error
+ * @access public
+ * @since PHP 4.3.0
+ */
+ function delExpect($error_code)
+ {
+ $deleted = false;
+ if ((is_array($error_code) && (0 != count($error_code)))) {
+ // $error_code is a non-empty array here; we walk through it trying
+ // to unset all values
+ foreach ($error_code as $key => $error) {
+ $deleted = $this->_checkDelExpect($error) ? true : false;
+ }
+
+ return $deleted ? true : PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ } elseif (!empty($error_code)) {
+ // $error_code comes alone, trying to unset it
+ if ($this->_checkDelExpect($error_code)) {
+ return true;
+ }
+
+ return PEAR::raiseError("The expected error you submitted does not exist"); // IMPROVE ME
+ }
+
+ // $error_code is empty
+ return PEAR::raiseError("The expected error you submitted is empty"); // IMPROVE ME
+ }
+
+ /**
+ * This method is a wrapper that returns an instance of the
+ * configured error class with this object's default error
+ * handling applied. If the $mode and $options parameters are not
+ * specified, the object's defaults are used.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param int $mode One of PEAR_ERROR_RETURN, PEAR_ERROR_PRINT,
+ * PEAR_ERROR_TRIGGER, PEAR_ERROR_DIE,
+ * PEAR_ERROR_CALLBACK, PEAR_ERROR_EXCEPTION.
+ *
+ * @param mixed $options If $mode is PEAR_ERROR_TRIGGER, this parameter
+ * specifies the PHP-internal error level (one of
+ * E_USER_NOTICE, E_USER_WARNING or E_USER_ERROR).
+ * If $mode is PEAR_ERROR_CALLBACK, this
+ * parameter specifies the callback function or
+ * method. In other error modes this parameter
+ * is ignored.
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @param string $error_class The returned error object will be
+ * instantiated from this class, if specified.
+ *
+ * @param bool $skipmsg If true, raiseError will only pass error codes,
+ * the error message parameter will be dropped.
+ *
+ * @return object a PEAR error object
+ * @see PEAR::setErrorHandling
+ * @since PHP 4.0.5
+ */
+ protected static function _raiseError($object,
+ $message = null,
+ $code = null,
+ $mode = null,
+ $options = null,
+ $userinfo = null,
+ $error_class = null,
+ $skipmsg = false)
+ {
+ // The error is yet a PEAR error object
+ if (is_object($message)) {
+ $code = $message->getCode();
+ $userinfo = $message->getUserInfo();
+ $error_class = $message->getType();
+ $message->error_message_prefix = '';
+ $message = $message->getMessage();
+ }
+
+ if (
+ $object !== null &&
+ isset($object->_expected_errors) &&
+ count($object->_expected_errors) > 0 &&
+ count($exp = end($object->_expected_errors))
+ ) {
+ if ($exp[0] === "*" ||
+ (is_int(reset($exp)) && in_array($code, $exp)) ||
+ (is_string(reset($exp)) && in_array($message, $exp))
+ ) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ }
+
+ // No mode given, try global ones
+ if ($mode === null) {
+ // Class error handler
+ if ($object !== null && isset($object->_default_error_mode)) {
+ $mode = $object->_default_error_mode;
+ $options = $object->_default_error_options;
+ // Global error handler
+ } elseif (isset($GLOBALS['_PEAR_default_error_mode'])) {
+ $mode = $GLOBALS['_PEAR_default_error_mode'];
+ $options = $GLOBALS['_PEAR_default_error_options'];
+ }
+ }
+
+ if ($error_class !== null) {
+ $ec = $error_class;
+ } elseif ($object !== null && isset($object->_error_class)) {
+ $ec = $object->_error_class;
+ } else {
+ $ec = 'PEAR_Error';
+ }
+
+ if ($skipmsg) {
+ $a = new $ec($code, $mode, $options, $userinfo);
+ } else {
+ $a = new $ec($message, $code, $mode, $options, $userinfo);
+ }
+
+ return $a;
+ }
+
+ /**
+ * Simpler form of raiseError with fewer options. In most cases
+ * message, code and userinfo are enough.
+ *
+ * @param mixed $message a text error message or a PEAR error object
+ *
+ * @param int $code a numeric error code (it is up to your class
+ * to define these if you want to use codes)
+ *
+ * @param string $userinfo If you need to pass along for example debug
+ * information, this parameter is meant for that.
+ *
+ * @return object a PEAR error object
+ * @see PEAR::raiseError
+ */
+ protected static function _throwError($object, $message = null, $code = null, $userinfo = null)
+ {
+ if ($object !== null) {
+ $a = $object->raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ }
+
+ $a = PEAR::raiseError($message, $code, null, null, $userinfo);
+ return $a;
+ }
+
+ public static function staticPushErrorHandling($mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ $stack[] = array($def_mode, $def_options);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $def_mode = $mode;
+ $def_options = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $def_mode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $def_options = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ public static function staticPopErrorHandling()
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ $setmode = &$GLOBALS['_PEAR_default_error_mode'];
+ $setoptions = &$GLOBALS['_PEAR_default_error_options'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ switch ($mode) {
+ case PEAR_ERROR_EXCEPTION:
+ case PEAR_ERROR_RETURN:
+ case PEAR_ERROR_PRINT:
+ case PEAR_ERROR_TRIGGER:
+ case PEAR_ERROR_DIE:
+ case null:
+ $setmode = $mode;
+ $setoptions = $options;
+ break;
+
+ case PEAR_ERROR_CALLBACK:
+ $setmode = $mode;
+ // class/object method callback
+ if (is_callable($options)) {
+ $setoptions = $options;
+ } else {
+ trigger_error("invalid error callback", E_USER_WARNING);
+ }
+ break;
+
+ default:
+ trigger_error("invalid error mode", E_USER_WARNING);
+ break;
+ }
+ return true;
+ }
+
+ /**
+ * Push a new error handler on top of the error handler options stack. With this
+ * you can easily override the actual error handler for some code and restore
+ * it later with popErrorHandling.
+ *
+ * @param mixed $mode (same as setErrorHandling)
+ * @param mixed $options (same as setErrorHandling)
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::setErrorHandling
+ */
+ protected static function _pushErrorHandling($object, $mode, $options = null)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ if ($object !== null) {
+ $def_mode = &$object->_default_error_mode;
+ $def_options = &$object->_default_error_options;
+ } else {
+ $def_mode = &$GLOBALS['_PEAR_default_error_mode'];
+ $def_options = &$GLOBALS['_PEAR_default_error_options'];
+ }
+ $stack[] = array($def_mode, $def_options);
+
+ if ($object !== null) {
+ $object->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ $stack[] = array($mode, $options);
+ return true;
+ }
+
+ /**
+ * Pop the last error handler used
+ *
+ * @return bool Always true
+ *
+ * @see PEAR::pushErrorHandling
+ */
+ protected static function _popErrorHandling($object)
+ {
+ $stack = &$GLOBALS['_PEAR_error_handler_stack'];
+ array_pop($stack);
+ list($mode, $options) = $stack[sizeof($stack) - 1];
+ array_pop($stack);
+ if ($object !== null) {
+ $object->setErrorHandling($mode, $options);
+ } else {
+ PEAR::setErrorHandling($mode, $options);
+ }
+ return true;
+ }
+
+ /**
+ * OS independent PHP extension load. Remember to take care
+ * on the correct extension name for case sensitive OSes.
+ *
+ * @param string $ext The extension name
+ * @return bool Success or not on the dl() call
+ */
+ public static function loadExtension($ext)
+ {
+ if (extension_loaded($ext)) {
+ return true;
+ }
+
+ // if either returns true dl() will produce a FATAL error, stop that
+ if (
+ function_exists('dl') === false ||
+ ini_get('enable_dl') != 1
+ ) {
+ return false;
+ }
+
+ if (OS_WINDOWS) {
+ $suffix = '.dll';
+ } elseif (PHP_OS == 'HP-UX') {
+ $suffix = '.sl';
+ } elseif (PHP_OS == 'AIX') {
+ $suffix = '.a';
+ } elseif (PHP_OS == 'OSX') {
+ $suffix = '.bundle';
+ } else {
+ $suffix = '.so';
+ }
+
+ return @dl('php_'.$ext.$suffix) || @dl($ext.$suffix);
+ }
+}
+
+function _PEAR_call_destructors()
+{
+ global $_PEAR_destructor_object_list;
+ if (is_array($_PEAR_destructor_object_list) &&
+ sizeof($_PEAR_destructor_object_list))
+ {
+ reset($_PEAR_destructor_object_list);
+
+ $destructLifoExists = PEAR::getStaticProperty('PEAR', 'destructlifo');
+
+ if ($destructLifoExists) {
+ $_PEAR_destructor_object_list = array_reverse($_PEAR_destructor_object_list);
+ }
+
+ foreach ($_PEAR_destructor_object_list as $k => $objref) {
+ $classname = get_class($objref);
+ while ($classname) {
+ $destructor = "_$classname";
+ if (method_exists($objref, $destructor)) {
+ $objref->$destructor();
+ break;
+ } else {
+ $classname = get_parent_class($classname);
+ }
+ }
+ }
+ // Empty the object list to ensure that destructors are
+ // not called more than once.
+ $_PEAR_destructor_object_list = array();
+ }
+
+ // Now call the shutdown functions
+ if (
+ isset($GLOBALS['_PEAR_shutdown_funcs']) &&
+ is_array($GLOBALS['_PEAR_shutdown_funcs']) &&
+ !empty($GLOBALS['_PEAR_shutdown_funcs'])
+ ) {
+ foreach ($GLOBALS['_PEAR_shutdown_funcs'] as $value) {
+ call_user_func_array($value[0], $value[1]);
+ }
+ }
+}
+
+/**
+ * Standard PEAR error class for PHP 4
+ *
+ * This class is supserseded by {@link PEAR_Exception} in PHP 5
+ *
+ * @category pear
+ * @package PEAR
+ * @author Stig Bakken <ssb@php.net>
+ * @author Tomas V.V. Cox <cox@idecnet.com>
+ * @author Gregory Beaver <cellog@php.net>
+ * @copyright 1997-2006 The PHP Group
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/manual/en/core.pear.pear-error.php
+ * @see PEAR::raiseError(), PEAR::throwError()
+ * @since Class available since PHP 4.0.2
+ */
+class PEAR_Error
+{
+ var $error_message_prefix = '';
+ var $mode = PEAR_ERROR_RETURN;
+ var $level = E_USER_NOTICE;
+ var $code = -1;
+ var $message = '';
+ var $userinfo = '';
+ var $backtrace = null;
+
+ /**
+ * PEAR_Error constructor
+ *
+ * @param string $message message
+ *
+ * @param int $code (optional) error code
+ *
+ * @param int $mode (optional) error mode, one of: PEAR_ERROR_RETURN,
+ * PEAR_ERROR_PRINT, PEAR_ERROR_DIE, PEAR_ERROR_TRIGGER,
+ * PEAR_ERROR_CALLBACK or PEAR_ERROR_EXCEPTION
+ *
+ * @param mixed $options (optional) error level, _OR_ in the case of
+ * PEAR_ERROR_CALLBACK, the callback function or object/method
+ * tuple.
+ *
+ * @param string $userinfo (optional) additional user/debug info
+ *
+ * @access public
+ *
+ */
+ function __construct($message = 'unknown error', $code = null,
+ $mode = null, $options = null, $userinfo = null)
+ {
+ if ($mode === null) {
+ $mode = PEAR_ERROR_RETURN;
+ }
+ $this->message = $message;
+ $this->code = $code;
+ $this->mode = $mode;
+ $this->userinfo = $userinfo;
+
+ $skiptrace = PEAR::getStaticProperty('PEAR_Error', 'skiptrace');
+
+ if (!$skiptrace) {
+ $this->backtrace = debug_backtrace();
+ if (isset($this->backtrace[0]) && isset($this->backtrace[0]['object'])) {
+ unset($this->backtrace[0]['object']);
+ }
+ }
+
+ if ($mode & PEAR_ERROR_CALLBACK) {
+ $this->level = E_USER_NOTICE;
+ $this->callback = $options;
+ } else {
+ if ($options === null) {
+ $options = E_USER_NOTICE;
+ }
+
+ $this->level = $options;
+ $this->callback = null;
+ }
+
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ } else {
+ $format = $options;
+ }
+
+ printf($format, $this->getMessage());
+ }
+
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ trigger_error($this->getMessage(), $this->level);
+ }
+
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $msg = $this->getMessage();
+ if (is_null($options) || is_int($options)) {
+ $format = "%s";
+ if (substr($msg, -1) != "\n") {
+ $msg .= "\n";
+ }
+ } else {
+ $format = $options;
+ }
+ printf($format, $msg);
+ exit($code);
+ }
+
+ if ($this->mode & PEAR_ERROR_CALLBACK && is_callable($this->callback)) {
+ call_user_func($this->callback, $this);
+ }
+
+ if ($this->mode & PEAR_ERROR_EXCEPTION) {
+ trigger_error("PEAR_ERROR_EXCEPTION is obsolete, use class PEAR_Exception for exceptions", E_USER_WARNING);
+ eval('$e = new Exception($this->message, $this->code);throw($e);');
+ }
+ }
+
+ /**
+ * Only here for backwards compatibility.
+ *
+ * Class "Cache_Error" still uses it, among others.
+ *
+ * @param string $message Message
+ * @param int $code Error code
+ * @param int $mode Error mode
+ * @param mixed $options See __construct()
+ * @param string $userinfo Additional user/debug info
+ */
+ public function PEAR_Error(
+ $message = 'unknown error', $code = null, $mode = null,
+ $options = null, $userinfo = null
+ ) {
+ self::__construct($message, $code, $mode, $options, $userinfo);
+ }
+
+ /**
+ * Get the error mode from an error object.
+ *
+ * @return int error mode
+ * @access public
+ */
+ function getMode()
+ {
+ return $this->mode;
+ }
+
+ /**
+ * Get the callback function/method from an error object.
+ *
+ * @return mixed callback function or object/method array
+ * @access public
+ */
+ function getCallback()
+ {
+ return $this->callback;
+ }
+
+ /**
+ * Get the error message from an error object.
+ *
+ * @return string full error message
+ * @access public
+ */
+ function getMessage()
+ {
+ return ($this->error_message_prefix . $this->message);
+ }
+
+ /**
+ * Get error code from an error object
+ *
+ * @return int error code
+ * @access public
+ */
+ function getCode()
+ {
+ return $this->code;
+ }
+
+ /**
+ * Get the name of this error/exception.
+ *
+ * @return string error/exception name (type)
+ * @access public
+ */
+ function getType()
+ {
+ return get_class($this);
+ }
+
+ /**
+ * Get additional user-supplied information.
+ *
+ * @return string user-supplied information
+ * @access public
+ */
+ function getUserInfo()
+ {
+ return $this->userinfo;
+ }
+
+ /**
+ * Get additional debug information supplied by the application.
+ *
+ * @return string debug information
+ * @access public
+ */
+ function getDebugInfo()
+ {
+ return $this->getUserInfo();
+ }
+
+ /**
+ * Get the call backtrace from where the error was generated.
+ * Supported with PHP 4.3.0 or newer.
+ *
+ * @param int $frame (optional) what frame to fetch
+ * @return array Backtrace, or NULL if not available.
+ * @access public
+ */
+ function getBacktrace($frame = null)
+ {
+ if (defined('PEAR_IGNORE_BACKTRACE')) {
+ return null;
+ }
+ if ($frame === null) {
+ return $this->backtrace;
+ }
+ return $this->backtrace[$frame];
+ }
+
+ function addUserInfo($info)
+ {
+ if (empty($this->userinfo)) {
+ $this->userinfo = $info;
+ } else {
+ $this->userinfo .= " ** $info";
+ }
+ }
+
+ function __toString()
+ {
+ return $this->getMessage();
+ }
+
+ /**
+ * Make a string representation of this object.
+ *
+ * @return string a string with an object summary
+ * @access public
+ */
+ function toString()
+ {
+ $modes = array();
+ $levels = array(E_USER_NOTICE => 'notice',
+ E_USER_WARNING => 'warning',
+ E_USER_ERROR => 'error');
+ if ($this->mode & PEAR_ERROR_CALLBACK) {
+ if (is_array($this->callback)) {
+ $callback = (is_object($this->callback[0]) ?
+ strtolower(get_class($this->callback[0])) :
+ $this->callback[0]) . '::' .
+ $this->callback[1];
+ } else {
+ $callback = $this->callback;
+ }
+ return sprintf('[%s: message="%s" code=%d mode=callback '.
+ 'callback=%s prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ $callback, $this->error_message_prefix,
+ $this->userinfo);
+ }
+ if ($this->mode & PEAR_ERROR_PRINT) {
+ $modes[] = 'print';
+ }
+ if ($this->mode & PEAR_ERROR_TRIGGER) {
+ $modes[] = 'trigger';
+ }
+ if ($this->mode & PEAR_ERROR_DIE) {
+ $modes[] = 'die';
+ }
+ if ($this->mode & PEAR_ERROR_RETURN) {
+ $modes[] = 'return';
+ }
+ return sprintf('[%s: message="%s" code=%d mode=%s level=%s '.
+ 'prefix="%s" info="%s"]',
+ strtolower(get_class($this)), $this->message, $this->code,
+ implode("|", $modes), $levels[$this->level],
+ $this->error_message_prefix,
+ $this->userinfo);
+ }
+}
+
+/*
+ * Local Variables:
+ * mode: php
+ * tab-width: 4
+ * c-basic-offset: 4
+ * End:
+ */
diff --git a/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/Error.php b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/Error.php
new file mode 100644
index 00000000..96efff75
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/Error.php
@@ -0,0 +1,14 @@
+<?php
+/**
+ * Dummy file to make autoloaders work
+ *
+ * PHP version 5
+ *
+ * @category PEAR
+ * @package PEAR
+ * @author Christian Weiske <cweiske@php.net>
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR
+ */
+require_once __DIR__ . '/../PEAR.php';
+?> \ No newline at end of file
diff --git a/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php
new file mode 100644
index 00000000..6619fbb1
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/src/PEAR/ErrorStack.php
@@ -0,0 +1,979 @@
+<?php
+/**
+ * Error Stack Implementation
+ *
+ * This is an incredibly simple implementation of a very complex error handling
+ * facility. It contains the ability
+ * to track multiple errors from multiple packages simultaneously. In addition,
+ * it can track errors of many levels, save data along with the error, context
+ * information such as the exact file, line number, class and function that
+ * generated the error, and if necessary, it can raise a traditional PEAR_Error.
+ * It has built-in support for PEAR::Log, to log errors as they occur
+ *
+ * Since version 0.2alpha, it is also possible to selectively ignore errors,
+ * through the use of an error callback, see {@link pushCallback()}
+ *
+ * Since version 0.3alpha, it is possible to specify the exception class
+ * returned from {@link push()}
+ *
+ * Since version PEAR1.3.2, ErrorStack no longer instantiates an exception class. This can
+ * still be done quite handily in an error callback or by manipulating the returned array
+ * @category Debugging
+ * @package PEAR_ErrorStack
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 2004-2008 Greg Beaver
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR_ErrorStack
+ */
+
+/**
+ * Singleton storage
+ *
+ * Format:
+ * <pre>
+ * array(
+ * 'package1' => PEAR_ErrorStack object,
+ * 'package2' => PEAR_ErrorStack object,
+ * ...
+ * )
+ * </pre>
+ * @access private
+ * @global array $GLOBALS['_PEAR_ERRORSTACK_SINGLETON']
+ */
+$GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] = array();
+
+/**
+ * Global error callback (default)
+ *
+ * This is only used if set to non-false. * is the default callback for
+ * all packages, whereas specific packages may set a default callback
+ * for all instances, regardless of whether they are a singleton or not.
+ *
+ * To exclude non-singletons, only set the local callback for the singleton
+ * @see PEAR_ErrorStack::setDefaultCallback()
+ * @access private
+ * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']
+ */
+$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'] = array(
+ '*' => false,
+);
+
+/**
+ * Global Log object (default)
+ *
+ * This is only used if set to non-false. Use to set a default log object for
+ * all stacks, regardless of instantiation order or location
+ * @see PEAR_ErrorStack::setDefaultLogger()
+ * @access private
+ * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
+ */
+$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = false;
+
+/**
+ * Global Overriding Callback
+ *
+ * This callback will override any error callbacks that specific loggers have set.
+ * Use with EXTREME caution
+ * @see PEAR_ErrorStack::staticPushCallback()
+ * @access private
+ * @global array $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']
+ */
+$GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
+
+/**#@+
+ * One of four possible return values from the error Callback
+ * @see PEAR_ErrorStack::_errorCallback()
+ */
+/**
+ * If this is returned, then the error will be both pushed onto the stack
+ * and logged.
+ */
+define('PEAR_ERRORSTACK_PUSHANDLOG', 1);
+/**
+ * If this is returned, then the error will only be pushed onto the stack,
+ * and not logged.
+ */
+define('PEAR_ERRORSTACK_PUSH', 2);
+/**
+ * If this is returned, then the error will only be logged, but not pushed
+ * onto the error stack.
+ */
+define('PEAR_ERRORSTACK_LOG', 3);
+/**
+ * If this is returned, then the error is completely ignored.
+ */
+define('PEAR_ERRORSTACK_IGNORE', 4);
+/**
+ * If this is returned, then the error is logged and die() is called.
+ */
+define('PEAR_ERRORSTACK_DIE', 5);
+/**#@-*/
+
+/**
+ * Error code for an attempt to instantiate a non-class as a PEAR_ErrorStack in
+ * the singleton method.
+ */
+define('PEAR_ERRORSTACK_ERR_NONCLASS', 1);
+
+/**
+ * Error code for an attempt to pass an object into {@link PEAR_ErrorStack::getMessage()}
+ * that has no __toString() method
+ */
+define('PEAR_ERRORSTACK_ERR_OBJTOSTRING', 2);
+/**
+ * Error Stack Implementation
+ *
+ * Usage:
+ * <code>
+ * // global error stack
+ * $global_stack = &PEAR_ErrorStack::singleton('MyPackage');
+ * // local error stack
+ * $local_stack = new PEAR_ErrorStack('MyPackage');
+ * </code>
+ * @author Greg Beaver <cellog@php.net>
+ * @version @package_version@
+ * @package PEAR_ErrorStack
+ * @category Debugging
+ * @copyright 2004-2008 Greg Beaver
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR_ErrorStack
+ */
+class PEAR_ErrorStack {
+ /**
+ * Errors are stored in the order that they are pushed on the stack.
+ * @since 0.4alpha Errors are no longer organized by error level.
+ * This renders pop() nearly unusable, and levels could be more easily
+ * handled in a callback anyway
+ * @var array
+ * @access private
+ */
+ var $_errors = array();
+
+ /**
+ * Storage of errors by level.
+ *
+ * Allows easy retrieval and deletion of only errors from a particular level
+ * @since PEAR 1.4.0dev
+ * @var array
+ * @access private
+ */
+ var $_errorsByLevel = array();
+
+ /**
+ * Package name this error stack represents
+ * @var string
+ * @access protected
+ */
+ var $_package;
+
+ /**
+ * Determines whether a PEAR_Error is thrown upon every error addition
+ * @var boolean
+ * @access private
+ */
+ var $_compat = false;
+
+ /**
+ * If set to a valid callback, this will be used to generate the error
+ * message from the error code, otherwise the message passed in will be
+ * used
+ * @var false|string|array
+ * @access private
+ */
+ var $_msgCallback = false;
+
+ /**
+ * If set to a valid callback, this will be used to generate the error
+ * context for an error. For PHP-related errors, this will be a file
+ * and line number as retrieved from debug_backtrace(), but can be
+ * customized for other purposes. The error might actually be in a separate
+ * configuration file, or in a database query.
+ * @var false|string|array
+ * @access protected
+ */
+ var $_contextCallback = false;
+
+ /**
+ * If set to a valid callback, this will be called every time an error
+ * is pushed onto the stack. The return value will be used to determine
+ * whether to allow an error to be pushed or logged.
+ *
+ * The return value must be one an PEAR_ERRORSTACK_* constant
+ * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
+ * @var false|string|array
+ * @access protected
+ */
+ var $_errorCallback = array();
+
+ /**
+ * PEAR::Log object for logging errors
+ * @var false|Log
+ * @access protected
+ */
+ var $_logger = false;
+
+ /**
+ * Error messages - designed to be overridden
+ * @var array
+ * @abstract
+ */
+ var $_errorMsgs = array();
+
+ /**
+ * Set up a new error stack
+ *
+ * @param string $package name of the package this error stack represents
+ * @param callback $msgCallback callback used for error message generation
+ * @param callback $contextCallback callback used for context generation,
+ * defaults to {@link getFileLine()}
+ * @param boolean $throwPEAR_Error
+ */
+ function __construct($package, $msgCallback = false, $contextCallback = false,
+ $throwPEAR_Error = false)
+ {
+ $this->_package = $package;
+ $this->setMessageCallback($msgCallback);
+ $this->setContextCallback($contextCallback);
+ $this->_compat = $throwPEAR_Error;
+ }
+
+ /**
+ * Return a single error stack for this package.
+ *
+ * Note that all parameters are ignored if the stack for package $package
+ * has already been instantiated
+ * @param string $package name of the package this error stack represents
+ * @param callback $msgCallback callback used for error message generation
+ * @param callback $contextCallback callback used for context generation,
+ * defaults to {@link getFileLine()}
+ * @param boolean $throwPEAR_Error
+ * @param string $stackClass class to instantiate
+ *
+ * @return PEAR_ErrorStack
+ */
+ public static function &singleton(
+ $package, $msgCallback = false, $contextCallback = false,
+ $throwPEAR_Error = false, $stackClass = 'PEAR_ErrorStack'
+ ) {
+ if (isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
+ return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
+ }
+ if (!class_exists($stackClass)) {
+ if (function_exists('debug_backtrace')) {
+ $trace = debug_backtrace();
+ }
+ PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_NONCLASS,
+ 'exception', array('stackclass' => $stackClass),
+ 'stack class "%stackclass%" is not a valid class name (should be like PEAR_ErrorStack)',
+ false, $trace);
+ }
+ $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package] =
+ new $stackClass($package, $msgCallback, $contextCallback, $throwPEAR_Error);
+
+ return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package];
+ }
+
+ /**
+ * Internal error handler for PEAR_ErrorStack class
+ *
+ * Dies if the error is an exception (and would have died anyway)
+ * @access private
+ */
+ function _handleError($err)
+ {
+ if ($err['level'] == 'exception') {
+ $message = $err['message'];
+ if (isset($_SERVER['REQUEST_URI'])) {
+ echo '<br />';
+ } else {
+ echo "\n";
+ }
+ var_dump($err['context']);
+ die($message);
+ }
+ }
+
+ /**
+ * Set up a PEAR::Log object for all error stacks that don't have one
+ * @param Log $log
+ */
+ public static function setDefaultLogger(&$log)
+ {
+ if (is_object($log) && method_exists($log, 'log') ) {
+ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
+ } elseif (is_callable($log)) {
+ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'] = &$log;
+ }
+ }
+
+ /**
+ * Set up a PEAR::Log object for this error stack
+ * @param Log $log
+ */
+ function setLogger(&$log)
+ {
+ if (is_object($log) && method_exists($log, 'log') ) {
+ $this->_logger = &$log;
+ } elseif (is_callable($log)) {
+ $this->_logger = &$log;
+ }
+ }
+
+ /**
+ * Set an error code => error message mapping callback
+ *
+ * This method sets the callback that can be used to generate error
+ * messages for any instance
+ * @param array|string Callback function/method
+ */
+ function setMessageCallback($msgCallback)
+ {
+ if (!$msgCallback) {
+ $this->_msgCallback = array(&$this, 'getErrorMessage');
+ } else {
+ if (is_callable($msgCallback)) {
+ $this->_msgCallback = $msgCallback;
+ }
+ }
+ }
+
+ /**
+ * Get an error code => error message mapping callback
+ *
+ * This method returns the current callback that can be used to generate error
+ * messages
+ * @return array|string|false Callback function/method or false if none
+ */
+ function getMessageCallback()
+ {
+ return $this->_msgCallback;
+ }
+
+ /**
+ * Sets a default callback to be used by all error stacks
+ *
+ * This method sets the callback that can be used to generate error
+ * messages for a singleton
+ * @param array|string Callback function/method
+ * @param string Package name, or false for all packages
+ */
+ public static function setDefaultCallback($callback = false, $package = false)
+ {
+ if (!is_callable($callback)) {
+ $callback = false;
+ }
+ $package = $package ? $package : '*';
+ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$package] = $callback;
+ }
+
+ /**
+ * Set a callback that generates context information (location of error) for an error stack
+ *
+ * This method sets the callback that can be used to generate context
+ * information for an error. Passing in NULL will disable context generation
+ * and remove the expensive call to debug_backtrace()
+ * @param array|string|null Callback function/method
+ */
+ function setContextCallback($contextCallback)
+ {
+ if ($contextCallback === null) {
+ return $this->_contextCallback = false;
+ }
+ if (!$contextCallback) {
+ $this->_contextCallback = array(&$this, 'getFileLine');
+ } else {
+ if (is_callable($contextCallback)) {
+ $this->_contextCallback = $contextCallback;
+ }
+ }
+ }
+
+ /**
+ * Set an error Callback
+ * If set to a valid callback, this will be called every time an error
+ * is pushed onto the stack. The return value will be used to determine
+ * whether to allow an error to be pushed or logged.
+ *
+ * The return value must be one of the ERRORSTACK_* constants.
+ *
+ * This functionality can be used to emulate PEAR's pushErrorHandling, and
+ * the PEAR_ERROR_CALLBACK mode, without affecting the integrity of
+ * the error stack or logging
+ * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
+ * @see popCallback()
+ * @param string|array $cb
+ */
+ function pushCallback($cb)
+ {
+ array_push($this->_errorCallback, $cb);
+ }
+
+ /**
+ * Remove a callback from the error callback stack
+ * @see pushCallback()
+ * @return array|string|false
+ */
+ function popCallback()
+ {
+ if (!count($this->_errorCallback)) {
+ return false;
+ }
+ return array_pop($this->_errorCallback);
+ }
+
+ /**
+ * Set a temporary overriding error callback for every package error stack
+ *
+ * Use this to temporarily disable all existing callbacks (can be used
+ * to emulate the @ operator, for instance)
+ * @see PEAR_ERRORSTACK_PUSHANDLOG, PEAR_ERRORSTACK_PUSH, PEAR_ERRORSTACK_LOG
+ * @see staticPopCallback(), pushCallback()
+ * @param string|array $cb
+ */
+ public static function staticPushCallback($cb)
+ {
+ array_push($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'], $cb);
+ }
+
+ /**
+ * Remove a temporary overriding error callback
+ * @see staticPushCallback()
+ * @return array|string|false
+ */
+ public static function staticPopCallback()
+ {
+ $ret = array_pop($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK']);
+ if (!is_array($GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'])) {
+ $GLOBALS['_PEAR_ERRORSTACK_OVERRIDE_CALLBACK'] = array();
+ }
+ return $ret;
+ }
+
+ /**
+ * Add an error to the stack
+ *
+ * If the message generator exists, it is called with 2 parameters.
+ * - the current Error Stack object
+ * - an array that is in the same format as an error. Available indices
+ * are 'code', 'package', 'time', 'params', 'level', and 'context'
+ *
+ * Next, if the error should contain context information, this is
+ * handled by the context grabbing method.
+ * Finally, the error is pushed onto the proper error stack
+ * @param int $code Package-specific error code
+ * @param string $level Error level. This is NOT spell-checked
+ * @param array $params associative array of error parameters
+ * @param string $msg Error message, or a portion of it if the message
+ * is to be generated
+ * @param array $repackage If this error re-packages an error pushed by
+ * another package, place the array returned from
+ * {@link pop()} in this parameter
+ * @param array $backtrace Protected parameter: use this to pass in the
+ * {@link debug_backtrace()} that should be used
+ * to find error context
+ * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
+ * thrown. If a PEAR_Error is returned, the userinfo
+ * property is set to the following array:
+ *
+ * <code>
+ * array(
+ * 'code' => $code,
+ * 'params' => $params,
+ * 'package' => $this->_package,
+ * 'level' => $level,
+ * 'time' => time(),
+ * 'context' => $context,
+ * 'message' => $msg,
+ * //['repackage' => $err] repackaged error array/Exception class
+ * );
+ * </code>
+ *
+ * Normally, the previous array is returned.
+ */
+ function push($code, $level = 'error', $params = array(), $msg = false,
+ $repackage = false, $backtrace = false)
+ {
+ $context = false;
+ // grab error context
+ if ($this->_contextCallback) {
+ if (!$backtrace) {
+ $backtrace = debug_backtrace();
+ }
+ $context = call_user_func($this->_contextCallback, $code, $params, $backtrace);
+ }
+
+ // save error
+ $time = explode(' ', microtime());
+ $time = $time[1] + $time[0];
+ $err = array(
+ 'code' => $code,
+ 'params' => $params,
+ 'package' => $this->_package,
+ 'level' => $level,
+ 'time' => $time,
+ 'context' => $context,
+ 'message' => $msg,
+ );
+
+ if ($repackage) {
+ $err['repackage'] = $repackage;
+ }
+
+ // set up the error message, if necessary
+ if ($this->_msgCallback) {
+ $msg = call_user_func_array($this->_msgCallback,
+ array(&$this, $err));
+ $err['message'] = $msg;
+ }
+ $push = $log = true;
+ $die = false;
+ // try the overriding callback first
+ $callback = $this->staticPopCallback();
+ if ($callback) {
+ $this->staticPushCallback($callback);
+ }
+ if (!is_callable($callback)) {
+ // try the local callback next
+ $callback = $this->popCallback();
+ if (is_callable($callback)) {
+ $this->pushCallback($callback);
+ } else {
+ // try the default callback
+ $callback = isset($GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package]) ?
+ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK'][$this->_package] :
+ $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_CALLBACK']['*'];
+ }
+ }
+ if (is_callable($callback)) {
+ switch(call_user_func($callback, $err)){
+ case PEAR_ERRORSTACK_IGNORE:
+ return $err;
+ break;
+ case PEAR_ERRORSTACK_PUSH:
+ $log = false;
+ break;
+ case PEAR_ERRORSTACK_LOG:
+ $push = false;
+ break;
+ case PEAR_ERRORSTACK_DIE:
+ $die = true;
+ break;
+ // anything else returned has the same effect as pushandlog
+ }
+ }
+ if ($push) {
+ array_unshift($this->_errors, $err);
+ if (!isset($this->_errorsByLevel[$err['level']])) {
+ $this->_errorsByLevel[$err['level']] = array();
+ }
+ $this->_errorsByLevel[$err['level']][] = &$this->_errors[0];
+ }
+ if ($log) {
+ if ($this->_logger || $GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER']) {
+ $this->_log($err);
+ }
+ }
+ if ($die) {
+ die();
+ }
+ if ($this->_compat && $push) {
+ return $this->raiseError($msg, $code, null, null, $err);
+ }
+ return $err;
+ }
+
+ /**
+ * Static version of {@link push()}
+ *
+ * @param string $package Package name this error belongs to
+ * @param int $code Package-specific error code
+ * @param string $level Error level. This is NOT spell-checked
+ * @param array $params associative array of error parameters
+ * @param string $msg Error message, or a portion of it if the message
+ * is to be generated
+ * @param array $repackage If this error re-packages an error pushed by
+ * another package, place the array returned from
+ * {@link pop()} in this parameter
+ * @param array $backtrace Protected parameter: use this to pass in the
+ * {@link debug_backtrace()} that should be used
+ * to find error context
+ * @return PEAR_Error|array if compatibility mode is on, a PEAR_Error is also
+ * thrown. see docs for {@link push()}
+ */
+ public static function staticPush(
+ $package, $code, $level = 'error', $params = array(),
+ $msg = false, $repackage = false, $backtrace = false
+ ) {
+ $s = &PEAR_ErrorStack::singleton($package);
+ if ($s->_contextCallback) {
+ if (!$backtrace) {
+ if (function_exists('debug_backtrace')) {
+ $backtrace = debug_backtrace();
+ }
+ }
+ }
+ return $s->push($code, $level, $params, $msg, $repackage, $backtrace);
+ }
+
+ /**
+ * Log an error using PEAR::Log
+ * @param array $err Error array
+ * @param array $levels Error level => Log constant map
+ * @access protected
+ */
+ function _log($err)
+ {
+ if ($this->_logger) {
+ $logger = &$this->_logger;
+ } else {
+ $logger = &$GLOBALS['_PEAR_ERRORSTACK_DEFAULT_LOGGER'];
+ }
+ if (is_a($logger, 'Log')) {
+ $levels = array(
+ 'exception' => PEAR_LOG_CRIT,
+ 'alert' => PEAR_LOG_ALERT,
+ 'critical' => PEAR_LOG_CRIT,
+ 'error' => PEAR_LOG_ERR,
+ 'warning' => PEAR_LOG_WARNING,
+ 'notice' => PEAR_LOG_NOTICE,
+ 'info' => PEAR_LOG_INFO,
+ 'debug' => PEAR_LOG_DEBUG);
+ if (isset($levels[$err['level']])) {
+ $level = $levels[$err['level']];
+ } else {
+ $level = PEAR_LOG_INFO;
+ }
+ $logger->log($err['message'], $level, $err);
+ } else { // support non-standard logs
+ call_user_func($logger, $err);
+ }
+ }
+
+
+ /**
+ * Pop an error off of the error stack
+ *
+ * @return false|array
+ * @since 0.4alpha it is no longer possible to specify a specific error
+ * level to return - the last error pushed will be returned, instead
+ */
+ function pop()
+ {
+ $err = @array_shift($this->_errors);
+ if (!is_null($err)) {
+ @array_pop($this->_errorsByLevel[$err['level']]);
+ if (!count($this->_errorsByLevel[$err['level']])) {
+ unset($this->_errorsByLevel[$err['level']]);
+ }
+ }
+ return $err;
+ }
+
+ /**
+ * Pop an error off of the error stack, static method
+ *
+ * @param string package name
+ * @return boolean
+ * @since PEAR1.5.0a1
+ */
+ static function staticPop($package)
+ {
+ if ($package) {
+ if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
+ return false;
+ }
+ return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->pop();
+ }
+ }
+
+ /**
+ * Determine whether there are any errors on the stack
+ * @param string|array Level name. Use to determine if any errors
+ * of level (string), or levels (array) have been pushed
+ * @return boolean
+ */
+ function hasErrors($level = false)
+ {
+ if ($level) {
+ return isset($this->_errorsByLevel[$level]);
+ }
+ return count($this->_errors);
+ }
+
+ /**
+ * Retrieve all errors since last purge
+ *
+ * @param boolean set in order to empty the error stack
+ * @param string level name, to return only errors of a particular severity
+ * @return array
+ */
+ function getErrors($purge = false, $level = false)
+ {
+ if (!$purge) {
+ if ($level) {
+ if (!isset($this->_errorsByLevel[$level])) {
+ return array();
+ } else {
+ return $this->_errorsByLevel[$level];
+ }
+ } else {
+ return $this->_errors;
+ }
+ }
+ if ($level) {
+ $ret = $this->_errorsByLevel[$level];
+ foreach ($this->_errorsByLevel[$level] as $i => $unused) {
+ // entries are references to the $_errors array
+ $this->_errorsByLevel[$level][$i] = false;
+ }
+ // array_filter removes all entries === false
+ $this->_errors = array_filter($this->_errors);
+ unset($this->_errorsByLevel[$level]);
+ return $ret;
+ }
+ $ret = $this->_errors;
+ $this->_errors = array();
+ $this->_errorsByLevel = array();
+ return $ret;
+ }
+
+ /**
+ * Determine whether there are any errors on a single error stack, or on any error stack
+ *
+ * The optional parameter can be used to test the existence of any errors without the need of
+ * singleton instantiation
+ * @param string|false Package name to check for errors
+ * @param string Level name to check for a particular severity
+ * @return boolean
+ */
+ public static function staticHasErrors($package = false, $level = false)
+ {
+ if ($package) {
+ if (!isset($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package])) {
+ return false;
+ }
+ return $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->hasErrors($level);
+ }
+ foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
+ if ($obj->hasErrors($level)) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * Get a list of all errors since last purge, organized by package
+ * @since PEAR 1.4.0dev BC break! $level is now in the place $merge used to be
+ * @param boolean $purge Set to purge the error stack of existing errors
+ * @param string $level Set to a level name in order to retrieve only errors of a particular level
+ * @param boolean $merge Set to return a flat array, not organized by package
+ * @param array $sortfunc Function used to sort a merged array - default
+ * sorts by time, and should be good for most cases
+ *
+ * @return array
+ */
+ public static function staticGetErrors(
+ $purge = false, $level = false, $merge = false,
+ $sortfunc = array('PEAR_ErrorStack', '_sortErrors')
+ ) {
+ $ret = array();
+ if (!is_callable($sortfunc)) {
+ $sortfunc = array('PEAR_ErrorStack', '_sortErrors');
+ }
+ foreach ($GLOBALS['_PEAR_ERRORSTACK_SINGLETON'] as $package => $obj) {
+ $test = $GLOBALS['_PEAR_ERRORSTACK_SINGLETON'][$package]->getErrors($purge, $level);
+ if ($test) {
+ if ($merge) {
+ $ret = array_merge($ret, $test);
+ } else {
+ $ret[$package] = $test;
+ }
+ }
+ }
+ if ($merge) {
+ usort($ret, $sortfunc);
+ }
+ return $ret;
+ }
+
+ /**
+ * Error sorting function, sorts by time
+ * @access private
+ */
+ public static function _sortErrors($a, $b)
+ {
+ if ($a['time'] == $b['time']) {
+ return 0;
+ }
+ if ($a['time'] < $b['time']) {
+ return 1;
+ }
+ return -1;
+ }
+
+ /**
+ * Standard file/line number/function/class context callback
+ *
+ * This function uses a backtrace generated from {@link debug_backtrace()}
+ * and so will not work at all in PHP < 4.3.0. The frame should
+ * reference the frame that contains the source of the error.
+ * @return array|false either array('file' => file, 'line' => line,
+ * 'function' => function name, 'class' => class name) or
+ * if this doesn't work, then false
+ * @param unused
+ * @param integer backtrace frame.
+ * @param array Results of debug_backtrace()
+ */
+ public static function getFileLine($code, $params, $backtrace = null)
+ {
+ if ($backtrace === null) {
+ return false;
+ }
+ $frame = 0;
+ $functionframe = 1;
+ if (!isset($backtrace[1])) {
+ $functionframe = 0;
+ } else {
+ while (isset($backtrace[$functionframe]['function']) &&
+ $backtrace[$functionframe]['function'] == 'eval' &&
+ isset($backtrace[$functionframe + 1])) {
+ $functionframe++;
+ }
+ }
+ if (isset($backtrace[$frame])) {
+ if (!isset($backtrace[$frame]['file'])) {
+ $frame++;
+ }
+ $funcbacktrace = $backtrace[$functionframe];
+ $filebacktrace = $backtrace[$frame];
+ $ret = array('file' => $filebacktrace['file'],
+ 'line' => $filebacktrace['line']);
+ // rearrange for eval'd code or create function errors
+ if (strpos($filebacktrace['file'], '(') &&
+ preg_match(';^(.*?)\((\d+)\) : (.*?)\\z;', $filebacktrace['file'],
+ $matches)) {
+ $ret['file'] = $matches[1];
+ $ret['line'] = $matches[2] + 0;
+ }
+ if (isset($funcbacktrace['function']) && isset($backtrace[1])) {
+ if ($funcbacktrace['function'] != 'eval') {
+ if ($funcbacktrace['function'] == '__lambda_func') {
+ $ret['function'] = 'create_function() code';
+ } else {
+ $ret['function'] = $funcbacktrace['function'];
+ }
+ }
+ }
+ if (isset($funcbacktrace['class']) && isset($backtrace[1])) {
+ $ret['class'] = $funcbacktrace['class'];
+ }
+ return $ret;
+ }
+ return false;
+ }
+
+ /**
+ * Standard error message generation callback
+ *
+ * This method may also be called by a custom error message generator
+ * to fill in template values from the params array, simply
+ * set the third parameter to the error message template string to use
+ *
+ * The special variable %__msg% is reserved: use it only to specify
+ * where a message passed in by the user should be placed in the template,
+ * like so:
+ *
+ * Error message: %msg% - internal error
+ *
+ * If the message passed like so:
+ *
+ * <code>
+ * $stack->push(ERROR_CODE, 'error', array(), 'server error 500');
+ * </code>
+ *
+ * The returned error message will be "Error message: server error 500 -
+ * internal error"
+ * @param PEAR_ErrorStack
+ * @param array
+ * @param string|false Pre-generated error message template
+ *
+ * @return string
+ */
+ public static function getErrorMessage(&$stack, $err, $template = false)
+ {
+ if ($template) {
+ $mainmsg = $template;
+ } else {
+ $mainmsg = $stack->getErrorMessageTemplate($err['code']);
+ }
+ $mainmsg = str_replace('%__msg%', $err['message'], $mainmsg);
+ if (is_array($err['params']) && count($err['params'])) {
+ foreach ($err['params'] as $name => $val) {
+ if (is_array($val)) {
+ // @ is needed in case $val is a multi-dimensional array
+ $val = @implode(', ', $val);
+ }
+ if (is_object($val)) {
+ if (method_exists($val, '__toString')) {
+ $val = $val->__toString();
+ } else {
+ PEAR_ErrorStack::staticPush('PEAR_ErrorStack', PEAR_ERRORSTACK_ERR_OBJTOSTRING,
+ 'warning', array('obj' => get_class($val)),
+ 'object %obj% passed into getErrorMessage, but has no __toString() method');
+ $val = 'Object';
+ }
+ }
+ $mainmsg = str_replace('%' . $name . '%', $val, $mainmsg);
+ }
+ }
+ return $mainmsg;
+ }
+
+ /**
+ * Standard Error Message Template generator from code
+ * @return string
+ */
+ function getErrorMessageTemplate($code)
+ {
+ if (!isset($this->_errorMsgs[$code])) {
+ return '%__msg%';
+ }
+ return $this->_errorMsgs[$code];
+ }
+
+ /**
+ * Set the Error Message Template array
+ *
+ * The array format must be:
+ * <pre>
+ * array(error code => 'message template',...)
+ * </pre>
+ *
+ * Error message parameters passed into {@link push()} will be used as input
+ * for the error message. If the template is 'message %foo% was %bar%', and the
+ * parameters are array('foo' => 'one', 'bar' => 'six'), the error message returned will
+ * be 'message one was six'
+ * @return string
+ */
+ function setErrorMessageTemplate($template)
+ {
+ $this->_errorMsgs = $template;
+ }
+
+
+ /**
+ * emulate PEAR::raiseError()
+ *
+ * @return PEAR_Error
+ */
+ function raiseError()
+ {
+ require_once 'PEAR.php';
+ $args = func_get_args();
+ return call_user_func_array(array('PEAR', 'raiseError'), $args);
+ }
+}
+$stack = &PEAR_ErrorStack::singleton('PEAR_ErrorStack');
+$stack->pushCallback(array('PEAR_ErrorStack', '_handleError'));
+?>
diff --git a/www/wiki/vendor/pear/pear-core-minimal/src/System.php b/www/wiki/vendor/pear/pear-core-minimal/src/System.php
new file mode 100644
index 00000000..aefc85b3
--- /dev/null
+++ b/www/wiki/vendor/pear/pear-core-minimal/src/System.php
@@ -0,0 +1,628 @@
+<?php
+/**
+ * File/Directory manipulation
+ *
+ * PHP versions 4 and 5
+ *
+ * @category pear
+ * @package System
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR
+ * @since File available since Release 0.1
+ */
+
+/**
+ * base class
+ */
+require_once 'PEAR.php';
+require_once 'Console/Getopt.php';
+
+$GLOBALS['_System_temp_files'] = array();
+
+/**
+* System offers cross platform compatible system functions
+*
+* Static functions for different operations. Should work under
+* Unix and Windows. The names and usage has been taken from its respectively
+* GNU commands. The functions will return (bool) false on error and will
+* trigger the error with the PHP trigger_error() function (you can silence
+* the error by prefixing a '@' sign after the function call, but this
+* is not recommended practice. Instead use an error handler with
+* {@link set_error_handler()}).
+*
+* Documentation on this class you can find in:
+* http://pear.php.net/manual/
+*
+* Example usage:
+* if (!@System::rm('-r file1 dir1')) {
+* print "could not delete file1 or dir1";
+* }
+*
+* In case you need to to pass file names with spaces,
+* pass the params as an array:
+*
+* System::rm(array('-r', $file1, $dir1));
+*
+* @category pear
+* @package System
+* @author Tomas V.V. Cox <cox@idecnet.com>
+* @copyright 1997-2006 The PHP Group
+* @license http://opensource.org/licenses/bsd-license.php New BSD License
+* @version Release: @package_version@
+* @link http://pear.php.net/package/PEAR
+* @since Class available since Release 0.1
+* @static
+*/
+class System
+{
+ /**
+ * returns the commandline arguments of a function
+ *
+ * @param string $argv the commandline
+ * @param string $short_options the allowed option short-tags
+ * @param string $long_options the allowed option long-tags
+ * @return array the given options and there values
+ */
+ public static function _parseArgs($argv, $short_options, $long_options = null)
+ {
+ if (!is_array($argv) && $argv !== null) {
+ /*
+ // Quote all items that are a short option
+ $av = preg_split('/(\A| )--?[a-z0-9]+[ =]?((?<!\\\\)((,\s*)|((?<!,)\s+))?)/i', $argv, -1, PREG_SPLIT_NO_EMPTY | PREG_SPLIT_OFFSET_CAPTURE);
+ $offset = 0;
+ foreach ($av as $a) {
+ $b = trim($a[0]);
+ if ($b{0} == '"' || $b{0} == "'") {
+ continue;
+ }
+
+ $escape = escapeshellarg($b);
+ $pos = $a[1] + $offset;
+ $argv = substr_replace($argv, $escape, $pos, strlen($b));
+ $offset += 2;
+ }
+ */
+
+ // Find all items, quoted or otherwise
+ preg_match_all("/(?:[\"'])(.*?)(?:['\"])|([^\s]+)/", $argv, $av);
+ $argv = $av[1];
+ foreach ($av[2] as $k => $a) {
+ if (empty($a)) {
+ continue;
+ }
+ $argv[$k] = trim($a) ;
+ }
+ }
+
+ return Console_Getopt::getopt2($argv, $short_options, $long_options);
+ }
+
+ /**
+ * Output errors with PHP trigger_error(). You can silence the errors
+ * with prefixing a "@" sign to the function call: @System::mkdir(..);
+ *
+ * @param mixed $error a PEAR error or a string with the error message
+ * @return bool false
+ */
+ protected static function raiseError($error)
+ {
+ if (PEAR::isError($error)) {
+ $error = $error->getMessage();
+ }
+ trigger_error($error, E_USER_WARNING);
+ return false;
+ }
+
+ /**
+ * Creates a nested array representing the structure of a directory
+ *
+ * System::_dirToStruct('dir1', 0) =>
+ * Array
+ * (
+ * [dirs] => Array
+ * (
+ * [0] => dir1
+ * )
+ *
+ * [files] => Array
+ * (
+ * [0] => dir1/file2
+ * [1] => dir1/file3
+ * )
+ * )
+ * @param string $sPath Name of the directory
+ * @param integer $maxinst max. deep of the lookup
+ * @param integer $aktinst starting deep of the lookup
+ * @param bool $silent if true, do not emit errors.
+ * @return array the structure of the dir
+ */
+ protected static function _dirToStruct($sPath, $maxinst, $aktinst = 0, $silent = false)
+ {
+ $struct = array('dirs' => array(), 'files' => array());
+ if (($dir = @opendir($sPath)) === false) {
+ if (!$silent) {
+ System::raiseError("Could not open dir $sPath");
+ }
+ return $struct; // XXX could not open error
+ }
+
+ $struct['dirs'][] = $sPath = realpath($sPath); // XXX don't add if '.' or '..' ?
+ $list = array();
+ while (false !== ($file = readdir($dir))) {
+ if ($file != '.' && $file != '..') {
+ $list[] = $file;
+ }
+ }
+
+ closedir($dir);
+ natsort($list);
+ if ($aktinst < $maxinst || $maxinst == 0) {
+ foreach ($list as $val) {
+ $path = $sPath . DIRECTORY_SEPARATOR . $val;
+ if (is_dir($path) && !is_link($path)) {
+ $tmp = System::_dirToStruct($path, $maxinst, $aktinst+1, $silent);
+ $struct = array_merge_recursive($struct, $tmp);
+ } else {
+ $struct['files'][] = $path;
+ }
+ }
+ }
+
+ return $struct;
+ }
+
+ /**
+ * Creates a nested array representing the structure of a directory and files
+ *
+ * @param array $files Array listing files and dirs
+ * @return array
+ * @static
+ * @see System::_dirToStruct()
+ */
+ protected static function _multipleToStruct($files)
+ {
+ $struct = array('dirs' => array(), 'files' => array());
+ settype($files, 'array');
+ foreach ($files as $file) {
+ if (is_dir($file) && !is_link($file)) {
+ $tmp = System::_dirToStruct($file, 0);
+ $struct = array_merge_recursive($tmp, $struct);
+ } else {
+ if (!in_array($file, $struct['files'])) {
+ $struct['files'][] = $file;
+ }
+ }
+ }
+ return $struct;
+ }
+
+ /**
+ * The rm command for removing files.
+ * Supports multiple files and dirs and also recursive deletes
+ *
+ * @param string $args the arguments for rm
+ * @return mixed PEAR_Error or true for success
+ * @static
+ * @access public
+ */
+ public static function rm($args)
+ {
+ $opts = System::_parseArgs($args, 'rf'); // "f" does nothing but I like it :-)
+ if (PEAR::isError($opts)) {
+ return System::raiseError($opts);
+ }
+ foreach ($opts[0] as $opt) {
+ if ($opt[0] == 'r') {
+ $do_recursive = true;
+ }
+ }
+ $ret = true;
+ if (isset($do_recursive)) {
+ $struct = System::_multipleToStruct($opts[1]);
+ foreach ($struct['files'] as $file) {
+ if (!@unlink($file)) {
+ $ret = false;
+ }
+ }
+
+ rsort($struct['dirs']);
+ foreach ($struct['dirs'] as $dir) {
+ if (!@rmdir($dir)) {
+ $ret = false;
+ }
+ }
+ } else {
+ foreach ($opts[1] as $file) {
+ $delete = (is_dir($file)) ? 'rmdir' : 'unlink';
+ if (!@$delete($file)) {
+ $ret = false;
+ }
+ }
+ }
+ return $ret;
+ }
+
+ /**
+ * Make directories.
+ *
+ * The -p option will create parent directories
+ * @param string $args the name of the director(y|ies) to create
+ * @return bool True for success
+ */
+ public static function mkDir($args)
+ {
+ $opts = System::_parseArgs($args, 'pm:');
+ if (PEAR::isError($opts)) {
+ return System::raiseError($opts);
+ }
+
+ $mode = 0777; // default mode
+ foreach ($opts[0] as $opt) {
+ if ($opt[0] == 'p') {
+ $create_parents = true;
+ } elseif ($opt[0] == 'm') {
+ // if the mode is clearly an octal number (starts with 0)
+ // convert it to decimal
+ if (strlen($opt[1]) && $opt[1]{0} == '0') {
+ $opt[1] = octdec($opt[1]);
+ } else {
+ // convert to int
+ $opt[1] += 0;
+ }
+ $mode = $opt[1];
+ }
+ }
+
+ $ret = true;
+ if (isset($create_parents)) {
+ foreach ($opts[1] as $dir) {
+ $dirstack = array();
+ while ((!file_exists($dir) || !is_dir($dir)) &&
+ $dir != DIRECTORY_SEPARATOR) {
+ array_unshift($dirstack, $dir);
+ $dir = dirname($dir);
+ }
+
+ while ($newdir = array_shift($dirstack)) {
+ if (!is_writeable(dirname($newdir))) {
+ $ret = false;
+ break;
+ }
+
+ if (!mkdir($newdir, $mode)) {
+ $ret = false;
+ }
+ }
+ }
+ } else {
+ foreach($opts[1] as $dir) {
+ if ((@file_exists($dir) || !is_dir($dir)) && !mkdir($dir, $mode)) {
+ $ret = false;
+ }
+ }
+ }
+
+ return $ret;
+ }
+
+ /**
+ * Concatenate files
+ *
+ * Usage:
+ * 1) $var = System::cat('sample.txt test.txt');
+ * 2) System::cat('sample.txt test.txt > final.txt');
+ * 3) System::cat('sample.txt test.txt >> final.txt');
+ *
+ * Note: as the class use fopen, urls should work also
+ *
+ * @param string $args the arguments
+ * @return boolean true on success
+ */
+ public static function &cat($args)
+ {
+ $ret = null;
+ $files = array();
+ if (!is_array($args)) {
+ $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
+ }
+
+ $count_args = count($args);
+ for ($i = 0; $i < $count_args; $i++) {
+ if ($args[$i] == '>') {
+ $mode = 'wb';
+ $outputfile = $args[$i+1];
+ break;
+ } elseif ($args[$i] == '>>') {
+ $mode = 'ab+';
+ $outputfile = $args[$i+1];
+ break;
+ } else {
+ $files[] = $args[$i];
+ }
+ }
+ $outputfd = false;
+ if (isset($mode)) {
+ if (!$outputfd = fopen($outputfile, $mode)) {
+ $err = System::raiseError("Could not open $outputfile");
+ return $err;
+ }
+ $ret = true;
+ }
+ foreach ($files as $file) {
+ if (!$fd = fopen($file, 'r')) {
+ System::raiseError("Could not open $file");
+ continue;
+ }
+ while ($cont = fread($fd, 2048)) {
+ if (is_resource($outputfd)) {
+ fwrite($outputfd, $cont);
+ } else {
+ $ret .= $cont;
+ }
+ }
+ fclose($fd);
+ }
+ if (is_resource($outputfd)) {
+ fclose($outputfd);
+ }
+ return $ret;
+ }
+
+ /**
+ * Creates temporary files or directories. This function will remove
+ * the created files when the scripts finish its execution.
+ *
+ * Usage:
+ * 1) $tempfile = System::mktemp("prefix");
+ * 2) $tempdir = System::mktemp("-d prefix");
+ * 3) $tempfile = System::mktemp();
+ * 4) $tempfile = System::mktemp("-t /var/tmp prefix");
+ *
+ * prefix -> The string that will be prepended to the temp name
+ * (defaults to "tmp").
+ * -d -> A temporary dir will be created instead of a file.
+ * -t -> The target dir where the temporary (file|dir) will be created. If
+ * this param is missing by default the env vars TMP on Windows or
+ * TMPDIR in Unix will be used. If these vars are also missing
+ * c:\windows\temp or /tmp will be used.
+ *
+ * @param string $args The arguments
+ * @return mixed the full path of the created (file|dir) or false
+ * @see System::tmpdir()
+ */
+ public static function mktemp($args = null)
+ {
+ static $first_time = true;
+ $opts = System::_parseArgs($args, 't:d');
+ if (PEAR::isError($opts)) {
+ return System::raiseError($opts);
+ }
+
+ foreach ($opts[0] as $opt) {
+ if ($opt[0] == 'd') {
+ $tmp_is_dir = true;
+ } elseif ($opt[0] == 't') {
+ $tmpdir = $opt[1];
+ }
+ }
+
+ $prefix = (isset($opts[1][0])) ? $opts[1][0] : 'tmp';
+ if (!isset($tmpdir)) {
+ $tmpdir = System::tmpdir();
+ }
+
+ if (!System::mkDir(array('-p', $tmpdir))) {
+ return false;
+ }
+
+ $tmp = tempnam($tmpdir, $prefix);
+ if (isset($tmp_is_dir)) {
+ unlink($tmp); // be careful possible race condition here
+ if (!mkdir($tmp, 0700)) {
+ return System::raiseError("Unable to create temporary directory $tmpdir");
+ }
+ }
+
+ $GLOBALS['_System_temp_files'][] = $tmp;
+ if (isset($tmp_is_dir)) {
+ //$GLOBALS['_System_temp_files'][] = dirname($tmp);
+ }
+
+ if ($first_time) {
+ PEAR::registerShutdownFunc(array('System', '_removeTmpFiles'));
+ $first_time = false;
+ }
+
+ return $tmp;
+ }
+
+ /**
+ * Remove temporary files created my mkTemp. This function is executed
+ * at script shutdown time
+ */
+ public static function _removeTmpFiles()
+ {
+ if (count($GLOBALS['_System_temp_files'])) {
+ $delete = $GLOBALS['_System_temp_files'];
+ array_unshift($delete, '-r');
+ System::rm($delete);
+ $GLOBALS['_System_temp_files'] = array();
+ }
+ }
+
+ /**
+ * Get the path of the temporal directory set in the system
+ * by looking in its environments variables.
+ * Note: php.ini-recommended removes the "E" from the variables_order setting,
+ * making unavaible the $_ENV array, that s why we do tests with _ENV
+ *
+ * @return string The temporary directory on the system
+ */
+ public static function tmpdir()
+ {
+ if (OS_WINDOWS) {
+ if ($var = isset($_ENV['TMP']) ? $_ENV['TMP'] : getenv('TMP')) {
+ return $var;
+ }
+ if ($var = isset($_ENV['TEMP']) ? $_ENV['TEMP'] : getenv('TEMP')) {
+ return $var;
+ }
+ if ($var = isset($_ENV['USERPROFILE']) ? $_ENV['USERPROFILE'] : getenv('USERPROFILE')) {
+ return $var;
+ }
+ if ($var = isset($_ENV['windir']) ? $_ENV['windir'] : getenv('windir')) {
+ return $var;
+ }
+ return getenv('SystemRoot') . '\temp';
+ }
+ if ($var = isset($_ENV['TMPDIR']) ? $_ENV['TMPDIR'] : getenv('TMPDIR')) {
+ return $var;
+ }
+ return realpath('/tmp');
+ }
+
+ /**
+ * The "which" command (show the full path of a command)
+ *
+ * @param string $program The command to search for
+ * @param mixed $fallback Value to return if $program is not found
+ *
+ * @return mixed A string with the full path or false if not found
+ * @author Stig Bakken <ssb@php.net>
+ */
+ public static function which($program, $fallback = false)
+ {
+ // enforce API
+ if (!is_string($program) || '' == $program) {
+ return $fallback;
+ }
+
+ // full path given
+ if (basename($program) != $program) {
+ $path_elements[] = dirname($program);
+ $program = basename($program);
+ } else {
+ $path = getenv('PATH');
+ if (!$path) {
+ $path = getenv('Path'); // some OSes are just stupid enough to do this
+ }
+
+ $path_elements = explode(PATH_SEPARATOR, $path);
+ }
+
+ if (OS_WINDOWS) {
+ $exe_suffixes = getenv('PATHEXT')
+ ? explode(PATH_SEPARATOR, getenv('PATHEXT'))
+ : array('.exe','.bat','.cmd','.com');
+ // allow passing a command.exe param
+ if (strpos($program, '.') !== false) {
+ array_unshift($exe_suffixes, '');
+ }
+ } else {
+ $exe_suffixes = array('');
+ }
+
+ foreach ($exe_suffixes as $suff) {
+ foreach ($path_elements as $dir) {
+ $file = $dir . DIRECTORY_SEPARATOR . $program . $suff;
+ // It's possible to run a .bat on Windows that is_executable
+ // would return false for. The is_executable check is meaningless...
+ if (OS_WINDOWS) {
+ return $file;
+ } else {
+ if (is_executable($file)) {
+ return $file;
+ }
+ }
+ }
+ }
+ return $fallback;
+ }
+
+ /**
+ * The "find" command
+ *
+ * Usage:
+ *
+ * System::find($dir);
+ * System::find("$dir -type d");
+ * System::find("$dir -type f");
+ * System::find("$dir -name *.php");
+ * System::find("$dir -name *.php -name *.htm*");
+ * System::find("$dir -maxdepth 1");
+ *
+ * Params implemented:
+ * $dir -> Start the search at this directory
+ * -type d -> return only directories
+ * -type f -> return only files
+ * -maxdepth <n> -> max depth of recursion
+ * -name <pattern> -> search pattern (bash style). Multiple -name param allowed
+ *
+ * @param mixed Either array or string with the command line
+ * @return array Array of found files
+ */
+ public static function find($args)
+ {
+ if (!is_array($args)) {
+ $args = preg_split('/\s+/', $args, -1, PREG_SPLIT_NO_EMPTY);
+ }
+ $dir = realpath(array_shift($args));
+ if (!$dir) {
+ return array();
+ }
+ $patterns = array();
+ $depth = 0;
+ $do_files = $do_dirs = true;
+ $args_count = count($args);
+ for ($i = 0; $i < $args_count; $i++) {
+ switch ($args[$i]) {
+ case '-type':
+ if (in_array($args[$i+1], array('d', 'f'))) {
+ if ($args[$i+1] == 'd') {
+ $do_files = false;
+ } else {
+ $do_dirs = false;
+ }
+ }
+ $i++;
+ break;
+ case '-name':
+ $name = preg_quote($args[$i+1], '#');
+ // our magic characters ? and * have just been escaped,
+ // so now we change the escaped versions to PCRE operators
+ $name = strtr($name, array('\?' => '.', '\*' => '.*'));
+ $patterns[] = '('.$name.')';
+ $i++;
+ break;
+ case '-maxdepth':
+ $depth = $args[$i+1];
+ break;
+ }
+ }
+ $path = System::_dirToStruct($dir, $depth, 0, true);
+ if ($do_files && $do_dirs) {
+ $files = array_merge($path['files'], $path['dirs']);
+ } elseif ($do_dirs) {
+ $files = $path['dirs'];
+ } else {
+ $files = $path['files'];
+ }
+ if (count($patterns)) {
+ $dsq = preg_quote(DIRECTORY_SEPARATOR, '#');
+ $pattern = '#(^|'.$dsq.')'.implode('|', $patterns).'($|'.$dsq.')#';
+ $ret = array();
+ $files_count = count($files);
+ for ($i = 0; $i < $files_count; $i++) {
+ // only search in the part of the file below the current directory
+ $filepart = basename($files[$i]);
+ if (preg_match($pattern, $filepart)) {
+ $ret[] = $files[$i];
+ }
+ }
+ return $ret;
+ }
+ return $files;
+ }
+}
diff --git a/www/wiki/vendor/pear/pear_exception/LICENSE b/www/wiki/vendor/pear/pear_exception/LICENSE
new file mode 100644
index 00000000..a00a2421
--- /dev/null
+++ b/www/wiki/vendor/pear/pear_exception/LICENSE
@@ -0,0 +1,27 @@
+Copyright (c) 1997-2009,
+ Stig Bakken <ssb@php.net>,
+ Gregory Beaver <cellog@php.net>,
+ Helgi Þormar Þorbjörnsson <helgi@php.net>,
+ Tomas V.V.Cox <cox@idecnet.com>,
+ Martin Jansen <mj@php.net>.
+All rights reserved.
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions are met:
+
+ * Redistributions of source code must retain the above copyright notice,
+ this list of conditions and the following disclaimer.
+ * Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
+FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/www/wiki/vendor/pear/pear_exception/PEAR/Exception.php b/www/wiki/vendor/pear/pear_exception/PEAR/Exception.php
new file mode 100644
index 00000000..5abf4f84
--- /dev/null
+++ b/www/wiki/vendor/pear/pear_exception/PEAR/Exception.php
@@ -0,0 +1,456 @@
+<?php
+/* vim: set expandtab tabstop=4 shiftwidth=4 foldmethod=marker: */
+/**
+ * PEAR_Exception
+ *
+ * PHP version 5
+ *
+ * @category PEAR
+ * @package PEAR_Exception
+ * @author Tomas V. V. Cox <cox@idecnet.com>
+ * @author Hans Lellelid <hans@velum.net>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @link http://pear.php.net/package/PEAR_Exception
+ * @since File available since Release 1.0.0
+ */
+
+
+/**
+ * Base PEAR_Exception Class
+ *
+ * 1) Features:
+ *
+ * - Nestable exceptions (throw new PEAR_Exception($msg, $prev_exception))
+ * - Definable triggers, shot when exceptions occur
+ * - Pretty and informative error messages
+ * - Added more context info available (like class, method or cause)
+ * - cause can be a PEAR_Exception or an array of mixed
+ * PEAR_Exceptions/PEAR_ErrorStack warnings
+ * - callbacks for specific exception classes and their children
+ *
+ * 2) Ideas:
+ *
+ * - Maybe a way to define a 'template' for the output
+ *
+ * 3) Inherited properties from PHP Exception Class:
+ *
+ * protected $message
+ * protected $code
+ * protected $line
+ * protected $file
+ * private $trace
+ *
+ * 4) Inherited methods from PHP Exception Class:
+ *
+ * __clone
+ * __construct
+ * getMessage
+ * getCode
+ * getFile
+ * getLine
+ * getTraceSafe
+ * getTraceSafeAsString
+ * __toString
+ *
+ * 5) Usage example
+ *
+ * <code>
+ * require_once 'PEAR/Exception.php';
+ *
+ * class Test {
+ * function foo() {
+ * throw new PEAR_Exception('Error Message', ERROR_CODE);
+ * }
+ * }
+ *
+ * function myLogger($pear_exception) {
+ * echo $pear_exception->getMessage();
+ * }
+ * // each time a exception is thrown the 'myLogger' will be called
+ * // (its use is completely optional)
+ * PEAR_Exception::addObserver('myLogger');
+ * $test = new Test;
+ * try {
+ * $test->foo();
+ * } catch (PEAR_Exception $e) {
+ * print $e;
+ * }
+ * </code>
+ *
+ * @category PEAR
+ * @package PEAR_Exception
+ * @author Tomas V.V.Cox <cox@idecnet.com>
+ * @author Hans Lellelid <hans@velum.net>
+ * @author Bertrand Mansion <bmansion@mamasam.com>
+ * @author Greg Beaver <cellog@php.net>
+ * @copyright 1997-2009 The Authors
+ * @license http://opensource.org/licenses/bsd-license.php New BSD License
+ * @version Release: @package_version@
+ * @link http://pear.php.net/package/PEAR_Exception
+ * @since Class available since Release 1.0.0
+ */
+class PEAR_Exception extends Exception
+{
+ const OBSERVER_PRINT = -2;
+ const OBSERVER_TRIGGER = -4;
+ const OBSERVER_DIE = -8;
+ protected $cause;
+ private static $_observers = array();
+ private static $_uniqueid = 0;
+ private $_trace;
+
+ /**
+ * Supported signatures:
+ * - PEAR_Exception(string $message);
+ * - PEAR_Exception(string $message, int $code);
+ * - PEAR_Exception(string $message, Exception $cause);
+ * - PEAR_Exception(string $message, Exception $cause, int $code);
+ * - PEAR_Exception(string $message, PEAR_Error $cause);
+ * - PEAR_Exception(string $message, PEAR_Error $cause, int $code);
+ * - PEAR_Exception(string $message, array $causes);
+ * - PEAR_Exception(string $message, array $causes, int $code);
+ *
+ * @param string $message exception message
+ * @param int|Exception|PEAR_Error|array|null $p2 exception cause
+ * @param int|null $p3 exception code or null
+ */
+ public function __construct($message, $p2 = null, $p3 = null)
+ {
+ if (is_int($p2)) {
+ $code = $p2;
+ $this->cause = null;
+ } elseif (is_object($p2) || is_array($p2)) {
+ // using is_object allows both Exception and PEAR_Error
+ if (is_object($p2) && !($p2 instanceof Exception)) {
+ if (!class_exists('PEAR_Error') || !($p2 instanceof PEAR_Error)) {
+ throw new PEAR_Exception(
+ 'exception cause must be Exception, ' .
+ 'array, or PEAR_Error'
+ );
+ }
+ }
+ $code = $p3;
+ if (is_array($p2) && isset($p2['message'])) {
+ // fix potential problem of passing in a single warning
+ $p2 = array($p2);
+ }
+ $this->cause = $p2;
+ } else {
+ $code = null;
+ $this->cause = null;
+ }
+ parent::__construct($message, $code);
+ $this->signal();
+ }
+
+ /**
+ * Add an exception observer
+ *
+ * @param mixed $callback - A valid php callback, see php func is_callable()
+ * - A PEAR_Exception::OBSERVER_* constant
+ * - An array(const PEAR_Exception::OBSERVER_*,
+ * mixed $options)
+ * @param string $label The name of the observer. Use this if you want
+ * to remove it later with removeObserver()
+ *
+ * @return void
+ */
+ public static function addObserver($callback, $label = 'default')
+ {
+ self::$_observers[$label] = $callback;
+ }
+
+ /**
+ * Remove an exception observer
+ *
+ * @param string $label Name of the observer
+ *
+ * @return void
+ */
+ public static function removeObserver($label = 'default')
+ {
+ unset(self::$_observers[$label]);
+ }
+
+ /**
+ * Generate a unique ID for an observer
+ *
+ * @return int unique identifier for an observer
+ */
+ public static function getUniqueId()
+ {
+ return self::$_uniqueid++;
+ }
+
+ /**
+ * Send a signal to all observers
+ *
+ * @return void
+ */
+ protected function signal()
+ {
+ foreach (self::$_observers as $func) {
+ if (is_callable($func)) {
+ call_user_func($func, $this);
+ continue;
+ }
+ settype($func, 'array');
+ switch ($func[0]) {
+ case self::OBSERVER_PRINT :
+ $f = (isset($func[1])) ? $func[1] : '%s';
+ printf($f, $this->getMessage());
+ break;
+ case self::OBSERVER_TRIGGER :
+ $f = (isset($func[1])) ? $func[1] : E_USER_NOTICE;
+ trigger_error($this->getMessage(), $f);
+ break;
+ case self::OBSERVER_DIE :
+ $f = (isset($func[1])) ? $func[1] : '%s';
+ die(printf($f, $this->getMessage()));
+ break;
+ default:
+ trigger_error('invalid observer type', E_USER_WARNING);
+ }
+ }
+ }
+
+ /**
+ * Return specific error information that can be used for more detailed
+ * error messages or translation.
+ *
+ * This method may be overridden in child exception classes in order
+ * to add functionality not present in PEAR_Exception and is a placeholder
+ * to define API
+ *
+ * The returned array must be an associative array of parameter => value like so:
+ * <pre>
+ * array('name' => $name, 'context' => array(...))
+ * </pre>
+ *
+ * @return array
+ */
+ public function getErrorData()
+ {
+ return array();
+ }
+
+ /**
+ * Returns the exception that caused this exception to be thrown
+ *
+ * @return Exception|array The context of the exception
+ */
+ public function getCause()
+ {
+ return $this->cause;
+ }
+
+ /**
+ * Function must be public to call on caused exceptions
+ *
+ * @param array $causes Array that gets filled.
+ *
+ * @return void
+ */
+ public function getCauseMessage(&$causes)
+ {
+ $trace = $this->getTraceSafe();
+ $cause = array('class' => get_class($this),
+ 'message' => $this->message,
+ 'file' => 'unknown',
+ 'line' => 'unknown');
+ if (isset($trace[0])) {
+ if (isset($trace[0]['file'])) {
+ $cause['file'] = $trace[0]['file'];
+ $cause['line'] = $trace[0]['line'];
+ }
+ }
+ $causes[] = $cause;
+ if ($this->cause instanceof PEAR_Exception) {
+ $this->cause->getCauseMessage($causes);
+ } elseif ($this->cause instanceof Exception) {
+ $causes[] = array('class' => get_class($this->cause),
+ 'message' => $this->cause->getMessage(),
+ 'file' => $this->cause->getFile(),
+ 'line' => $this->cause->getLine());
+ } elseif (class_exists('PEAR_Error') && $this->cause instanceof PEAR_Error) {
+ $causes[] = array('class' => get_class($this->cause),
+ 'message' => $this->cause->getMessage(),
+ 'file' => 'unknown',
+ 'line' => 'unknown');
+ } elseif (is_array($this->cause)) {
+ foreach ($this->cause as $cause) {
+ if ($cause instanceof PEAR_Exception) {
+ $cause->getCauseMessage($causes);
+ } elseif ($cause instanceof Exception) {
+ $causes[] = array('class' => get_class($cause),
+ 'message' => $cause->getMessage(),
+ 'file' => $cause->getFile(),
+ 'line' => $cause->getLine());
+ } elseif (class_exists('PEAR_Error')
+ && $cause instanceof PEAR_Error
+ ) {
+ $causes[] = array('class' => get_class($cause),
+ 'message' => $cause->getMessage(),
+ 'file' => 'unknown',
+ 'line' => 'unknown');
+ } elseif (is_array($cause) && isset($cause['message'])) {
+ // PEAR_ErrorStack warning
+ $causes[] = array(
+ 'class' => $cause['package'],
+ 'message' => $cause['message'],
+ 'file' => isset($cause['context']['file']) ?
+ $cause['context']['file'] :
+ 'unknown',
+ 'line' => isset($cause['context']['line']) ?
+ $cause['context']['line'] :
+ 'unknown',
+ );
+ }
+ }
+ }
+ }
+
+ /**
+ * Build a backtrace and return it
+ *
+ * @return array Backtrace
+ */
+ public function getTraceSafe()
+ {
+ if (!isset($this->_trace)) {
+ $this->_trace = $this->getTrace();
+ if (empty($this->_trace)) {
+ $backtrace = debug_backtrace();
+ $this->_trace = array($backtrace[count($backtrace)-1]);
+ }
+ }
+ return $this->_trace;
+ }
+
+ /**
+ * Gets the first class of the backtrace
+ *
+ * @return string Class name
+ */
+ public function getErrorClass()
+ {
+ $trace = $this->getTraceSafe();
+ return $trace[0]['class'];
+ }
+
+ /**
+ * Gets the first method of the backtrace
+ *
+ * @return string Method/function name
+ */
+ public function getErrorMethod()
+ {
+ $trace = $this->getTraceSafe();
+ return $trace[0]['function'];
+ }
+
+ /**
+ * Converts the exception to a string (HTML or plain text)
+ *
+ * @return string String representation
+ *
+ * @see toHtml()
+ * @see toText()
+ */
+ public function __toString()
+ {
+ if (isset($_SERVER['REQUEST_URI'])) {
+ return $this->toHtml();
+ }
+ return $this->toText();
+ }
+
+ /**
+ * Generates a HTML representation of the exception
+ *
+ * @return string HTML code
+ */
+ public function toHtml()
+ {
+ $trace = $this->getTraceSafe();
+ $causes = array();
+ $this->getCauseMessage($causes);
+ $html = '<table style="border: 1px" cellspacing="0">' . "\n";
+ foreach ($causes as $i => $cause) {
+ $html .= '<tr><td colspan="3" style="background: #ff9999">'
+ . str_repeat('-', $i) . ' <b>' . $cause['class'] . '</b>: '
+ . htmlspecialchars($cause['message'])
+ . ' in <b>' . $cause['file'] . '</b> '
+ . 'on line <b>' . $cause['line'] . '</b>'
+ . "</td></tr>\n";
+ }
+ $html .= '<tr><td colspan="3" style="background-color: #aaaaaa; text-align: center; font-weight: bold;">Exception trace</td></tr>' . "\n"
+ . '<tr><td style="text-align: center; background: #cccccc; width:20px; font-weight: bold;">#</td>'
+ . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Function</td>'
+ . '<td style="text-align: center; background: #cccccc; font-weight: bold;">Location</td></tr>' . "\n";
+
+ foreach ($trace as $k => $v) {
+ $html .= '<tr><td style="text-align: center;">' . $k . '</td>'
+ . '<td>';
+ if (!empty($v['class'])) {
+ $html .= $v['class'] . $v['type'];
+ }
+ $html .= $v['function'];
+ $args = array();
+ if (!empty($v['args'])) {
+ foreach ($v['args'] as $arg) {
+ if (is_null($arg)) {
+ $args[] = 'null';
+ } else if (is_array($arg)) {
+ $args[] = 'Array';
+ } else if (is_object($arg)) {
+ $args[] = 'Object('.get_class($arg).')';
+ } else if (is_bool($arg)) {
+ $args[] = $arg ? 'true' : 'false';
+ } else if (is_int($arg) || is_double($arg)) {
+ $args[] = $arg;
+ } else {
+ $arg = (string)$arg;
+ $str = htmlspecialchars(substr($arg, 0, 16));
+ if (strlen($arg) > 16) {
+ $str .= '&hellip;';
+ }
+ $args[] = "'" . $str . "'";
+ }
+ }
+ }
+ $html .= '(' . implode(', ', $args) . ')'
+ . '</td>'
+ . '<td>' . (isset($v['file']) ? $v['file'] : 'unknown')
+ . ':' . (isset($v['line']) ? $v['line'] : 'unknown')
+ . '</td></tr>' . "\n";
+ }
+ $html .= '<tr><td style="text-align: center;">' . ($k+1) . '</td>'
+ . '<td>{main}</td>'
+ . '<td>&nbsp;</td></tr>' . "\n"
+ . '</table>';
+ return $html;
+ }
+
+ /**
+ * Generates text representation of the exception and stack trace
+ *
+ * @return string
+ */
+ public function toText()
+ {
+ $causes = array();
+ $this->getCauseMessage($causes);
+ $causeMsg = '';
+ foreach ($causes as $i => $cause) {
+ $causeMsg .= str_repeat(' ', $i) . $cause['class'] . ': '
+ . $cause['message'] . ' in ' . $cause['file']
+ . ' on line ' . $cause['line'] . "\n";
+ }
+ return $causeMsg . $this->getTraceAsString();
+ }
+}
+?>
diff --git a/www/wiki/vendor/pear/pear_exception/composer.json b/www/wiki/vendor/pear/pear_exception/composer.json
new file mode 100644
index 00000000..ce33ed1c
--- /dev/null
+++ b/www/wiki/vendor/pear/pear_exception/composer.json
@@ -0,0 +1,43 @@
+{
+ "name": "pear/pear_exception",
+ "description": "The PEAR Exception base class.",
+ "type": "class",
+ "keywords": [
+ "exception"
+ ],
+ "homepage": "https://github.com/pear/PEAR_Exception",
+ "license": "BSD-2-Clause",
+ "authors": [
+ {
+ "name": "Helgi Thormar",
+ "email": "dufuz@php.net"
+ },
+ {
+ "name": "Greg Beaver",
+ "email": "cellog@php.net"
+ }
+ ],
+ "require": {
+ "php": ">=4.4.0"
+ },
+ "autoload": {
+ "psr-0": {
+ "PEAR": ""
+ }
+ },
+ "extra": {
+ "branch-alias": {
+ "dev-master": "1.0.x-dev"
+ }
+ },
+ "include-path": [
+ "."
+ ],
+ "support": {
+ "issues": "http://pear.php.net/bugs/search.php?cmd=display&package_name[]=PEAR_Exception",
+ "source": "https://github.com/pear/PEAR_Exception"
+ },
+ "require-dev": {
+ "phpunit/phpunit": "*"
+ }
+}
diff --git a/www/wiki/vendor/pear/pear_exception/package.xml b/www/wiki/vendor/pear/pear_exception/package.xml
new file mode 100644
index 00000000..98290c6a
--- /dev/null
+++ b/www/wiki/vendor/pear/pear_exception/package.xml
@@ -0,0 +1,120 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<package packagerversion="1.9.4" version="2.0"
+ xmlns="http://pear.php.net/dtd/package-2.0"
+ xmlns:tasks="http://pear.php.net/dtd/tasks-1.0"
+ xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+ xsi:schemaLocation="http://pear.php.net/dtd/tasks-1.0 http://pear.php.net/dtd/tasks-1.0.xsd http://pear.php.net/dtd/package-2.0 http://pear.php.net/dtd/package-2.0.xsd"
+>
+ <name>PEAR_Exception</name>
+ <channel>pear.php.net</channel>
+ <summary>The PEAR Exception base class</summary>
+ <description>PEAR_Exception PHP5 error handling mechanism</description>
+
+ <lead>
+ <name>Christian Weiske</name>
+ <user>cweiske</user>
+ <email>cweiske@php.net</email>
+ <active>yes</active>
+ </lead>
+ <lead>
+ <name>Helgi Thormar</name>
+ <user>dufuz</user>
+ <email>dufuz@php.net</email>
+ <active>no</active>
+ </lead>
+ <developer>
+ <name>Greg Beaver</name>
+ <user>cellog</user>
+ <email>cellog@php.net</email>
+ <active>no</active>
+ </developer>
+
+ <date>2015-02-10</date>
+ <time>21:02:23</time>
+ <version>
+ <release>1.0.0</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <license uri="http://opensource.org/licenses/bsd-license.php">New BSD License</license>
+ <notes>
+ This package was split out from the PEAR package.
+ If you use PEAR_Exception in your package and use nothing from the PEAR package
+ then it's better to depend on just PEAR_Exception.
+ </notes>
+ <contents>
+ <dir name="/">
+ <file name="/PEAR/Exception.php" role="php">
+ <tasks:replace from="@package_version@" to="version" type="package-info" />
+ </file>
+ <dir name="tests">
+ <dir name="PEAR">
+ <file name="ExceptionTest.php" role="test"/>
+ </dir>
+ </dir>
+ </dir>
+ </contents>
+
+ <dependencies>
+ <required>
+ <php>
+ <min>5.4.0</min>
+ </php>
+ <pearinstaller>
+ <min>1.9.5</min>
+ </pearinstaller>
+ </required>
+ </dependencies>
+
+ <phprelease />
+
+ <changelog>
+ <release>
+ <version>
+ <release>1.0.0</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>stable</release>
+ <api>stable</api>
+ </stability>
+ <date>2015-02-10</date>
+ <license uri="http://opensource.org/licenses/bsd-license.php">New BSD License</license>
+ <notes>Release stable version</notes>
+ </release>
+
+ <release>
+ <version>
+ <release>1.0.0beta2</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2014-02-21</date>
+ <license uri="http://opensource.org/licenses/bsd-license.php">New BSD License</license>
+ <notes>Bump up PEAR dependency.</notes>
+ </release>
+
+ <release>
+ <version>
+ <release>1.0.0beta1</release>
+ <api>1.0.0</api>
+ </version>
+ <stability>
+ <release>beta</release>
+ <api>stable</api>
+ </stability>
+ <date>2012-05-10</date>
+ <license uri="http://opensource.org/licenses/bsd-license.php">New BSD License</license>
+ <notes>
+This packge was split out from the PEAR package. If you use PEAR_Exception in your package
+and use nothing from the PEAR package then it&apos;s better to depend on just PEAR_Exception.
+ </notes>
+ </release>
+ </changelog>
+</package>
diff --git a/www/wiki/vendor/pear/pear_exception/tests/PEAR/ExceptionTest.php b/www/wiki/vendor/pear/pear_exception/tests/PEAR/ExceptionTest.php
new file mode 100644
index 00000000..61d2df4f
--- /dev/null
+++ b/www/wiki/vendor/pear/pear_exception/tests/PEAR/ExceptionTest.php
@@ -0,0 +1,78 @@
+<?php
+$localFile = __DIR__ . '/../../PEAR/Exception.php';
+if (file_exists($localFile)) {
+ require_once $localFile;
+} else {
+ require_once 'PEAR/Exception.php';
+}
+
+class PEAR_ExceptionTest extends PHPUnit_Framework_TestCase
+{
+ /**
+ * @expectedException PEAR_Exception
+ * @expectedExceptionMessage foo
+ */
+ public function testThrow()
+ {
+ throw new PEAR_Exception('foo');
+ }
+
+ public function testGetCauseNone()
+ {
+ $e = new PEAR_Exception('foo bar');
+ $this->assertNull($e->getCause());
+ }
+
+ public function testGetCauseException()
+ {
+ $cause = new Exception('foo bar');
+ $e = new PEAR_Exception('I caught an exception', $cause);
+ $this->assertNotNull($e->getCause());
+ $this->assertInstanceOf('Exception', $e->getCause());
+ $this->assertEquals($cause, $e->getCause());
+ }
+
+ public function testGetCauseMessage()
+ {
+ $cause = new Exception('foo bar');
+ $e = new PEAR_Exception('I caught an exception', $cause);
+
+ $e->getCauseMessage($causes);
+ $this->assertEquals('I caught an exception', $causes[0]['message']);
+ $this->assertEquals('foo bar', $causes[1]['message']);
+ }
+
+ public function testGetTraceSafe()
+ {
+ $e = new PEAR_Exception('oops');
+ $this->assertInternalType('array', $e->getTraceSafe());
+ }
+
+ public function testGetErrorClass()
+ {
+ $e = new PEAR_Exception('oops');
+ $this->assertEquals('PEAR_ExceptionTest', $e->getErrorClass());
+ }
+
+ public function testGetErrorMethod()
+ {
+ $e = new PEAR_Exception('oops');
+ $this->assertEquals('testGetErrorMethod', $e->getErrorMethod());
+ }
+
+ public function test__toString()
+ {
+ $e = new PEAR_Exception('oops');
+ $this->assertInternalType('string', (string) $e);
+ $this->assertContains('oops', (string) $e);
+ }
+
+ public function testToHtml()
+ {
+ $e = new PEAR_Exception('oops');
+ $html = $e->toHtml();
+ $this->assertInternalType('string', $html);
+ $this->assertContains('oops', $html);
+ }
+}
+?>