Completed
Branch develop (37f7b7)
by
unknown
24:41
created
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/OpenDKIMSigner.php 1 patch
Indentation   +162 added lines, -162 removed lines patch added patch discarded remove patch
@@ -18,166 +18,166 @@
 block discarded – undo
18 18
  */
19 19
 class Swift_Signers_OpenDKIMSigner extends Swift_Signers_DKIMSigner
20 20
 {
21
-    private $peclLoaded = false;
22
-
23
-    private $dkimHandler = null;
24
-
25
-    private $dropFirstLF = true;
26
-
27
-    const CANON_RELAXED = 1;
28
-    const CANON_SIMPLE = 2;
29
-    const SIG_RSA_SHA1 = 3;
30
-    const SIG_RSA_SHA256 = 4;
31
-
32
-    public function __construct($privateKey, $domainName, $selector)
33
-    {
34
-        if (!\extension_loaded('opendkim')) {
35
-            throw new Swift_SwiftException('php-opendkim extension not found');
36
-        }
37
-
38
-        $this->peclLoaded = true;
39
-
40
-        parent::__construct($privateKey, $domainName, $selector);
41
-    }
42
-
43
-    public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
44
-    {
45
-        $header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature');
46
-        $headerVal = $this->dkimHandler->getSignatureHeader();
47
-        if (false === $headerVal || \is_int($headerVal)) {
48
-            throw new Swift_SwiftException('OpenDKIM Error: '.$this->dkimHandler->getError());
49
-        }
50
-        $header->setValue($headerVal);
51
-        $headers->set($header);
52
-
53
-        return $this;
54
-    }
55
-
56
-    public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
57
-    {
58
-        $hash = 'rsa-sha1' == $this->hashAlgorithm ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256;
59
-        $bodyCanon = 'simple' == $this->bodyCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
60
-        $headerCanon = 'simple' == $this->headerCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
61
-        $this->dkimHandler = new OpenDKIMSign($this->privateKey, $this->selector, $this->domainName, $headerCanon, $bodyCanon, $hash, -1);
62
-        // Hardcode signature Margin for now
63
-        $this->dkimHandler->setMargin(78);
64
-
65
-        if (!is_numeric($this->signatureTimestamp)) {
66
-            OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, time());
67
-        } else {
68
-            if (!OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, $this->signatureTimestamp)) {
69
-                throw new Swift_SwiftException('Unable to force signature timestamp ['.openssl_error_string().']');
70
-            }
71
-        }
72
-        if (isset($this->signerIdentity)) {
73
-            $this->dkimHandler->setSigner($this->signerIdentity);
74
-        }
75
-        $listHeaders = $headers->listAll();
76
-        foreach ($listHeaders as $hName) {
77
-            // Check if we need to ignore Header
78
-            if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
79
-                $tmp = $headers->getAll($hName);
80
-                if ($headers->has($hName)) {
81
-                    foreach ($tmp as $header) {
82
-                        if ('' != $header->getFieldBody()) {
83
-                            $htosign = $header->toString();
84
-                            $this->dkimHandler->header($htosign);
85
-                            $this->signedHeaders[] = $header->getFieldName();
86
-                        }
87
-                    }
88
-                }
89
-            }
90
-        }
91
-
92
-        return $this;
93
-    }
94
-
95
-    public function startBody()
96
-    {
97
-        if (!$this->peclLoaded) {
98
-            return parent::startBody();
99
-        }
100
-        $this->dropFirstLF = true;
101
-        $this->dkimHandler->eoh();
102
-
103
-        return $this;
104
-    }
105
-
106
-    public function endBody()
107
-    {
108
-        if (!$this->peclLoaded) {
109
-            return parent::endBody();
110
-        }
111
-        $this->dkimHandler->eom();
112
-
113
-        return $this;
114
-    }
115
-
116
-    public function reset()
117
-    {
118
-        $this->dkimHandler = null;
119
-        parent::reset();
120
-
121
-        return $this;
122
-    }
123
-
124
-    /**
125
-     * Set the signature timestamp.
126
-     *
127
-     * @param int $time
128
-     *
129
-     * @return $this
130
-     */
131
-    public function setSignatureTimestamp($time)
132
-    {
133
-        $this->signatureTimestamp = $time;
134
-
135
-        return $this;
136
-    }
137
-
138
-    /**
139
-     * Set the signature expiration timestamp.
140
-     *
141
-     * @param int $time
142
-     *
143
-     * @return $this
144
-     */
145
-    public function setSignatureExpiration($time)
146
-    {
147
-        $this->signatureExpiration = $time;
148
-
149
-        return $this;
150
-    }
151
-
152
-    /**
153
-     * Enable / disable the DebugHeaders.
154
-     *
155
-     * @param bool $debug
156
-     *
157
-     * @return $this
158
-     */
159
-    public function setDebugHeaders($debug)
160
-    {
161
-        $this->debugHeaders = (bool) $debug;
162
-
163
-        return $this;
164
-    }
165
-
166
-    // Protected
167
-
168
-    protected function canonicalizeBody($string)
169
-    {
170
-        if (!$this->peclLoaded) {
171
-            return parent::canonicalizeBody($string);
172
-        }
173
-        if (true === $this->dropFirstLF) {
174
-            if ("\r" == $string[0] && "\n" == $string[1]) {
175
-                $string = substr($string, 2);
176
-            }
177
-        }
178
-        $this->dropFirstLF = false;
179
-        if (\strlen($string)) {
180
-            $this->dkimHandler->body($string);
181
-        }
182
-    }
21
+	private $peclLoaded = false;
22
+
23
+	private $dkimHandler = null;
24
+
25
+	private $dropFirstLF = true;
26
+
27
+	const CANON_RELAXED = 1;
28
+	const CANON_SIMPLE = 2;
29
+	const SIG_RSA_SHA1 = 3;
30
+	const SIG_RSA_SHA256 = 4;
31
+
32
+	public function __construct($privateKey, $domainName, $selector)
33
+	{
34
+		if (!\extension_loaded('opendkim')) {
35
+			throw new Swift_SwiftException('php-opendkim extension not found');
36
+		}
37
+
38
+		$this->peclLoaded = true;
39
+
40
+		parent::__construct($privateKey, $domainName, $selector);
41
+	}
42
+
43
+	public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
44
+	{
45
+		$header = new Swift_Mime_Headers_OpenDKIMHeader('DKIM-Signature');
46
+		$headerVal = $this->dkimHandler->getSignatureHeader();
47
+		if (false === $headerVal || \is_int($headerVal)) {
48
+			throw new Swift_SwiftException('OpenDKIM Error: '.$this->dkimHandler->getError());
49
+		}
50
+		$header->setValue($headerVal);
51
+		$headers->set($header);
52
+
53
+		return $this;
54
+	}
55
+
56
+	public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
57
+	{
58
+		$hash = 'rsa-sha1' == $this->hashAlgorithm ? OpenDKIMSign::ALG_RSASHA1 : OpenDKIMSign::ALG_RSASHA256;
59
+		$bodyCanon = 'simple' == $this->bodyCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
60
+		$headerCanon = 'simple' == $this->headerCanon ? OpenDKIMSign::CANON_SIMPLE : OpenDKIMSign::CANON_RELAXED;
61
+		$this->dkimHandler = new OpenDKIMSign($this->privateKey, $this->selector, $this->domainName, $headerCanon, $bodyCanon, $hash, -1);
62
+		// Hardcode signature Margin for now
63
+		$this->dkimHandler->setMargin(78);
64
+
65
+		if (!is_numeric($this->signatureTimestamp)) {
66
+			OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, time());
67
+		} else {
68
+			if (!OpenDKIM::setOption(OpenDKIM::OPTS_FIXEDTIME, $this->signatureTimestamp)) {
69
+				throw new Swift_SwiftException('Unable to force signature timestamp ['.openssl_error_string().']');
70
+			}
71
+		}
72
+		if (isset($this->signerIdentity)) {
73
+			$this->dkimHandler->setSigner($this->signerIdentity);
74
+		}
75
+		$listHeaders = $headers->listAll();
76
+		foreach ($listHeaders as $hName) {
77
+			// Check if we need to ignore Header
78
+			if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
79
+				$tmp = $headers->getAll($hName);
80
+				if ($headers->has($hName)) {
81
+					foreach ($tmp as $header) {
82
+						if ('' != $header->getFieldBody()) {
83
+							$htosign = $header->toString();
84
+							$this->dkimHandler->header($htosign);
85
+							$this->signedHeaders[] = $header->getFieldName();
86
+						}
87
+					}
88
+				}
89
+			}
90
+		}
91
+
92
+		return $this;
93
+	}
94
+
95
+	public function startBody()
96
+	{
97
+		if (!$this->peclLoaded) {
98
+			return parent::startBody();
99
+		}
100
+		$this->dropFirstLF = true;
101
+		$this->dkimHandler->eoh();
102
+
103
+		return $this;
104
+	}
105
+
106
+	public function endBody()
107
+	{
108
+		if (!$this->peclLoaded) {
109
+			return parent::endBody();
110
+		}
111
+		$this->dkimHandler->eom();
112
+
113
+		return $this;
114
+	}
115
+
116
+	public function reset()
117
+	{
118
+		$this->dkimHandler = null;
119
+		parent::reset();
120
+
121
+		return $this;
122
+	}
123
+
124
+	/**
125
+	 * Set the signature timestamp.
126
+	 *
127
+	 * @param int $time
128
+	 *
129
+	 * @return $this
130
+	 */
131
+	public function setSignatureTimestamp($time)
132
+	{
133
+		$this->signatureTimestamp = $time;
134
+
135
+		return $this;
136
+	}
137
+
138
+	/**
139
+	 * Set the signature expiration timestamp.
140
+	 *
141
+	 * @param int $time
142
+	 *
143
+	 * @return $this
144
+	 */
145
+	public function setSignatureExpiration($time)
146
+	{
147
+		$this->signatureExpiration = $time;
148
+
149
+		return $this;
150
+	}
151
+
152
+	/**
153
+	 * Enable / disable the DebugHeaders.
154
+	 *
155
+	 * @param bool $debug
156
+	 *
157
+	 * @return $this
158
+	 */
159
+	public function setDebugHeaders($debug)
160
+	{
161
+		$this->debugHeaders = (bool) $debug;
162
+
163
+		return $this;
164
+	}
165
+
166
+	// Protected
167
+
168
+	protected function canonicalizeBody($string)
169
+	{
170
+		if (!$this->peclLoaded) {
171
+			return parent::canonicalizeBody($string);
172
+		}
173
+		if (true === $this->dropFirstLF) {
174
+			if ("\r" == $string[0] && "\n" == $string[1]) {
175
+				$string = substr($string, 2);
176
+			}
177
+		}
178
+		$this->dropFirstLF = false;
179
+		if (\strlen($string)) {
180
+			$this->dkimHandler->body($string);
181
+		}
182
+	}
183 183
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/DomainKeySigner.php 1 patch
Indentation   +486 added lines, -486 removed lines patch added patch discarded remove patch
@@ -15,490 +15,490 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Signers_DomainKeySigner implements Swift_Signers_HeaderSigner
17 17
 {
18
-    /**
19
-     * PrivateKey.
20
-     *
21
-     * @var string
22
-     */
23
-    protected $privateKey;
24
-
25
-    /**
26
-     * DomainName.
27
-     *
28
-     * @var string
29
-     */
30
-    protected $domainName;
31
-
32
-    /**
33
-     * Selector.
34
-     *
35
-     * @var string
36
-     */
37
-    protected $selector;
38
-
39
-    /**
40
-     * Hash algorithm used.
41
-     *
42
-     * @var string
43
-     */
44
-    protected $hashAlgorithm = 'rsa-sha1';
45
-
46
-    /**
47
-     * Canonisation method.
48
-     *
49
-     * @var string
50
-     */
51
-    protected $canon = 'simple';
52
-
53
-    /**
54
-     * Headers not being signed.
55
-     *
56
-     * @var array
57
-     */
58
-    protected $ignoredHeaders = [];
59
-
60
-    /**
61
-     * Signer identity.
62
-     *
63
-     * @var string
64
-     */
65
-    protected $signerIdentity;
66
-
67
-    /**
68
-     * Must we embed signed headers?
69
-     *
70
-     * @var bool
71
-     */
72
-    protected $debugHeaders = false;
73
-
74
-    // work variables
75
-    /**
76
-     * Headers used to generate hash.
77
-     *
78
-     * @var array
79
-     */
80
-    private $signedHeaders = [];
81
-
82
-    /**
83
-     * Stores the signature header.
84
-     *
85
-     * @var Swift_Mime_Headers_ParameterizedHeader
86
-     */
87
-    protected $domainKeyHeader;
88
-
89
-    /**
90
-     * Hash Handler.
91
-     *
92
-     * @var resource|null
93
-     */
94
-    private $hashHandler;
95
-
96
-    private $canonData = '';
97
-
98
-    private $bodyCanonEmptyCounter = 0;
99
-
100
-    private $bodyCanonIgnoreStart = 2;
101
-
102
-    private $bodyCanonSpace = false;
103
-
104
-    private $bodyCanonLastChar = null;
105
-
106
-    private $bodyCanonLine = '';
107
-
108
-    private $bound = [];
109
-
110
-    /**
111
-     * Constructor.
112
-     *
113
-     * @param string $privateKey
114
-     * @param string $domainName
115
-     * @param string $selector
116
-     */
117
-    public function __construct($privateKey, $domainName, $selector)
118
-    {
119
-        $this->privateKey = $privateKey;
120
-        $this->domainName = $domainName;
121
-        $this->signerIdentity = '@'.$domainName;
122
-        $this->selector = $selector;
123
-    }
124
-
125
-    /**
126
-     * Resets internal states.
127
-     *
128
-     * @return $this
129
-     */
130
-    public function reset()
131
-    {
132
-        $this->hashHandler = null;
133
-        $this->bodyCanonIgnoreStart = 2;
134
-        $this->bodyCanonEmptyCounter = 0;
135
-        $this->bodyCanonLastChar = null;
136
-        $this->bodyCanonSpace = false;
137
-
138
-        return $this;
139
-    }
140
-
141
-    /**
142
-     * Writes $bytes to the end of the stream.
143
-     *
144
-     * Writing may not happen immediately if the stream chooses to buffer.  If
145
-     * you want to write these bytes with immediate effect, call {@link commit()}
146
-     * after calling write().
147
-     *
148
-     * This method returns the sequence ID of the write (i.e. 1 for first, 2 for
149
-     * second, etc etc).
150
-     *
151
-     * @param string $bytes
152
-     *
153
-     * @return int
154
-     *
155
-     * @throws Swift_IoException
156
-     *
157
-     * @return $this
158
-     */
159
-    public function write($bytes)
160
-    {
161
-        $this->canonicalizeBody($bytes);
162
-        foreach ($this->bound as $is) {
163
-            $is->write($bytes);
164
-        }
165
-
166
-        return $this;
167
-    }
168
-
169
-    /**
170
-     * For any bytes that are currently buffered inside the stream, force them
171
-     * off the buffer.
172
-     *
173
-     * @throws Swift_IoException
174
-     *
175
-     * @return $this
176
-     */
177
-    public function commit()
178
-    {
179
-        // Nothing to do
180
-        return $this;
181
-    }
182
-
183
-    /**
184
-     * Attach $is to this stream.
185
-     *
186
-     * The stream acts as an observer, receiving all data that is written.
187
-     * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
188
-     *
189
-     * @return $this
190
-     */
191
-    public function bind(Swift_InputByteStream $is)
192
-    {
193
-        // Don't have to mirror anything
194
-        $this->bound[] = $is;
195
-
196
-        return $this;
197
-    }
198
-
199
-    /**
200
-     * Remove an already bound stream.
201
-     *
202
-     * If $is is not bound, no errors will be raised.
203
-     * If the stream currently has any buffered data it will be written to $is
204
-     * before unbinding occurs.
205
-     *
206
-     * @return $this
207
-     */
208
-    public function unbind(Swift_InputByteStream $is)
209
-    {
210
-        // Don't have to mirror anything
211
-        foreach ($this->bound as $k => $stream) {
212
-            if ($stream === $is) {
213
-                unset($this->bound[$k]);
214
-
215
-                break;
216
-            }
217
-        }
218
-
219
-        return $this;
220
-    }
221
-
222
-    /**
223
-     * Flush the contents of the stream (empty it) and set the internal pointer
224
-     * to the beginning.
225
-     *
226
-     * @throws Swift_IoException
227
-     *
228
-     * @return $this
229
-     */
230
-    public function flushBuffers()
231
-    {
232
-        $this->reset();
233
-
234
-        return $this;
235
-    }
236
-
237
-    /**
238
-     * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1 defaults to rsa-sha256.
239
-     *
240
-     * @param string $hash
241
-     *
242
-     * @return $this
243
-     */
244
-    public function setHashAlgorithm($hash)
245
-    {
246
-        $this->hashAlgorithm = 'rsa-sha1';
247
-
248
-        return $this;
249
-    }
250
-
251
-    /**
252
-     * Set the canonicalization algorithm.
253
-     *
254
-     * @param string $canon simple | nofws defaults to simple
255
-     *
256
-     * @return $this
257
-     */
258
-    public function setCanon($canon)
259
-    {
260
-        if ('nofws' == $canon) {
261
-            $this->canon = 'nofws';
262
-        } else {
263
-            $this->canon = 'simple';
264
-        }
265
-
266
-        return $this;
267
-    }
268
-
269
-    /**
270
-     * Set the signer identity.
271
-     *
272
-     * @param string $identity
273
-     *
274
-     * @return $this
275
-     */
276
-    public function setSignerIdentity($identity)
277
-    {
278
-        $this->signerIdentity = $identity;
279
-
280
-        return $this;
281
-    }
282
-
283
-    /**
284
-     * Enable / disable the DebugHeaders.
285
-     *
286
-     * @param bool $debug
287
-     *
288
-     * @return $this
289
-     */
290
-    public function setDebugHeaders($debug)
291
-    {
292
-        $this->debugHeaders = (bool) $debug;
293
-
294
-        return $this;
295
-    }
296
-
297
-    /**
298
-     * Start Body.
299
-     */
300
-    public function startBody()
301
-    {
302
-    }
303
-
304
-    /**
305
-     * End Body.
306
-     */
307
-    public function endBody()
308
-    {
309
-        $this->endOfBody();
310
-    }
311
-
312
-    /**
313
-     * Returns the list of Headers Tampered by this plugin.
314
-     *
315
-     * @return array
316
-     */
317
-    public function getAlteredHeaders()
318
-    {
319
-        if ($this->debugHeaders) {
320
-            return ['DomainKey-Signature', 'X-DebugHash'];
321
-        }
322
-
323
-        return ['DomainKey-Signature'];
324
-    }
325
-
326
-    /**
327
-     * Adds an ignored Header.
328
-     *
329
-     * @param string $header_name
330
-     *
331
-     * @return $this
332
-     */
333
-    public function ignoreHeader($header_name)
334
-    {
335
-        $this->ignoredHeaders[strtolower($header_name ?? '')] = true;
336
-
337
-        return $this;
338
-    }
339
-
340
-    /**
341
-     * Set the headers to sign.
342
-     *
343
-     * @return $this
344
-     */
345
-    public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
346
-    {
347
-        $this->startHash();
348
-        $this->canonData = '';
349
-        // Loop through Headers
350
-        $listHeaders = $headers->listAll();
351
-        foreach ($listHeaders as $hName) {
352
-            // Check if we need to ignore Header
353
-            if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
354
-                if ($headers->has($hName)) {
355
-                    $tmp = $headers->getAll($hName);
356
-                    foreach ($tmp as $header) {
357
-                        if ('' != $header->getFieldBody()) {
358
-                            $this->addHeader($header->toString());
359
-                            $this->signedHeaders[] = $header->getFieldName();
360
-                        }
361
-                    }
362
-                }
363
-            }
364
-        }
365
-        $this->endOfHeaders();
366
-
367
-        return $this;
368
-    }
369
-
370
-    /**
371
-     * Add the signature to the given Headers.
372
-     *
373
-     * @return $this
374
-     */
375
-    public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
376
-    {
377
-        // Prepare the DomainKey-Signature Header
378
-        $params = ['a' => $this->hashAlgorithm, 'b' => chunk_split(base64_encode($this->getEncryptedHash() ?? ''), 73, ' '), 'c' => $this->canon, 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'q' => 'dns', 's' => $this->selector];
379
-        $string = '';
380
-        foreach ($params as $k => $v) {
381
-            $string .= $k.'='.$v.'; ';
382
-        }
383
-        $string = trim($string);
384
-        $headers->addTextHeader('DomainKey-Signature', $string);
385
-
386
-        return $this;
387
-    }
388
-
389
-    /* Private helpers */
390
-
391
-    protected function addHeader($header)
392
-    {
393
-        switch ($this->canon) {
394
-            case 'nofws':
395
-                // Prepare Header and cascade
396
-                $exploded = explode(':', $header, 2);
397
-                $name = strtolower(trim($exploded[0]));
398
-                $value = str_replace("\r\n", '', $exploded[1]);
399
-                $value = preg_replace("/[ \t][ \t]+/", ' ', $value);
400
-                $header = $name.':'.trim($value)."\r\n";
401
-                // no break
402
-            case 'simple':
403
-                // Nothing to do
404
-        }
405
-        $this->addToHash($header);
406
-    }
407
-
408
-    protected function endOfHeaders()
409
-    {
410
-        $this->bodyCanonEmptyCounter = 1;
411
-    }
412
-
413
-    protected function canonicalizeBody($string)
414
-    {
415
-        $len = \strlen($string);
416
-        $canon = '';
417
-        $nofws = ('nofws' == $this->canon);
418
-        for ($i = 0; $i < $len; ++$i) {
419
-            if ($this->bodyCanonIgnoreStart > 0) {
420
-                --$this->bodyCanonIgnoreStart;
421
-                continue;
422
-            }
423
-            switch ($string[$i]) {
424
-                case "\r":
425
-                    $this->bodyCanonLastChar = "\r";
426
-                    break;
427
-                case "\n":
428
-                    if ("\r" == $this->bodyCanonLastChar) {
429
-                        if ($nofws) {
430
-                            $this->bodyCanonSpace = false;
431
-                        }
432
-                        if ('' == $this->bodyCanonLine) {
433
-                            ++$this->bodyCanonEmptyCounter;
434
-                        } else {
435
-                            $this->bodyCanonLine = '';
436
-                            $canon .= "\r\n";
437
-                        }
438
-                    } else {
439
-                        // Wooops Error
440
-                        throw new Swift_SwiftException('Invalid new line sequence in mail found \n without preceding \r');
441
-                    }
442
-                    break;
443
-                case ' ':
444
-                case "\t":
445
-                case "\x09": //HTAB
446
-                    if ($nofws) {
447
-                        $this->bodyCanonSpace = true;
448
-                        break;
449
-                    }
450
-                    // no break
451
-                default:
452
-                    if ($this->bodyCanonEmptyCounter > 0) {
453
-                        $canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter);
454
-                        $this->bodyCanonEmptyCounter = 0;
455
-                    }
456
-                    $this->bodyCanonLine .= $string[$i];
457
-                    $canon .= $string[$i];
458
-            }
459
-        }
460
-        $this->addToHash($canon);
461
-    }
462
-
463
-    protected function endOfBody()
464
-    {
465
-        if (\strlen($this->bodyCanonLine) > 0) {
466
-            $this->addToHash("\r\n");
467
-        }
468
-    }
469
-
470
-    private function addToHash($string)
471
-    {
472
-        $this->canonData .= $string;
473
-        hash_update($this->hashHandler, $string);
474
-    }
475
-
476
-    private function startHash()
477
-    {
478
-        // Init
479
-        switch ($this->hashAlgorithm) {
480
-            case 'rsa-sha1':
481
-                $this->hashHandler = hash_init('sha1');
482
-                break;
483
-        }
484
-        $this->bodyCanonLine = '';
485
-    }
486
-
487
-    /**
488
-     * @throws Swift_SwiftException
489
-     *
490
-     * @return string
491
-     */
492
-    private function getEncryptedHash()
493
-    {
494
-        $signature = '';
495
-        $pkeyId = openssl_get_privatekey($this->privateKey);
496
-        if (!$pkeyId) {
497
-            throw new Swift_SwiftException('Unable to load DomainKey Private Key ['.openssl_error_string().']');
498
-        }
499
-        if (openssl_sign($this->canonData, $signature, $pkeyId, OPENSSL_ALGO_SHA1)) {
500
-            return $signature;
501
-        }
502
-        throw new Swift_SwiftException('Unable to sign DomainKey Hash  ['.openssl_error_string().']');
503
-    }
18
+	/**
19
+	 * PrivateKey.
20
+	 *
21
+	 * @var string
22
+	 */
23
+	protected $privateKey;
24
+
25
+	/**
26
+	 * DomainName.
27
+	 *
28
+	 * @var string
29
+	 */
30
+	protected $domainName;
31
+
32
+	/**
33
+	 * Selector.
34
+	 *
35
+	 * @var string
36
+	 */
37
+	protected $selector;
38
+
39
+	/**
40
+	 * Hash algorithm used.
41
+	 *
42
+	 * @var string
43
+	 */
44
+	protected $hashAlgorithm = 'rsa-sha1';
45
+
46
+	/**
47
+	 * Canonisation method.
48
+	 *
49
+	 * @var string
50
+	 */
51
+	protected $canon = 'simple';
52
+
53
+	/**
54
+	 * Headers not being signed.
55
+	 *
56
+	 * @var array
57
+	 */
58
+	protected $ignoredHeaders = [];
59
+
60
+	/**
61
+	 * Signer identity.
62
+	 *
63
+	 * @var string
64
+	 */
65
+	protected $signerIdentity;
66
+
67
+	/**
68
+	 * Must we embed signed headers?
69
+	 *
70
+	 * @var bool
71
+	 */
72
+	protected $debugHeaders = false;
73
+
74
+	// work variables
75
+	/**
76
+	 * Headers used to generate hash.
77
+	 *
78
+	 * @var array
79
+	 */
80
+	private $signedHeaders = [];
81
+
82
+	/**
83
+	 * Stores the signature header.
84
+	 *
85
+	 * @var Swift_Mime_Headers_ParameterizedHeader
86
+	 */
87
+	protected $domainKeyHeader;
88
+
89
+	/**
90
+	 * Hash Handler.
91
+	 *
92
+	 * @var resource|null
93
+	 */
94
+	private $hashHandler;
95
+
96
+	private $canonData = '';
97
+
98
+	private $bodyCanonEmptyCounter = 0;
99
+
100
+	private $bodyCanonIgnoreStart = 2;
101
+
102
+	private $bodyCanonSpace = false;
103
+
104
+	private $bodyCanonLastChar = null;
105
+
106
+	private $bodyCanonLine = '';
107
+
108
+	private $bound = [];
109
+
110
+	/**
111
+	 * Constructor.
112
+	 *
113
+	 * @param string $privateKey
114
+	 * @param string $domainName
115
+	 * @param string $selector
116
+	 */
117
+	public function __construct($privateKey, $domainName, $selector)
118
+	{
119
+		$this->privateKey = $privateKey;
120
+		$this->domainName = $domainName;
121
+		$this->signerIdentity = '@'.$domainName;
122
+		$this->selector = $selector;
123
+	}
124
+
125
+	/**
126
+	 * Resets internal states.
127
+	 *
128
+	 * @return $this
129
+	 */
130
+	public function reset()
131
+	{
132
+		$this->hashHandler = null;
133
+		$this->bodyCanonIgnoreStart = 2;
134
+		$this->bodyCanonEmptyCounter = 0;
135
+		$this->bodyCanonLastChar = null;
136
+		$this->bodyCanonSpace = false;
137
+
138
+		return $this;
139
+	}
140
+
141
+	/**
142
+	 * Writes $bytes to the end of the stream.
143
+	 *
144
+	 * Writing may not happen immediately if the stream chooses to buffer.  If
145
+	 * you want to write these bytes with immediate effect, call {@link commit()}
146
+	 * after calling write().
147
+	 *
148
+	 * This method returns the sequence ID of the write (i.e. 1 for first, 2 for
149
+	 * second, etc etc).
150
+	 *
151
+	 * @param string $bytes
152
+	 *
153
+	 * @return int
154
+	 *
155
+	 * @throws Swift_IoException
156
+	 *
157
+	 * @return $this
158
+	 */
159
+	public function write($bytes)
160
+	{
161
+		$this->canonicalizeBody($bytes);
162
+		foreach ($this->bound as $is) {
163
+			$is->write($bytes);
164
+		}
165
+
166
+		return $this;
167
+	}
168
+
169
+	/**
170
+	 * For any bytes that are currently buffered inside the stream, force them
171
+	 * off the buffer.
172
+	 *
173
+	 * @throws Swift_IoException
174
+	 *
175
+	 * @return $this
176
+	 */
177
+	public function commit()
178
+	{
179
+		// Nothing to do
180
+		return $this;
181
+	}
182
+
183
+	/**
184
+	 * Attach $is to this stream.
185
+	 *
186
+	 * The stream acts as an observer, receiving all data that is written.
187
+	 * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
188
+	 *
189
+	 * @return $this
190
+	 */
191
+	public function bind(Swift_InputByteStream $is)
192
+	{
193
+		// Don't have to mirror anything
194
+		$this->bound[] = $is;
195
+
196
+		return $this;
197
+	}
198
+
199
+	/**
200
+	 * Remove an already bound stream.
201
+	 *
202
+	 * If $is is not bound, no errors will be raised.
203
+	 * If the stream currently has any buffered data it will be written to $is
204
+	 * before unbinding occurs.
205
+	 *
206
+	 * @return $this
207
+	 */
208
+	public function unbind(Swift_InputByteStream $is)
209
+	{
210
+		// Don't have to mirror anything
211
+		foreach ($this->bound as $k => $stream) {
212
+			if ($stream === $is) {
213
+				unset($this->bound[$k]);
214
+
215
+				break;
216
+			}
217
+		}
218
+
219
+		return $this;
220
+	}
221
+
222
+	/**
223
+	 * Flush the contents of the stream (empty it) and set the internal pointer
224
+	 * to the beginning.
225
+	 *
226
+	 * @throws Swift_IoException
227
+	 *
228
+	 * @return $this
229
+	 */
230
+	public function flushBuffers()
231
+	{
232
+		$this->reset();
233
+
234
+		return $this;
235
+	}
236
+
237
+	/**
238
+	 * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1 defaults to rsa-sha256.
239
+	 *
240
+	 * @param string $hash
241
+	 *
242
+	 * @return $this
243
+	 */
244
+	public function setHashAlgorithm($hash)
245
+	{
246
+		$this->hashAlgorithm = 'rsa-sha1';
247
+
248
+		return $this;
249
+	}
250
+
251
+	/**
252
+	 * Set the canonicalization algorithm.
253
+	 *
254
+	 * @param string $canon simple | nofws defaults to simple
255
+	 *
256
+	 * @return $this
257
+	 */
258
+	public function setCanon($canon)
259
+	{
260
+		if ('nofws' == $canon) {
261
+			$this->canon = 'nofws';
262
+		} else {
263
+			$this->canon = 'simple';
264
+		}
265
+
266
+		return $this;
267
+	}
268
+
269
+	/**
270
+	 * Set the signer identity.
271
+	 *
272
+	 * @param string $identity
273
+	 *
274
+	 * @return $this
275
+	 */
276
+	public function setSignerIdentity($identity)
277
+	{
278
+		$this->signerIdentity = $identity;
279
+
280
+		return $this;
281
+	}
282
+
283
+	/**
284
+	 * Enable / disable the DebugHeaders.
285
+	 *
286
+	 * @param bool $debug
287
+	 *
288
+	 * @return $this
289
+	 */
290
+	public function setDebugHeaders($debug)
291
+	{
292
+		$this->debugHeaders = (bool) $debug;
293
+
294
+		return $this;
295
+	}
296
+
297
+	/**
298
+	 * Start Body.
299
+	 */
300
+	public function startBody()
301
+	{
302
+	}
303
+
304
+	/**
305
+	 * End Body.
306
+	 */
307
+	public function endBody()
308
+	{
309
+		$this->endOfBody();
310
+	}
311
+
312
+	/**
313
+	 * Returns the list of Headers Tampered by this plugin.
314
+	 *
315
+	 * @return array
316
+	 */
317
+	public function getAlteredHeaders()
318
+	{
319
+		if ($this->debugHeaders) {
320
+			return ['DomainKey-Signature', 'X-DebugHash'];
321
+		}
322
+
323
+		return ['DomainKey-Signature'];
324
+	}
325
+
326
+	/**
327
+	 * Adds an ignored Header.
328
+	 *
329
+	 * @param string $header_name
330
+	 *
331
+	 * @return $this
332
+	 */
333
+	public function ignoreHeader($header_name)
334
+	{
335
+		$this->ignoredHeaders[strtolower($header_name ?? '')] = true;
336
+
337
+		return $this;
338
+	}
339
+
340
+	/**
341
+	 * Set the headers to sign.
342
+	 *
343
+	 * @return $this
344
+	 */
345
+	public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
346
+	{
347
+		$this->startHash();
348
+		$this->canonData = '';
349
+		// Loop through Headers
350
+		$listHeaders = $headers->listAll();
351
+		foreach ($listHeaders as $hName) {
352
+			// Check if we need to ignore Header
353
+			if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
354
+				if ($headers->has($hName)) {
355
+					$tmp = $headers->getAll($hName);
356
+					foreach ($tmp as $header) {
357
+						if ('' != $header->getFieldBody()) {
358
+							$this->addHeader($header->toString());
359
+							$this->signedHeaders[] = $header->getFieldName();
360
+						}
361
+					}
362
+				}
363
+			}
364
+		}
365
+		$this->endOfHeaders();
366
+
367
+		return $this;
368
+	}
369
+
370
+	/**
371
+	 * Add the signature to the given Headers.
372
+	 *
373
+	 * @return $this
374
+	 */
375
+	public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
376
+	{
377
+		// Prepare the DomainKey-Signature Header
378
+		$params = ['a' => $this->hashAlgorithm, 'b' => chunk_split(base64_encode($this->getEncryptedHash() ?? ''), 73, ' '), 'c' => $this->canon, 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'q' => 'dns', 's' => $this->selector];
379
+		$string = '';
380
+		foreach ($params as $k => $v) {
381
+			$string .= $k.'='.$v.'; ';
382
+		}
383
+		$string = trim($string);
384
+		$headers->addTextHeader('DomainKey-Signature', $string);
385
+
386
+		return $this;
387
+	}
388
+
389
+	/* Private helpers */
390
+
391
+	protected function addHeader($header)
392
+	{
393
+		switch ($this->canon) {
394
+			case 'nofws':
395
+				// Prepare Header and cascade
396
+				$exploded = explode(':', $header, 2);
397
+				$name = strtolower(trim($exploded[0]));
398
+				$value = str_replace("\r\n", '', $exploded[1]);
399
+				$value = preg_replace("/[ \t][ \t]+/", ' ', $value);
400
+				$header = $name.':'.trim($value)."\r\n";
401
+				// no break
402
+			case 'simple':
403
+				// Nothing to do
404
+		}
405
+		$this->addToHash($header);
406
+	}
407
+
408
+	protected function endOfHeaders()
409
+	{
410
+		$this->bodyCanonEmptyCounter = 1;
411
+	}
412
+
413
+	protected function canonicalizeBody($string)
414
+	{
415
+		$len = \strlen($string);
416
+		$canon = '';
417
+		$nofws = ('nofws' == $this->canon);
418
+		for ($i = 0; $i < $len; ++$i) {
419
+			if ($this->bodyCanonIgnoreStart > 0) {
420
+				--$this->bodyCanonIgnoreStart;
421
+				continue;
422
+			}
423
+			switch ($string[$i]) {
424
+				case "\r":
425
+					$this->bodyCanonLastChar = "\r";
426
+					break;
427
+				case "\n":
428
+					if ("\r" == $this->bodyCanonLastChar) {
429
+						if ($nofws) {
430
+							$this->bodyCanonSpace = false;
431
+						}
432
+						if ('' == $this->bodyCanonLine) {
433
+							++$this->bodyCanonEmptyCounter;
434
+						} else {
435
+							$this->bodyCanonLine = '';
436
+							$canon .= "\r\n";
437
+						}
438
+					} else {
439
+						// Wooops Error
440
+						throw new Swift_SwiftException('Invalid new line sequence in mail found \n without preceding \r');
441
+					}
442
+					break;
443
+				case ' ':
444
+				case "\t":
445
+				case "\x09": //HTAB
446
+					if ($nofws) {
447
+						$this->bodyCanonSpace = true;
448
+						break;
449
+					}
450
+					// no break
451
+				default:
452
+					if ($this->bodyCanonEmptyCounter > 0) {
453
+						$canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter);
454
+						$this->bodyCanonEmptyCounter = 0;
455
+					}
456
+					$this->bodyCanonLine .= $string[$i];
457
+					$canon .= $string[$i];
458
+			}
459
+		}
460
+		$this->addToHash($canon);
461
+	}
462
+
463
+	protected function endOfBody()
464
+	{
465
+		if (\strlen($this->bodyCanonLine) > 0) {
466
+			$this->addToHash("\r\n");
467
+		}
468
+	}
469
+
470
+	private function addToHash($string)
471
+	{
472
+		$this->canonData .= $string;
473
+		hash_update($this->hashHandler, $string);
474
+	}
475
+
476
+	private function startHash()
477
+	{
478
+		// Init
479
+		switch ($this->hashAlgorithm) {
480
+			case 'rsa-sha1':
481
+				$this->hashHandler = hash_init('sha1');
482
+				break;
483
+		}
484
+		$this->bodyCanonLine = '';
485
+	}
486
+
487
+	/**
488
+	 * @throws Swift_SwiftException
489
+	 *
490
+	 * @return string
491
+	 */
492
+	private function getEncryptedHash()
493
+	{
494
+		$signature = '';
495
+		$pkeyId = openssl_get_privatekey($this->privateKey);
496
+		if (!$pkeyId) {
497
+			throw new Swift_SwiftException('Unable to load DomainKey Private Key ['.openssl_error_string().']');
498
+		}
499
+		if (openssl_sign($this->canonData, $signature, $pkeyId, OPENSSL_ALGO_SHA1)) {
500
+			return $signature;
501
+		}
502
+		throw new Swift_SwiftException('Unable to sign DomainKey Hash  ['.openssl_error_string().']');
503
+	}
504 504
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/BodySigner.php 1 patch
Indentation   +12 added lines, -12 removed lines patch added patch discarded remove patch
@@ -15,17 +15,17 @@
 block discarded – undo
15 15
  */
16 16
 interface Swift_Signers_BodySigner extends Swift_Signer
17 17
 {
18
-    /**
19
-     * Change the Swift_Signed_Message to apply the singing.
20
-     *
21
-     * @return self
22
-     */
23
-    public function signMessage(Swift_Message $message);
18
+	/**
19
+	 * Change the Swift_Signed_Message to apply the singing.
20
+	 *
21
+	 * @return self
22
+	 */
23
+	public function signMessage(Swift_Message $message);
24 24
 
25
-    /**
26
-     * Return the list of header a signer might tamper.
27
-     *
28
-     * @return array
29
-     */
30
-    public function getAlteredHeaders();
25
+	/**
26
+	 * Return the list of header a signer might tamper.
27
+	 *
28
+	 * @return array
29
+	 */
30
+	public function getAlteredHeaders();
31 31
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/HeaderSigner.php 1 patch
Indentation   +38 added lines, -38 removed lines patch added patch discarded remove patch
@@ -15,47 +15,47 @@
 block discarded – undo
15 15
  */
16 16
 interface Swift_Signers_HeaderSigner extends Swift_Signer, Swift_InputByteStream
17 17
 {
18
-    /**
19
-     * Exclude an header from the signed headers.
20
-     *
21
-     * @param string $header_name
22
-     *
23
-     * @return self
24
-     */
25
-    public function ignoreHeader($header_name);
18
+	/**
19
+	 * Exclude an header from the signed headers.
20
+	 *
21
+	 * @param string $header_name
22
+	 *
23
+	 * @return self
24
+	 */
25
+	public function ignoreHeader($header_name);
26 26
 
27
-    /**
28
-     * Prepare the Signer to get a new Body.
29
-     *
30
-     * @return self
31
-     */
32
-    public function startBody();
27
+	/**
28
+	 * Prepare the Signer to get a new Body.
29
+	 *
30
+	 * @return self
31
+	 */
32
+	public function startBody();
33 33
 
34
-    /**
35
-     * Give the signal that the body has finished streaming.
36
-     *
37
-     * @return self
38
-     */
39
-    public function endBody();
34
+	/**
35
+	 * Give the signal that the body has finished streaming.
36
+	 *
37
+	 * @return self
38
+	 */
39
+	public function endBody();
40 40
 
41
-    /**
42
-     * Give the headers already given.
43
-     *
44
-     * @return self
45
-     */
46
-    public function setHeaders(Swift_Mime_SimpleHeaderSet $headers);
41
+	/**
42
+	 * Give the headers already given.
43
+	 *
44
+	 * @return self
45
+	 */
46
+	public function setHeaders(Swift_Mime_SimpleHeaderSet $headers);
47 47
 
48
-    /**
49
-     * Add the header(s) to the headerSet.
50
-     *
51
-     * @return self
52
-     */
53
-    public function addSignature(Swift_Mime_SimpleHeaderSet $headers);
48
+	/**
49
+	 * Add the header(s) to the headerSet.
50
+	 *
51
+	 * @return self
52
+	 */
53
+	public function addSignature(Swift_Mime_SimpleHeaderSet $headers);
54 54
 
55
-    /**
56
-     * Return the list of header a signer might tamper.
57
-     *
58
-     * @return array
59
-     */
60
-    public function getAlteredHeaders();
55
+	/**
56
+	 * Return the list of header a signer might tamper.
57
+	 *
58
+	 * @return array
59
+	 */
60
+	public function getAlteredHeaders();
61 61
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/IoException.php 1 patch
Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -15,14 +15,14 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_IoException extends Swift_SwiftException
17 17
 {
18
-    /**
19
-     * Create a new IoException with $message.
20
-     *
21
-     * @param string $message
22
-     * @param int    $code
23
-     */
24
-    public function __construct($message, $code = 0, Exception $previous = null)
25
-    {
26
-        parent::__construct($message, $code, $previous);
27
-    }
18
+	/**
19
+	 * Create a new IoException with $message.
20
+	 *
21
+	 * @param string $message
22
+	 * @param int    $code
23
+	 */
24
+	public function __construct($message, $code = 0, Exception $previous = null)
25
+	{
26
+		parent::__construct($message, $code, $previous);
27
+	}
28 28
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/FileSpool.php 1 patch
Indentation   +189 added lines, -189 removed lines patch added patch discarded remove patch
@@ -16,193 +16,193 @@
 block discarded – undo
16 16
  */
17 17
 class Swift_FileSpool extends Swift_ConfigurableSpool
18 18
 {
19
-    /** The spool directory */
20
-    private $path;
21
-
22
-    /**
23
-     * File WriteRetry Limit.
24
-     *
25
-     * @var int
26
-     */
27
-    private $retryLimit = 10;
28
-
29
-    /**
30
-     * Create a new FileSpool.
31
-     *
32
-     * @param string $path
33
-     *
34
-     * @throws Swift_IoException
35
-     */
36
-    public function __construct($path)
37
-    {
38
-        $this->path = $path;
39
-
40
-        if (!file_exists($this->path)) {
41
-            if (!mkdir($this->path, 0777, true)) {
42
-                throw new Swift_IoException(sprintf('Unable to create path "%s".', $this->path));
43
-            }
44
-        }
45
-    }
46
-
47
-    /**
48
-     * Tests if this Spool mechanism has started.
49
-     *
50
-     * @return bool
51
-     */
52
-    public function isStarted()
53
-    {
54
-        return true;
55
-    }
56
-
57
-    /**
58
-     * Starts this Spool mechanism.
59
-     */
60
-    public function start()
61
-    {
62
-    }
63
-
64
-    /**
65
-     * Stops this Spool mechanism.
66
-     */
67
-    public function stop()
68
-    {
69
-    }
70
-
71
-    /**
72
-     * Allow to manage the enqueuing retry limit.
73
-     *
74
-     * Default, is ten and allows over 64^20 different fileNames
75
-     *
76
-     * @param int $limit
77
-     */
78
-    public function setRetryLimit($limit)
79
-    {
80
-        $this->retryLimit = $limit;
81
-    }
82
-
83
-    /**
84
-     * Queues a message.
85
-     *
86
-     * @param Swift_Mime_SimpleMessage $message The message to store
87
-     *
88
-     * @throws Swift_IoException
89
-     *
90
-     * @return bool
91
-     */
92
-    public function queueMessage(Swift_Mime_SimpleMessage $message)
93
-    {
94
-        $ser = serialize($message);
95
-        $fileName = $this->path.'/'.$this->getRandomString(10);
96
-        for ($i = 0; $i < $this->retryLimit; ++$i) {
97
-            /* We try an exclusive creation of the file. This is an atomic operation, it avoid locking mechanism */
98
-            $fp = @fopen($fileName.'.message', 'xb');
99
-            if (false !== $fp) {
100
-                if (false === fwrite($fp, $ser)) {
101
-                    return false;
102
-                }
103
-
104
-                return fclose($fp);
105
-            } else {
106
-                /* The file already exists, we try a longer fileName */
107
-                $fileName .= $this->getRandomString(1);
108
-            }
109
-        }
110
-
111
-        throw new Swift_IoException(sprintf('Unable to create a file for enqueuing Message in "%s".', $this->path));
112
-    }
113
-
114
-    /**
115
-     * Execute a recovery if for any reason a process is sending for too long.
116
-     *
117
-     * @param int $timeout in second Defaults is for very slow smtp responses
118
-     */
119
-    public function recover($timeout = 900)
120
-    {
121
-        foreach (new DirectoryIterator($this->path) as $file) {
122
-            $file = $file->getRealPath();
123
-
124
-            if ('.message.sending' == substr($file, -16)) {
125
-                $lockedtime = filectime($file);
126
-                if ((time() - $lockedtime) > $timeout) {
127
-                    rename($file, substr($file, 0, -8));
128
-                }
129
-            }
130
-        }
131
-    }
132
-
133
-    /**
134
-     * Sends messages using the given transport instance.
135
-     *
136
-     * @param Swift_Transport $transport        A transport instance
137
-     * @param string[]        $failedRecipients An array of failures by-reference
138
-     *
139
-     * @return int The number of sent e-mail's
140
-     */
141
-    public function flushQueue(Swift_Transport $transport, &$failedRecipients = null)
142
-    {
143
-        $directoryIterator = new DirectoryIterator($this->path);
144
-
145
-        /* Start the transport only if there are queued files to send */
146
-        if (!$transport->isStarted()) {
147
-            foreach ($directoryIterator as $file) {
148
-                if ('.message' == substr($file->getRealPath(), -8)) {
149
-                    $transport->start();
150
-                    break;
151
-                }
152
-            }
153
-        }
154
-
155
-        $failedRecipients = (array) $failedRecipients;
156
-        $count = 0;
157
-        $time = time();
158
-        foreach ($directoryIterator as $file) {
159
-            $file = $file->getRealPath();
160
-
161
-            if ('.message' != substr($file, -8)) {
162
-                continue;
163
-            }
164
-
165
-            /* We try a rename, it's an atomic operation, and avoid locking the file */
166
-            if (rename($file, $file.'.sending')) {
167
-                $message = unserialize(file_get_contents($file.'.sending'));
168
-
169
-                $count += $transport->send($message, $failedRecipients);
170
-
171
-                unlink($file.'.sending');
172
-            } else {
173
-                /* This message has just been catched by another process */
174
-                continue;
175
-            }
176
-
177
-            if ($this->getMessageLimit() && $count >= $this->getMessageLimit()) {
178
-                break;
179
-            }
180
-
181
-            if ($this->getTimeLimit() && (time() - $time) >= $this->getTimeLimit()) {
182
-                break;
183
-            }
184
-        }
185
-
186
-        return $count;
187
-    }
188
-
189
-    /**
190
-     * Returns a random string needed to generate a fileName for the queue.
191
-     *
192
-     * @param int $count
193
-     *
194
-     * @return string
195
-     */
196
-    protected function getRandomString($count)
197
-    {
198
-        // This string MUST stay FS safe, avoid special chars
199
-        $base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
200
-        $ret = '';
201
-        $strlen = \strlen($base);
202
-        for ($i = 0; $i < $count; ++$i) {
203
-            $ret .= $base[random_int(0, $strlen - 1)];
204
-        }
205
-
206
-        return $ret;
207
-    }
19
+	/** The spool directory */
20
+	private $path;
21
+
22
+	/**
23
+	 * File WriteRetry Limit.
24
+	 *
25
+	 * @var int
26
+	 */
27
+	private $retryLimit = 10;
28
+
29
+	/**
30
+	 * Create a new FileSpool.
31
+	 *
32
+	 * @param string $path
33
+	 *
34
+	 * @throws Swift_IoException
35
+	 */
36
+	public function __construct($path)
37
+	{
38
+		$this->path = $path;
39
+
40
+		if (!file_exists($this->path)) {
41
+			if (!mkdir($this->path, 0777, true)) {
42
+				throw new Swift_IoException(sprintf('Unable to create path "%s".', $this->path));
43
+			}
44
+		}
45
+	}
46
+
47
+	/**
48
+	 * Tests if this Spool mechanism has started.
49
+	 *
50
+	 * @return bool
51
+	 */
52
+	public function isStarted()
53
+	{
54
+		return true;
55
+	}
56
+
57
+	/**
58
+	 * Starts this Spool mechanism.
59
+	 */
60
+	public function start()
61
+	{
62
+	}
63
+
64
+	/**
65
+	 * Stops this Spool mechanism.
66
+	 */
67
+	public function stop()
68
+	{
69
+	}
70
+
71
+	/**
72
+	 * Allow to manage the enqueuing retry limit.
73
+	 *
74
+	 * Default, is ten and allows over 64^20 different fileNames
75
+	 *
76
+	 * @param int $limit
77
+	 */
78
+	public function setRetryLimit($limit)
79
+	{
80
+		$this->retryLimit = $limit;
81
+	}
82
+
83
+	/**
84
+	 * Queues a message.
85
+	 *
86
+	 * @param Swift_Mime_SimpleMessage $message The message to store
87
+	 *
88
+	 * @throws Swift_IoException
89
+	 *
90
+	 * @return bool
91
+	 */
92
+	public function queueMessage(Swift_Mime_SimpleMessage $message)
93
+	{
94
+		$ser = serialize($message);
95
+		$fileName = $this->path.'/'.$this->getRandomString(10);
96
+		for ($i = 0; $i < $this->retryLimit; ++$i) {
97
+			/* We try an exclusive creation of the file. This is an atomic operation, it avoid locking mechanism */
98
+			$fp = @fopen($fileName.'.message', 'xb');
99
+			if (false !== $fp) {
100
+				if (false === fwrite($fp, $ser)) {
101
+					return false;
102
+				}
103
+
104
+				return fclose($fp);
105
+			} else {
106
+				/* The file already exists, we try a longer fileName */
107
+				$fileName .= $this->getRandomString(1);
108
+			}
109
+		}
110
+
111
+		throw new Swift_IoException(sprintf('Unable to create a file for enqueuing Message in "%s".', $this->path));
112
+	}
113
+
114
+	/**
115
+	 * Execute a recovery if for any reason a process is sending for too long.
116
+	 *
117
+	 * @param int $timeout in second Defaults is for very slow smtp responses
118
+	 */
119
+	public function recover($timeout = 900)
120
+	{
121
+		foreach (new DirectoryIterator($this->path) as $file) {
122
+			$file = $file->getRealPath();
123
+
124
+			if ('.message.sending' == substr($file, -16)) {
125
+				$lockedtime = filectime($file);
126
+				if ((time() - $lockedtime) > $timeout) {
127
+					rename($file, substr($file, 0, -8));
128
+				}
129
+			}
130
+		}
131
+	}
132
+
133
+	/**
134
+	 * Sends messages using the given transport instance.
135
+	 *
136
+	 * @param Swift_Transport $transport        A transport instance
137
+	 * @param string[]        $failedRecipients An array of failures by-reference
138
+	 *
139
+	 * @return int The number of sent e-mail's
140
+	 */
141
+	public function flushQueue(Swift_Transport $transport, &$failedRecipients = null)
142
+	{
143
+		$directoryIterator = new DirectoryIterator($this->path);
144
+
145
+		/* Start the transport only if there are queued files to send */
146
+		if (!$transport->isStarted()) {
147
+			foreach ($directoryIterator as $file) {
148
+				if ('.message' == substr($file->getRealPath(), -8)) {
149
+					$transport->start();
150
+					break;
151
+				}
152
+			}
153
+		}
154
+
155
+		$failedRecipients = (array) $failedRecipients;
156
+		$count = 0;
157
+		$time = time();
158
+		foreach ($directoryIterator as $file) {
159
+			$file = $file->getRealPath();
160
+
161
+			if ('.message' != substr($file, -8)) {
162
+				continue;
163
+			}
164
+
165
+			/* We try a rename, it's an atomic operation, and avoid locking the file */
166
+			if (rename($file, $file.'.sending')) {
167
+				$message = unserialize(file_get_contents($file.'.sending'));
168
+
169
+				$count += $transport->send($message, $failedRecipients);
170
+
171
+				unlink($file.'.sending');
172
+			} else {
173
+				/* This message has just been catched by another process */
174
+				continue;
175
+			}
176
+
177
+			if ($this->getMessageLimit() && $count >= $this->getMessageLimit()) {
178
+				break;
179
+			}
180
+
181
+			if ($this->getTimeLimit() && (time() - $time) >= $this->getTimeLimit()) {
182
+				break;
183
+			}
184
+		}
185
+
186
+		return $count;
187
+	}
188
+
189
+	/**
190
+	 * Returns a random string needed to generate a fileName for the queue.
191
+	 *
192
+	 * @param int $count
193
+	 *
194
+	 * @return string
195
+	 */
196
+	protected function getRandomString($count)
197
+	{
198
+		// This string MUST stay FS safe, avoid special chars
199
+		$base = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789_-';
200
+		$ret = '';
201
+		$strlen = \strlen($base);
202
+		for ($i = 0; $i < $count; ++$i) {
203
+			$ret .= $base[random_int(0, $strlen - 1)];
204
+		}
205
+
206
+		return $ret;
207
+	}
208 208
 }
Please login to merge, or discard this patch.
swiftmailer/lib/classes/Swift/CharacterStream/NgCharacterStream.php 1 patch
Indentation   +220 added lines, -220 removed lines patch added patch discarded remove patch
@@ -15,248 +15,248 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_CharacterStream_NgCharacterStream implements Swift_CharacterStream
17 17
 {
18
-    /**
19
-     * The char reader (lazy-loaded) for the current charset.
20
-     *
21
-     * @var Swift_CharacterReader
22
-     */
23
-    private $charReader;
18
+	/**
19
+	 * The char reader (lazy-loaded) for the current charset.
20
+	 *
21
+	 * @var Swift_CharacterReader
22
+	 */
23
+	private $charReader;
24 24
 
25
-    /**
26
-     * A factory for creating CharacterReader instances.
27
-     *
28
-     * @var Swift_CharacterReaderFactory
29
-     */
30
-    private $charReaderFactory;
25
+	/**
26
+	 * A factory for creating CharacterReader instances.
27
+	 *
28
+	 * @var Swift_CharacterReaderFactory
29
+	 */
30
+	private $charReaderFactory;
31 31
 
32
-    /**
33
-     * The character set this stream is using.
34
-     *
35
-     * @var string
36
-     */
37
-    private $charset;
32
+	/**
33
+	 * The character set this stream is using.
34
+	 *
35
+	 * @var string
36
+	 */
37
+	private $charset;
38 38
 
39
-    /**
40
-     * The data's stored as-is.
41
-     *
42
-     * @var string
43
-     */
44
-    private $datas = '';
39
+	/**
40
+	 * The data's stored as-is.
41
+	 *
42
+	 * @var string
43
+	 */
44
+	private $datas = '';
45 45
 
46
-    /**
47
-     * Number of bytes in the stream.
48
-     *
49
-     * @var int
50
-     */
51
-    private $datasSize = 0;
46
+	/**
47
+	 * Number of bytes in the stream.
48
+	 *
49
+	 * @var int
50
+	 */
51
+	private $datasSize = 0;
52 52
 
53
-    /**
54
-     * Map.
55
-     *
56
-     * @var mixed
57
-     */
58
-    private $map;
53
+	/**
54
+	 * Map.
55
+	 *
56
+	 * @var mixed
57
+	 */
58
+	private $map;
59 59
 
60
-    /**
61
-     * Map Type.
62
-     *
63
-     * @var int
64
-     */
65
-    private $mapType = 0;
60
+	/**
61
+	 * Map Type.
62
+	 *
63
+	 * @var int
64
+	 */
65
+	private $mapType = 0;
66 66
 
67
-    /**
68
-     * Number of characters in the stream.
69
-     *
70
-     * @var int
71
-     */
72
-    private $charCount = 0;
67
+	/**
68
+	 * Number of characters in the stream.
69
+	 *
70
+	 * @var int
71
+	 */
72
+	private $charCount = 0;
73 73
 
74
-    /**
75
-     * Position in the stream.
76
-     *
77
-     * @var int
78
-     */
79
-    private $currentPos = 0;
74
+	/**
75
+	 * Position in the stream.
76
+	 *
77
+	 * @var int
78
+	 */
79
+	private $currentPos = 0;
80 80
 
81
-    /**
82
-     * Constructor.
83
-     *
84
-     * @param string $charset
85
-     */
86
-    public function __construct(Swift_CharacterReaderFactory $factory, $charset)
87
-    {
88
-        $this->setCharacterReaderFactory($factory);
89
-        $this->setCharacterSet($charset);
90
-    }
81
+	/**
82
+	 * Constructor.
83
+	 *
84
+	 * @param string $charset
85
+	 */
86
+	public function __construct(Swift_CharacterReaderFactory $factory, $charset)
87
+	{
88
+		$this->setCharacterReaderFactory($factory);
89
+		$this->setCharacterSet($charset);
90
+	}
91 91
 
92
-    /* -- Changing parameters of the stream -- */
92
+	/* -- Changing parameters of the stream -- */
93 93
 
94
-    /**
95
-     * Set the character set used in this CharacterStream.
96
-     *
97
-     * @param string $charset
98
-     */
99
-    public function setCharacterSet($charset)
100
-    {
101
-        $this->charset = $charset;
102
-        $this->charReader = null;
103
-        $this->mapType = 0;
104
-    }
94
+	/**
95
+	 * Set the character set used in this CharacterStream.
96
+	 *
97
+	 * @param string $charset
98
+	 */
99
+	public function setCharacterSet($charset)
100
+	{
101
+		$this->charset = $charset;
102
+		$this->charReader = null;
103
+		$this->mapType = 0;
104
+	}
105 105
 
106
-    /**
107
-     * Set the CharacterReaderFactory for multi charset support.
108
-     */
109
-    public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory)
110
-    {
111
-        $this->charReaderFactory = $factory;
112
-    }
106
+	/**
107
+	 * Set the CharacterReaderFactory for multi charset support.
108
+	 */
109
+	public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory)
110
+	{
111
+		$this->charReaderFactory = $factory;
112
+	}
113 113
 
114
-    /**
115
-     * @see Swift_CharacterStream::flushContents()
116
-     */
117
-    public function flushContents()
118
-    {
119
-        $this->datas = null;
120
-        $this->map = null;
121
-        $this->charCount = 0;
122
-        $this->currentPos = 0;
123
-        $this->datasSize = 0;
124
-    }
114
+	/**
115
+	 * @see Swift_CharacterStream::flushContents()
116
+	 */
117
+	public function flushContents()
118
+	{
119
+		$this->datas = null;
120
+		$this->map = null;
121
+		$this->charCount = 0;
122
+		$this->currentPos = 0;
123
+		$this->datasSize = 0;
124
+	}
125 125
 
126
-    /**
127
-     * @see Swift_CharacterStream::importByteStream()
128
-     */
129
-    public function importByteStream(Swift_OutputByteStream $os)
130
-    {
131
-        $this->flushContents();
132
-        $blocks = 512;
133
-        $os->setReadPointer(0);
134
-        while (false !== ($read = $os->read($blocks))) {
135
-            $this->write($read);
136
-        }
137
-    }
126
+	/**
127
+	 * @see Swift_CharacterStream::importByteStream()
128
+	 */
129
+	public function importByteStream(Swift_OutputByteStream $os)
130
+	{
131
+		$this->flushContents();
132
+		$blocks = 512;
133
+		$os->setReadPointer(0);
134
+		while (false !== ($read = $os->read($blocks))) {
135
+			$this->write($read);
136
+		}
137
+	}
138 138
 
139
-    /**
140
-     * @see Swift_CharacterStream::importString()
141
-     *
142
-     * @param string $string
143
-     */
144
-    public function importString($string)
145
-    {
146
-        $this->flushContents();
147
-        $this->write($string);
148
-    }
139
+	/**
140
+	 * @see Swift_CharacterStream::importString()
141
+	 *
142
+	 * @param string $string
143
+	 */
144
+	public function importString($string)
145
+	{
146
+		$this->flushContents();
147
+		$this->write($string);
148
+	}
149 149
 
150
-    /**
151
-     * @see Swift_CharacterStream::read()
152
-     *
153
-     * @param int $length
154
-     *
155
-     * @return string
156
-     */
157
-    public function read($length)
158
-    {
159
-        if ($this->currentPos >= $this->charCount) {
160
-            return false;
161
-        }
162
-        $ret = false;
163
-        $length = ($this->currentPos + $length > $this->charCount) ? $this->charCount - $this->currentPos : $length;
164
-        switch ($this->mapType) {
165
-            case Swift_CharacterReader::MAP_TYPE_FIXED_LEN:
166
-                $len = $length * $this->map;
167
-                $ret = substr($this->datas,
168
-                        $this->currentPos * $this->map,
169
-                        $len);
170
-                $this->currentPos += $length;
171
-                break;
150
+	/**
151
+	 * @see Swift_CharacterStream::read()
152
+	 *
153
+	 * @param int $length
154
+	 *
155
+	 * @return string
156
+	 */
157
+	public function read($length)
158
+	{
159
+		if ($this->currentPos >= $this->charCount) {
160
+			return false;
161
+		}
162
+		$ret = false;
163
+		$length = ($this->currentPos + $length > $this->charCount) ? $this->charCount - $this->currentPos : $length;
164
+		switch ($this->mapType) {
165
+			case Swift_CharacterReader::MAP_TYPE_FIXED_LEN:
166
+				$len = $length * $this->map;
167
+				$ret = substr($this->datas,
168
+						$this->currentPos * $this->map,
169
+						$len);
170
+				$this->currentPos += $length;
171
+				break;
172 172
 
173
-            case Swift_CharacterReader::MAP_TYPE_INVALID:
174
-                $ret = '';
175
-                for (; $this->currentPos < $length; ++$this->currentPos) {
176
-                    if (isset($this->map[$this->currentPos])) {
177
-                        $ret .= '?';
178
-                    } else {
179
-                        $ret .= $this->datas[$this->currentPos];
180
-                    }
181
-                }
182
-                break;
173
+			case Swift_CharacterReader::MAP_TYPE_INVALID:
174
+				$ret = '';
175
+				for (; $this->currentPos < $length; ++$this->currentPos) {
176
+					if (isset($this->map[$this->currentPos])) {
177
+						$ret .= '?';
178
+					} else {
179
+						$ret .= $this->datas[$this->currentPos];
180
+					}
181
+				}
182
+				break;
183 183
 
184
-            case Swift_CharacterReader::MAP_TYPE_POSITIONS:
185
-                $end = $this->currentPos + $length;
186
-                $end = $end > $this->charCount ? $this->charCount : $end;
187
-                $ret = '';
188
-                $start = 0;
189
-                if ($this->currentPos > 0) {
190
-                    $start = $this->map['p'][$this->currentPos - 1];
191
-                }
192
-                $to = $start;
193
-                for (; $this->currentPos < $end; ++$this->currentPos) {
194
-                    if (isset($this->map['i'][$this->currentPos])) {
195
-                        $ret .= substr($this->datas, $start, $to - $start).'?';
196
-                        $start = $this->map['p'][$this->currentPos];
197
-                    } else {
198
-                        $to = $this->map['p'][$this->currentPos];
199
-                    }
200
-                }
201
-                $ret .= substr($this->datas, $start, $to - $start);
202
-                break;
203
-        }
184
+			case Swift_CharacterReader::MAP_TYPE_POSITIONS:
185
+				$end = $this->currentPos + $length;
186
+				$end = $end > $this->charCount ? $this->charCount : $end;
187
+				$ret = '';
188
+				$start = 0;
189
+				if ($this->currentPos > 0) {
190
+					$start = $this->map['p'][$this->currentPos - 1];
191
+				}
192
+				$to = $start;
193
+				for (; $this->currentPos < $end; ++$this->currentPos) {
194
+					if (isset($this->map['i'][$this->currentPos])) {
195
+						$ret .= substr($this->datas, $start, $to - $start).'?';
196
+						$start = $this->map['p'][$this->currentPos];
197
+					} else {
198
+						$to = $this->map['p'][$this->currentPos];
199
+					}
200
+				}
201
+				$ret .= substr($this->datas, $start, $to - $start);
202
+				break;
203
+		}
204 204
 
205
-        return $ret;
206
-    }
205
+		return $ret;
206
+	}
207 207
 
208
-    /**
209
-     * @see Swift_CharacterStream::readBytes()
210
-     *
211
-     * @param int $length
212
-     *
213
-     * @return int[]
214
-     */
215
-    public function readBytes($length)
216
-    {
217
-        $read = $this->read($length);
218
-        if (false !== $read) {
219
-            $ret = array_map('ord', str_split($read, 1));
208
+	/**
209
+	 * @see Swift_CharacterStream::readBytes()
210
+	 *
211
+	 * @param int $length
212
+	 *
213
+	 * @return int[]
214
+	 */
215
+	public function readBytes($length)
216
+	{
217
+		$read = $this->read($length);
218
+		if (false !== $read) {
219
+			$ret = array_map('ord', str_split($read, 1));
220 220
 
221
-            return $ret;
222
-        }
221
+			return $ret;
222
+		}
223 223
 
224
-        return false;
225
-    }
224
+		return false;
225
+	}
226 226
 
227
-    /**
228
-     * @see Swift_CharacterStream::setPointer()
229
-     *
230
-     * @param int $charOffset
231
-     */
232
-    public function setPointer($charOffset)
233
-    {
234
-        if ($this->charCount < $charOffset) {
235
-            $charOffset = $this->charCount;
236
-        }
237
-        $this->currentPos = $charOffset;
238
-    }
227
+	/**
228
+	 * @see Swift_CharacterStream::setPointer()
229
+	 *
230
+	 * @param int $charOffset
231
+	 */
232
+	public function setPointer($charOffset)
233
+	{
234
+		if ($this->charCount < $charOffset) {
235
+			$charOffset = $this->charCount;
236
+		}
237
+		$this->currentPos = $charOffset;
238
+	}
239 239
 
240
-    /**
241
-     * @see Swift_CharacterStream::write()
242
-     *
243
-     * @param string $chars
244
-     */
245
-    public function write($chars)
246
-    {
247
-        if (!isset($this->charReader)) {
248
-            $this->charReader = $this->charReaderFactory->getReaderFor(
249
-                $this->charset);
250
-            $this->map = [];
251
-            $this->mapType = $this->charReader->getMapType();
252
-        }
253
-        $ignored = '';
254
-        $this->datas .= $chars;
255
-        $this->charCount += $this->charReader->getCharPositions(substr($this->datas, $this->datasSize), $this->datasSize, $this->map, $ignored);
256
-        if (false !== $ignored) {
257
-            $this->datasSize = \strlen($this->datas) - \strlen($ignored);
258
-        } else {
259
-            $this->datasSize = \strlen($this->datas);
260
-        }
261
-    }
240
+	/**
241
+	 * @see Swift_CharacterStream::write()
242
+	 *
243
+	 * @param string $chars
244
+	 */
245
+	public function write($chars)
246
+	{
247
+		if (!isset($this->charReader)) {
248
+			$this->charReader = $this->charReaderFactory->getReaderFor(
249
+				$this->charset);
250
+			$this->map = [];
251
+			$this->mapType = $this->charReader->getMapType();
252
+		}
253
+		$ignored = '';
254
+		$this->datas .= $chars;
255
+		$this->charCount += $this->charReader->getCharPositions(substr($this->datas, $this->datasSize), $this->datasSize, $this->map, $ignored);
256
+		if (false !== $ignored) {
257
+			$this->datasSize = \strlen($this->datas) - \strlen($ignored);
258
+		} else {
259
+			$this->datasSize = \strlen($this->datas);
260
+		}
261
+	}
262 262
 }
Please login to merge, or discard this patch.
swiftmailer/lib/classes/Swift/CharacterStream/ArrayCharacterStream.php 1 patch
Indentation   +273 added lines, -273 removed lines patch added patch discarded remove patch
@@ -15,277 +15,277 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_CharacterStream_ArrayCharacterStream implements Swift_CharacterStream
17 17
 {
18
-    /** A map of byte values and their respective characters */
19
-    private static $charMap;
20
-
21
-    /** A map of characters and their derivative byte values */
22
-    private static $byteMap;
23
-
24
-    /** The char reader (lazy-loaded) for the current charset */
25
-    private $charReader;
26
-
27
-    /** A factory for creating CharacterReader instances */
28
-    private $charReaderFactory;
29
-
30
-    /** The character set this stream is using */
31
-    private $charset;
32
-
33
-    /** Array of characters */
34
-    private $array = [];
35
-
36
-    /** Size of the array of character */
37
-    private $array_size = [];
38
-
39
-    /** The current character offset in the stream */
40
-    private $offset = 0;
41
-
42
-    /**
43
-     * Create a new CharacterStream with the given $chars, if set.
44
-     *
45
-     * @param Swift_CharacterReaderFactory $factory for loading validators
46
-     * @param string                       $charset used in the stream
47
-     */
48
-    public function __construct(Swift_CharacterReaderFactory $factory, $charset)
49
-    {
50
-        self::initializeMaps();
51
-        $this->setCharacterReaderFactory($factory);
52
-        $this->setCharacterSet($charset);
53
-    }
54
-
55
-    /**
56
-     * Set the character set used in this CharacterStream.
57
-     *
58
-     * @param string $charset
59
-     */
60
-    public function setCharacterSet($charset)
61
-    {
62
-        $this->charset = $charset;
63
-        $this->charReader = null;
64
-    }
65
-
66
-    /**
67
-     * Set the CharacterReaderFactory for multi charset support.
68
-     */
69
-    public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory)
70
-    {
71
-        $this->charReaderFactory = $factory;
72
-    }
73
-
74
-    /**
75
-     * Overwrite this character stream using the byte sequence in the byte stream.
76
-     *
77
-     * @param Swift_OutputByteStream $os output stream to read from
78
-     */
79
-    public function importByteStream(Swift_OutputByteStream $os)
80
-    {
81
-        if (!isset($this->charReader)) {
82
-            $this->charReader = $this->charReaderFactory
83
-                ->getReaderFor($this->charset);
84
-        }
85
-
86
-        $startLength = $this->charReader->getInitialByteSize();
87
-        while (false !== $bytes = $os->read($startLength)) {
88
-            $c = [];
89
-            for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
90
-                $c[] = self::$byteMap[$bytes[$i]];
91
-            }
92
-            $size = \count($c);
93
-            $need = $this->charReader
94
-                ->validateByteSequence($c, $size);
95
-            if ($need > 0 &&
96
-                false !== $bytes = $os->read($need)) {
97
-                for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
98
-                    $c[] = self::$byteMap[$bytes[$i]];
99
-                }
100
-            }
101
-            $this->array[] = $c;
102
-            ++$this->array_size;
103
-        }
104
-    }
105
-
106
-    /**
107
-     * Import a string a bytes into this CharacterStream, overwriting any existing
108
-     * data in the stream.
109
-     *
110
-     * @param string $string
111
-     */
112
-    public function importString($string)
113
-    {
114
-        $this->flushContents();
115
-        $this->write($string);
116
-    }
117
-
118
-    /**
119
-     * Read $length characters from the stream and move the internal pointer
120
-     * $length further into the stream.
121
-     *
122
-     * @param int $length
123
-     *
124
-     * @return string
125
-     */
126
-    public function read($length)
127
-    {
128
-        if ($this->offset == $this->array_size) {
129
-            return false;
130
-        }
131
-
132
-        // Don't use array slice
133
-        $arrays = [];
134
-        $end = $length + $this->offset;
135
-        for ($i = $this->offset; $i < $end; ++$i) {
136
-            if (!isset($this->array[$i])) {
137
-                break;
138
-            }
139
-            $arrays[] = $this->array[$i];
140
-        }
141
-        $this->offset += $i - $this->offset; // Limit function calls
142
-        $chars = false;
143
-        foreach ($arrays as $array) {
144
-            $chars .= implode('', array_map('chr', $array));
145
-        }
146
-
147
-        return $chars;
148
-    }
149
-
150
-    /**
151
-     * Read $length characters from the stream and return a 1-dimensional array
152
-     * containing there octet values.
153
-     *
154
-     * @param int $length
155
-     *
156
-     * @return int[]
157
-     */
158
-    public function readBytes($length)
159
-    {
160
-        if ($this->offset == $this->array_size) {
161
-            return false;
162
-        }
163
-        $arrays = [];
164
-        $end = $length + $this->offset;
165
-        for ($i = $this->offset; $i < $end; ++$i) {
166
-            if (!isset($this->array[$i])) {
167
-                break;
168
-            }
169
-            $arrays[] = $this->array[$i];
170
-        }
171
-        $this->offset += ($i - $this->offset); // Limit function calls
172
-
173
-        return array_merge(...$arrays);
174
-    }
175
-
176
-    /**
177
-     * Write $chars to the end of the stream.
178
-     *
179
-     * @param string $chars
180
-     */
181
-    public function write($chars)
182
-    {
183
-        if (!isset($this->charReader)) {
184
-            $this->charReader = $this->charReaderFactory->getReaderFor(
185
-                $this->charset);
186
-        }
187
-
188
-        $startLength = $this->charReader->getInitialByteSize();
189
-
190
-        $fp = fopen('php://memory', 'w+b');
191
-        fwrite($fp, $chars);
192
-        unset($chars);
193
-        fseek($fp, 0, SEEK_SET);
194
-
195
-        $buffer = [0];
196
-        $buf_pos = 1;
197
-        $buf_len = 1;
198
-        $has_datas = true;
199
-        do {
200
-            $bytes = [];
201
-            // Buffer Filing
202
-            if ($buf_len - $buf_pos < $startLength) {
203
-                $buf = array_splice($buffer, $buf_pos);
204
-                $new = $this->reloadBuffer($fp, 100);
205
-                if ($new) {
206
-                    $buffer = array_merge($buf, $new);
207
-                    $buf_len = \count($buffer);
208
-                    $buf_pos = 0;
209
-                } else {
210
-                    $has_datas = false;
211
-                }
212
-            }
213
-            if ($buf_len - $buf_pos > 0) {
214
-                $size = 0;
215
-                for ($i = 0; $i < $startLength && isset($buffer[$buf_pos]); ++$i) {
216
-                    ++$size;
217
-                    $bytes[] = $buffer[$buf_pos++];
218
-                }
219
-                $need = $this->charReader->validateByteSequence(
220
-                    $bytes, $size);
221
-                if ($need > 0) {
222
-                    if ($buf_len - $buf_pos < $need) {
223
-                        $new = $this->reloadBuffer($fp, $need);
224
-
225
-                        if ($new) {
226
-                            $buffer = array_merge($buffer, $new);
227
-                            $buf_len = \count($buffer);
228
-                        }
229
-                    }
230
-                    for ($i = 0; $i < $need && isset($buffer[$buf_pos]); ++$i) {
231
-                        $bytes[] = $buffer[$buf_pos++];
232
-                    }
233
-                }
234
-                $this->array[] = $bytes;
235
-                ++$this->array_size;
236
-            }
237
-        } while ($has_datas);
238
-
239
-        fclose($fp);
240
-    }
241
-
242
-    /**
243
-     * Move the internal pointer to $charOffset in the stream.
244
-     *
245
-     * @param int $charOffset
246
-     */
247
-    public function setPointer($charOffset)
248
-    {
249
-        if ($charOffset > $this->array_size) {
250
-            $charOffset = $this->array_size;
251
-        } elseif ($charOffset < 0) {
252
-            $charOffset = 0;
253
-        }
254
-        $this->offset = $charOffset;
255
-    }
256
-
257
-    /**
258
-     * Empty the stream and reset the internal pointer.
259
-     */
260
-    public function flushContents()
261
-    {
262
-        $this->offset = 0;
263
-        $this->array = [];
264
-        $this->array_size = 0;
265
-    }
266
-
267
-    private function reloadBuffer($fp, $len)
268
-    {
269
-        if (!feof($fp) && false !== ($bytes = fread($fp, $len))) {
270
-            $buf = [];
271
-            for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
272
-                $buf[] = self::$byteMap[$bytes[$i]];
273
-            }
274
-
275
-            return $buf;
276
-        }
277
-
278
-        return false;
279
-    }
280
-
281
-    private static function initializeMaps()
282
-    {
283
-        if (!isset(self::$charMap)) {
284
-            self::$charMap = [];
285
-            for ($byte = 0; $byte < 256; ++$byte) {
286
-                self::$charMap[$byte] = \chr($byte);
287
-            }
288
-            self::$byteMap = array_flip(self::$charMap);
289
-        }
290
-    }
18
+	/** A map of byte values and their respective characters */
19
+	private static $charMap;
20
+
21
+	/** A map of characters and their derivative byte values */
22
+	private static $byteMap;
23
+
24
+	/** The char reader (lazy-loaded) for the current charset */
25
+	private $charReader;
26
+
27
+	/** A factory for creating CharacterReader instances */
28
+	private $charReaderFactory;
29
+
30
+	/** The character set this stream is using */
31
+	private $charset;
32
+
33
+	/** Array of characters */
34
+	private $array = [];
35
+
36
+	/** Size of the array of character */
37
+	private $array_size = [];
38
+
39
+	/** The current character offset in the stream */
40
+	private $offset = 0;
41
+
42
+	/**
43
+	 * Create a new CharacterStream with the given $chars, if set.
44
+	 *
45
+	 * @param Swift_CharacterReaderFactory $factory for loading validators
46
+	 * @param string                       $charset used in the stream
47
+	 */
48
+	public function __construct(Swift_CharacterReaderFactory $factory, $charset)
49
+	{
50
+		self::initializeMaps();
51
+		$this->setCharacterReaderFactory($factory);
52
+		$this->setCharacterSet($charset);
53
+	}
54
+
55
+	/**
56
+	 * Set the character set used in this CharacterStream.
57
+	 *
58
+	 * @param string $charset
59
+	 */
60
+	public function setCharacterSet($charset)
61
+	{
62
+		$this->charset = $charset;
63
+		$this->charReader = null;
64
+	}
65
+
66
+	/**
67
+	 * Set the CharacterReaderFactory for multi charset support.
68
+	 */
69
+	public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory)
70
+	{
71
+		$this->charReaderFactory = $factory;
72
+	}
73
+
74
+	/**
75
+	 * Overwrite this character stream using the byte sequence in the byte stream.
76
+	 *
77
+	 * @param Swift_OutputByteStream $os output stream to read from
78
+	 */
79
+	public function importByteStream(Swift_OutputByteStream $os)
80
+	{
81
+		if (!isset($this->charReader)) {
82
+			$this->charReader = $this->charReaderFactory
83
+				->getReaderFor($this->charset);
84
+		}
85
+
86
+		$startLength = $this->charReader->getInitialByteSize();
87
+		while (false !== $bytes = $os->read($startLength)) {
88
+			$c = [];
89
+			for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
90
+				$c[] = self::$byteMap[$bytes[$i]];
91
+			}
92
+			$size = \count($c);
93
+			$need = $this->charReader
94
+				->validateByteSequence($c, $size);
95
+			if ($need > 0 &&
96
+				false !== $bytes = $os->read($need)) {
97
+				for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
98
+					$c[] = self::$byteMap[$bytes[$i]];
99
+				}
100
+			}
101
+			$this->array[] = $c;
102
+			++$this->array_size;
103
+		}
104
+	}
105
+
106
+	/**
107
+	 * Import a string a bytes into this CharacterStream, overwriting any existing
108
+	 * data in the stream.
109
+	 *
110
+	 * @param string $string
111
+	 */
112
+	public function importString($string)
113
+	{
114
+		$this->flushContents();
115
+		$this->write($string);
116
+	}
117
+
118
+	/**
119
+	 * Read $length characters from the stream and move the internal pointer
120
+	 * $length further into the stream.
121
+	 *
122
+	 * @param int $length
123
+	 *
124
+	 * @return string
125
+	 */
126
+	public function read($length)
127
+	{
128
+		if ($this->offset == $this->array_size) {
129
+			return false;
130
+		}
131
+
132
+		// Don't use array slice
133
+		$arrays = [];
134
+		$end = $length + $this->offset;
135
+		for ($i = $this->offset; $i < $end; ++$i) {
136
+			if (!isset($this->array[$i])) {
137
+				break;
138
+			}
139
+			$arrays[] = $this->array[$i];
140
+		}
141
+		$this->offset += $i - $this->offset; // Limit function calls
142
+		$chars = false;
143
+		foreach ($arrays as $array) {
144
+			$chars .= implode('', array_map('chr', $array));
145
+		}
146
+
147
+		return $chars;
148
+	}
149
+
150
+	/**
151
+	 * Read $length characters from the stream and return a 1-dimensional array
152
+	 * containing there octet values.
153
+	 *
154
+	 * @param int $length
155
+	 *
156
+	 * @return int[]
157
+	 */
158
+	public function readBytes($length)
159
+	{
160
+		if ($this->offset == $this->array_size) {
161
+			return false;
162
+		}
163
+		$arrays = [];
164
+		$end = $length + $this->offset;
165
+		for ($i = $this->offset; $i < $end; ++$i) {
166
+			if (!isset($this->array[$i])) {
167
+				break;
168
+			}
169
+			$arrays[] = $this->array[$i];
170
+		}
171
+		$this->offset += ($i - $this->offset); // Limit function calls
172
+
173
+		return array_merge(...$arrays);
174
+	}
175
+
176
+	/**
177
+	 * Write $chars to the end of the stream.
178
+	 *
179
+	 * @param string $chars
180
+	 */
181
+	public function write($chars)
182
+	{
183
+		if (!isset($this->charReader)) {
184
+			$this->charReader = $this->charReaderFactory->getReaderFor(
185
+				$this->charset);
186
+		}
187
+
188
+		$startLength = $this->charReader->getInitialByteSize();
189
+
190
+		$fp = fopen('php://memory', 'w+b');
191
+		fwrite($fp, $chars);
192
+		unset($chars);
193
+		fseek($fp, 0, SEEK_SET);
194
+
195
+		$buffer = [0];
196
+		$buf_pos = 1;
197
+		$buf_len = 1;
198
+		$has_datas = true;
199
+		do {
200
+			$bytes = [];
201
+			// Buffer Filing
202
+			if ($buf_len - $buf_pos < $startLength) {
203
+				$buf = array_splice($buffer, $buf_pos);
204
+				$new = $this->reloadBuffer($fp, 100);
205
+				if ($new) {
206
+					$buffer = array_merge($buf, $new);
207
+					$buf_len = \count($buffer);
208
+					$buf_pos = 0;
209
+				} else {
210
+					$has_datas = false;
211
+				}
212
+			}
213
+			if ($buf_len - $buf_pos > 0) {
214
+				$size = 0;
215
+				for ($i = 0; $i < $startLength && isset($buffer[$buf_pos]); ++$i) {
216
+					++$size;
217
+					$bytes[] = $buffer[$buf_pos++];
218
+				}
219
+				$need = $this->charReader->validateByteSequence(
220
+					$bytes, $size);
221
+				if ($need > 0) {
222
+					if ($buf_len - $buf_pos < $need) {
223
+						$new = $this->reloadBuffer($fp, $need);
224
+
225
+						if ($new) {
226
+							$buffer = array_merge($buffer, $new);
227
+							$buf_len = \count($buffer);
228
+						}
229
+					}
230
+					for ($i = 0; $i < $need && isset($buffer[$buf_pos]); ++$i) {
231
+						$bytes[] = $buffer[$buf_pos++];
232
+					}
233
+				}
234
+				$this->array[] = $bytes;
235
+				++$this->array_size;
236
+			}
237
+		} while ($has_datas);
238
+
239
+		fclose($fp);
240
+	}
241
+
242
+	/**
243
+	 * Move the internal pointer to $charOffset in the stream.
244
+	 *
245
+	 * @param int $charOffset
246
+	 */
247
+	public function setPointer($charOffset)
248
+	{
249
+		if ($charOffset > $this->array_size) {
250
+			$charOffset = $this->array_size;
251
+		} elseif ($charOffset < 0) {
252
+			$charOffset = 0;
253
+		}
254
+		$this->offset = $charOffset;
255
+	}
256
+
257
+	/**
258
+	 * Empty the stream and reset the internal pointer.
259
+	 */
260
+	public function flushContents()
261
+	{
262
+		$this->offset = 0;
263
+		$this->array = [];
264
+		$this->array_size = 0;
265
+	}
266
+
267
+	private function reloadBuffer($fp, $len)
268
+	{
269
+		if (!feof($fp) && false !== ($bytes = fread($fp, $len))) {
270
+			$buf = [];
271
+			for ($i = 0, $len = \strlen($bytes); $i < $len; ++$i) {
272
+				$buf[] = self::$byteMap[$bytes[$i]];
273
+			}
274
+
275
+			return $buf;
276
+		}
277
+
278
+		return false;
279
+	}
280
+
281
+	private static function initializeMaps()
282
+	{
283
+		if (!isset(self::$charMap)) {
284
+			self::$charMap = [];
285
+			for ($byte = 0; $byte < 256; ++$byte) {
286
+				self::$charMap[$byte] = \chr($byte);
287
+			}
288
+			self::$byteMap = array_flip(self::$charMap);
289
+		}
290
+	}
291 291
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift.php 1 patch
Indentation   +52 added lines, -52 removed lines patch added patch discarded remove patch
@@ -15,64 +15,64 @@
 block discarded – undo
15 15
  */
16 16
 abstract class Swift
17 17
 {
18
-    const VERSION = '6.3.0';
18
+	const VERSION = '6.3.0';
19 19
 
20
-    public static $initialized = false;
21
-    public static $inits = [];
20
+	public static $initialized = false;
21
+	public static $inits = [];
22 22
 
23
-    /**
24
-     * Registers an initializer callable that will be called the first time
25
-     * a SwiftMailer class is autoloaded.
26
-     *
27
-     * This enables you to tweak the default configuration in a lazy way.
28
-     *
29
-     * @param mixed $callable A valid PHP callable that will be called when autoloading the first Swift class
30
-     */
31
-    public static function init($callable)
32
-    {
33
-        self::$inits[] = $callable;
34
-    }
23
+	/**
24
+	 * Registers an initializer callable that will be called the first time
25
+	 * a SwiftMailer class is autoloaded.
26
+	 *
27
+	 * This enables you to tweak the default configuration in a lazy way.
28
+	 *
29
+	 * @param mixed $callable A valid PHP callable that will be called when autoloading the first Swift class
30
+	 */
31
+	public static function init($callable)
32
+	{
33
+		self::$inits[] = $callable;
34
+	}
35 35
 
36
-    /**
37
-     * Internal autoloader for spl_autoload_register().
38
-     *
39
-     * @param string $class
40
-     */
41
-    public static function autoload($class)
42
-    {
43
-        // Don't interfere with other autoloaders
44
-        if (0 !== strpos($class, 'Swift_')) {
45
-            return;
46
-        }
36
+	/**
37
+	 * Internal autoloader for spl_autoload_register().
38
+	 *
39
+	 * @param string $class
40
+	 */
41
+	public static function autoload($class)
42
+	{
43
+		// Don't interfere with other autoloaders
44
+		if (0 !== strpos($class, 'Swift_')) {
45
+			return;
46
+		}
47 47
 
48
-        $path = __DIR__.'/'.str_replace('_', '/', $class).'.php';
48
+		$path = __DIR__.'/'.str_replace('_', '/', $class).'.php';
49 49
 
50
-        if (!file_exists($path)) {
51
-            return;
52
-        }
50
+		if (!file_exists($path)) {
51
+			return;
52
+		}
53 53
 
54
-        require $path;
54
+		require $path;
55 55
 
56
-        if (self::$inits && !self::$initialized) {
57
-            self::$initialized = true;
58
-            foreach (self::$inits as $init) {
59
-                \call_user_func($init);
60
-            }
61
-        }
62
-    }
56
+		if (self::$inits && !self::$initialized) {
57
+			self::$initialized = true;
58
+			foreach (self::$inits as $init) {
59
+				\call_user_func($init);
60
+			}
61
+		}
62
+	}
63 63
 
64
-    /**
65
-     * Configure autoloading using Swift Mailer.
66
-     *
67
-     * This is designed to play nicely with other autoloaders.
68
-     *
69
-     * @param mixed $callable A valid PHP callable that will be called when autoloading the first Swift class
70
-     */
71
-    public static function registerAutoload($callable = null)
72
-    {
73
-        if (null !== $callable) {
74
-            self::$inits[] = $callable;
75
-        }
76
-        spl_autoload_register(['Swift', 'autoload']);
77
-    }
64
+	/**
65
+	 * Configure autoloading using Swift Mailer.
66
+	 *
67
+	 * This is designed to play nicely with other autoloaders.
68
+	 *
69
+	 * @param mixed $callable A valid PHP callable that will be called when autoloading the first Swift class
70
+	 */
71
+	public static function registerAutoload($callable = null)
72
+	{
73
+		if (null !== $callable) {
74
+			self::$inits[] = $callable;
75
+		}
76
+		spl_autoload_register(['Swift', 'autoload']);
77
+	}
78 78
 }
Please login to merge, or discard this patch.