These results are based on our legacy PHP analysis, consider migrating to our new PHP analysis engine instead. Learn more
1 | <?php |
||
2 | /** |
||
3 | * PHPMailer - PHP email creation and transport class. |
||
4 | * PHP Version 5.4 |
||
5 | * @package PHPMailer |
||
6 | * @link https://github.com/PHPMailer/PHPMailer/ The PHPMailer GitHub project |
||
7 | * @author Marcus Bointon (Synchro/coolbru) <[email protected]> |
||
8 | * @author Jim Jagielski (jimjag) <[email protected]> |
||
9 | * @author Andy Prevost (codeworxtech) <[email protected]> |
||
10 | * @author Brent R. Matzelle (original founder) |
||
11 | * @copyright 2012 - 2014 Marcus Bointon |
||
12 | * @copyright 2010 - 2012 Jim Jagielski |
||
13 | * @copyright 2004 - 2009 Andy Prevost |
||
14 | * @license http://www.gnu.org/copyleft/lesser.html GNU Lesser General Public License |
||
15 | * @note This program is distributed in the hope that it will be useful - WITHOUT |
||
16 | * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or |
||
17 | * FITNESS FOR A PARTICULAR PURPOSE. |
||
18 | */ |
||
19 | |||
20 | /** |
||
21 | * PHPMailerOAuth - PHPMailer subclass adding OAuth support. |
||
22 | * @package PHPMailer |
||
23 | * @author @sherryl4george |
||
24 | * @author Marcus Bointon (@Synchro) <[email protected]> |
||
25 | */ |
||
26 | class PHPMailerOAuth extends PHPMailer |
||
27 | { |
||
28 | /** |
||
29 | * The OAuth user's email address |
||
30 | * @var string |
||
31 | */ |
||
32 | public $oauthUserEmail = ''; |
||
33 | |||
34 | /** |
||
35 | * The OAuth refresh token |
||
36 | * @var string |
||
37 | */ |
||
38 | public $oauthRefreshToken = ''; |
||
39 | |||
40 | /** |
||
41 | * The OAuth client ID |
||
42 | * @var string |
||
43 | */ |
||
44 | public $oauthClientId = ''; |
||
45 | |||
46 | /** |
||
47 | * The OAuth client secret |
||
48 | * @var string |
||
49 | */ |
||
50 | public $oauthClientSecret = ''; |
||
51 | |||
52 | /** |
||
53 | * An instance of the PHPMailerOAuthGoogle class. |
||
54 | * @var PHPMailerOAuthGoogle |
||
55 | * @access protected |
||
56 | */ |
||
57 | protected $oauth = null; |
||
58 | |||
59 | /** |
||
60 | * Get a PHPMailerOAuthGoogle instance to use. |
||
61 | * @return PHPMailerOAuthGoogle |
||
62 | */ |
||
63 | public function getOAUTHInstance() |
||
64 | { |
||
65 | if (!is_object($this->oauth)) { |
||
66 | $this->oauth = new PHPMailerOAuthGoogle( |
||
67 | $this->oauthUserEmail, |
||
68 | $this->oauthClientSecret, |
||
69 | $this->oauthClientId, |
||
70 | $this->oauthRefreshToken |
||
71 | ); |
||
72 | } |
||
73 | return $this->oauth; |
||
74 | } |
||
75 | |||
76 | /** |
||
77 | * Initiate a connection to an SMTP server. |
||
78 | * Overrides the original smtpConnect method to add support for OAuth. |
||
79 | * @param array $options An array of options compatible with stream_context_create() |
||
80 | * @uses SMTP |
||
81 | * @access public |
||
82 | * @return bool |
||
83 | */ |
||
84 | public function smtpConnect($options = array()) |
||
0 ignored issues
–
show
|
|||
85 | { |
||
86 | if (is_null($this->smtp)) { |
||
87 | $this->smtp = $this->getSMTPInstance(); |
||
88 | } |
||
89 | |||
90 | if (is_null($this->oauth)) { |
||
91 | $this->oauth = $this->getOAUTHInstance(); |
||
92 | } |
||
93 | |||
94 | // Already connected? |
||
95 | if ($this->smtp->connected()) { |
||
96 | return true; |
||
97 | } |
||
98 | |||
99 | $this->smtp->setTimeout($this->Timeout); |
||
100 | $this->smtp->setDebugLevel($this->SMTPDebug); |
||
101 | $this->smtp->setDebugOutput($this->Debugoutput); |
||
102 | $this->smtp->setVerp($this->do_verp); |
||
103 | $hosts = explode(';', $this->Host); |
||
104 | $lastexception = null; |
||
105 | |||
106 | foreach ($hosts as $hostentry) { |
||
107 | $hostinfo = array(); |
||
108 | if (!preg_match('/^((ssl|tls):\/\/)*([a-zA-Z0-9\.-]*):?([0-9]*)$/', trim($hostentry), $hostinfo)) { |
||
109 | // Not a valid host entry |
||
110 | continue; |
||
111 | } |
||
112 | // $hostinfo[2]: optional ssl or tls prefix |
||
113 | // $hostinfo[3]: the hostname |
||
114 | // $hostinfo[4]: optional port number |
||
115 | // The host string prefix can temporarily override the current setting for SMTPSecure |
||
116 | // If it's not specified, the default value is used |
||
117 | $prefix = ''; |
||
118 | $secure = $this->SMTPSecure; |
||
119 | $tls = ($this->SMTPSecure == 'tls'); |
||
120 | if ('ssl' == $hostinfo[2] or ('' == $hostinfo[2] and 'ssl' == $this->SMTPSecure)) { |
||
121 | $prefix = 'ssl://'; |
||
122 | $tls = false; // Can't have SSL and TLS at the same time |
||
123 | $secure = 'ssl'; |
||
124 | } elseif ($hostinfo[2] == 'tls') { |
||
125 | $tls = true; |
||
126 | // tls doesn't use a prefix |
||
127 | $secure = 'tls'; |
||
128 | } |
||
129 | //Do we need the OpenSSL extension? |
||
130 | $sslext = defined('OPENSSL_ALGO_SHA1'); |
||
131 | if ('tls' === $secure or 'ssl' === $secure) { |
||
132 | //Check for an OpenSSL constant rather than using extension_loaded, which is sometimes disabled |
||
133 | if (!$sslext) { |
||
134 | throw new phpmailerException($this->lang('extension_missing').'openssl', self::STOP_CRITICAL); |
||
135 | } |
||
136 | } |
||
137 | $host = $hostinfo[3]; |
||
138 | $port = $this->Port; |
||
139 | $tport = (integer)$hostinfo[4]; |
||
140 | if ($tport > 0 and $tport < 65536) { |
||
141 | $port = $tport; |
||
142 | } |
||
143 | if ($this->smtp->connect($prefix . $host, $port, $this->Timeout, $options)) { |
||
144 | try { |
||
145 | if ($this->Helo) { |
||
146 | $hello = $this->Helo; |
||
147 | } else { |
||
148 | $hello = $this->serverHostname(); |
||
149 | } |
||
150 | $this->smtp->hello($hello); |
||
151 | //Automatically enable TLS encryption if: |
||
152 | // * it's not disabled |
||
153 | // * we have openssl extension |
||
154 | // * we are not already using SSL |
||
155 | // * the server offers STARTTLS |
||
156 | if ($this->SMTPAutoTLS and $sslext and $secure != 'ssl' and $this->smtp->getServerExt('STARTTLS')) { |
||
157 | $tls = true; |
||
158 | } |
||
159 | if ($tls) { |
||
160 | if (!$this->smtp->startTLS()) { |
||
161 | throw new phpmailerException($this->lang('connect_host')); |
||
162 | } |
||
163 | // We must resend HELO after tls negotiation |
||
164 | $this->smtp->hello($hello); |
||
165 | } |
||
166 | if ($this->SMTPAuth) { |
||
167 | if (!$this->smtp->authenticate( |
||
168 | $this->Username, |
||
169 | $this->Password, |
||
170 | $this->AuthType, |
||
171 | $this->Realm, |
||
172 | $this->Workstation, |
||
173 | $this->oauth |
||
0 ignored issues
–
show
$this->oauth is of type object<PHPMailerOAuthGoogle> , but the function expects a null|object<OAuth> .
It seems like the type of the argument is not accepted by the function/method which you are calling. In some cases, in particular if PHP’s automatic type-juggling kicks in this might be fine. In other cases, however this might be a bug. We suggest to add an explicit type cast like in the following example: function acceptsInteger($int) { }
$x = '123'; // string "123"
// Instead of
acceptsInteger($x);
// we recommend to use
acceptsInteger((integer) $x);
Loading history...
|
|||
174 | ) |
||
175 | ) { |
||
176 | throw new phpmailerException($this->lang('authenticate')); |
||
177 | } |
||
178 | } |
||
179 | return true; |
||
180 | } catch (phpmailerException $exc) { |
||
181 | $lastexception = $exc; |
||
182 | $this->edebug($exc->getMessage()); |
||
183 | // We must have connected, but then failed TLS or Auth, so close connection nicely |
||
184 | $this->smtp->quit(); |
||
185 | } |
||
186 | } |
||
187 | } |
||
188 | // If we get here, all connection attempts have failed, so close connection hard |
||
189 | $this->smtp->close(); |
||
190 | // As we've caught all exceptions, just report whatever the last one was |
||
191 | if ($this->exceptions and !is_null($lastexception)) { |
||
192 | throw $lastexception; |
||
193 | } |
||
194 | return false; |
||
195 | } |
||
196 | } |
||
197 |
A high number of execution paths generally suggests many nested conditional statements and make the code less readible. This can usually be fixed by splitting the method into several smaller methods.
You can also find more information in the “Code” section of your repository.