Completed
Branch develop (aacecf)
by
unknown
25:04
created
htdocs/includes/swiftmailer/lib/classes/Swift/Message.php 1 patch
Indentation   +261 added lines, -261 removed lines patch added patch discarded remove patch
@@ -15,265 +15,265 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Message extends Swift_Mime_SimpleMessage
17 17
 {
18
-    /**
19
-     * @var Swift_Signers_HeaderSigner[]
20
-     */
21
-    private $headerSigners = [];
22
-
23
-    /**
24
-     * @var Swift_Signers_BodySigner[]
25
-     */
26
-    private $bodySigners = [];
27
-
28
-    /**
29
-     * @var array
30
-     */
31
-    private $savedMessage = [];
32
-
33
-    /**
34
-     * Create a new Message.
35
-     *
36
-     * Details may be optionally passed into the constructor.
37
-     *
38
-     * @param string $subject
39
-     * @param string $body
40
-     * @param string $contentType
41
-     * @param string $charset
42
-     */
43
-    public function __construct($subject = null, $body = null, $contentType = null, $charset = null)
44
-    {
45
-        \call_user_func_array(
46
-            [$this, 'Swift_Mime_SimpleMessage::__construct'],
47
-            Swift_DependencyContainer::getInstance()
48
-                ->createDependenciesFor('mime.message')
49
-            );
50
-
51
-        if (!isset($charset)) {
52
-            $charset = Swift_DependencyContainer::getInstance()
53
-                ->lookup('properties.charset');
54
-        }
55
-        $this->setSubject($subject);
56
-        $this->setBody($body);
57
-        $this->setCharset($charset);
58
-        if ($contentType) {
59
-            $this->setContentType($contentType);
60
-        }
61
-    }
62
-
63
-    /**
64
-     * Add a MimePart to this Message.
65
-     *
66
-     * @param string|Swift_OutputByteStream $body
67
-     * @param string                        $contentType
68
-     * @param string                        $charset
69
-     *
70
-     * @return $this
71
-     */
72
-    public function addPart($body, $contentType = null, $charset = null)
73
-    {
74
-        return $this->attach((new Swift_MimePart($body, $contentType, $charset))->setEncoder($this->getEncoder()));
75
-    }
76
-
77
-    /**
78
-     * Attach a new signature handler to the message.
79
-     *
80
-     * @return $this
81
-     */
82
-    public function attachSigner(Swift_Signer $signer)
83
-    {
84
-        if ($signer instanceof Swift_Signers_HeaderSigner) {
85
-            $this->headerSigners[] = $signer;
86
-        } elseif ($signer instanceof Swift_Signers_BodySigner) {
87
-            $this->bodySigners[] = $signer;
88
-        }
89
-
90
-        return $this;
91
-    }
92
-
93
-    /**
94
-     * Detach a signature handler from a message.
95
-     *
96
-     * @return $this
97
-     */
98
-    public function detachSigner(Swift_Signer $signer)
99
-    {
100
-        if ($signer instanceof Swift_Signers_HeaderSigner) {
101
-            foreach ($this->headerSigners as $k => $headerSigner) {
102
-                if ($headerSigner === $signer) {
103
-                    unset($this->headerSigners[$k]);
104
-
105
-                    return $this;
106
-                }
107
-            }
108
-        } elseif ($signer instanceof Swift_Signers_BodySigner) {
109
-            foreach ($this->bodySigners as $k => $bodySigner) {
110
-                if ($bodySigner === $signer) {
111
-                    unset($this->bodySigners[$k]);
112
-
113
-                    return $this;
114
-                }
115
-            }
116
-        }
117
-
118
-        return $this;
119
-    }
120
-
121
-    /**
122
-     * Clear all signature handlers attached to the message.
123
-     *
124
-     * @return $this
125
-     */
126
-    public function clearSigners()
127
-    {
128
-        $this->headerSigners = [];
129
-        $this->bodySigners = [];
130
-
131
-        return $this;
132
-    }
133
-
134
-    /**
135
-     * Get this message as a complete string.
136
-     *
137
-     * @return string
138
-     */
139
-    public function toString()
140
-    {
141
-        if (empty($this->headerSigners) && empty($this->bodySigners)) {
142
-            return parent::toString();
143
-        }
144
-
145
-        $this->saveMessage();
146
-
147
-        $this->doSign();
148
-
149
-        $string = parent::toString();
150
-
151
-        $this->restoreMessage();
152
-
153
-        return $string;
154
-    }
155
-
156
-    /**
157
-     * Write this message to a {@link Swift_InputByteStream}.
158
-     */
159
-    public function toByteStream(Swift_InputByteStream $is)
160
-    {
161
-        if (empty($this->headerSigners) && empty($this->bodySigners)) {
162
-            parent::toByteStream($is);
163
-
164
-            return;
165
-        }
166
-
167
-        $this->saveMessage();
168
-
169
-        $this->doSign();
170
-
171
-        parent::toByteStream($is);
172
-
173
-        $this->restoreMessage();
174
-    }
175
-
176
-    public function __wakeup()
177
-    {
178
-        Swift_DependencyContainer::getInstance()->createDependenciesFor('mime.message');
179
-    }
180
-
181
-    /**
182
-     * loops through signers and apply the signatures.
183
-     */
184
-    protected function doSign()
185
-    {
186
-        foreach ($this->bodySigners as $signer) {
187
-            $altered = $signer->getAlteredHeaders();
188
-            $this->saveHeaders($altered);
189
-            $signer->signMessage($this);
190
-        }
191
-
192
-        foreach ($this->headerSigners as $signer) {
193
-            $altered = $signer->getAlteredHeaders();
194
-            $this->saveHeaders($altered);
195
-            $signer->reset();
196
-
197
-            $signer->setHeaders($this->getHeaders());
198
-
199
-            $signer->startBody();
200
-            $this->bodyToByteStream($signer);
201
-            $signer->endBody();
202
-
203
-            $signer->addSignature($this->getHeaders());
204
-        }
205
-    }
206
-
207
-    /**
208
-     * save the message before any signature is applied.
209
-     */
210
-    protected function saveMessage()
211
-    {
212
-        $this->savedMessage = ['headers' => []];
213
-        $this->savedMessage['body'] = $this->getBody();
214
-        $this->savedMessage['children'] = $this->getChildren();
215
-        if (\count($this->savedMessage['children']) > 0 && '' != $this->getBody()) {
216
-            $this->setChildren(array_merge([$this->becomeMimePart()], $this->savedMessage['children']));
217
-            $this->setBody('');
218
-        }
219
-    }
220
-
221
-    /**
222
-     * save the original headers.
223
-     */
224
-    protected function saveHeaders(array $altered)
225
-    {
226
-        foreach ($altered as $head) {
227
-            $lc = strtolower($head ?? '');
228
-
229
-            if (!isset($this->savedMessage['headers'][$lc])) {
230
-                $this->savedMessage['headers'][$lc] = $this->getHeaders()->getAll($head);
231
-            }
232
-        }
233
-    }
234
-
235
-    /**
236
-     * Remove or restore altered headers.
237
-     */
238
-    protected function restoreHeaders()
239
-    {
240
-        foreach ($this->savedMessage['headers'] as $name => $savedValue) {
241
-            $headers = $this->getHeaders()->getAll($name);
242
-
243
-            foreach ($headers as $key => $value) {
244
-                if (!isset($savedValue[$key])) {
245
-                    $this->getHeaders()->remove($name, $key);
246
-                }
247
-            }
248
-        }
249
-    }
250
-
251
-    /**
252
-     * Restore message body.
253
-     */
254
-    protected function restoreMessage()
255
-    {
256
-        $this->setBody($this->savedMessage['body']);
257
-        $this->setChildren($this->savedMessage['children']);
258
-
259
-        $this->restoreHeaders();
260
-        $this->savedMessage = [];
261
-    }
262
-
263
-    /**
264
-     * Clone Message Signers.
265
-     *
266
-     * @see Swift_Mime_SimpleMimeEntity::__clone()
267
-     */
268
-    public function __clone()
269
-    {
270
-        parent::__clone();
271
-        foreach ($this->bodySigners as $key => $bodySigner) {
272
-            $this->bodySigners[$key] = clone $bodySigner;
273
-        }
274
-
275
-        foreach ($this->headerSigners as $key => $headerSigner) {
276
-            $this->headerSigners[$key] = clone $headerSigner;
277
-        }
278
-    }
18
+	/**
19
+	 * @var Swift_Signers_HeaderSigner[]
20
+	 */
21
+	private $headerSigners = [];
22
+
23
+	/**
24
+	 * @var Swift_Signers_BodySigner[]
25
+	 */
26
+	private $bodySigners = [];
27
+
28
+	/**
29
+	 * @var array
30
+	 */
31
+	private $savedMessage = [];
32
+
33
+	/**
34
+	 * Create a new Message.
35
+	 *
36
+	 * Details may be optionally passed into the constructor.
37
+	 *
38
+	 * @param string $subject
39
+	 * @param string $body
40
+	 * @param string $contentType
41
+	 * @param string $charset
42
+	 */
43
+	public function __construct($subject = null, $body = null, $contentType = null, $charset = null)
44
+	{
45
+		\call_user_func_array(
46
+			[$this, 'Swift_Mime_SimpleMessage::__construct'],
47
+			Swift_DependencyContainer::getInstance()
48
+				->createDependenciesFor('mime.message')
49
+			);
50
+
51
+		if (!isset($charset)) {
52
+			$charset = Swift_DependencyContainer::getInstance()
53
+				->lookup('properties.charset');
54
+		}
55
+		$this->setSubject($subject);
56
+		$this->setBody($body);
57
+		$this->setCharset($charset);
58
+		if ($contentType) {
59
+			$this->setContentType($contentType);
60
+		}
61
+	}
62
+
63
+	/**
64
+	 * Add a MimePart to this Message.
65
+	 *
66
+	 * @param string|Swift_OutputByteStream $body
67
+	 * @param string                        $contentType
68
+	 * @param string                        $charset
69
+	 *
70
+	 * @return $this
71
+	 */
72
+	public function addPart($body, $contentType = null, $charset = null)
73
+	{
74
+		return $this->attach((new Swift_MimePart($body, $contentType, $charset))->setEncoder($this->getEncoder()));
75
+	}
76
+
77
+	/**
78
+	 * Attach a new signature handler to the message.
79
+	 *
80
+	 * @return $this
81
+	 */
82
+	public function attachSigner(Swift_Signer $signer)
83
+	{
84
+		if ($signer instanceof Swift_Signers_HeaderSigner) {
85
+			$this->headerSigners[] = $signer;
86
+		} elseif ($signer instanceof Swift_Signers_BodySigner) {
87
+			$this->bodySigners[] = $signer;
88
+		}
89
+
90
+		return $this;
91
+	}
92
+
93
+	/**
94
+	 * Detach a signature handler from a message.
95
+	 *
96
+	 * @return $this
97
+	 */
98
+	public function detachSigner(Swift_Signer $signer)
99
+	{
100
+		if ($signer instanceof Swift_Signers_HeaderSigner) {
101
+			foreach ($this->headerSigners as $k => $headerSigner) {
102
+				if ($headerSigner === $signer) {
103
+					unset($this->headerSigners[$k]);
104
+
105
+					return $this;
106
+				}
107
+			}
108
+		} elseif ($signer instanceof Swift_Signers_BodySigner) {
109
+			foreach ($this->bodySigners as $k => $bodySigner) {
110
+				if ($bodySigner === $signer) {
111
+					unset($this->bodySigners[$k]);
112
+
113
+					return $this;
114
+				}
115
+			}
116
+		}
117
+
118
+		return $this;
119
+	}
120
+
121
+	/**
122
+	 * Clear all signature handlers attached to the message.
123
+	 *
124
+	 * @return $this
125
+	 */
126
+	public function clearSigners()
127
+	{
128
+		$this->headerSigners = [];
129
+		$this->bodySigners = [];
130
+
131
+		return $this;
132
+	}
133
+
134
+	/**
135
+	 * Get this message as a complete string.
136
+	 *
137
+	 * @return string
138
+	 */
139
+	public function toString()
140
+	{
141
+		if (empty($this->headerSigners) && empty($this->bodySigners)) {
142
+			return parent::toString();
143
+		}
144
+
145
+		$this->saveMessage();
146
+
147
+		$this->doSign();
148
+
149
+		$string = parent::toString();
150
+
151
+		$this->restoreMessage();
152
+
153
+		return $string;
154
+	}
155
+
156
+	/**
157
+	 * Write this message to a {@link Swift_InputByteStream}.
158
+	 */
159
+	public function toByteStream(Swift_InputByteStream $is)
160
+	{
161
+		if (empty($this->headerSigners) && empty($this->bodySigners)) {
162
+			parent::toByteStream($is);
163
+
164
+			return;
165
+		}
166
+
167
+		$this->saveMessage();
168
+
169
+		$this->doSign();
170
+
171
+		parent::toByteStream($is);
172
+
173
+		$this->restoreMessage();
174
+	}
175
+
176
+	public function __wakeup()
177
+	{
178
+		Swift_DependencyContainer::getInstance()->createDependenciesFor('mime.message');
179
+	}
180
+
181
+	/**
182
+	 * loops through signers and apply the signatures.
183
+	 */
184
+	protected function doSign()
185
+	{
186
+		foreach ($this->bodySigners as $signer) {
187
+			$altered = $signer->getAlteredHeaders();
188
+			$this->saveHeaders($altered);
189
+			$signer->signMessage($this);
190
+		}
191
+
192
+		foreach ($this->headerSigners as $signer) {
193
+			$altered = $signer->getAlteredHeaders();
194
+			$this->saveHeaders($altered);
195
+			$signer->reset();
196
+
197
+			$signer->setHeaders($this->getHeaders());
198
+
199
+			$signer->startBody();
200
+			$this->bodyToByteStream($signer);
201
+			$signer->endBody();
202
+
203
+			$signer->addSignature($this->getHeaders());
204
+		}
205
+	}
206
+
207
+	/**
208
+	 * save the message before any signature is applied.
209
+	 */
210
+	protected function saveMessage()
211
+	{
212
+		$this->savedMessage = ['headers' => []];
213
+		$this->savedMessage['body'] = $this->getBody();
214
+		$this->savedMessage['children'] = $this->getChildren();
215
+		if (\count($this->savedMessage['children']) > 0 && '' != $this->getBody()) {
216
+			$this->setChildren(array_merge([$this->becomeMimePart()], $this->savedMessage['children']));
217
+			$this->setBody('');
218
+		}
219
+	}
220
+
221
+	/**
222
+	 * save the original headers.
223
+	 */
224
+	protected function saveHeaders(array $altered)
225
+	{
226
+		foreach ($altered as $head) {
227
+			$lc = strtolower($head ?? '');
228
+
229
+			if (!isset($this->savedMessage['headers'][$lc])) {
230
+				$this->savedMessage['headers'][$lc] = $this->getHeaders()->getAll($head);
231
+			}
232
+		}
233
+	}
234
+
235
+	/**
236
+	 * Remove or restore altered headers.
237
+	 */
238
+	protected function restoreHeaders()
239
+	{
240
+		foreach ($this->savedMessage['headers'] as $name => $savedValue) {
241
+			$headers = $this->getHeaders()->getAll($name);
242
+
243
+			foreach ($headers as $key => $value) {
244
+				if (!isset($savedValue[$key])) {
245
+					$this->getHeaders()->remove($name, $key);
246
+				}
247
+			}
248
+		}
249
+	}
250
+
251
+	/**
252
+	 * Restore message body.
253
+	 */
254
+	protected function restoreMessage()
255
+	{
256
+		$this->setBody($this->savedMessage['body']);
257
+		$this->setChildren($this->savedMessage['children']);
258
+
259
+		$this->restoreHeaders();
260
+		$this->savedMessage = [];
261
+	}
262
+
263
+	/**
264
+	 * Clone Message Signers.
265
+	 *
266
+	 * @see Swift_Mime_SimpleMimeEntity::__clone()
267
+	 */
268
+	public function __clone()
269
+	{
270
+		parent::__clone();
271
+		foreach ($this->bodySigners as $key => $bodySigner) {
272
+			$this->bodySigners[$key] = clone $bodySigner;
273
+		}
274
+
275
+		foreach ($this->headerSigners as $key => $headerSigner) {
276
+			$this->headerSigners[$key] = clone $headerSigner;
277
+		}
278
+	}
279 279
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Encoder/QpEncoder.php 1 patch
Indentation   +252 added lines, -252 removed lines patch added patch discarded remove patch
@@ -17,284 +17,284 @@
 block discarded – undo
17 17
  */
18 18
 class Swift_Encoder_QpEncoder implements Swift_Encoder
19 19
 {
20
-    /**
21
-     * The CharacterStream used for reading characters (as opposed to bytes).
22
-     *
23
-     * @var Swift_CharacterStream
24
-     */
25
-    protected $charStream;
20
+	/**
21
+	 * The CharacterStream used for reading characters (as opposed to bytes).
22
+	 *
23
+	 * @var Swift_CharacterStream
24
+	 */
25
+	protected $charStream;
26 26
 
27
-    /**
28
-     * A filter used if input should be canonicalized.
29
-     *
30
-     * @var Swift_StreamFilter
31
-     */
32
-    protected $filter;
27
+	/**
28
+	 * A filter used if input should be canonicalized.
29
+	 *
30
+	 * @var Swift_StreamFilter
31
+	 */
32
+	protected $filter;
33 33
 
34
-    /**
35
-     * Pre-computed QP for HUGE optimization.
36
-     *
37
-     * @var string[]
38
-     */
39
-    protected static $qpMap = [
40
-        0 => '=00', 1 => '=01', 2 => '=02', 3 => '=03', 4 => '=04',
41
-        5 => '=05', 6 => '=06', 7 => '=07', 8 => '=08', 9 => '=09',
42
-        10 => '=0A', 11 => '=0B', 12 => '=0C', 13 => '=0D', 14 => '=0E',
43
-        15 => '=0F', 16 => '=10', 17 => '=11', 18 => '=12', 19 => '=13',
44
-        20 => '=14', 21 => '=15', 22 => '=16', 23 => '=17', 24 => '=18',
45
-        25 => '=19', 26 => '=1A', 27 => '=1B', 28 => '=1C', 29 => '=1D',
46
-        30 => '=1E', 31 => '=1F', 32 => '=20', 33 => '=21', 34 => '=22',
47
-        35 => '=23', 36 => '=24', 37 => '=25', 38 => '=26', 39 => '=27',
48
-        40 => '=28', 41 => '=29', 42 => '=2A', 43 => '=2B', 44 => '=2C',
49
-        45 => '=2D', 46 => '=2E', 47 => '=2F', 48 => '=30', 49 => '=31',
50
-        50 => '=32', 51 => '=33', 52 => '=34', 53 => '=35', 54 => '=36',
51
-        55 => '=37', 56 => '=38', 57 => '=39', 58 => '=3A', 59 => '=3B',
52
-        60 => '=3C', 61 => '=3D', 62 => '=3E', 63 => '=3F', 64 => '=40',
53
-        65 => '=41', 66 => '=42', 67 => '=43', 68 => '=44', 69 => '=45',
54
-        70 => '=46', 71 => '=47', 72 => '=48', 73 => '=49', 74 => '=4A',
55
-        75 => '=4B', 76 => '=4C', 77 => '=4D', 78 => '=4E', 79 => '=4F',
56
-        80 => '=50', 81 => '=51', 82 => '=52', 83 => '=53', 84 => '=54',
57
-        85 => '=55', 86 => '=56', 87 => '=57', 88 => '=58', 89 => '=59',
58
-        90 => '=5A', 91 => '=5B', 92 => '=5C', 93 => '=5D', 94 => '=5E',
59
-        95 => '=5F', 96 => '=60', 97 => '=61', 98 => '=62', 99 => '=63',
60
-        100 => '=64', 101 => '=65', 102 => '=66', 103 => '=67', 104 => '=68',
61
-        105 => '=69', 106 => '=6A', 107 => '=6B', 108 => '=6C', 109 => '=6D',
62
-        110 => '=6E', 111 => '=6F', 112 => '=70', 113 => '=71', 114 => '=72',
63
-        115 => '=73', 116 => '=74', 117 => '=75', 118 => '=76', 119 => '=77',
64
-        120 => '=78', 121 => '=79', 122 => '=7A', 123 => '=7B', 124 => '=7C',
65
-        125 => '=7D', 126 => '=7E', 127 => '=7F', 128 => '=80', 129 => '=81',
66
-        130 => '=82', 131 => '=83', 132 => '=84', 133 => '=85', 134 => '=86',
67
-        135 => '=87', 136 => '=88', 137 => '=89', 138 => '=8A', 139 => '=8B',
68
-        140 => '=8C', 141 => '=8D', 142 => '=8E', 143 => '=8F', 144 => '=90',
69
-        145 => '=91', 146 => '=92', 147 => '=93', 148 => '=94', 149 => '=95',
70
-        150 => '=96', 151 => '=97', 152 => '=98', 153 => '=99', 154 => '=9A',
71
-        155 => '=9B', 156 => '=9C', 157 => '=9D', 158 => '=9E', 159 => '=9F',
72
-        160 => '=A0', 161 => '=A1', 162 => '=A2', 163 => '=A3', 164 => '=A4',
73
-        165 => '=A5', 166 => '=A6', 167 => '=A7', 168 => '=A8', 169 => '=A9',
74
-        170 => '=AA', 171 => '=AB', 172 => '=AC', 173 => '=AD', 174 => '=AE',
75
-        175 => '=AF', 176 => '=B0', 177 => '=B1', 178 => '=B2', 179 => '=B3',
76
-        180 => '=B4', 181 => '=B5', 182 => '=B6', 183 => '=B7', 184 => '=B8',
77
-        185 => '=B9', 186 => '=BA', 187 => '=BB', 188 => '=BC', 189 => '=BD',
78
-        190 => '=BE', 191 => '=BF', 192 => '=C0', 193 => '=C1', 194 => '=C2',
79
-        195 => '=C3', 196 => '=C4', 197 => '=C5', 198 => '=C6', 199 => '=C7',
80
-        200 => '=C8', 201 => '=C9', 202 => '=CA', 203 => '=CB', 204 => '=CC',
81
-        205 => '=CD', 206 => '=CE', 207 => '=CF', 208 => '=D0', 209 => '=D1',
82
-        210 => '=D2', 211 => '=D3', 212 => '=D4', 213 => '=D5', 214 => '=D6',
83
-        215 => '=D7', 216 => '=D8', 217 => '=D9', 218 => '=DA', 219 => '=DB',
84
-        220 => '=DC', 221 => '=DD', 222 => '=DE', 223 => '=DF', 224 => '=E0',
85
-        225 => '=E1', 226 => '=E2', 227 => '=E3', 228 => '=E4', 229 => '=E5',
86
-        230 => '=E6', 231 => '=E7', 232 => '=E8', 233 => '=E9', 234 => '=EA',
87
-        235 => '=EB', 236 => '=EC', 237 => '=ED', 238 => '=EE', 239 => '=EF',
88
-        240 => '=F0', 241 => '=F1', 242 => '=F2', 243 => '=F3', 244 => '=F4',
89
-        245 => '=F5', 246 => '=F6', 247 => '=F7', 248 => '=F8', 249 => '=F9',
90
-        250 => '=FA', 251 => '=FB', 252 => '=FC', 253 => '=FD', 254 => '=FE',
91
-        255 => '=FF',
92
-        ];
34
+	/**
35
+	 * Pre-computed QP for HUGE optimization.
36
+	 *
37
+	 * @var string[]
38
+	 */
39
+	protected static $qpMap = [
40
+		0 => '=00', 1 => '=01', 2 => '=02', 3 => '=03', 4 => '=04',
41
+		5 => '=05', 6 => '=06', 7 => '=07', 8 => '=08', 9 => '=09',
42
+		10 => '=0A', 11 => '=0B', 12 => '=0C', 13 => '=0D', 14 => '=0E',
43
+		15 => '=0F', 16 => '=10', 17 => '=11', 18 => '=12', 19 => '=13',
44
+		20 => '=14', 21 => '=15', 22 => '=16', 23 => '=17', 24 => '=18',
45
+		25 => '=19', 26 => '=1A', 27 => '=1B', 28 => '=1C', 29 => '=1D',
46
+		30 => '=1E', 31 => '=1F', 32 => '=20', 33 => '=21', 34 => '=22',
47
+		35 => '=23', 36 => '=24', 37 => '=25', 38 => '=26', 39 => '=27',
48
+		40 => '=28', 41 => '=29', 42 => '=2A', 43 => '=2B', 44 => '=2C',
49
+		45 => '=2D', 46 => '=2E', 47 => '=2F', 48 => '=30', 49 => '=31',
50
+		50 => '=32', 51 => '=33', 52 => '=34', 53 => '=35', 54 => '=36',
51
+		55 => '=37', 56 => '=38', 57 => '=39', 58 => '=3A', 59 => '=3B',
52
+		60 => '=3C', 61 => '=3D', 62 => '=3E', 63 => '=3F', 64 => '=40',
53
+		65 => '=41', 66 => '=42', 67 => '=43', 68 => '=44', 69 => '=45',
54
+		70 => '=46', 71 => '=47', 72 => '=48', 73 => '=49', 74 => '=4A',
55
+		75 => '=4B', 76 => '=4C', 77 => '=4D', 78 => '=4E', 79 => '=4F',
56
+		80 => '=50', 81 => '=51', 82 => '=52', 83 => '=53', 84 => '=54',
57
+		85 => '=55', 86 => '=56', 87 => '=57', 88 => '=58', 89 => '=59',
58
+		90 => '=5A', 91 => '=5B', 92 => '=5C', 93 => '=5D', 94 => '=5E',
59
+		95 => '=5F', 96 => '=60', 97 => '=61', 98 => '=62', 99 => '=63',
60
+		100 => '=64', 101 => '=65', 102 => '=66', 103 => '=67', 104 => '=68',
61
+		105 => '=69', 106 => '=6A', 107 => '=6B', 108 => '=6C', 109 => '=6D',
62
+		110 => '=6E', 111 => '=6F', 112 => '=70', 113 => '=71', 114 => '=72',
63
+		115 => '=73', 116 => '=74', 117 => '=75', 118 => '=76', 119 => '=77',
64
+		120 => '=78', 121 => '=79', 122 => '=7A', 123 => '=7B', 124 => '=7C',
65
+		125 => '=7D', 126 => '=7E', 127 => '=7F', 128 => '=80', 129 => '=81',
66
+		130 => '=82', 131 => '=83', 132 => '=84', 133 => '=85', 134 => '=86',
67
+		135 => '=87', 136 => '=88', 137 => '=89', 138 => '=8A', 139 => '=8B',
68
+		140 => '=8C', 141 => '=8D', 142 => '=8E', 143 => '=8F', 144 => '=90',
69
+		145 => '=91', 146 => '=92', 147 => '=93', 148 => '=94', 149 => '=95',
70
+		150 => '=96', 151 => '=97', 152 => '=98', 153 => '=99', 154 => '=9A',
71
+		155 => '=9B', 156 => '=9C', 157 => '=9D', 158 => '=9E', 159 => '=9F',
72
+		160 => '=A0', 161 => '=A1', 162 => '=A2', 163 => '=A3', 164 => '=A4',
73
+		165 => '=A5', 166 => '=A6', 167 => '=A7', 168 => '=A8', 169 => '=A9',
74
+		170 => '=AA', 171 => '=AB', 172 => '=AC', 173 => '=AD', 174 => '=AE',
75
+		175 => '=AF', 176 => '=B0', 177 => '=B1', 178 => '=B2', 179 => '=B3',
76
+		180 => '=B4', 181 => '=B5', 182 => '=B6', 183 => '=B7', 184 => '=B8',
77
+		185 => '=B9', 186 => '=BA', 187 => '=BB', 188 => '=BC', 189 => '=BD',
78
+		190 => '=BE', 191 => '=BF', 192 => '=C0', 193 => '=C1', 194 => '=C2',
79
+		195 => '=C3', 196 => '=C4', 197 => '=C5', 198 => '=C6', 199 => '=C7',
80
+		200 => '=C8', 201 => '=C9', 202 => '=CA', 203 => '=CB', 204 => '=CC',
81
+		205 => '=CD', 206 => '=CE', 207 => '=CF', 208 => '=D0', 209 => '=D1',
82
+		210 => '=D2', 211 => '=D3', 212 => '=D4', 213 => '=D5', 214 => '=D6',
83
+		215 => '=D7', 216 => '=D8', 217 => '=D9', 218 => '=DA', 219 => '=DB',
84
+		220 => '=DC', 221 => '=DD', 222 => '=DE', 223 => '=DF', 224 => '=E0',
85
+		225 => '=E1', 226 => '=E2', 227 => '=E3', 228 => '=E4', 229 => '=E5',
86
+		230 => '=E6', 231 => '=E7', 232 => '=E8', 233 => '=E9', 234 => '=EA',
87
+		235 => '=EB', 236 => '=EC', 237 => '=ED', 238 => '=EE', 239 => '=EF',
88
+		240 => '=F0', 241 => '=F1', 242 => '=F2', 243 => '=F3', 244 => '=F4',
89
+		245 => '=F5', 246 => '=F6', 247 => '=F7', 248 => '=F8', 249 => '=F9',
90
+		250 => '=FA', 251 => '=FB', 252 => '=FC', 253 => '=FD', 254 => '=FE',
91
+		255 => '=FF',
92
+		];
93 93
 
94
-    protected static $safeMapShare = [];
94
+	protected static $safeMapShare = [];
95 95
 
96
-    /**
97
-     * A map of non-encoded ascii characters.
98
-     *
99
-     * @var string[]
100
-     */
101
-    protected $safeMap = [];
96
+	/**
97
+	 * A map of non-encoded ascii characters.
98
+	 *
99
+	 * @var string[]
100
+	 */
101
+	protected $safeMap = [];
102 102
 
103
-    /**
104
-     * Creates a new QpEncoder for the given CharacterStream.
105
-     *
106
-     * @param Swift_CharacterStream $charStream to use for reading characters
107
-     * @param Swift_StreamFilter    $filter     if input should be canonicalized
108
-     */
109
-    public function __construct(Swift_CharacterStream $charStream, Swift_StreamFilter $filter = null)
110
-    {
111
-        $this->charStream = $charStream;
112
-        if (!isset(self::$safeMapShare[$this->getSafeMapShareId()])) {
113
-            $this->initSafeMap();
114
-            self::$safeMapShare[$this->getSafeMapShareId()] = $this->safeMap;
115
-        } else {
116
-            $this->safeMap = self::$safeMapShare[$this->getSafeMapShareId()];
117
-        }
118
-        $this->filter = $filter;
119
-    }
103
+	/**
104
+	 * Creates a new QpEncoder for the given CharacterStream.
105
+	 *
106
+	 * @param Swift_CharacterStream $charStream to use for reading characters
107
+	 * @param Swift_StreamFilter    $filter     if input should be canonicalized
108
+	 */
109
+	public function __construct(Swift_CharacterStream $charStream, Swift_StreamFilter $filter = null)
110
+	{
111
+		$this->charStream = $charStream;
112
+		if (!isset(self::$safeMapShare[$this->getSafeMapShareId()])) {
113
+			$this->initSafeMap();
114
+			self::$safeMapShare[$this->getSafeMapShareId()] = $this->safeMap;
115
+		} else {
116
+			$this->safeMap = self::$safeMapShare[$this->getSafeMapShareId()];
117
+		}
118
+		$this->filter = $filter;
119
+	}
120 120
 
121
-    public function __sleep()
122
-    {
123
-        return ['charStream', 'filter'];
124
-    }
121
+	public function __sleep()
122
+	{
123
+		return ['charStream', 'filter'];
124
+	}
125 125
 
126
-    public function __wakeup()
127
-    {
128
-        if (!isset(self::$safeMapShare[$this->getSafeMapShareId()])) {
129
-            $this->initSafeMap();
130
-            self::$safeMapShare[$this->getSafeMapShareId()] = $this->safeMap;
131
-        } else {
132
-            $this->safeMap = self::$safeMapShare[$this->getSafeMapShareId()];
133
-        }
134
-    }
126
+	public function __wakeup()
127
+	{
128
+		if (!isset(self::$safeMapShare[$this->getSafeMapShareId()])) {
129
+			$this->initSafeMap();
130
+			self::$safeMapShare[$this->getSafeMapShareId()] = $this->safeMap;
131
+		} else {
132
+			$this->safeMap = self::$safeMapShare[$this->getSafeMapShareId()];
133
+		}
134
+	}
135 135
 
136
-    protected function getSafeMapShareId()
137
-    {
138
-        return static::class;
139
-    }
136
+	protected function getSafeMapShareId()
137
+	{
138
+		return static::class;
139
+	}
140 140
 
141
-    protected function initSafeMap()
142
-    {
143
-        foreach (array_merge(
144
-            [0x09, 0x20], range(0x21, 0x3C), range(0x3E, 0x7E)) as $byte) {
145
-            $this->safeMap[$byte] = \chr($byte);
146
-        }
147
-    }
141
+	protected function initSafeMap()
142
+	{
143
+		foreach (array_merge(
144
+			[0x09, 0x20], range(0x21, 0x3C), range(0x3E, 0x7E)) as $byte) {
145
+			$this->safeMap[$byte] = \chr($byte);
146
+		}
147
+	}
148 148
 
149
-    /**
150
-     * Takes an unencoded string and produces a QP encoded string from it.
151
-     *
152
-     * QP encoded strings have a maximum line length of 76 characters.
153
-     * If the first line needs to be shorter, indicate the difference with
154
-     * $firstLineOffset.
155
-     *
156
-     * @param string $string          to encode
157
-     * @param int    $firstLineOffset optional
158
-     * @param int    $maxLineLength   optional 0 indicates the default of 76 chars
159
-     *
160
-     * @return string
161
-     */
162
-    public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
163
-    {
164
-        if ($maxLineLength > 76 || $maxLineLength <= 0) {
165
-            $maxLineLength = 76;
166
-        }
149
+	/**
150
+	 * Takes an unencoded string and produces a QP encoded string from it.
151
+	 *
152
+	 * QP encoded strings have a maximum line length of 76 characters.
153
+	 * If the first line needs to be shorter, indicate the difference with
154
+	 * $firstLineOffset.
155
+	 *
156
+	 * @param string $string          to encode
157
+	 * @param int    $firstLineOffset optional
158
+	 * @param int    $maxLineLength   optional 0 indicates the default of 76 chars
159
+	 *
160
+	 * @return string
161
+	 */
162
+	public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
163
+	{
164
+		if ($maxLineLength > 76 || $maxLineLength <= 0) {
165
+			$maxLineLength = 76;
166
+		}
167 167
 
168
-        $thisLineLength = $maxLineLength - $firstLineOffset;
168
+		$thisLineLength = $maxLineLength - $firstLineOffset;
169 169
 
170
-        $lines = [];
171
-        $lNo = 0;
172
-        $lines[$lNo] = '';
173
-        $currentLine = &$lines[$lNo++];
174
-        $size = $lineLen = 0;
170
+		$lines = [];
171
+		$lNo = 0;
172
+		$lines[$lNo] = '';
173
+		$currentLine = &$lines[$lNo++];
174
+		$size = $lineLen = 0;
175 175
 
176
-        $this->charStream->flushContents();
177
-        $this->charStream->importString($string);
176
+		$this->charStream->flushContents();
177
+		$this->charStream->importString($string);
178 178
 
179
-        // Fetching more than 4 chars at one is slower, as is fetching fewer bytes
180
-        // Conveniently 4 chars is the UTF-8 safe number since UTF-8 has up to 6
181
-        // bytes per char and (6 * 4 * 3 = 72 chars per line) * =NN is 3 bytes
182
-        while (false !== $bytes = $this->nextSequence()) {
183
-            // If we're filtering the input
184
-            if (isset($this->filter)) {
185
-                // If we can't filter because we need more bytes
186
-                while ($this->filter->shouldBuffer($bytes)) {
187
-                    // Then collect bytes into the buffer
188
-                    if (false === $moreBytes = $this->nextSequence(1)) {
189
-                        break;
190
-                    }
179
+		// Fetching more than 4 chars at one is slower, as is fetching fewer bytes
180
+		// Conveniently 4 chars is the UTF-8 safe number since UTF-8 has up to 6
181
+		// bytes per char and (6 * 4 * 3 = 72 chars per line) * =NN is 3 bytes
182
+		while (false !== $bytes = $this->nextSequence()) {
183
+			// If we're filtering the input
184
+			if (isset($this->filter)) {
185
+				// If we can't filter because we need more bytes
186
+				while ($this->filter->shouldBuffer($bytes)) {
187
+					// Then collect bytes into the buffer
188
+					if (false === $moreBytes = $this->nextSequence(1)) {
189
+						break;
190
+					}
191 191
 
192
-                    foreach ($moreBytes as $b) {
193
-                        $bytes[] = $b;
194
-                    }
195
-                }
196
-                // And filter them
197
-                $bytes = $this->filter->filter($bytes);
198
-            }
192
+					foreach ($moreBytes as $b) {
193
+						$bytes[] = $b;
194
+					}
195
+				}
196
+				// And filter them
197
+				$bytes = $this->filter->filter($bytes);
198
+			}
199 199
 
200
-            $enc = $this->encodeByteSequence($bytes, $size);
200
+			$enc = $this->encodeByteSequence($bytes, $size);
201 201
 
202
-            $i = strpos($enc, '=0D=0A');
203
-            $newLineLength = $lineLen + (false === $i ? $size : $i);
202
+			$i = strpos($enc, '=0D=0A');
203
+			$newLineLength = $lineLen + (false === $i ? $size : $i);
204 204
 
205
-            if ($currentLine && $newLineLength >= $thisLineLength) {
206
-                $lines[$lNo] = '';
207
-                $currentLine = &$lines[$lNo++];
208
-                $thisLineLength = $maxLineLength;
209
-                $lineLen = 0;
210
-            }
205
+			if ($currentLine && $newLineLength >= $thisLineLength) {
206
+				$lines[$lNo] = '';
207
+				$currentLine = &$lines[$lNo++];
208
+				$thisLineLength = $maxLineLength;
209
+				$lineLen = 0;
210
+			}
211 211
 
212
-            $currentLine .= $enc;
212
+			$currentLine .= $enc;
213 213
 
214
-            if (false === $i) {
215
-                $lineLen += $size;
216
-            } else {
217
-                // 6 is the length of '=0D=0A'.
218
-                $lineLen = $size - strrpos($enc, '=0D=0A') - 6;
219
-            }
220
-        }
214
+			if (false === $i) {
215
+				$lineLen += $size;
216
+			} else {
217
+				// 6 is the length of '=0D=0A'.
218
+				$lineLen = $size - strrpos($enc, '=0D=0A') - 6;
219
+			}
220
+		}
221 221
 
222
-        return $this->standardize(implode("=\r\n", $lines));
223
-    }
222
+		return $this->standardize(implode("=\r\n", $lines));
223
+	}
224 224
 
225
-    /**
226
-     * Updates the charset used.
227
-     *
228
-     * @param string $charset
229
-     */
230
-    public function charsetChanged($charset)
231
-    {
232
-        $this->charStream->setCharacterSet($charset);
233
-    }
225
+	/**
226
+	 * Updates the charset used.
227
+	 *
228
+	 * @param string $charset
229
+	 */
230
+	public function charsetChanged($charset)
231
+	{
232
+		$this->charStream->setCharacterSet($charset);
233
+	}
234 234
 
235
-    /**
236
-     * Encode the given byte array into a verbatim QP form.
237
-     *
238
-     * @param int[] $bytes
239
-     * @param int   $size
240
-     *
241
-     * @return string
242
-     */
243
-    protected function encodeByteSequence(array $bytes, &$size)
244
-    {
245
-        $ret = '';
246
-        $size = 0;
247
-        foreach ($bytes as $b) {
248
-            if (isset($this->safeMap[$b])) {
249
-                $ret .= $this->safeMap[$b];
250
-                ++$size;
251
-            } else {
252
-                $ret .= self::$qpMap[$b];
253
-                $size += 3;
254
-            }
255
-        }
235
+	/**
236
+	 * Encode the given byte array into a verbatim QP form.
237
+	 *
238
+	 * @param int[] $bytes
239
+	 * @param int   $size
240
+	 *
241
+	 * @return string
242
+	 */
243
+	protected function encodeByteSequence(array $bytes, &$size)
244
+	{
245
+		$ret = '';
246
+		$size = 0;
247
+		foreach ($bytes as $b) {
248
+			if (isset($this->safeMap[$b])) {
249
+				$ret .= $this->safeMap[$b];
250
+				++$size;
251
+			} else {
252
+				$ret .= self::$qpMap[$b];
253
+				$size += 3;
254
+			}
255
+		}
256 256
 
257
-        return $ret;
258
-    }
257
+		return $ret;
258
+	}
259 259
 
260
-    /**
261
-     * Get the next sequence of bytes to read from the char stream.
262
-     *
263
-     * @param int $size number of bytes to read
264
-     *
265
-     * @return int[]
266
-     */
267
-    protected function nextSequence($size = 4)
268
-    {
269
-        return $this->charStream->readBytes($size);
270
-    }
260
+	/**
261
+	 * Get the next sequence of bytes to read from the char stream.
262
+	 *
263
+	 * @param int $size number of bytes to read
264
+	 *
265
+	 * @return int[]
266
+	 */
267
+	protected function nextSequence($size = 4)
268
+	{
269
+		return $this->charStream->readBytes($size);
270
+	}
271 271
 
272
-    /**
273
-     * Make sure CRLF is correct and HT/SPACE are in valid places.
274
-     *
275
-     * @param string $string
276
-     *
277
-     * @return string
278
-     */
279
-    protected function standardize($string)
280
-    {
281
-        $string = str_replace(["\t=0D=0A", ' =0D=0A', '=0D=0A'],
282
-            ["=09\r\n", "=20\r\n", "\r\n"], $string
283
-            );
284
-        switch ($end = \ord(substr($string, -1))) {
285
-            case 0x09:
286
-            case 0x20:
287
-                $string = substr_replace($string, self::$qpMap[$end], -1);
288
-        }
272
+	/**
273
+	 * Make sure CRLF is correct and HT/SPACE are in valid places.
274
+	 *
275
+	 * @param string $string
276
+	 *
277
+	 * @return string
278
+	 */
279
+	protected function standardize($string)
280
+	{
281
+		$string = str_replace(["\t=0D=0A", ' =0D=0A', '=0D=0A'],
282
+			["=09\r\n", "=20\r\n", "\r\n"], $string
283
+			);
284
+		switch ($end = \ord(substr($string, -1))) {
285
+			case 0x09:
286
+			case 0x20:
287
+				$string = substr_replace($string, self::$qpMap[$end], -1);
288
+		}
289 289
 
290
-        return $string;
291
-    }
290
+		return $string;
291
+	}
292 292
 
293
-    /**
294
-     * Make a deep copy of object.
295
-     */
296
-    public function __clone()
297
-    {
298
-        $this->charStream = clone $this->charStream;
299
-    }
293
+	/**
294
+	 * Make a deep copy of object.
295
+	 */
296
+	public function __clone()
297
+	{
298
+		$this->charStream = clone $this->charStream;
299
+	}
300 300
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Encoder/Rfc2231Encoder.php 1 patch
Indentation   +63 added lines, -63 removed lines patch added patch discarded remove patch
@@ -15,76 +15,76 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Encoder_Rfc2231Encoder implements Swift_Encoder
17 17
 {
18
-    /**
19
-     * A character stream to use when reading a string as characters instead of bytes.
20
-     *
21
-     * @var Swift_CharacterStream
22
-     */
23
-    private $charStream;
18
+	/**
19
+	 * A character stream to use when reading a string as characters instead of bytes.
20
+	 *
21
+	 * @var Swift_CharacterStream
22
+	 */
23
+	private $charStream;
24 24
 
25
-    /**
26
-     * Creates a new Rfc2231Encoder using the given character stream instance.
27
-     */
28
-    public function __construct(Swift_CharacterStream $charStream)
29
-    {
30
-        $this->charStream = $charStream;
31
-    }
25
+	/**
26
+	 * Creates a new Rfc2231Encoder using the given character stream instance.
27
+	 */
28
+	public function __construct(Swift_CharacterStream $charStream)
29
+	{
30
+		$this->charStream = $charStream;
31
+	}
32 32
 
33
-    /**
34
-     * Takes an unencoded string and produces a string encoded according to
35
-     * RFC 2231 from it.
36
-     *
37
-     * @param string $string
38
-     * @param int    $firstLineOffset
39
-     * @param int    $maxLineLength   optional, 0 indicates the default of 75 bytes
40
-     *
41
-     * @return string
42
-     */
43
-    public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
44
-    {
45
-        $lines = [];
46
-        $lineCount = 0;
47
-        $lines[] = '';
48
-        $currentLine = &$lines[$lineCount++];
33
+	/**
34
+	 * Takes an unencoded string and produces a string encoded according to
35
+	 * RFC 2231 from it.
36
+	 *
37
+	 * @param string $string
38
+	 * @param int    $firstLineOffset
39
+	 * @param int    $maxLineLength   optional, 0 indicates the default of 75 bytes
40
+	 *
41
+	 * @return string
42
+	 */
43
+	public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
44
+	{
45
+		$lines = [];
46
+		$lineCount = 0;
47
+		$lines[] = '';
48
+		$currentLine = &$lines[$lineCount++];
49 49
 
50
-        if (0 >= $maxLineLength) {
51
-            $maxLineLength = 75;
52
-        }
50
+		if (0 >= $maxLineLength) {
51
+			$maxLineLength = 75;
52
+		}
53 53
 
54
-        $this->charStream->flushContents();
55
-        $this->charStream->importString($string);
54
+		$this->charStream->flushContents();
55
+		$this->charStream->importString($string);
56 56
 
57
-        $thisLineLength = $maxLineLength - $firstLineOffset;
57
+		$thisLineLength = $maxLineLength - $firstLineOffset;
58 58
 
59
-        while (false !== $char = $this->charStream->read(4)) {
60
-            $encodedChar = rawurlencode($char);
61
-            if (0 != \strlen($currentLine)
62
-                && \strlen($currentLine.$encodedChar) > $thisLineLength) {
63
-                $lines[] = '';
64
-                $currentLine = &$lines[$lineCount++];
65
-                $thisLineLength = $maxLineLength;
66
-            }
67
-            $currentLine .= $encodedChar;
68
-        }
59
+		while (false !== $char = $this->charStream->read(4)) {
60
+			$encodedChar = rawurlencode($char);
61
+			if (0 != \strlen($currentLine)
62
+				&& \strlen($currentLine.$encodedChar) > $thisLineLength) {
63
+				$lines[] = '';
64
+				$currentLine = &$lines[$lineCount++];
65
+				$thisLineLength = $maxLineLength;
66
+			}
67
+			$currentLine .= $encodedChar;
68
+		}
69 69
 
70
-        return implode("\r\n", $lines);
71
-    }
70
+		return implode("\r\n", $lines);
71
+	}
72 72
 
73
-    /**
74
-     * Updates the charset used.
75
-     *
76
-     * @param string $charset
77
-     */
78
-    public function charsetChanged($charset)
79
-    {
80
-        $this->charStream->setCharacterSet($charset);
81
-    }
73
+	/**
74
+	 * Updates the charset used.
75
+	 *
76
+	 * @param string $charset
77
+	 */
78
+	public function charsetChanged($charset)
79
+	{
80
+		$this->charStream->setCharacterSet($charset);
81
+	}
82 82
 
83
-    /**
84
-     * Make a deep copy of object.
85
-     */
86
-    public function __clone()
87
-    {
88
-        $this->charStream = clone $this->charStream;
89
-    }
83
+	/**
84
+	 * Make a deep copy of object.
85
+	 */
86
+	public function __clone()
87
+	{
88
+		$this->charStream = clone $this->charStream;
89
+	}
90 90
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Encoder/Base64Encoder.php 1 patch
Indentation   +36 added lines, -36 removed lines patch added patch discarded remove patch
@@ -15,44 +15,44 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Encoder_Base64Encoder implements Swift_Encoder
17 17
 {
18
-    /**
19
-     * Takes an unencoded string and produces a Base64 encoded string from it.
20
-     *
21
-     * Base64 encoded strings have a maximum line length of 76 characters.
22
-     * If the first line needs to be shorter, indicate the difference with
23
-     * $firstLineOffset.
24
-     *
25
-     * @param string $string          to encode
26
-     * @param int    $firstLineOffset
27
-     * @param int    $maxLineLength   optional, 0 indicates the default of 76 bytes
28
-     *
29
-     * @return string
30
-     */
31
-    public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
32
-    {
33
-        if (0 >= $maxLineLength || 76 < $maxLineLength) {
34
-            $maxLineLength = 76;
35
-        }
18
+	/**
19
+	 * Takes an unencoded string and produces a Base64 encoded string from it.
20
+	 *
21
+	 * Base64 encoded strings have a maximum line length of 76 characters.
22
+	 * If the first line needs to be shorter, indicate the difference with
23
+	 * $firstLineOffset.
24
+	 *
25
+	 * @param string $string          to encode
26
+	 * @param int    $firstLineOffset
27
+	 * @param int    $maxLineLength   optional, 0 indicates the default of 76 bytes
28
+	 *
29
+	 * @return string
30
+	 */
31
+	public function encodeString($string, $firstLineOffset = 0, $maxLineLength = 0)
32
+	{
33
+		if (0 >= $maxLineLength || 76 < $maxLineLength) {
34
+			$maxLineLength = 76;
35
+		}
36 36
 
37
-        $encodedString = base64_encode($string ?? '');
38
-        $firstLine = '';
37
+		$encodedString = base64_encode($string ?? '');
38
+		$firstLine = '';
39 39
 
40
-        if (0 != $firstLineOffset) {
41
-            $firstLine = substr(
42
-                $encodedString, 0, $maxLineLength - $firstLineOffset
43
-                )."\r\n";
44
-            $encodedString = substr(
45
-                $encodedString, $maxLineLength - $firstLineOffset
46
-                );
47
-        }
40
+		if (0 != $firstLineOffset) {
41
+			$firstLine = substr(
42
+				$encodedString, 0, $maxLineLength - $firstLineOffset
43
+				)."\r\n";
44
+			$encodedString = substr(
45
+				$encodedString, $maxLineLength - $firstLineOffset
46
+				);
47
+		}
48 48
 
49
-        return $firstLine.trim(chunk_split($encodedString, $maxLineLength, "\r\n"));
50
-    }
49
+		return $firstLine.trim(chunk_split($encodedString, $maxLineLength, "\r\n"));
50
+	}
51 51
 
52
-    /**
53
-     * Does nothing.
54
-     */
55
-    public function charsetChanged($charset)
56
-    {
57
-    }
52
+	/**
53
+	 * Does nothing.
54
+	 */
55
+	public function charsetChanged($charset)
56
+	{
57
+	}
58 58
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/CharacterStream.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -19,69 +19,69 @@
 block discarded – undo
19 19
  */
20 20
 interface Swift_CharacterStream
21 21
 {
22
-    /**
23
-     * Set the character set used in this CharacterStream.
24
-     *
25
-     * @param string $charset
26
-     */
27
-    public function setCharacterSet($charset);
22
+	/**
23
+	 * Set the character set used in this CharacterStream.
24
+	 *
25
+	 * @param string $charset
26
+	 */
27
+	public function setCharacterSet($charset);
28 28
 
29
-    /**
30
-     * Set the CharacterReaderFactory for multi charset support.
31
-     */
32
-    public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory);
29
+	/**
30
+	 * Set the CharacterReaderFactory for multi charset support.
31
+	 */
32
+	public function setCharacterReaderFactory(Swift_CharacterReaderFactory $factory);
33 33
 
34
-    /**
35
-     * Overwrite this character stream using the byte sequence in the byte stream.
36
-     *
37
-     * @param Swift_OutputByteStream $os output stream to read from
38
-     */
39
-    public function importByteStream(Swift_OutputByteStream $os);
34
+	/**
35
+	 * Overwrite this character stream using the byte sequence in the byte stream.
36
+	 *
37
+	 * @param Swift_OutputByteStream $os output stream to read from
38
+	 */
39
+	public function importByteStream(Swift_OutputByteStream $os);
40 40
 
41
-    /**
42
-     * Import a string a bytes into this CharacterStream, overwriting any existing
43
-     * data in the stream.
44
-     *
45
-     * @param string $string
46
-     */
47
-    public function importString($string);
41
+	/**
42
+	 * Import a string a bytes into this CharacterStream, overwriting any existing
43
+	 * data in the stream.
44
+	 *
45
+	 * @param string $string
46
+	 */
47
+	public function importString($string);
48 48
 
49
-    /**
50
-     * Read $length characters from the stream and move the internal pointer
51
-     * $length further into the stream.
52
-     *
53
-     * @param int $length
54
-     *
55
-     * @return string
56
-     */
57
-    public function read($length);
49
+	/**
50
+	 * Read $length characters from the stream and move the internal pointer
51
+	 * $length further into the stream.
52
+	 *
53
+	 * @param int $length
54
+	 *
55
+	 * @return string
56
+	 */
57
+	public function read($length);
58 58
 
59
-    /**
60
-     * Read $length characters from the stream and return a 1-dimensional array
61
-     * containing there octet values.
62
-     *
63
-     * @param int $length
64
-     *
65
-     * @return int[]
66
-     */
67
-    public function readBytes($length);
59
+	/**
60
+	 * Read $length characters from the stream and return a 1-dimensional array
61
+	 * containing there octet values.
62
+	 *
63
+	 * @param int $length
64
+	 *
65
+	 * @return int[]
66
+	 */
67
+	public function readBytes($length);
68 68
 
69
-    /**
70
-     * Write $chars to the end of the stream.
71
-     *
72
-     * @param string $chars
73
-     */
74
-    public function write($chars);
69
+	/**
70
+	 * Write $chars to the end of the stream.
71
+	 *
72
+	 * @param string $chars
73
+	 */
74
+	public function write($chars);
75 75
 
76
-    /**
77
-     * Move the internal pointer to $charOffset in the stream.
78
-     *
79
-     * @param int $charOffset
80
-     */
81
-    public function setPointer($charOffset);
76
+	/**
77
+	 * Move the internal pointer to $charOffset in the stream.
78
+	 *
79
+	 * @param int $charOffset
80
+	 */
81
+	public function setPointer($charOffset);
82 82
 
83
-    /**
84
-     * Empty the stream and reset the internal pointer.
85
-     */
86
-    public function flushContents();
83
+	/**
84
+	 * Empty the stream and reset the internal pointer.
85
+	 */
86
+	public function flushContents();
87 87
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/TransportException.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_TransportException extends Swift_IoException
17 17
 {
18
-    /**
19
-     * Create a new TransportException 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 TransportException 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/Image.php 1 patch
Indentation   +24 added lines, -24 removed lines patch added patch discarded remove patch
@@ -15,29 +15,29 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Image extends Swift_EmbeddedFile
17 17
 {
18
-    /**
19
-     * Create a new EmbeddedFile.
20
-     *
21
-     * Details may be optionally provided to the constructor.
22
-     *
23
-     * @param string|Swift_OutputByteStream $data
24
-     * @param string                        $filename
25
-     * @param string                        $contentType
26
-     */
27
-    public function __construct($data = null, $filename = null, $contentType = null)
28
-    {
29
-        parent::__construct($data, $filename, $contentType);
30
-    }
18
+	/**
19
+	 * Create a new EmbeddedFile.
20
+	 *
21
+	 * Details may be optionally provided to the constructor.
22
+	 *
23
+	 * @param string|Swift_OutputByteStream $data
24
+	 * @param string                        $filename
25
+	 * @param string                        $contentType
26
+	 */
27
+	public function __construct($data = null, $filename = null, $contentType = null)
28
+	{
29
+		parent::__construct($data, $filename, $contentType);
30
+	}
31 31
 
32
-    /**
33
-     * Create a new Image from a filesystem path.
34
-     *
35
-     * @param string $path
36
-     *
37
-     * @return self
38
-     */
39
-    public static function fromPath($path)
40
-    {
41
-        return (new self())->setFile(new Swift_ByteStream_FileByteStream($path));
42
-    }
32
+	/**
33
+	 * Create a new Image from a filesystem path.
34
+	 *
35
+	 * @param string $path
36
+	 *
37
+	 * @return self
38
+	 */
39
+	public static function fromPath($path)
40
+	{
41
+		return (new self())->setFile(new Swift_ByteStream_FileByteStream($path));
42
+	}
43 43
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/SMimeSigner.php 1 patch
Indentation   +522 added lines, -522 removed lines patch added patch discarded remove patch
@@ -17,526 +17,526 @@
 block discarded – undo
17 17
  */
18 18
 class Swift_Signers_SMimeSigner implements Swift_Signers_BodySigner
19 19
 {
20
-    protected $signCertificate;
21
-    protected $signPrivateKey;
22
-    protected $encryptCert;
23
-    protected $signThenEncrypt = true;
24
-    protected $signLevel;
25
-    protected $encryptLevel;
26
-    protected $signOptions;
27
-    protected $encryptOptions;
28
-    protected $encryptCipher;
29
-    protected $extraCerts = null;
30
-    protected $wrapFullMessage = false;
31
-
32
-    /**
33
-     * @var Swift_StreamFilters_StringReplacementFilterFactory
34
-     */
35
-    protected $replacementFactory;
36
-
37
-    /**
38
-     * @var Swift_Mime_SimpleHeaderFactory
39
-     */
40
-    protected $headerFactory;
41
-
42
-    /**
43
-     * Constructor.
44
-     *
45
-     * @param string|null $signCertificate
46
-     * @param string|null $signPrivateKey
47
-     * @param string|null $encryptCertificate
48
-     */
49
-    public function __construct($signCertificate = null, $signPrivateKey = null, $encryptCertificate = null)
50
-    {
51
-        if (null !== $signPrivateKey) {
52
-            $this->setSignCertificate($signCertificate, $signPrivateKey);
53
-        }
54
-
55
-        if (null !== $encryptCertificate) {
56
-            $this->setEncryptCertificate($encryptCertificate);
57
-        }
58
-
59
-        $this->replacementFactory = Swift_DependencyContainer::getInstance()
60
-            ->lookup('transport.replacementfactory');
61
-
62
-        $this->signOptions = PKCS7_DETACHED;
63
-        $this->encryptCipher = OPENSSL_CIPHER_AES_128_CBC;
64
-    }
65
-
66
-    /**
67
-     * Set the certificate location to use for signing.
68
-     *
69
-     * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php
70
-     *
71
-     * @param string       $certificate
72
-     * @param string|array $privateKey  If the key needs an passphrase use array('file-location', 'passphrase') instead
73
-     * @param int          $signOptions Bitwise operator options for openssl_pkcs7_sign()
74
-     * @param string       $extraCerts  A file containing intermediate certificates needed by the signing certificate
75
-     *
76
-     * @return $this
77
-     */
78
-    public function setSignCertificate($certificate, $privateKey = null, $signOptions = PKCS7_DETACHED, $extraCerts = null)
79
-    {
80
-        $this->signCertificate = 'file://'.str_replace('\\', '/', realpath($certificate));
81
-
82
-        if (null !== $privateKey) {
83
-            if (\is_array($privateKey)) {
84
-                $this->signPrivateKey = $privateKey;
85
-                $this->signPrivateKey[0] = 'file://'.str_replace('\\', '/', realpath($privateKey[0]));
86
-            } else {
87
-                $this->signPrivateKey = 'file://'.str_replace('\\', '/', realpath($privateKey));
88
-            }
89
-        }
90
-
91
-        $this->signOptions = $signOptions;
92
-        $this->extraCerts = $extraCerts ? realpath($extraCerts) : null;
93
-
94
-        return $this;
95
-    }
96
-
97
-    /**
98
-     * Set the certificate location to use for encryption.
99
-     *
100
-     * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php
101
-     * @see https://secure.php.net/manual/en/openssl.ciphers.php
102
-     *
103
-     * @param string|array $recipientCerts Either an single X.509 certificate, or an assoc array of X.509 certificates.
104
-     * @param int          $cipher
105
-     *
106
-     * @return $this
107
-     */
108
-    public function setEncryptCertificate($recipientCerts, $cipher = null)
109
-    {
110
-        if (\is_array($recipientCerts)) {
111
-            $this->encryptCert = [];
112
-
113
-            foreach ($recipientCerts as $cert) {
114
-                $this->encryptCert[] = 'file://'.str_replace('\\', '/', realpath($cert));
115
-            }
116
-        } else {
117
-            $this->encryptCert = 'file://'.str_replace('\\', '/', realpath($recipientCerts));
118
-        }
119
-
120
-        if (null !== $cipher) {
121
-            $this->encryptCipher = $cipher;
122
-        }
123
-
124
-        return $this;
125
-    }
126
-
127
-    /**
128
-     * @return string
129
-     */
130
-    public function getSignCertificate()
131
-    {
132
-        return $this->signCertificate;
133
-    }
134
-
135
-    /**
136
-     * @return string
137
-     */
138
-    public function getSignPrivateKey()
139
-    {
140
-        return $this->signPrivateKey;
141
-    }
142
-
143
-    /**
144
-     * Set perform signing before encryption.
145
-     *
146
-     * The default is to first sign the message and then encrypt.
147
-     * But some older mail clients, namely Microsoft Outlook 2000 will work when the message first encrypted.
148
-     * As this goes against the official specs, its recommended to only use 'encryption -> signing' when specifically targeting these 'broken' clients.
149
-     *
150
-     * @param bool $signThenEncrypt
151
-     *
152
-     * @return $this
153
-     */
154
-    public function setSignThenEncrypt($signThenEncrypt = true)
155
-    {
156
-        $this->signThenEncrypt = $signThenEncrypt;
157
-
158
-        return $this;
159
-    }
160
-
161
-    /**
162
-     * @return bool
163
-     */
164
-    public function isSignThenEncrypt()
165
-    {
166
-        return $this->signThenEncrypt;
167
-    }
168
-
169
-    /**
170
-     * Resets internal states.
171
-     *
172
-     * @return $this
173
-     */
174
-    public function reset()
175
-    {
176
-        return $this;
177
-    }
178
-
179
-    /**
180
-     * Specify whether to wrap the entire MIME message in the S/MIME message.
181
-     *
182
-     * According to RFC5751 section 3.1:
183
-     * In order to protect outer, non-content-related message header fields
184
-     * (for instance, the "Subject", "To", "From", and "Cc" fields), the
185
-     * sending client MAY wrap a full MIME message in a message/rfc822
186
-     * wrapper in order to apply S/MIME security services to these header
187
-     * fields.  It is up to the receiving client to decide how to present
188
-     * this "inner" header along with the unprotected "outer" header.
189
-     *
190
-     * @param bool $wrap
191
-     *
192
-     * @return $this
193
-     */
194
-    public function setWrapFullMessage($wrap)
195
-    {
196
-        $this->wrapFullMessage = $wrap;
197
-    }
198
-
199
-    /**
200
-     * Change the Swift_Message to apply the signing.
201
-     *
202
-     * @return $this
203
-     */
204
-    public function signMessage(Swift_Message $message)
205
-    {
206
-        if (null === $this->signCertificate && null === $this->encryptCert) {
207
-            return $this;
208
-        }
209
-
210
-        if ($this->signThenEncrypt) {
211
-            $this->smimeSignMessage($message);
212
-            $this->smimeEncryptMessage($message);
213
-        } else {
214
-            $this->smimeEncryptMessage($message);
215
-            $this->smimeSignMessage($message);
216
-        }
217
-    }
218
-
219
-    /**
220
-     * Return the list of header a signer might tamper.
221
-     *
222
-     * @return array
223
-     */
224
-    public function getAlteredHeaders()
225
-    {
226
-        return ['Content-Type', 'Content-Transfer-Encoding', 'Content-Disposition'];
227
-    }
228
-
229
-    /**
230
-     * Sign a Swift message.
231
-     */
232
-    protected function smimeSignMessage(Swift_Message $message)
233
-    {
234
-        // If we don't have a certificate we can't sign the message
235
-        if (null === $this->signCertificate) {
236
-            return;
237
-        }
238
-
239
-        // Work on a clone of the original message
240
-        $signMessage = clone $message;
241
-        $signMessage->clearSigners();
242
-
243
-        if ($this->wrapFullMessage) {
244
-            // The original message essentially becomes the body of the new
245
-            // wrapped message
246
-            $signMessage = $this->wrapMimeMessage($signMessage);
247
-        } else {
248
-            // Only keep header needed to parse the body correctly
249
-            $this->clearAllHeaders($signMessage);
250
-            $this->copyHeaders(
251
-                $message,
252
-                $signMessage,
253
-                [
254
-                    'Content-Type',
255
-                    'Content-Transfer-Encoding',
256
-                    'Content-Disposition',
257
-                ]
258
-            );
259
-        }
260
-
261
-        // Copy the cloned message into a temporary file stream
262
-        $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
263
-        $signMessage->toByteStream($messageStream);
264
-        $messageStream->commit();
265
-        $signedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
266
-
267
-        // Sign the message using openssl
268
-        if (!openssl_pkcs7_sign(
269
-                $messageStream->getPath(),
270
-                $signedMessageStream->getPath(),
271
-                $this->signCertificate,
272
-                $this->signPrivateKey,
273
-                [],
274
-                $this->signOptions,
275
-                $this->extraCerts
276
-            )
277
-        ) {
278
-            throw new Swift_IoException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string()));
279
-        }
280
-
281
-        // Parse the resulting signed message content back into the Swift message
282
-        // preserving the original headers
283
-        $this->parseSSLOutput($signedMessageStream, $message);
284
-    }
285
-
286
-    /**
287
-     * Encrypt a Swift message.
288
-     */
289
-    protected function smimeEncryptMessage(Swift_Message $message)
290
-    {
291
-        // If we don't have a certificate we can't encrypt the message
292
-        if (null === $this->encryptCert) {
293
-            return;
294
-        }
295
-
296
-        // Work on a clone of the original message
297
-        $encryptMessage = clone $message;
298
-        $encryptMessage->clearSigners();
299
-
300
-        if ($this->wrapFullMessage) {
301
-            // The original message essentially becomes the body of the new
302
-            // wrapped message
303
-            $encryptMessage = $this->wrapMimeMessage($encryptMessage);
304
-        } else {
305
-            // Only keep header needed to parse the body correctly
306
-            $this->clearAllHeaders($encryptMessage);
307
-            $this->copyHeaders(
308
-                $message,
309
-                $encryptMessage,
310
-                [
311
-                    'Content-Type',
312
-                    'Content-Transfer-Encoding',
313
-                    'Content-Disposition',
314
-                ]
315
-            );
316
-        }
317
-
318
-        // Convert the message content (including headers) to a string
319
-        // and place it in a temporary file
320
-        $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
321
-        $encryptMessage->toByteStream($messageStream);
322
-        $messageStream->commit();
323
-        $encryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
324
-
325
-        // Encrypt the message
326
-        if (!openssl_pkcs7_encrypt(
327
-                $messageStream->getPath(),
328
-                $encryptedMessageStream->getPath(),
329
-                $this->encryptCert,
330
-                [],
331
-                0,
332
-                $this->encryptCipher
333
-            )
334
-        ) {
335
-            throw new Swift_IoException(sprintf('Failed to encrypt S/Mime message. Error: "%s".', openssl_error_string()));
336
-        }
337
-
338
-        // Parse the resulting signed message content back into the Swift message
339
-        // preserving the original headers
340
-        $this->parseSSLOutput($encryptedMessageStream, $message);
341
-    }
342
-
343
-    /**
344
-     * Copy named headers from one Swift message to another.
345
-     */
346
-    protected function copyHeaders(
347
-        Swift_Message $fromMessage,
348
-        Swift_Message $toMessage,
349
-        array $headers = []
350
-    ) {
351
-        foreach ($headers as $header) {
352
-            $this->copyHeader($fromMessage, $toMessage, $header);
353
-        }
354
-    }
355
-
356
-    /**
357
-     * Copy a single header from one Swift message to another.
358
-     *
359
-     * @param string $headerName
360
-     */
361
-    protected function copyHeader(Swift_Message $fromMessage, Swift_Message $toMessage, $headerName)
362
-    {
363
-        $header = $fromMessage->getHeaders()->get($headerName);
364
-        if (!$header) {
365
-            return;
366
-        }
367
-        $headers = $toMessage->getHeaders();
368
-        switch ($header->getFieldType()) {
369
-            case Swift_Mime_Header::TYPE_TEXT:
370
-                $headers->addTextHeader($header->getFieldName(), $header->getValue());
371
-                break;
372
-            case Swift_Mime_Header::TYPE_PARAMETERIZED:
373
-                $headers->addParameterizedHeader(
374
-                    $header->getFieldName(),
375
-                    $header->getValue(),
376
-                    $header->getParameters()
377
-                );
378
-                break;
379
-        }
380
-    }
381
-
382
-    /**
383
-     * Remove all headers from a Swift message.
384
-     */
385
-    protected function clearAllHeaders(Swift_Message $message)
386
-    {
387
-        $headers = $message->getHeaders();
388
-        foreach ($headers->listAll() as $header) {
389
-            $headers->removeAll($header);
390
-        }
391
-    }
392
-
393
-    /**
394
-     * Wraps a Swift_Message in a message/rfc822 MIME part.
395
-     *
396
-     * @return Swift_MimePart
397
-     */
398
-    protected function wrapMimeMessage(Swift_Message $message)
399
-    {
400
-        // Start by copying the original message into a message stream
401
-        $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
402
-        $message->toByteStream($messageStream);
403
-        $messageStream->commit();
404
-
405
-        // Create a new MIME part that wraps the original stream
406
-        $wrappedMessage = new Swift_MimePart($messageStream, 'message/rfc822');
407
-        $wrappedMessage->setEncoder(new Swift_Mime_ContentEncoder_PlainContentEncoder('7bit'));
408
-
409
-        return $wrappedMessage;
410
-    }
411
-
412
-    protected function parseSSLOutput(Swift_InputByteStream $inputStream, Swift_Message $message)
413
-    {
414
-        $messageStream = new Swift_ByteStream_TemporaryFileByteStream();
415
-        $this->copyFromOpenSSLOutput($inputStream, $messageStream);
416
-
417
-        $this->streamToMime($messageStream, $message);
418
-    }
419
-
420
-    /**
421
-     * Merges an OutputByteStream from OpenSSL to a Swift_Message.
422
-     */
423
-    protected function streamToMime(Swift_OutputByteStream $fromStream, Swift_Message $message)
424
-    {
425
-        // Parse the stream into headers and body
426
-        list($headers, $messageStream) = $this->parseStream($fromStream);
427
-
428
-        // Get the original message headers
429
-        $messageHeaders = $message->getHeaders();
430
-
431
-        // Let the stream determine the headers describing the body content,
432
-        // since the body of the original message is overwritten by the body
433
-        // coming from the stream.
434
-        // These are all content-* headers.
435
-
436
-        // Default transfer encoding is 7bit if not set
437
-        $encoding = '';
438
-        // Remove all existing transfer encoding headers
439
-        $messageHeaders->removeAll('Content-Transfer-Encoding');
440
-        // See whether the stream sets the transfer encoding
441
-        if (isset($headers['content-transfer-encoding'])) {
442
-            $encoding = $headers['content-transfer-encoding'];
443
-        }
444
-
445
-        // We use the null content encoder, since the body is already encoded
446
-        // according to the transfer encoding specified in the stream
447
-        $message->setEncoder(new Swift_Mime_ContentEncoder_NullContentEncoder($encoding));
448
-
449
-        // Set the disposition, if present
450
-        if (isset($headers['content-disposition'])) {
451
-            $messageHeaders->addTextHeader('Content-Disposition', $headers['content-disposition']);
452
-        }
453
-
454
-        // Copy over the body from the stream using the content type dictated
455
-        // by the stream content
456
-        $message->setChildren([]);
457
-        $message->setBody($messageStream, $headers['content-type']);
458
-    }
459
-
460
-    /**
461
-     * This message will parse the headers of a MIME email byte stream
462
-     * and return an array that contains the headers as an associative
463
-     * array and the email body as a string.
464
-     *
465
-     * @return array
466
-     */
467
-    protected function parseStream(Swift_OutputByteStream $emailStream)
468
-    {
469
-        $bufferLength = 78;
470
-        $headerData = '';
471
-        $headerBodySeparator = "\r\n\r\n";
472
-
473
-        $emailStream->setReadPointer(0);
474
-
475
-        // Read out the headers section from the stream to a string
476
-        while (false !== ($buffer = $emailStream->read($bufferLength))) {
477
-            $headerData .= $buffer;
478
-
479
-            $headersPosEnd = strpos($headerData, $headerBodySeparator);
480
-
481
-            // Stop reading if we found the end of the headers
482
-            if (false !== $headersPosEnd) {
483
-                break;
484
-            }
485
-        }
486
-
487
-        // Split the header data into lines
488
-        $headerData = trim(substr($headerData, 0, $headersPosEnd));
489
-        $headerLines = explode("\r\n", $headerData);
490
-        unset($headerData);
491
-
492
-        $headers = [];
493
-        $currentHeaderName = '';
494
-
495
-        // Transform header lines into an associative array
496
-        foreach ($headerLines as $headerLine) {
497
-            // Handle headers that span multiple lines
498
-            if (false === strpos($headerLine, ':')) {
499
-                $headers[$currentHeaderName] .= ' '.trim($headerLine ?? '');
500
-                continue;
501
-            }
502
-
503
-            $header = explode(':', $headerLine, 2);
504
-            $currentHeaderName = strtolower($header[0] ?? '');
505
-            $headers[$currentHeaderName] = trim($header[1] ?? '');
506
-        }
507
-
508
-        // Read the entire email body into a byte stream
509
-        $bodyStream = new Swift_ByteStream_TemporaryFileByteStream();
510
-
511
-        // Skip the header and separator and point to the body
512
-        $emailStream->setReadPointer($headersPosEnd + \strlen($headerBodySeparator));
513
-
514
-        while (false !== ($buffer = $emailStream->read($bufferLength))) {
515
-            $bodyStream->write($buffer);
516
-        }
517
-
518
-        $bodyStream->commit();
519
-
520
-        return [$headers, $bodyStream];
521
-    }
522
-
523
-    protected function copyFromOpenSSLOutput(Swift_OutputByteStream $fromStream, Swift_InputByteStream $toStream)
524
-    {
525
-        $bufferLength = 4096;
526
-        $filteredStream = new Swift_ByteStream_TemporaryFileByteStream();
527
-        $filteredStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF');
528
-        $filteredStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF');
529
-
530
-        while (false !== ($buffer = $fromStream->read($bufferLength))) {
531
-            $filteredStream->write($buffer);
532
-        }
533
-
534
-        $filteredStream->flushBuffers();
535
-
536
-        while (false !== ($buffer = $filteredStream->read($bufferLength))) {
537
-            $toStream->write($buffer);
538
-        }
539
-
540
-        $toStream->commit();
541
-    }
20
+	protected $signCertificate;
21
+	protected $signPrivateKey;
22
+	protected $encryptCert;
23
+	protected $signThenEncrypt = true;
24
+	protected $signLevel;
25
+	protected $encryptLevel;
26
+	protected $signOptions;
27
+	protected $encryptOptions;
28
+	protected $encryptCipher;
29
+	protected $extraCerts = null;
30
+	protected $wrapFullMessage = false;
31
+
32
+	/**
33
+	 * @var Swift_StreamFilters_StringReplacementFilterFactory
34
+	 */
35
+	protected $replacementFactory;
36
+
37
+	/**
38
+	 * @var Swift_Mime_SimpleHeaderFactory
39
+	 */
40
+	protected $headerFactory;
41
+
42
+	/**
43
+	 * Constructor.
44
+	 *
45
+	 * @param string|null $signCertificate
46
+	 * @param string|null $signPrivateKey
47
+	 * @param string|null $encryptCertificate
48
+	 */
49
+	public function __construct($signCertificate = null, $signPrivateKey = null, $encryptCertificate = null)
50
+	{
51
+		if (null !== $signPrivateKey) {
52
+			$this->setSignCertificate($signCertificate, $signPrivateKey);
53
+		}
54
+
55
+		if (null !== $encryptCertificate) {
56
+			$this->setEncryptCertificate($encryptCertificate);
57
+		}
58
+
59
+		$this->replacementFactory = Swift_DependencyContainer::getInstance()
60
+			->lookup('transport.replacementfactory');
61
+
62
+		$this->signOptions = PKCS7_DETACHED;
63
+		$this->encryptCipher = OPENSSL_CIPHER_AES_128_CBC;
64
+	}
65
+
66
+	/**
67
+	 * Set the certificate location to use for signing.
68
+	 *
69
+	 * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php
70
+	 *
71
+	 * @param string       $certificate
72
+	 * @param string|array $privateKey  If the key needs an passphrase use array('file-location', 'passphrase') instead
73
+	 * @param int          $signOptions Bitwise operator options for openssl_pkcs7_sign()
74
+	 * @param string       $extraCerts  A file containing intermediate certificates needed by the signing certificate
75
+	 *
76
+	 * @return $this
77
+	 */
78
+	public function setSignCertificate($certificate, $privateKey = null, $signOptions = PKCS7_DETACHED, $extraCerts = null)
79
+	{
80
+		$this->signCertificate = 'file://'.str_replace('\\', '/', realpath($certificate));
81
+
82
+		if (null !== $privateKey) {
83
+			if (\is_array($privateKey)) {
84
+				$this->signPrivateKey = $privateKey;
85
+				$this->signPrivateKey[0] = 'file://'.str_replace('\\', '/', realpath($privateKey[0]));
86
+			} else {
87
+				$this->signPrivateKey = 'file://'.str_replace('\\', '/', realpath($privateKey));
88
+			}
89
+		}
90
+
91
+		$this->signOptions = $signOptions;
92
+		$this->extraCerts = $extraCerts ? realpath($extraCerts) : null;
93
+
94
+		return $this;
95
+	}
96
+
97
+	/**
98
+	 * Set the certificate location to use for encryption.
99
+	 *
100
+	 * @see https://secure.php.net/manual/en/openssl.pkcs7.flags.php
101
+	 * @see https://secure.php.net/manual/en/openssl.ciphers.php
102
+	 *
103
+	 * @param string|array $recipientCerts Either an single X.509 certificate, or an assoc array of X.509 certificates.
104
+	 * @param int          $cipher
105
+	 *
106
+	 * @return $this
107
+	 */
108
+	public function setEncryptCertificate($recipientCerts, $cipher = null)
109
+	{
110
+		if (\is_array($recipientCerts)) {
111
+			$this->encryptCert = [];
112
+
113
+			foreach ($recipientCerts as $cert) {
114
+				$this->encryptCert[] = 'file://'.str_replace('\\', '/', realpath($cert));
115
+			}
116
+		} else {
117
+			$this->encryptCert = 'file://'.str_replace('\\', '/', realpath($recipientCerts));
118
+		}
119
+
120
+		if (null !== $cipher) {
121
+			$this->encryptCipher = $cipher;
122
+		}
123
+
124
+		return $this;
125
+	}
126
+
127
+	/**
128
+	 * @return string
129
+	 */
130
+	public function getSignCertificate()
131
+	{
132
+		return $this->signCertificate;
133
+	}
134
+
135
+	/**
136
+	 * @return string
137
+	 */
138
+	public function getSignPrivateKey()
139
+	{
140
+		return $this->signPrivateKey;
141
+	}
142
+
143
+	/**
144
+	 * Set perform signing before encryption.
145
+	 *
146
+	 * The default is to first sign the message and then encrypt.
147
+	 * But some older mail clients, namely Microsoft Outlook 2000 will work when the message first encrypted.
148
+	 * As this goes against the official specs, its recommended to only use 'encryption -> signing' when specifically targeting these 'broken' clients.
149
+	 *
150
+	 * @param bool $signThenEncrypt
151
+	 *
152
+	 * @return $this
153
+	 */
154
+	public function setSignThenEncrypt($signThenEncrypt = true)
155
+	{
156
+		$this->signThenEncrypt = $signThenEncrypt;
157
+
158
+		return $this;
159
+	}
160
+
161
+	/**
162
+	 * @return bool
163
+	 */
164
+	public function isSignThenEncrypt()
165
+	{
166
+		return $this->signThenEncrypt;
167
+	}
168
+
169
+	/**
170
+	 * Resets internal states.
171
+	 *
172
+	 * @return $this
173
+	 */
174
+	public function reset()
175
+	{
176
+		return $this;
177
+	}
178
+
179
+	/**
180
+	 * Specify whether to wrap the entire MIME message in the S/MIME message.
181
+	 *
182
+	 * According to RFC5751 section 3.1:
183
+	 * In order to protect outer, non-content-related message header fields
184
+	 * (for instance, the "Subject", "To", "From", and "Cc" fields), the
185
+	 * sending client MAY wrap a full MIME message in a message/rfc822
186
+	 * wrapper in order to apply S/MIME security services to these header
187
+	 * fields.  It is up to the receiving client to decide how to present
188
+	 * this "inner" header along with the unprotected "outer" header.
189
+	 *
190
+	 * @param bool $wrap
191
+	 *
192
+	 * @return $this
193
+	 */
194
+	public function setWrapFullMessage($wrap)
195
+	{
196
+		$this->wrapFullMessage = $wrap;
197
+	}
198
+
199
+	/**
200
+	 * Change the Swift_Message to apply the signing.
201
+	 *
202
+	 * @return $this
203
+	 */
204
+	public function signMessage(Swift_Message $message)
205
+	{
206
+		if (null === $this->signCertificate && null === $this->encryptCert) {
207
+			return $this;
208
+		}
209
+
210
+		if ($this->signThenEncrypt) {
211
+			$this->smimeSignMessage($message);
212
+			$this->smimeEncryptMessage($message);
213
+		} else {
214
+			$this->smimeEncryptMessage($message);
215
+			$this->smimeSignMessage($message);
216
+		}
217
+	}
218
+
219
+	/**
220
+	 * Return the list of header a signer might tamper.
221
+	 *
222
+	 * @return array
223
+	 */
224
+	public function getAlteredHeaders()
225
+	{
226
+		return ['Content-Type', 'Content-Transfer-Encoding', 'Content-Disposition'];
227
+	}
228
+
229
+	/**
230
+	 * Sign a Swift message.
231
+	 */
232
+	protected function smimeSignMessage(Swift_Message $message)
233
+	{
234
+		// If we don't have a certificate we can't sign the message
235
+		if (null === $this->signCertificate) {
236
+			return;
237
+		}
238
+
239
+		// Work on a clone of the original message
240
+		$signMessage = clone $message;
241
+		$signMessage->clearSigners();
242
+
243
+		if ($this->wrapFullMessage) {
244
+			// The original message essentially becomes the body of the new
245
+			// wrapped message
246
+			$signMessage = $this->wrapMimeMessage($signMessage);
247
+		} else {
248
+			// Only keep header needed to parse the body correctly
249
+			$this->clearAllHeaders($signMessage);
250
+			$this->copyHeaders(
251
+				$message,
252
+				$signMessage,
253
+				[
254
+					'Content-Type',
255
+					'Content-Transfer-Encoding',
256
+					'Content-Disposition',
257
+				]
258
+			);
259
+		}
260
+
261
+		// Copy the cloned message into a temporary file stream
262
+		$messageStream = new Swift_ByteStream_TemporaryFileByteStream();
263
+		$signMessage->toByteStream($messageStream);
264
+		$messageStream->commit();
265
+		$signedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
266
+
267
+		// Sign the message using openssl
268
+		if (!openssl_pkcs7_sign(
269
+				$messageStream->getPath(),
270
+				$signedMessageStream->getPath(),
271
+				$this->signCertificate,
272
+				$this->signPrivateKey,
273
+				[],
274
+				$this->signOptions,
275
+				$this->extraCerts
276
+			)
277
+		) {
278
+			throw new Swift_IoException(sprintf('Failed to sign S/Mime message. Error: "%s".', openssl_error_string()));
279
+		}
280
+
281
+		// Parse the resulting signed message content back into the Swift message
282
+		// preserving the original headers
283
+		$this->parseSSLOutput($signedMessageStream, $message);
284
+	}
285
+
286
+	/**
287
+	 * Encrypt a Swift message.
288
+	 */
289
+	protected function smimeEncryptMessage(Swift_Message $message)
290
+	{
291
+		// If we don't have a certificate we can't encrypt the message
292
+		if (null === $this->encryptCert) {
293
+			return;
294
+		}
295
+
296
+		// Work on a clone of the original message
297
+		$encryptMessage = clone $message;
298
+		$encryptMessage->clearSigners();
299
+
300
+		if ($this->wrapFullMessage) {
301
+			// The original message essentially becomes the body of the new
302
+			// wrapped message
303
+			$encryptMessage = $this->wrapMimeMessage($encryptMessage);
304
+		} else {
305
+			// Only keep header needed to parse the body correctly
306
+			$this->clearAllHeaders($encryptMessage);
307
+			$this->copyHeaders(
308
+				$message,
309
+				$encryptMessage,
310
+				[
311
+					'Content-Type',
312
+					'Content-Transfer-Encoding',
313
+					'Content-Disposition',
314
+				]
315
+			);
316
+		}
317
+
318
+		// Convert the message content (including headers) to a string
319
+		// and place it in a temporary file
320
+		$messageStream = new Swift_ByteStream_TemporaryFileByteStream();
321
+		$encryptMessage->toByteStream($messageStream);
322
+		$messageStream->commit();
323
+		$encryptedMessageStream = new Swift_ByteStream_TemporaryFileByteStream();
324
+
325
+		// Encrypt the message
326
+		if (!openssl_pkcs7_encrypt(
327
+				$messageStream->getPath(),
328
+				$encryptedMessageStream->getPath(),
329
+				$this->encryptCert,
330
+				[],
331
+				0,
332
+				$this->encryptCipher
333
+			)
334
+		) {
335
+			throw new Swift_IoException(sprintf('Failed to encrypt S/Mime message. Error: "%s".', openssl_error_string()));
336
+		}
337
+
338
+		// Parse the resulting signed message content back into the Swift message
339
+		// preserving the original headers
340
+		$this->parseSSLOutput($encryptedMessageStream, $message);
341
+	}
342
+
343
+	/**
344
+	 * Copy named headers from one Swift message to another.
345
+	 */
346
+	protected function copyHeaders(
347
+		Swift_Message $fromMessage,
348
+		Swift_Message $toMessage,
349
+		array $headers = []
350
+	) {
351
+		foreach ($headers as $header) {
352
+			$this->copyHeader($fromMessage, $toMessage, $header);
353
+		}
354
+	}
355
+
356
+	/**
357
+	 * Copy a single header from one Swift message to another.
358
+	 *
359
+	 * @param string $headerName
360
+	 */
361
+	protected function copyHeader(Swift_Message $fromMessage, Swift_Message $toMessage, $headerName)
362
+	{
363
+		$header = $fromMessage->getHeaders()->get($headerName);
364
+		if (!$header) {
365
+			return;
366
+		}
367
+		$headers = $toMessage->getHeaders();
368
+		switch ($header->getFieldType()) {
369
+			case Swift_Mime_Header::TYPE_TEXT:
370
+				$headers->addTextHeader($header->getFieldName(), $header->getValue());
371
+				break;
372
+			case Swift_Mime_Header::TYPE_PARAMETERIZED:
373
+				$headers->addParameterizedHeader(
374
+					$header->getFieldName(),
375
+					$header->getValue(),
376
+					$header->getParameters()
377
+				);
378
+				break;
379
+		}
380
+	}
381
+
382
+	/**
383
+	 * Remove all headers from a Swift message.
384
+	 */
385
+	protected function clearAllHeaders(Swift_Message $message)
386
+	{
387
+		$headers = $message->getHeaders();
388
+		foreach ($headers->listAll() as $header) {
389
+			$headers->removeAll($header);
390
+		}
391
+	}
392
+
393
+	/**
394
+	 * Wraps a Swift_Message in a message/rfc822 MIME part.
395
+	 *
396
+	 * @return Swift_MimePart
397
+	 */
398
+	protected function wrapMimeMessage(Swift_Message $message)
399
+	{
400
+		// Start by copying the original message into a message stream
401
+		$messageStream = new Swift_ByteStream_TemporaryFileByteStream();
402
+		$message->toByteStream($messageStream);
403
+		$messageStream->commit();
404
+
405
+		// Create a new MIME part that wraps the original stream
406
+		$wrappedMessage = new Swift_MimePart($messageStream, 'message/rfc822');
407
+		$wrappedMessage->setEncoder(new Swift_Mime_ContentEncoder_PlainContentEncoder('7bit'));
408
+
409
+		return $wrappedMessage;
410
+	}
411
+
412
+	protected function parseSSLOutput(Swift_InputByteStream $inputStream, Swift_Message $message)
413
+	{
414
+		$messageStream = new Swift_ByteStream_TemporaryFileByteStream();
415
+		$this->copyFromOpenSSLOutput($inputStream, $messageStream);
416
+
417
+		$this->streamToMime($messageStream, $message);
418
+	}
419
+
420
+	/**
421
+	 * Merges an OutputByteStream from OpenSSL to a Swift_Message.
422
+	 */
423
+	protected function streamToMime(Swift_OutputByteStream $fromStream, Swift_Message $message)
424
+	{
425
+		// Parse the stream into headers and body
426
+		list($headers, $messageStream) = $this->parseStream($fromStream);
427
+
428
+		// Get the original message headers
429
+		$messageHeaders = $message->getHeaders();
430
+
431
+		// Let the stream determine the headers describing the body content,
432
+		// since the body of the original message is overwritten by the body
433
+		// coming from the stream.
434
+		// These are all content-* headers.
435
+
436
+		// Default transfer encoding is 7bit if not set
437
+		$encoding = '';
438
+		// Remove all existing transfer encoding headers
439
+		$messageHeaders->removeAll('Content-Transfer-Encoding');
440
+		// See whether the stream sets the transfer encoding
441
+		if (isset($headers['content-transfer-encoding'])) {
442
+			$encoding = $headers['content-transfer-encoding'];
443
+		}
444
+
445
+		// We use the null content encoder, since the body is already encoded
446
+		// according to the transfer encoding specified in the stream
447
+		$message->setEncoder(new Swift_Mime_ContentEncoder_NullContentEncoder($encoding));
448
+
449
+		// Set the disposition, if present
450
+		if (isset($headers['content-disposition'])) {
451
+			$messageHeaders->addTextHeader('Content-Disposition', $headers['content-disposition']);
452
+		}
453
+
454
+		// Copy over the body from the stream using the content type dictated
455
+		// by the stream content
456
+		$message->setChildren([]);
457
+		$message->setBody($messageStream, $headers['content-type']);
458
+	}
459
+
460
+	/**
461
+	 * This message will parse the headers of a MIME email byte stream
462
+	 * and return an array that contains the headers as an associative
463
+	 * array and the email body as a string.
464
+	 *
465
+	 * @return array
466
+	 */
467
+	protected function parseStream(Swift_OutputByteStream $emailStream)
468
+	{
469
+		$bufferLength = 78;
470
+		$headerData = '';
471
+		$headerBodySeparator = "\r\n\r\n";
472
+
473
+		$emailStream->setReadPointer(0);
474
+
475
+		// Read out the headers section from the stream to a string
476
+		while (false !== ($buffer = $emailStream->read($bufferLength))) {
477
+			$headerData .= $buffer;
478
+
479
+			$headersPosEnd = strpos($headerData, $headerBodySeparator);
480
+
481
+			// Stop reading if we found the end of the headers
482
+			if (false !== $headersPosEnd) {
483
+				break;
484
+			}
485
+		}
486
+
487
+		// Split the header data into lines
488
+		$headerData = trim(substr($headerData, 0, $headersPosEnd));
489
+		$headerLines = explode("\r\n", $headerData);
490
+		unset($headerData);
491
+
492
+		$headers = [];
493
+		$currentHeaderName = '';
494
+
495
+		// Transform header lines into an associative array
496
+		foreach ($headerLines as $headerLine) {
497
+			// Handle headers that span multiple lines
498
+			if (false === strpos($headerLine, ':')) {
499
+				$headers[$currentHeaderName] .= ' '.trim($headerLine ?? '');
500
+				continue;
501
+			}
502
+
503
+			$header = explode(':', $headerLine, 2);
504
+			$currentHeaderName = strtolower($header[0] ?? '');
505
+			$headers[$currentHeaderName] = trim($header[1] ?? '');
506
+		}
507
+
508
+		// Read the entire email body into a byte stream
509
+		$bodyStream = new Swift_ByteStream_TemporaryFileByteStream();
510
+
511
+		// Skip the header and separator and point to the body
512
+		$emailStream->setReadPointer($headersPosEnd + \strlen($headerBodySeparator));
513
+
514
+		while (false !== ($buffer = $emailStream->read($bufferLength))) {
515
+			$bodyStream->write($buffer);
516
+		}
517
+
518
+		$bodyStream->commit();
519
+
520
+		return [$headers, $bodyStream];
521
+	}
522
+
523
+	protected function copyFromOpenSSLOutput(Swift_OutputByteStream $fromStream, Swift_InputByteStream $toStream)
524
+	{
525
+		$bufferLength = 4096;
526
+		$filteredStream = new Swift_ByteStream_TemporaryFileByteStream();
527
+		$filteredStream->addFilter($this->replacementFactory->createFilter("\r\n", "\n"), 'CRLF to LF');
528
+		$filteredStream->addFilter($this->replacementFactory->createFilter("\n", "\r\n"), 'LF to CRLF');
529
+
530
+		while (false !== ($buffer = $fromStream->read($bufferLength))) {
531
+			$filteredStream->write($buffer);
532
+		}
533
+
534
+		$filteredStream->flushBuffers();
535
+
536
+		while (false !== ($buffer = $filteredStream->read($bufferLength))) {
537
+			$toStream->write($buffer);
538
+		}
539
+
540
+		$toStream->commit();
541
+	}
542 542
 }
Please login to merge, or discard this patch.
htdocs/includes/swiftmailer/lib/classes/Swift/Signers/DKIMSigner.php 1 patch
Indentation   +664 added lines, -664 removed lines patch added patch discarded remove patch
@@ -15,668 +15,668 @@
 block discarded – undo
15 15
  */
16 16
 class Swift_Signers_DKIMSigner 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
-    private $passphrase = '';
40
-
41
-    /**
42
-     * Hash algorithm used.
43
-     *
44
-     * @see RFC6376 3.3: Signers MUST implement and SHOULD sign using rsa-sha256.
45
-     *
46
-     * @var string
47
-     */
48
-    protected $hashAlgorithm = 'rsa-sha256';
49
-
50
-    /**
51
-     * Body canon method.
52
-     *
53
-     * @var string
54
-     */
55
-    protected $bodyCanon = 'simple';
56
-
57
-    /**
58
-     * Header canon method.
59
-     *
60
-     * @var string
61
-     */
62
-    protected $headerCanon = 'simple';
63
-
64
-    /**
65
-     * Headers not being signed.
66
-     *
67
-     * @var array
68
-     */
69
-    protected $ignoredHeaders = ['return-path' => true];
70
-
71
-    /**
72
-     * Signer identity.
73
-     *
74
-     * @var string
75
-     */
76
-    protected $signerIdentity;
77
-
78
-    /**
79
-     * BodyLength.
80
-     *
81
-     * @var int
82
-     */
83
-    protected $bodyLen = 0;
84
-
85
-    /**
86
-     * Maximum signedLen.
87
-     *
88
-     * @var int
89
-     */
90
-    protected $maxLen = PHP_INT_MAX;
91
-
92
-    /**
93
-     * Embbed bodyLen in signature.
94
-     *
95
-     * @var bool
96
-     */
97
-    protected $showLen = false;
98
-
99
-    /**
100
-     * When the signature has been applied (true means time()), false means not embedded.
101
-     *
102
-     * @var mixed
103
-     */
104
-    protected $signatureTimestamp = true;
105
-
106
-    /**
107
-     * When will the signature expires false means not embedded, if sigTimestamp is auto
108
-     * Expiration is relative, otherwise it's absolute.
109
-     *
110
-     * @var int
111
-     */
112
-    protected $signatureExpiration = false;
113
-
114
-    /**
115
-     * Must we embed signed headers?
116
-     *
117
-     * @var bool
118
-     */
119
-    protected $debugHeaders = false;
120
-
121
-    // work variables
122
-    /**
123
-     * Headers used to generate hash.
124
-     *
125
-     * @var array
126
-     */
127
-    protected $signedHeaders = [];
128
-
129
-    /**
130
-     * If debugHeaders is set store debugData here.
131
-     *
132
-     * @var string[]
133
-     */
134
-    private $debugHeadersData = [];
135
-
136
-    /**
137
-     * Stores the bodyHash.
138
-     *
139
-     * @var string
140
-     */
141
-    private $bodyHash = '';
142
-
143
-    /**
144
-     * Stores the signature header.
145
-     *
146
-     * @var Swift_Mime_Headers_ParameterizedHeader
147
-     */
148
-    protected $dkimHeader;
149
-
150
-    private $bodyHashHandler;
151
-
152
-    private $headerHash;
153
-
154
-    private $headerCanonData = '';
155
-
156
-    private $bodyCanonEmptyCounter = 0;
157
-
158
-    private $bodyCanonIgnoreStart = 2;
159
-
160
-    private $bodyCanonSpace = false;
161
-
162
-    private $bodyCanonLastChar = null;
163
-
164
-    private $bodyCanonLine = '';
165
-
166
-    private $bound = [];
167
-
168
-    /**
169
-     * Constructor.
170
-     *
171
-     * @param string $privateKey
172
-     * @param string $domainName
173
-     * @param string $selector
174
-     * @param string $passphrase
175
-     */
176
-    public function __construct($privateKey, $domainName, $selector, $passphrase = '')
177
-    {
178
-        $this->privateKey = $privateKey;
179
-        $this->domainName = $domainName;
180
-        $this->signerIdentity = '@'.$domainName;
181
-        $this->selector = $selector;
182
-        $this->passphrase = $passphrase;
183
-    }
184
-
185
-    /**
186
-     * Reset the Signer.
187
-     *
188
-     * @see Swift_Signer::reset()
189
-     */
190
-    public function reset()
191
-    {
192
-        $this->headerHash = null;
193
-        $this->signedHeaders = [];
194
-        $this->bodyHash = null;
195
-        $this->bodyHashHandler = null;
196
-        $this->bodyCanonIgnoreStart = 2;
197
-        $this->bodyCanonEmptyCounter = 0;
198
-        $this->bodyCanonLastChar = null;
199
-        $this->bodyCanonSpace = false;
200
-    }
201
-
202
-    /**
203
-     * Writes $bytes to the end of the stream.
204
-     *
205
-     * Writing may not happen immediately if the stream chooses to buffer.  If
206
-     * you want to write these bytes with immediate effect, call {@link commit()}
207
-     * after calling write().
208
-     *
209
-     * This method returns the sequence ID of the write (i.e. 1 for first, 2 for
210
-     * second, etc etc).
211
-     *
212
-     * @param string $bytes
213
-     *
214
-     * @return int
215
-     *
216
-     * @throws Swift_IoException
217
-     */
218
-    // TODO fix return
219
-    public function write($bytes)
220
-    {
221
-        $this->canonicalizeBody($bytes);
222
-        foreach ($this->bound as $is) {
223
-            $is->write($bytes);
224
-        }
225
-    }
226
-
227
-    /**
228
-     * For any bytes that are currently buffered inside the stream, force them
229
-     * off the buffer.
230
-     */
231
-    public function commit()
232
-    {
233
-        // Nothing to do
234
-        return;
235
-    }
236
-
237
-    /**
238
-     * Attach $is to this stream.
239
-     *
240
-     * The stream acts as an observer, receiving all data that is written.
241
-     * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
242
-     */
243
-    public function bind(Swift_InputByteStream $is)
244
-    {
245
-        // Don't have to mirror anything
246
-        $this->bound[] = $is;
247
-
248
-        return;
249
-    }
250
-
251
-    /**
252
-     * Remove an already bound stream.
253
-     *
254
-     * If $is is not bound, no errors will be raised.
255
-     * If the stream currently has any buffered data it will be written to $is
256
-     * before unbinding occurs.
257
-     */
258
-    public function unbind(Swift_InputByteStream $is)
259
-    {
260
-        // Don't have to mirror anything
261
-        foreach ($this->bound as $k => $stream) {
262
-            if ($stream === $is) {
263
-                unset($this->bound[$k]);
264
-
265
-                return;
266
-            }
267
-        }
268
-    }
269
-
270
-    /**
271
-     * Flush the contents of the stream (empty it) and set the internal pointer
272
-     * to the beginning.
273
-     *
274
-     * @throws Swift_IoException
275
-     */
276
-    public function flushBuffers()
277
-    {
278
-        $this->reset();
279
-    }
280
-
281
-    /**
282
-     * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1.
283
-     *
284
-     * @param string $hash 'rsa-sha1' or 'rsa-sha256'
285
-     *
286
-     * @throws Swift_SwiftException
287
-     *
288
-     * @return $this
289
-     */
290
-    public function setHashAlgorithm($hash)
291
-    {
292
-        switch ($hash) {
293
-            case 'rsa-sha1':
294
-                $this->hashAlgorithm = 'rsa-sha1';
295
-                break;
296
-            case 'rsa-sha256':
297
-                $this->hashAlgorithm = 'rsa-sha256';
298
-                if (!\defined('OPENSSL_ALGO_SHA256')) {
299
-                    throw new Swift_SwiftException('Unable to set sha256 as it is not supported by OpenSSL.');
300
-                }
301
-                break;
302
-            default:
303
-                throw new Swift_SwiftException('Unable to set the hash algorithm, must be one of rsa-sha1 or rsa-sha256 (%s given).', $hash);
304
-        }
305
-
306
-        return $this;
307
-    }
308
-
309
-    /**
310
-     * Set the body canonicalization algorithm.
311
-     *
312
-     * @param string $canon
313
-     *
314
-     * @return $this
315
-     */
316
-    public function setBodyCanon($canon)
317
-    {
318
-        if ('relaxed' == $canon) {
319
-            $this->bodyCanon = 'relaxed';
320
-        } else {
321
-            $this->bodyCanon = 'simple';
322
-        }
323
-
324
-        return $this;
325
-    }
326
-
327
-    /**
328
-     * Set the header canonicalization algorithm.
329
-     *
330
-     * @param string $canon
331
-     *
332
-     * @return $this
333
-     */
334
-    public function setHeaderCanon($canon)
335
-    {
336
-        if ('relaxed' == $canon) {
337
-            $this->headerCanon = 'relaxed';
338
-        } else {
339
-            $this->headerCanon = 'simple';
340
-        }
341
-
342
-        return $this;
343
-    }
344
-
345
-    /**
346
-     * Set the signer identity.
347
-     *
348
-     * @param string $identity
349
-     *
350
-     * @return $this
351
-     */
352
-    public function setSignerIdentity($identity)
353
-    {
354
-        $this->signerIdentity = $identity;
355
-
356
-        return $this;
357
-    }
358
-
359
-    /**
360
-     * Set the length of the body to sign.
361
-     *
362
-     * @param mixed $len (bool or int)
363
-     *
364
-     * @return $this
365
-     */
366
-    public function setBodySignedLen($len)
367
-    {
368
-        if (true === $len) {
369
-            $this->showLen = true;
370
-            $this->maxLen = PHP_INT_MAX;
371
-        } elseif (false === $len) {
372
-            $this->showLen = false;
373
-            $this->maxLen = PHP_INT_MAX;
374
-        } else {
375
-            $this->showLen = true;
376
-            $this->maxLen = (int) $len;
377
-        }
378
-
379
-        return $this;
380
-    }
381
-
382
-    /**
383
-     * Set the signature timestamp.
384
-     *
385
-     * @param int $time A timestamp
386
-     *
387
-     * @return $this
388
-     */
389
-    public function setSignatureTimestamp($time)
390
-    {
391
-        $this->signatureTimestamp = $time;
392
-
393
-        return $this;
394
-    }
395
-
396
-    /**
397
-     * Set the signature expiration timestamp.
398
-     *
399
-     * @param int $time A timestamp
400
-     *
401
-     * @return $this
402
-     */
403
-    public function setSignatureExpiration($time)
404
-    {
405
-        $this->signatureExpiration = $time;
406
-
407
-        return $this;
408
-    }
409
-
410
-    /**
411
-     * Enable / disable the DebugHeaders.
412
-     *
413
-     * @param bool $debug
414
-     *
415
-     * @return Swift_Signers_DKIMSigner
416
-     */
417
-    public function setDebugHeaders($debug)
418
-    {
419
-        $this->debugHeaders = (bool) $debug;
420
-
421
-        return $this;
422
-    }
423
-
424
-    /**
425
-     * Start Body.
426
-     */
427
-    public function startBody()
428
-    {
429
-        // Init
430
-        switch ($this->hashAlgorithm) {
431
-            case 'rsa-sha256':
432
-                $this->bodyHashHandler = hash_init('sha256');
433
-                break;
434
-            case 'rsa-sha1':
435
-                $this->bodyHashHandler = hash_init('sha1');
436
-                break;
437
-        }
438
-        $this->bodyCanonLine = '';
439
-    }
440
-
441
-    /**
442
-     * End Body.
443
-     */
444
-    public function endBody()
445
-    {
446
-        $this->endOfBody();
447
-    }
448
-
449
-    /**
450
-     * Returns the list of Headers Tampered by this plugin.
451
-     *
452
-     * @return array
453
-     */
454
-    public function getAlteredHeaders()
455
-    {
456
-        if ($this->debugHeaders) {
457
-            return ['DKIM-Signature', 'X-DebugHash'];
458
-        } else {
459
-            return ['DKIM-Signature'];
460
-        }
461
-    }
462
-
463
-    /**
464
-     * Adds an ignored Header.
465
-     *
466
-     * @param string $header_name
467
-     *
468
-     * @return Swift_Signers_DKIMSigner
469
-     */
470
-    public function ignoreHeader($header_name)
471
-    {
472
-        $this->ignoredHeaders[strtolower($header_name ?? '')] = true;
473
-
474
-        return $this;
475
-    }
476
-
477
-    /**
478
-     * Set the headers to sign.
479
-     *
480
-     * @return Swift_Signers_DKIMSigner
481
-     */
482
-    public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
483
-    {
484
-        $this->headerCanonData = '';
485
-        // Loop through Headers
486
-        $listHeaders = $headers->listAll();
487
-        foreach ($listHeaders as $hName) {
488
-            // Check if we need to ignore Header
489
-            if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
490
-                if ($headers->has($hName)) {
491
-                    $tmp = $headers->getAll($hName);
492
-                    foreach ($tmp as $header) {
493
-                        if ('' != $header->getFieldBody()) {
494
-                            $this->addHeader($header->toString());
495
-                            $this->signedHeaders[] = $header->getFieldName();
496
-                        }
497
-                    }
498
-                }
499
-            }
500
-        }
501
-
502
-        return $this;
503
-    }
504
-
505
-    /**
506
-     * Add the signature to the given Headers.
507
-     *
508
-     * @return Swift_Signers_DKIMSigner
509
-     */
510
-    public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
511
-    {
512
-        // Prepare the DKIM-Signature
513
-        $params = ['v' => '1', 'a' => $this->hashAlgorithm, 'bh' => base64_encode($this->bodyHash ?? ''), 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'i' => $this->signerIdentity, 's' => $this->selector];
514
-        if ('simple' != $this->bodyCanon) {
515
-            $params['c'] = $this->headerCanon.'/'.$this->bodyCanon;
516
-        } elseif ('simple' != $this->headerCanon) {
517
-            $params['c'] = $this->headerCanon;
518
-        }
519
-        if ($this->showLen) {
520
-            $params['l'] = $this->bodyLen;
521
-        }
522
-        if (true === $this->signatureTimestamp) {
523
-            $params['t'] = time();
524
-            if (false !== $this->signatureExpiration) {
525
-                $params['x'] = $params['t'] + $this->signatureExpiration;
526
-            }
527
-        } else {
528
-            if (false !== $this->signatureTimestamp) {
529
-                $params['t'] = $this->signatureTimestamp;
530
-            }
531
-            if (false !== $this->signatureExpiration) {
532
-                $params['x'] = $this->signatureExpiration;
533
-            }
534
-        }
535
-        if ($this->debugHeaders) {
536
-            $params['z'] = implode('|', $this->debugHeadersData);
537
-        }
538
-        $string = '';
539
-        foreach ($params as $k => $v) {
540
-            $string .= $k.'='.$v.'; ';
541
-        }
542
-        $string = trim($string);
543
-        $headers->addTextHeader('DKIM-Signature', $string);
544
-        // Add the last DKIM-Signature
545
-        $tmp = $headers->getAll('DKIM-Signature');
546
-        $this->dkimHeader = end($tmp);
547
-        $this->addHeader(trim($this->dkimHeader->toString() ?? '')."\r\n b=", true);
548
-        if ($this->debugHeaders) {
549
-            $headers->addTextHeader('X-DebugHash', base64_encode($this->headerHash ?? ''));
550
-        }
551
-        $this->dkimHeader->setValue($string.' b='.trim(chunk_split(base64_encode($this->getEncryptedHash() ?? ''), 73, ' ')));
552
-
553
-        return $this;
554
-    }
555
-
556
-    /* Private helpers */
557
-
558
-    protected function addHeader($header, $is_sig = false)
559
-    {
560
-        switch ($this->headerCanon) {
561
-            case 'relaxed':
562
-                // Prepare Header and cascade
563
-                $exploded = explode(':', $header, 2);
564
-                $name = strtolower(trim($exploded[0]));
565
-                $value = str_replace("\r\n", '', $exploded[1]);
566
-                $value = preg_replace("/[ \t][ \t]+/", ' ', $value);
567
-                $header = $name.':'.trim($value).($is_sig ? '' : "\r\n");
568
-                // no break
569
-            case 'simple':
570
-                // Nothing to do
571
-        }
572
-        $this->addToHeaderHash($header);
573
-    }
574
-
575
-    protected function canonicalizeBody($string)
576
-    {
577
-        $len = \strlen($string);
578
-        $canon = '';
579
-        $method = ('relaxed' == $this->bodyCanon);
580
-        for ($i = 0; $i < $len; ++$i) {
581
-            if ($this->bodyCanonIgnoreStart > 0) {
582
-                --$this->bodyCanonIgnoreStart;
583
-                continue;
584
-            }
585
-            switch ($string[$i]) {
586
-                case "\r":
587
-                    $this->bodyCanonLastChar = "\r";
588
-                    break;
589
-                case "\n":
590
-                    if ("\r" == $this->bodyCanonLastChar) {
591
-                        if ($method) {
592
-                            $this->bodyCanonSpace = false;
593
-                        }
594
-                        if ('' == $this->bodyCanonLine) {
595
-                            ++$this->bodyCanonEmptyCounter;
596
-                        } else {
597
-                            $this->bodyCanonLine = '';
598
-                            $canon .= "\r\n";
599
-                        }
600
-                    } else {
601
-                        // Wooops Error
602
-                        // todo handle it but should never happen
603
-                    }
604
-                    break;
605
-                case ' ':
606
-                case "\t":
607
-                    if ($method) {
608
-                        $this->bodyCanonSpace = true;
609
-                        break;
610
-                    }
611
-                    // no break
612
-                default:
613
-                    if ($this->bodyCanonEmptyCounter > 0) {
614
-                        $canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter);
615
-                        $this->bodyCanonEmptyCounter = 0;
616
-                    }
617
-                    if ($this->bodyCanonSpace) {
618
-                        $this->bodyCanonLine .= ' ';
619
-                        $canon .= ' ';
620
-                        $this->bodyCanonSpace = false;
621
-                    }
622
-                    $this->bodyCanonLine .= $string[$i];
623
-                    $canon .= $string[$i];
624
-            }
625
-        }
626
-        $this->addToBodyHash($canon);
627
-    }
628
-
629
-    protected function endOfBody()
630
-    {
631
-        // Add trailing Line return if last line is non empty
632
-        if (\strlen($this->bodyCanonLine) > 0) {
633
-            $this->addToBodyHash("\r\n");
634
-        }
635
-        $this->bodyHash = hash_final($this->bodyHashHandler, true);
636
-    }
637
-
638
-    private function addToBodyHash($string)
639
-    {
640
-        $len = \strlen($string);
641
-        if ($len > ($new_len = ($this->maxLen - $this->bodyLen))) {
642
-            $string = substr($string, 0, $new_len);
643
-            $len = $new_len;
644
-        }
645
-        hash_update($this->bodyHashHandler, $string);
646
-        $this->bodyLen += $len;
647
-    }
648
-
649
-    private function addToHeaderHash($header)
650
-    {
651
-        if ($this->debugHeaders) {
652
-            $this->debugHeadersData[] = trim($header ?? '');
653
-        }
654
-        $this->headerCanonData .= $header;
655
-    }
656
-
657
-    /**
658
-     * @throws Swift_SwiftException
659
-     *
660
-     * @return string
661
-     */
662
-    private function getEncryptedHash()
663
-    {
664
-        $signature = '';
665
-        switch ($this->hashAlgorithm) {
666
-            case 'rsa-sha1':
667
-                $algorithm = OPENSSL_ALGO_SHA1;
668
-                break;
669
-            case 'rsa-sha256':
670
-                $algorithm = OPENSSL_ALGO_SHA256;
671
-                break;
672
-        }
673
-        $pkeyId = openssl_get_privatekey($this->privateKey, $this->passphrase);
674
-        if (!$pkeyId) {
675
-            throw new Swift_SwiftException('Unable to load DKIM Private Key ['.openssl_error_string().']');
676
-        }
677
-        if (openssl_sign($this->headerCanonData, $signature, $pkeyId, $algorithm)) {
678
-            return $signature;
679
-        }
680
-        throw new Swift_SwiftException('Unable to sign DKIM Hash ['.openssl_error_string().']');
681
-    }
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
+	private $passphrase = '';
40
+
41
+	/**
42
+	 * Hash algorithm used.
43
+	 *
44
+	 * @see RFC6376 3.3: Signers MUST implement and SHOULD sign using rsa-sha256.
45
+	 *
46
+	 * @var string
47
+	 */
48
+	protected $hashAlgorithm = 'rsa-sha256';
49
+
50
+	/**
51
+	 * Body canon method.
52
+	 *
53
+	 * @var string
54
+	 */
55
+	protected $bodyCanon = 'simple';
56
+
57
+	/**
58
+	 * Header canon method.
59
+	 *
60
+	 * @var string
61
+	 */
62
+	protected $headerCanon = 'simple';
63
+
64
+	/**
65
+	 * Headers not being signed.
66
+	 *
67
+	 * @var array
68
+	 */
69
+	protected $ignoredHeaders = ['return-path' => true];
70
+
71
+	/**
72
+	 * Signer identity.
73
+	 *
74
+	 * @var string
75
+	 */
76
+	protected $signerIdentity;
77
+
78
+	/**
79
+	 * BodyLength.
80
+	 *
81
+	 * @var int
82
+	 */
83
+	protected $bodyLen = 0;
84
+
85
+	/**
86
+	 * Maximum signedLen.
87
+	 *
88
+	 * @var int
89
+	 */
90
+	protected $maxLen = PHP_INT_MAX;
91
+
92
+	/**
93
+	 * Embbed bodyLen in signature.
94
+	 *
95
+	 * @var bool
96
+	 */
97
+	protected $showLen = false;
98
+
99
+	/**
100
+	 * When the signature has been applied (true means time()), false means not embedded.
101
+	 *
102
+	 * @var mixed
103
+	 */
104
+	protected $signatureTimestamp = true;
105
+
106
+	/**
107
+	 * When will the signature expires false means not embedded, if sigTimestamp is auto
108
+	 * Expiration is relative, otherwise it's absolute.
109
+	 *
110
+	 * @var int
111
+	 */
112
+	protected $signatureExpiration = false;
113
+
114
+	/**
115
+	 * Must we embed signed headers?
116
+	 *
117
+	 * @var bool
118
+	 */
119
+	protected $debugHeaders = false;
120
+
121
+	// work variables
122
+	/**
123
+	 * Headers used to generate hash.
124
+	 *
125
+	 * @var array
126
+	 */
127
+	protected $signedHeaders = [];
128
+
129
+	/**
130
+	 * If debugHeaders is set store debugData here.
131
+	 *
132
+	 * @var string[]
133
+	 */
134
+	private $debugHeadersData = [];
135
+
136
+	/**
137
+	 * Stores the bodyHash.
138
+	 *
139
+	 * @var string
140
+	 */
141
+	private $bodyHash = '';
142
+
143
+	/**
144
+	 * Stores the signature header.
145
+	 *
146
+	 * @var Swift_Mime_Headers_ParameterizedHeader
147
+	 */
148
+	protected $dkimHeader;
149
+
150
+	private $bodyHashHandler;
151
+
152
+	private $headerHash;
153
+
154
+	private $headerCanonData = '';
155
+
156
+	private $bodyCanonEmptyCounter = 0;
157
+
158
+	private $bodyCanonIgnoreStart = 2;
159
+
160
+	private $bodyCanonSpace = false;
161
+
162
+	private $bodyCanonLastChar = null;
163
+
164
+	private $bodyCanonLine = '';
165
+
166
+	private $bound = [];
167
+
168
+	/**
169
+	 * Constructor.
170
+	 *
171
+	 * @param string $privateKey
172
+	 * @param string $domainName
173
+	 * @param string $selector
174
+	 * @param string $passphrase
175
+	 */
176
+	public function __construct($privateKey, $domainName, $selector, $passphrase = '')
177
+	{
178
+		$this->privateKey = $privateKey;
179
+		$this->domainName = $domainName;
180
+		$this->signerIdentity = '@'.$domainName;
181
+		$this->selector = $selector;
182
+		$this->passphrase = $passphrase;
183
+	}
184
+
185
+	/**
186
+	 * Reset the Signer.
187
+	 *
188
+	 * @see Swift_Signer::reset()
189
+	 */
190
+	public function reset()
191
+	{
192
+		$this->headerHash = null;
193
+		$this->signedHeaders = [];
194
+		$this->bodyHash = null;
195
+		$this->bodyHashHandler = null;
196
+		$this->bodyCanonIgnoreStart = 2;
197
+		$this->bodyCanonEmptyCounter = 0;
198
+		$this->bodyCanonLastChar = null;
199
+		$this->bodyCanonSpace = false;
200
+	}
201
+
202
+	/**
203
+	 * Writes $bytes to the end of the stream.
204
+	 *
205
+	 * Writing may not happen immediately if the stream chooses to buffer.  If
206
+	 * you want to write these bytes with immediate effect, call {@link commit()}
207
+	 * after calling write().
208
+	 *
209
+	 * This method returns the sequence ID of the write (i.e. 1 for first, 2 for
210
+	 * second, etc etc).
211
+	 *
212
+	 * @param string $bytes
213
+	 *
214
+	 * @return int
215
+	 *
216
+	 * @throws Swift_IoException
217
+	 */
218
+	// TODO fix return
219
+	public function write($bytes)
220
+	{
221
+		$this->canonicalizeBody($bytes);
222
+		foreach ($this->bound as $is) {
223
+			$is->write($bytes);
224
+		}
225
+	}
226
+
227
+	/**
228
+	 * For any bytes that are currently buffered inside the stream, force them
229
+	 * off the buffer.
230
+	 */
231
+	public function commit()
232
+	{
233
+		// Nothing to do
234
+		return;
235
+	}
236
+
237
+	/**
238
+	 * Attach $is to this stream.
239
+	 *
240
+	 * The stream acts as an observer, receiving all data that is written.
241
+	 * All {@link write()} and {@link flushBuffers()} operations will be mirrored.
242
+	 */
243
+	public function bind(Swift_InputByteStream $is)
244
+	{
245
+		// Don't have to mirror anything
246
+		$this->bound[] = $is;
247
+
248
+		return;
249
+	}
250
+
251
+	/**
252
+	 * Remove an already bound stream.
253
+	 *
254
+	 * If $is is not bound, no errors will be raised.
255
+	 * If the stream currently has any buffered data it will be written to $is
256
+	 * before unbinding occurs.
257
+	 */
258
+	public function unbind(Swift_InputByteStream $is)
259
+	{
260
+		// Don't have to mirror anything
261
+		foreach ($this->bound as $k => $stream) {
262
+			if ($stream === $is) {
263
+				unset($this->bound[$k]);
264
+
265
+				return;
266
+			}
267
+		}
268
+	}
269
+
270
+	/**
271
+	 * Flush the contents of the stream (empty it) and set the internal pointer
272
+	 * to the beginning.
273
+	 *
274
+	 * @throws Swift_IoException
275
+	 */
276
+	public function flushBuffers()
277
+	{
278
+		$this->reset();
279
+	}
280
+
281
+	/**
282
+	 * Set hash_algorithm, must be one of rsa-sha256 | rsa-sha1.
283
+	 *
284
+	 * @param string $hash 'rsa-sha1' or 'rsa-sha256'
285
+	 *
286
+	 * @throws Swift_SwiftException
287
+	 *
288
+	 * @return $this
289
+	 */
290
+	public function setHashAlgorithm($hash)
291
+	{
292
+		switch ($hash) {
293
+			case 'rsa-sha1':
294
+				$this->hashAlgorithm = 'rsa-sha1';
295
+				break;
296
+			case 'rsa-sha256':
297
+				$this->hashAlgorithm = 'rsa-sha256';
298
+				if (!\defined('OPENSSL_ALGO_SHA256')) {
299
+					throw new Swift_SwiftException('Unable to set sha256 as it is not supported by OpenSSL.');
300
+				}
301
+				break;
302
+			default:
303
+				throw new Swift_SwiftException('Unable to set the hash algorithm, must be one of rsa-sha1 or rsa-sha256 (%s given).', $hash);
304
+		}
305
+
306
+		return $this;
307
+	}
308
+
309
+	/**
310
+	 * Set the body canonicalization algorithm.
311
+	 *
312
+	 * @param string $canon
313
+	 *
314
+	 * @return $this
315
+	 */
316
+	public function setBodyCanon($canon)
317
+	{
318
+		if ('relaxed' == $canon) {
319
+			$this->bodyCanon = 'relaxed';
320
+		} else {
321
+			$this->bodyCanon = 'simple';
322
+		}
323
+
324
+		return $this;
325
+	}
326
+
327
+	/**
328
+	 * Set the header canonicalization algorithm.
329
+	 *
330
+	 * @param string $canon
331
+	 *
332
+	 * @return $this
333
+	 */
334
+	public function setHeaderCanon($canon)
335
+	{
336
+		if ('relaxed' == $canon) {
337
+			$this->headerCanon = 'relaxed';
338
+		} else {
339
+			$this->headerCanon = 'simple';
340
+		}
341
+
342
+		return $this;
343
+	}
344
+
345
+	/**
346
+	 * Set the signer identity.
347
+	 *
348
+	 * @param string $identity
349
+	 *
350
+	 * @return $this
351
+	 */
352
+	public function setSignerIdentity($identity)
353
+	{
354
+		$this->signerIdentity = $identity;
355
+
356
+		return $this;
357
+	}
358
+
359
+	/**
360
+	 * Set the length of the body to sign.
361
+	 *
362
+	 * @param mixed $len (bool or int)
363
+	 *
364
+	 * @return $this
365
+	 */
366
+	public function setBodySignedLen($len)
367
+	{
368
+		if (true === $len) {
369
+			$this->showLen = true;
370
+			$this->maxLen = PHP_INT_MAX;
371
+		} elseif (false === $len) {
372
+			$this->showLen = false;
373
+			$this->maxLen = PHP_INT_MAX;
374
+		} else {
375
+			$this->showLen = true;
376
+			$this->maxLen = (int) $len;
377
+		}
378
+
379
+		return $this;
380
+	}
381
+
382
+	/**
383
+	 * Set the signature timestamp.
384
+	 *
385
+	 * @param int $time A timestamp
386
+	 *
387
+	 * @return $this
388
+	 */
389
+	public function setSignatureTimestamp($time)
390
+	{
391
+		$this->signatureTimestamp = $time;
392
+
393
+		return $this;
394
+	}
395
+
396
+	/**
397
+	 * Set the signature expiration timestamp.
398
+	 *
399
+	 * @param int $time A timestamp
400
+	 *
401
+	 * @return $this
402
+	 */
403
+	public function setSignatureExpiration($time)
404
+	{
405
+		$this->signatureExpiration = $time;
406
+
407
+		return $this;
408
+	}
409
+
410
+	/**
411
+	 * Enable / disable the DebugHeaders.
412
+	 *
413
+	 * @param bool $debug
414
+	 *
415
+	 * @return Swift_Signers_DKIMSigner
416
+	 */
417
+	public function setDebugHeaders($debug)
418
+	{
419
+		$this->debugHeaders = (bool) $debug;
420
+
421
+		return $this;
422
+	}
423
+
424
+	/**
425
+	 * Start Body.
426
+	 */
427
+	public function startBody()
428
+	{
429
+		// Init
430
+		switch ($this->hashAlgorithm) {
431
+			case 'rsa-sha256':
432
+				$this->bodyHashHandler = hash_init('sha256');
433
+				break;
434
+			case 'rsa-sha1':
435
+				$this->bodyHashHandler = hash_init('sha1');
436
+				break;
437
+		}
438
+		$this->bodyCanonLine = '';
439
+	}
440
+
441
+	/**
442
+	 * End Body.
443
+	 */
444
+	public function endBody()
445
+	{
446
+		$this->endOfBody();
447
+	}
448
+
449
+	/**
450
+	 * Returns the list of Headers Tampered by this plugin.
451
+	 *
452
+	 * @return array
453
+	 */
454
+	public function getAlteredHeaders()
455
+	{
456
+		if ($this->debugHeaders) {
457
+			return ['DKIM-Signature', 'X-DebugHash'];
458
+		} else {
459
+			return ['DKIM-Signature'];
460
+		}
461
+	}
462
+
463
+	/**
464
+	 * Adds an ignored Header.
465
+	 *
466
+	 * @param string $header_name
467
+	 *
468
+	 * @return Swift_Signers_DKIMSigner
469
+	 */
470
+	public function ignoreHeader($header_name)
471
+	{
472
+		$this->ignoredHeaders[strtolower($header_name ?? '')] = true;
473
+
474
+		return $this;
475
+	}
476
+
477
+	/**
478
+	 * Set the headers to sign.
479
+	 *
480
+	 * @return Swift_Signers_DKIMSigner
481
+	 */
482
+	public function setHeaders(Swift_Mime_SimpleHeaderSet $headers)
483
+	{
484
+		$this->headerCanonData = '';
485
+		// Loop through Headers
486
+		$listHeaders = $headers->listAll();
487
+		foreach ($listHeaders as $hName) {
488
+			// Check if we need to ignore Header
489
+			if (!isset($this->ignoredHeaders[strtolower($hName ?? '')])) {
490
+				if ($headers->has($hName)) {
491
+					$tmp = $headers->getAll($hName);
492
+					foreach ($tmp as $header) {
493
+						if ('' != $header->getFieldBody()) {
494
+							$this->addHeader($header->toString());
495
+							$this->signedHeaders[] = $header->getFieldName();
496
+						}
497
+					}
498
+				}
499
+			}
500
+		}
501
+
502
+		return $this;
503
+	}
504
+
505
+	/**
506
+	 * Add the signature to the given Headers.
507
+	 *
508
+	 * @return Swift_Signers_DKIMSigner
509
+	 */
510
+	public function addSignature(Swift_Mime_SimpleHeaderSet $headers)
511
+	{
512
+		// Prepare the DKIM-Signature
513
+		$params = ['v' => '1', 'a' => $this->hashAlgorithm, 'bh' => base64_encode($this->bodyHash ?? ''), 'd' => $this->domainName, 'h' => implode(': ', $this->signedHeaders), 'i' => $this->signerIdentity, 's' => $this->selector];
514
+		if ('simple' != $this->bodyCanon) {
515
+			$params['c'] = $this->headerCanon.'/'.$this->bodyCanon;
516
+		} elseif ('simple' != $this->headerCanon) {
517
+			$params['c'] = $this->headerCanon;
518
+		}
519
+		if ($this->showLen) {
520
+			$params['l'] = $this->bodyLen;
521
+		}
522
+		if (true === $this->signatureTimestamp) {
523
+			$params['t'] = time();
524
+			if (false !== $this->signatureExpiration) {
525
+				$params['x'] = $params['t'] + $this->signatureExpiration;
526
+			}
527
+		} else {
528
+			if (false !== $this->signatureTimestamp) {
529
+				$params['t'] = $this->signatureTimestamp;
530
+			}
531
+			if (false !== $this->signatureExpiration) {
532
+				$params['x'] = $this->signatureExpiration;
533
+			}
534
+		}
535
+		if ($this->debugHeaders) {
536
+			$params['z'] = implode('|', $this->debugHeadersData);
537
+		}
538
+		$string = '';
539
+		foreach ($params as $k => $v) {
540
+			$string .= $k.'='.$v.'; ';
541
+		}
542
+		$string = trim($string);
543
+		$headers->addTextHeader('DKIM-Signature', $string);
544
+		// Add the last DKIM-Signature
545
+		$tmp = $headers->getAll('DKIM-Signature');
546
+		$this->dkimHeader = end($tmp);
547
+		$this->addHeader(trim($this->dkimHeader->toString() ?? '')."\r\n b=", true);
548
+		if ($this->debugHeaders) {
549
+			$headers->addTextHeader('X-DebugHash', base64_encode($this->headerHash ?? ''));
550
+		}
551
+		$this->dkimHeader->setValue($string.' b='.trim(chunk_split(base64_encode($this->getEncryptedHash() ?? ''), 73, ' ')));
552
+
553
+		return $this;
554
+	}
555
+
556
+	/* Private helpers */
557
+
558
+	protected function addHeader($header, $is_sig = false)
559
+	{
560
+		switch ($this->headerCanon) {
561
+			case 'relaxed':
562
+				// Prepare Header and cascade
563
+				$exploded = explode(':', $header, 2);
564
+				$name = strtolower(trim($exploded[0]));
565
+				$value = str_replace("\r\n", '', $exploded[1]);
566
+				$value = preg_replace("/[ \t][ \t]+/", ' ', $value);
567
+				$header = $name.':'.trim($value).($is_sig ? '' : "\r\n");
568
+				// no break
569
+			case 'simple':
570
+				// Nothing to do
571
+		}
572
+		$this->addToHeaderHash($header);
573
+	}
574
+
575
+	protected function canonicalizeBody($string)
576
+	{
577
+		$len = \strlen($string);
578
+		$canon = '';
579
+		$method = ('relaxed' == $this->bodyCanon);
580
+		for ($i = 0; $i < $len; ++$i) {
581
+			if ($this->bodyCanonIgnoreStart > 0) {
582
+				--$this->bodyCanonIgnoreStart;
583
+				continue;
584
+			}
585
+			switch ($string[$i]) {
586
+				case "\r":
587
+					$this->bodyCanonLastChar = "\r";
588
+					break;
589
+				case "\n":
590
+					if ("\r" == $this->bodyCanonLastChar) {
591
+						if ($method) {
592
+							$this->bodyCanonSpace = false;
593
+						}
594
+						if ('' == $this->bodyCanonLine) {
595
+							++$this->bodyCanonEmptyCounter;
596
+						} else {
597
+							$this->bodyCanonLine = '';
598
+							$canon .= "\r\n";
599
+						}
600
+					} else {
601
+						// Wooops Error
602
+						// todo handle it but should never happen
603
+					}
604
+					break;
605
+				case ' ':
606
+				case "\t":
607
+					if ($method) {
608
+						$this->bodyCanonSpace = true;
609
+						break;
610
+					}
611
+					// no break
612
+				default:
613
+					if ($this->bodyCanonEmptyCounter > 0) {
614
+						$canon .= str_repeat("\r\n", $this->bodyCanonEmptyCounter);
615
+						$this->bodyCanonEmptyCounter = 0;
616
+					}
617
+					if ($this->bodyCanonSpace) {
618
+						$this->bodyCanonLine .= ' ';
619
+						$canon .= ' ';
620
+						$this->bodyCanonSpace = false;
621
+					}
622
+					$this->bodyCanonLine .= $string[$i];
623
+					$canon .= $string[$i];
624
+			}
625
+		}
626
+		$this->addToBodyHash($canon);
627
+	}
628
+
629
+	protected function endOfBody()
630
+	{
631
+		// Add trailing Line return if last line is non empty
632
+		if (\strlen($this->bodyCanonLine) > 0) {
633
+			$this->addToBodyHash("\r\n");
634
+		}
635
+		$this->bodyHash = hash_final($this->bodyHashHandler, true);
636
+	}
637
+
638
+	private function addToBodyHash($string)
639
+	{
640
+		$len = \strlen($string);
641
+		if ($len > ($new_len = ($this->maxLen - $this->bodyLen))) {
642
+			$string = substr($string, 0, $new_len);
643
+			$len = $new_len;
644
+		}
645
+		hash_update($this->bodyHashHandler, $string);
646
+		$this->bodyLen += $len;
647
+	}
648
+
649
+	private function addToHeaderHash($header)
650
+	{
651
+		if ($this->debugHeaders) {
652
+			$this->debugHeadersData[] = trim($header ?? '');
653
+		}
654
+		$this->headerCanonData .= $header;
655
+	}
656
+
657
+	/**
658
+	 * @throws Swift_SwiftException
659
+	 *
660
+	 * @return string
661
+	 */
662
+	private function getEncryptedHash()
663
+	{
664
+		$signature = '';
665
+		switch ($this->hashAlgorithm) {
666
+			case 'rsa-sha1':
667
+				$algorithm = OPENSSL_ALGO_SHA1;
668
+				break;
669
+			case 'rsa-sha256':
670
+				$algorithm = OPENSSL_ALGO_SHA256;
671
+				break;
672
+		}
673
+		$pkeyId = openssl_get_privatekey($this->privateKey, $this->passphrase);
674
+		if (!$pkeyId) {
675
+			throw new Swift_SwiftException('Unable to load DKIM Private Key ['.openssl_error_string().']');
676
+		}
677
+		if (openssl_sign($this->headerCanonData, $signature, $pkeyId, $algorithm)) {
678
+			return $signature;
679
+		}
680
+		throw new Swift_SwiftException('Unable to sign DKIM Hash ['.openssl_error_string().']');
681
+	}
682 682
 }
Please login to merge, or discard this patch.