Completed
Branch develop (fc1aaa)
by
unknown
18:31
created
htdocs/includes/sabre/sabre/uri/lib/functions.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -31,7 +31,7 @@  discard block
 block discarded – undo
31 31
     }
32 32
 
33 33
     $base = parse($basePath);
34
-    $pick = function ($part) use ($base, $delta) {
34
+    $pick = function($part) use ($base, $delta) {
35 35
         if ($delta[$part]) {
36 36
             return $delta[$part];
37 37
         } elseif ($base[$part]) {
@@ -187,7 +187,7 @@  discard block
 block discarded – undo
187 187
     // uriencode them first.
188 188
     $uri = preg_replace_callback(
189 189
         '/[^[:ascii:]]/u',
190
-        function ($matches) {
190
+        function($matches) {
191 191
             return rawurlencode($matches[0]);
192 192
         },
193 193
         $uri
@@ -316,7 +316,7 @@  discard block
 block discarded – undo
316 316
     // uriencode them first.
317 317
     $uri = preg_replace_callback(
318 318
         '/[^[:ascii:]]/u',
319
-        function ($matches) {
319
+        function($matches) {
320 320
             return rawurlencode($matches[0]);
321 321
         },
322 322
         $uri
Please login to merge, or discard this patch.
Indentation   +260 added lines, -260 removed lines patch added patch discarded remove patch
@@ -22,80 +22,80 @@  discard block
 block discarded – undo
22 22
  */
23 23
 function resolve(string $basePath, string $newPath): string
24 24
 {
25
-    $delta = parse($newPath);
26
-
27
-    // If the new path defines a scheme, it's absolute and we can just return
28
-    // that.
29
-    if ($delta['scheme']) {
30
-        return build($delta);
31
-    }
32
-
33
-    $base = parse($basePath);
34
-    $pick = function ($part) use ($base, $delta) {
35
-        if ($delta[$part]) {
36
-            return $delta[$part];
37
-        } elseif ($base[$part]) {
38
-            return $base[$part];
39
-        }
40
-
41
-        return null;
42
-    };
43
-
44
-    $newParts = [];
45
-
46
-    $newParts['scheme'] = $pick('scheme');
47
-    $newParts['host'] = $pick('host');
48
-    $newParts['port'] = $pick('port');
49
-
50
-    $path = '';
51
-    if (is_string($delta['path']) and strlen($delta['path']) > 0) {
52
-        // If the path starts with a slash
53
-        if ('/' === $delta['path'][0]) {
54
-            $path = $delta['path'];
55
-        } else {
56
-            // Removing last component from base path.
57
-            $path = $base['path'];
58
-            $length = strrpos((string) $path, '/');
59
-            if (false !== $length) {
60
-                $path = substr($path, 0, $length);
61
-            }
62
-            $path .= '/'.$delta['path'];
63
-        }
64
-    } else {
65
-        $path = $base['path'] ?: '/';
66
-    }
67
-    // Removing .. and .
68
-    $pathParts = explode('/', $path);
69
-    $newPathParts = [];
70
-    foreach ($pathParts as $pathPart) {
71
-        switch ($pathPart) {
72
-            //case '' :
73
-            case '.':
74
-                break;
75
-            case '..':
76
-                array_pop($newPathParts);
77
-                break;
78
-            default:
79
-                $newPathParts[] = $pathPart;
80
-                break;
81
-        }
82
-    }
83
-
84
-    $path = implode('/', $newPathParts);
85
-
86
-    // If the source url ended with a /, we want to preserve that.
87
-    $newParts['path'] = 0 === strpos($path, '/') ? $path : '/'.$path;
88
-    if ($delta['query']) {
89
-        $newParts['query'] = $delta['query'];
90
-    } elseif (!empty($base['query']) && empty($delta['host']) && empty($delta['path'])) {
91
-        // Keep the old query if host and path didn't change
92
-        $newParts['query'] = $base['query'];
93
-    }
94
-    if ($delta['fragment']) {
95
-        $newParts['fragment'] = $delta['fragment'];
96
-    }
97
-
98
-    return build($newParts);
25
+	$delta = parse($newPath);
26
+
27
+	// If the new path defines a scheme, it's absolute and we can just return
28
+	// that.
29
+	if ($delta['scheme']) {
30
+		return build($delta);
31
+	}
32
+
33
+	$base = parse($basePath);
34
+	$pick = function ($part) use ($base, $delta) {
35
+		if ($delta[$part]) {
36
+			return $delta[$part];
37
+		} elseif ($base[$part]) {
38
+			return $base[$part];
39
+		}
40
+
41
+		return null;
42
+	};
43
+
44
+	$newParts = [];
45
+
46
+	$newParts['scheme'] = $pick('scheme');
47
+	$newParts['host'] = $pick('host');
48
+	$newParts['port'] = $pick('port');
49
+
50
+	$path = '';
51
+	if (is_string($delta['path']) and strlen($delta['path']) > 0) {
52
+		// If the path starts with a slash
53
+		if ('/' === $delta['path'][0]) {
54
+			$path = $delta['path'];
55
+		} else {
56
+			// Removing last component from base path.
57
+			$path = $base['path'];
58
+			$length = strrpos((string) $path, '/');
59
+			if (false !== $length) {
60
+				$path = substr($path, 0, $length);
61
+			}
62
+			$path .= '/'.$delta['path'];
63
+		}
64
+	} else {
65
+		$path = $base['path'] ?: '/';
66
+	}
67
+	// Removing .. and .
68
+	$pathParts = explode('/', $path);
69
+	$newPathParts = [];
70
+	foreach ($pathParts as $pathPart) {
71
+		switch ($pathPart) {
72
+			//case '' :
73
+			case '.':
74
+				break;
75
+			case '..':
76
+				array_pop($newPathParts);
77
+				break;
78
+			default:
79
+				$newPathParts[] = $pathPart;
80
+				break;
81
+		}
82
+	}
83
+
84
+	$path = implode('/', $newPathParts);
85
+
86
+	// If the source url ended with a /, we want to preserve that.
87
+	$newParts['path'] = 0 === strpos($path, '/') ? $path : '/'.$path;
88
+	if ($delta['query']) {
89
+		$newParts['query'] = $delta['query'];
90
+	} elseif (!empty($base['query']) && empty($delta['host']) && empty($delta['path'])) {
91
+		// Keep the old query if host and path didn't change
92
+		$newParts['query'] = $base['query'];
93
+	}
94
+	if ($delta['fragment']) {
95
+		$newParts['fragment'] = $delta['fragment'];
96
+	}
97
+
98
+	return build($newParts);
99 99
 }
100 100
 
101 101
 /**
@@ -111,57 +111,57 @@  discard block
 block discarded – undo
111 111
  */
112 112
 function normalize(string $uri): string
113 113
 {
114
-    $parts = parse($uri);
115
-
116
-    if (!empty($parts['path'])) {
117
-        $pathParts = explode('/', ltrim($parts['path'], '/'));
118
-        $newPathParts = [];
119
-        foreach ($pathParts as $pathPart) {
120
-            switch ($pathPart) {
121
-                case '.':
122
-                    // skip
123
-                    break;
124
-                case '..':
125
-                    // One level up in the hierarchy
126
-                    array_pop($newPathParts);
127
-                    break;
128
-                default:
129
-                    // Ensuring that everything is correctly percent-encoded.
130
-                    $newPathParts[] = rawurlencode(rawurldecode($pathPart));
131
-                    break;
132
-            }
133
-        }
134
-        $parts['path'] = '/'.implode('/', $newPathParts);
135
-    }
136
-
137
-    if ($parts['scheme']) {
138
-        $parts['scheme'] = strtolower($parts['scheme']);
139
-        $defaultPorts = [
140
-            'http' => '80',
141
-            'https' => '443',
142
-        ];
143
-
144
-        if (!empty($parts['port']) && isset($defaultPorts[$parts['scheme']]) && $defaultPorts[$parts['scheme']] == $parts['port']) {
145
-            // Removing default ports.
146
-            unset($parts['port']);
147
-        }
148
-        // A few HTTP specific rules.
149
-        switch ($parts['scheme']) {
150
-            case 'http':
151
-            case 'https':
152
-                if (empty($parts['path'])) {
153
-                    // An empty path is equivalent to / in http.
154
-                    $parts['path'] = '/';
155
-                }
156
-                break;
157
-        }
158
-    }
159
-
160
-    if ($parts['host']) {
161
-        $parts['host'] = strtolower($parts['host']);
162
-    }
163
-
164
-    return build($parts);
114
+	$parts = parse($uri);
115
+
116
+	if (!empty($parts['path'])) {
117
+		$pathParts = explode('/', ltrim($parts['path'], '/'));
118
+		$newPathParts = [];
119
+		foreach ($pathParts as $pathPart) {
120
+			switch ($pathPart) {
121
+				case '.':
122
+					// skip
123
+					break;
124
+				case '..':
125
+					// One level up in the hierarchy
126
+					array_pop($newPathParts);
127
+					break;
128
+				default:
129
+					// Ensuring that everything is correctly percent-encoded.
130
+					$newPathParts[] = rawurlencode(rawurldecode($pathPart));
131
+					break;
132
+			}
133
+		}
134
+		$parts['path'] = '/'.implode('/', $newPathParts);
135
+	}
136
+
137
+	if ($parts['scheme']) {
138
+		$parts['scheme'] = strtolower($parts['scheme']);
139
+		$defaultPorts = [
140
+			'http' => '80',
141
+			'https' => '443',
142
+		];
143
+
144
+		if (!empty($parts['port']) && isset($defaultPorts[$parts['scheme']]) && $defaultPorts[$parts['scheme']] == $parts['port']) {
145
+			// Removing default ports.
146
+			unset($parts['port']);
147
+		}
148
+		// A few HTTP specific rules.
149
+		switch ($parts['scheme']) {
150
+			case 'http':
151
+			case 'https':
152
+				if (empty($parts['path'])) {
153
+					// An empty path is equivalent to / in http.
154
+					$parts['path'] = '/';
155
+				}
156
+				break;
157
+		}
158
+	}
159
+
160
+	if ($parts['host']) {
161
+		$parts['host'] = strtolower($parts['host']);
162
+	}
163
+
164
+	return build($parts);
165 165
 }
166 166
 
167 167
 /**
@@ -180,34 +180,34 @@  discard block
 block discarded – undo
180 180
  */
181 181
 function parse(string $uri): array
182 182
 {
183
-    // Normally a URI must be ASCII, however. However, often it's not and
184
-    // parse_url might corrupt these strings.
185
-    //
186
-    // For that reason we take any non-ascii characters from the uri and
187
-    // uriencode them first.
188
-    $uri = preg_replace_callback(
189
-        '/[^[:ascii:]]/u',
190
-        function ($matches) {
191
-            return rawurlencode($matches[0]);
192
-        },
193
-        $uri
194
-    );
195
-
196
-    $result = parse_url($uri);
197
-    if (!$result) {
198
-        $result = _parse_fallback($uri);
199
-    }
200
-
201
-    return
202
-         $result + [
203
-            'scheme' => null,
204
-            'host' => null,
205
-            'path' => null,
206
-            'port' => null,
207
-            'user' => null,
208
-            'query' => null,
209
-            'fragment' => null,
210
-        ];
183
+	// Normally a URI must be ASCII, however. However, often it's not and
184
+	// parse_url might corrupt these strings.
185
+	//
186
+	// For that reason we take any non-ascii characters from the uri and
187
+	// uriencode them first.
188
+	$uri = preg_replace_callback(
189
+		'/[^[:ascii:]]/u',
190
+		function ($matches) {
191
+			return rawurlencode($matches[0]);
192
+		},
193
+		$uri
194
+	);
195
+
196
+	$result = parse_url($uri);
197
+	if (!$result) {
198
+		$result = _parse_fallback($uri);
199
+	}
200
+
201
+	return
202
+		 $result + [
203
+			'scheme' => null,
204
+			'host' => null,
205
+			'path' => null,
206
+			'port' => null,
207
+			'user' => null,
208
+			'query' => null,
209
+			'fragment' => null,
210
+		];
211 211
 }
212 212
 
213 213
 /**
@@ -218,39 +218,39 @@  discard block
 block discarded – undo
218 218
  */
219 219
 function build(array $parts): string
220 220
 {
221
-    $uri = '';
222
-
223
-    $authority = '';
224
-    if (!empty($parts['host'])) {
225
-        $authority = $parts['host'];
226
-        if (!empty($parts['user'])) {
227
-            $authority = $parts['user'].'@'.$authority;
228
-        }
229
-        if (!empty($parts['port'])) {
230
-            $authority = $authority.':'.$parts['port'];
231
-        }
232
-    }
233
-
234
-    if (!empty($parts['scheme'])) {
235
-        // If there's a scheme, there's also a host.
236
-        $uri = $parts['scheme'].':';
237
-    }
238
-    if ($authority || (!empty($parts['scheme']) && 'file' === $parts['scheme'])) {
239
-        // No scheme, but there is a host.
240
-        $uri .= '//'.$authority;
241
-    }
242
-
243
-    if (!empty($parts['path'])) {
244
-        $uri .= $parts['path'];
245
-    }
246
-    if (!empty($parts['query'])) {
247
-        $uri .= '?'.$parts['query'];
248
-    }
249
-    if (!empty($parts['fragment'])) {
250
-        $uri .= '#'.$parts['fragment'];
251
-    }
252
-
253
-    return $uri;
221
+	$uri = '';
222
+
223
+	$authority = '';
224
+	if (!empty($parts['host'])) {
225
+		$authority = $parts['host'];
226
+		if (!empty($parts['user'])) {
227
+			$authority = $parts['user'].'@'.$authority;
228
+		}
229
+		if (!empty($parts['port'])) {
230
+			$authority = $authority.':'.$parts['port'];
231
+		}
232
+	}
233
+
234
+	if (!empty($parts['scheme'])) {
235
+		// If there's a scheme, there's also a host.
236
+		$uri = $parts['scheme'].':';
237
+	}
238
+	if ($authority || (!empty($parts['scheme']) && 'file' === $parts['scheme'])) {
239
+		// No scheme, but there is a host.
240
+		$uri .= '//'.$authority;
241
+	}
242
+
243
+	if (!empty($parts['path'])) {
244
+		$uri .= $parts['path'];
245
+	}
246
+	if (!empty($parts['query'])) {
247
+		$uri .= '?'.$parts['query'];
248
+	}
249
+	if (!empty($parts['fragment'])) {
250
+		$uri .= '#'.$parts['fragment'];
251
+	}
252
+
253
+	return $uri;
254 254
 }
255 255
 
256 256
 /**
@@ -272,12 +272,12 @@  discard block
 block discarded – undo
272 272
  */
273 273
 function split(string $path): array
274 274
 {
275
-    $matches = [];
276
-    if (preg_match('/^(?:(?:(.*)(?:\/+))?([^\/]+))(?:\/?)$/u', $path, $matches)) {
277
-        return [$matches[1], $matches[2]];
278
-    }
275
+	$matches = [];
276
+	if (preg_match('/^(?:(?:(.*)(?:\/+))?([^\/]+))(?:\/?)$/u', $path, $matches)) {
277
+		return [$matches[1], $matches[2]];
278
+	}
279 279
 
280
-    return [null, null];
280
+	return [null, null];
281 281
 }
282 282
 
283 283
 /**
@@ -296,79 +296,79 @@  discard block
 block discarded – undo
296 296
  */
297 297
 function _parse_fallback(string $uri): array
298 298
 {
299
-    // Normally a URI must be ASCII, however. However, often it's not and
300
-    // parse_url might corrupt these strings.
301
-    //
302
-    // For that reason we take any non-ascii characters from the uri and
303
-    // uriencode them first.
304
-    $uri = preg_replace_callback(
305
-        '/[^[:ascii:]]/u',
306
-        function ($matches) {
307
-            return rawurlencode($matches[0]);
308
-        },
309
-        $uri
310
-    );
311
-
312
-    $result = [
313
-        'scheme' => null,
314
-        'host' => null,
315
-        'port' => null,
316
-        'user' => null,
317
-        'path' => null,
318
-        'fragment' => null,
319
-        'query' => null,
320
-    ];
321
-
322
-    if (preg_match('% ^([A-Za-z][A-Za-z0-9+-\.]+): %x', $uri, $matches)) {
323
-        $result['scheme'] = $matches[1];
324
-        // Take what's left.
325
-        $uri = substr($uri, strlen($result['scheme']) + 1);
326
-    }
327
-
328
-    // Taking off a fragment part
329
-    if (false !== strpos($uri, '#')) {
330
-        list($uri, $result['fragment']) = explode('#', $uri, 2);
331
-    }
332
-    // Taking off the query part
333
-    if (false !== strpos($uri, '?')) {
334
-        list($uri, $result['query']) = explode('?', $uri, 2);
335
-    }
336
-
337
-    if ('///' === substr($uri, 0, 3)) {
338
-        // The triple slash uris are a bit unusual, but we have special handling
339
-        // for them.
340
-        $result['path'] = substr($uri, 2);
341
-        $result['host'] = '';
342
-    } elseif ('//' === substr($uri, 0, 2)) {
343
-        // Uris that have an authority part.
344
-        $regex = '%^
299
+	// Normally a URI must be ASCII, however. However, often it's not and
300
+	// parse_url might corrupt these strings.
301
+	//
302
+	// For that reason we take any non-ascii characters from the uri and
303
+	// uriencode them first.
304
+	$uri = preg_replace_callback(
305
+		'/[^[:ascii:]]/u',
306
+		function ($matches) {
307
+			return rawurlencode($matches[0]);
308
+		},
309
+		$uri
310
+	);
311
+
312
+	$result = [
313
+		'scheme' => null,
314
+		'host' => null,
315
+		'port' => null,
316
+		'user' => null,
317
+		'path' => null,
318
+		'fragment' => null,
319
+		'query' => null,
320
+	];
321
+
322
+	if (preg_match('% ^([A-Za-z][A-Za-z0-9+-\.]+): %x', $uri, $matches)) {
323
+		$result['scheme'] = $matches[1];
324
+		// Take what's left.
325
+		$uri = substr($uri, strlen($result['scheme']) + 1);
326
+	}
327
+
328
+	// Taking off a fragment part
329
+	if (false !== strpos($uri, '#')) {
330
+		list($uri, $result['fragment']) = explode('#', $uri, 2);
331
+	}
332
+	// Taking off the query part
333
+	if (false !== strpos($uri, '?')) {
334
+		list($uri, $result['query']) = explode('?', $uri, 2);
335
+	}
336
+
337
+	if ('///' === substr($uri, 0, 3)) {
338
+		// The triple slash uris are a bit unusual, but we have special handling
339
+		// for them.
340
+		$result['path'] = substr($uri, 2);
341
+		$result['host'] = '';
342
+	} elseif ('//' === substr($uri, 0, 2)) {
343
+		// Uris that have an authority part.
344
+		$regex = '%^
345 345
             //
346 346
             (?: (?<user> [^:@]+) (: (?<pass> [^@]+)) @)?
347 347
             (?<host> ( [^:/]* | \[ [^\]]+ \] ))
348 348
             (?: : (?<port> [0-9]+))?
349 349
             (?<path> / .*)?
350 350
           $%x';
351
-        if (!preg_match($regex, $uri, $matches)) {
352
-            throw new InvalidUriException('Invalid, or could not parse URI');
353
-        }
354
-        if ($matches['host']) {
355
-            $result['host'] = $matches['host'];
356
-        }
357
-        if (isset($matches['port'])) {
358
-            $result['port'] = (int) $matches['port'];
359
-        }
360
-        if (isset($matches['path'])) {
361
-            $result['path'] = $matches['path'];
362
-        }
363
-        if ($matches['user']) {
364
-            $result['user'] = $matches['user'];
365
-        }
366
-        if ($matches['pass']) {
367
-            $result['pass'] = $matches['pass'];
368
-        }
369
-    } else {
370
-        $result['path'] = $uri;
371
-    }
372
-
373
-    return $result;
351
+		if (!preg_match($regex, $uri, $matches)) {
352
+			throw new InvalidUriException('Invalid, or could not parse URI');
353
+		}
354
+		if ($matches['host']) {
355
+			$result['host'] = $matches['host'];
356
+		}
357
+		if (isset($matches['port'])) {
358
+			$result['port'] = (int) $matches['port'];
359
+		}
360
+		if (isset($matches['path'])) {
361
+			$result['path'] = $matches['path'];
362
+		}
363
+		if ($matches['user']) {
364
+			$result['user'] = $matches['user'];
365
+		}
366
+		if ($matches['pass']) {
367
+			$result['pass'] = $matches['pass'];
368
+		}
369
+	} else {
370
+		$result['path'] = $uri;
371
+	}
372
+
373
+	return $result;
374 374
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/http/lib/ClientHttpException.php 1 patch
Indentation   +28 added lines, -28 removed lines patch added patch discarded remove patch
@@ -16,35 +16,35 @@
 block discarded – undo
16 16
  */
17 17
 class ClientHttpException extends \Exception implements HttpException
18 18
 {
19
-    /**
20
-     * Response object.
21
-     *
22
-     * @var ResponseInterface
23
-     */
24
-    protected $response;
19
+	/**
20
+	 * Response object.
21
+	 *
22
+	 * @var ResponseInterface
23
+	 */
24
+	protected $response;
25 25
 
26
-    /**
27
-     * Constructor.
28
-     */
29
-    public function __construct(ResponseInterface $response)
30
-    {
31
-        $this->response = $response;
32
-        parent::__construct($response->getStatusText(), $response->getStatus());
33
-    }
26
+	/**
27
+	 * Constructor.
28
+	 */
29
+	public function __construct(ResponseInterface $response)
30
+	{
31
+		$this->response = $response;
32
+		parent::__construct($response->getStatusText(), $response->getStatus());
33
+	}
34 34
 
35
-    /**
36
-     * The http status code for the error.
37
-     */
38
-    public function getHttpStatus(): int
39
-    {
40
-        return $this->response->getStatus();
41
-    }
35
+	/**
36
+	 * The http status code for the error.
37
+	 */
38
+	public function getHttpStatus(): int
39
+	{
40
+		return $this->response->getStatus();
41
+	}
42 42
 
43
-    /**
44
-     * Returns the full response object.
45
-     */
46
-    public function getResponse(): ResponseInterface
47
-    {
48
-        return $this->response;
49
-    }
43
+	/**
44
+	 * Returns the full response object.
45
+	 */
46
+	public function getResponse(): ResponseInterface
47
+	{
48
+		return $this->response;
49
+	}
50 50
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/http/lib/Auth/AWS.php 1 patch
Indentation   +200 added lines, -200 removed lines patch added patch discarded remove patch
@@ -17,204 +17,204 @@
 block discarded – undo
17 17
  */
18 18
 class AWS extends AbstractAuth
19 19
 {
20
-    /**
21
-     * The signature supplied by the HTTP client.
22
-     *
23
-     * @var string
24
-     */
25
-    private $signature = null;
26
-
27
-    /**
28
-     * The accesskey supplied by the HTTP client.
29
-     *
30
-     * @var string
31
-     */
32
-    private $accessKey = null;
33
-
34
-    /**
35
-     * An error code, if any.
36
-     *
37
-     * This value will be filled with one of the ERR_* constants
38
-     *
39
-     * @var int
40
-     */
41
-    public $errorCode = 0;
42
-
43
-    const ERR_NOAWSHEADER = 1;
44
-    const ERR_MD5CHECKSUMWRONG = 2;
45
-    const ERR_INVALIDDATEFORMAT = 3;
46
-    const ERR_REQUESTTIMESKEWED = 4;
47
-    const ERR_INVALIDSIGNATURE = 5;
48
-
49
-    /**
50
-     * Gathers all information from the headers.
51
-     *
52
-     * This method needs to be called prior to anything else.
53
-     */
54
-    public function init(): bool
55
-    {
56
-        $authHeader = $this->request->getHeader('Authorization');
57
-
58
-        if (null === $authHeader) {
59
-            $this->errorCode = self::ERR_NOAWSHEADER;
60
-
61
-            return false;
62
-        }
63
-        $authHeader = explode(' ', $authHeader);
64
-
65
-        if ('AWS' !== $authHeader[0] || !isset($authHeader[1])) {
66
-            $this->errorCode = self::ERR_NOAWSHEADER;
67
-
68
-            return false;
69
-        }
70
-
71
-        list($this->accessKey, $this->signature) = explode(':', $authHeader[1]);
72
-
73
-        return true;
74
-    }
75
-
76
-    /**
77
-     * Returns the username for the request.
78
-     */
79
-    public function getAccessKey(): string
80
-    {
81
-        return $this->accessKey;
82
-    }
83
-
84
-    /**
85
-     * Validates the signature based on the secretKey.
86
-     */
87
-    public function validate(string $secretKey): bool
88
-    {
89
-        $contentMD5 = $this->request->getHeader('Content-MD5');
90
-
91
-        if ($contentMD5) {
92
-            // We need to validate the integrity of the request
93
-            $body = $this->request->getBody();
94
-            $this->request->setBody($body);
95
-
96
-            if ($contentMD5 !== base64_encode(md5((string) $body, true))) {
97
-                // content-md5 header did not match md5 signature of body
98
-                $this->errorCode = self::ERR_MD5CHECKSUMWRONG;
99
-
100
-                return false;
101
-            }
102
-        }
103
-
104
-        if (!$requestDate = $this->request->getHeader('x-amz-date')) {
105
-            $requestDate = $this->request->getHeader('Date');
106
-        }
107
-
108
-        if (!$this->validateRFC2616Date((string) $requestDate)) {
109
-            return false;
110
-        }
111
-
112
-        $amzHeaders = $this->getAmzHeaders();
113
-
114
-        $signature = base64_encode(
115
-            $this->hmacsha1($secretKey,
116
-                $this->request->getMethod()."\n".
117
-                $contentMD5."\n".
118
-                $this->request->getHeader('Content-type')."\n".
119
-                $requestDate."\n".
120
-                $amzHeaders.
121
-                $this->request->getUrl()
122
-            )
123
-        );
124
-
125
-        if ($this->signature !== $signature) {
126
-            $this->errorCode = self::ERR_INVALIDSIGNATURE;
127
-
128
-            return false;
129
-        }
130
-
131
-        return true;
132
-    }
133
-
134
-    /**
135
-     * Returns an HTTP 401 header, forcing login.
136
-     *
137
-     * This should be called when username and password are incorrect, or not supplied at all
138
-     */
139
-    public function requireLogin()
140
-    {
141
-        $this->response->addHeader('WWW-Authenticate', 'AWS');
142
-        $this->response->setStatus(401);
143
-    }
144
-
145
-    /**
146
-     * Makes sure the supplied value is a valid RFC2616 date.
147
-     *
148
-     * If we would just use strtotime to get a valid timestamp, we have no way of checking if a
149
-     * user just supplied the word 'now' for the date header.
150
-     *
151
-     * This function also makes sure the Date header is within 15 minutes of the operating
152
-     * system date, to prevent replay attacks.
153
-     */
154
-    protected function validateRFC2616Date(string $dateHeader): bool
155
-    {
156
-        $date = HTTP\parseDate($dateHeader);
157
-
158
-        // Unknown format
159
-        if (!$date) {
160
-            $this->errorCode = self::ERR_INVALIDDATEFORMAT;
161
-
162
-            return false;
163
-        }
164
-
165
-        $min = new \DateTime('-15 minutes');
166
-        $max = new \DateTime('+15 minutes');
167
-
168
-        // We allow 15 minutes around the current date/time
169
-        if ($date > $max || $date < $min) {
170
-            $this->errorCode = self::ERR_REQUESTTIMESKEWED;
171
-
172
-            return false;
173
-        }
174
-
175
-        return true;
176
-    }
177
-
178
-    /**
179
-     * Returns a list of AMZ headers.
180
-     */
181
-    protected function getAmzHeaders(): string
182
-    {
183
-        $amzHeaders = [];
184
-        $headers = $this->request->getHeaders();
185
-        foreach ($headers as $headerName => $headerValue) {
186
-            if (0 === strpos(strtolower($headerName), 'x-amz-')) {
187
-                $amzHeaders[strtolower($headerName)] = str_replace(["\r\n"], [' '], $headerValue[0])."\n";
188
-            }
189
-        }
190
-        ksort($amzHeaders);
191
-
192
-        $headerStr = '';
193
-        foreach ($amzHeaders as $h => $v) {
194
-            $headerStr .= $h.':'.$v;
195
-        }
196
-
197
-        return $headerStr;
198
-    }
199
-
200
-    /**
201
-     * Generates an HMAC-SHA1 signature.
202
-     */
203
-    private function hmacsha1(string $key, string $message): string
204
-    {
205
-        if (function_exists('hash_hmac')) {
206
-            return hash_hmac('sha1', $message, $key, true);
207
-        }
208
-
209
-        $blocksize = 64;
210
-        if (strlen($key) > $blocksize) {
211
-            $key = pack('H*', sha1($key));
212
-        }
213
-        $key = str_pad($key, $blocksize, chr(0x00));
214
-        $ipad = str_repeat(chr(0x36), $blocksize);
215
-        $opad = str_repeat(chr(0x5c), $blocksize);
216
-        $hmac = pack('H*', sha1(($key ^ $opad).pack('H*', sha1(($key ^ $ipad).$message))));
217
-
218
-        return $hmac;
219
-    }
20
+	/**
21
+	 * The signature supplied by the HTTP client.
22
+	 *
23
+	 * @var string
24
+	 */
25
+	private $signature = null;
26
+
27
+	/**
28
+	 * The accesskey supplied by the HTTP client.
29
+	 *
30
+	 * @var string
31
+	 */
32
+	private $accessKey = null;
33
+
34
+	/**
35
+	 * An error code, if any.
36
+	 *
37
+	 * This value will be filled with one of the ERR_* constants
38
+	 *
39
+	 * @var int
40
+	 */
41
+	public $errorCode = 0;
42
+
43
+	const ERR_NOAWSHEADER = 1;
44
+	const ERR_MD5CHECKSUMWRONG = 2;
45
+	const ERR_INVALIDDATEFORMAT = 3;
46
+	const ERR_REQUESTTIMESKEWED = 4;
47
+	const ERR_INVALIDSIGNATURE = 5;
48
+
49
+	/**
50
+	 * Gathers all information from the headers.
51
+	 *
52
+	 * This method needs to be called prior to anything else.
53
+	 */
54
+	public function init(): bool
55
+	{
56
+		$authHeader = $this->request->getHeader('Authorization');
57
+
58
+		if (null === $authHeader) {
59
+			$this->errorCode = self::ERR_NOAWSHEADER;
60
+
61
+			return false;
62
+		}
63
+		$authHeader = explode(' ', $authHeader);
64
+
65
+		if ('AWS' !== $authHeader[0] || !isset($authHeader[1])) {
66
+			$this->errorCode = self::ERR_NOAWSHEADER;
67
+
68
+			return false;
69
+		}
70
+
71
+		list($this->accessKey, $this->signature) = explode(':', $authHeader[1]);
72
+
73
+		return true;
74
+	}
75
+
76
+	/**
77
+	 * Returns the username for the request.
78
+	 */
79
+	public function getAccessKey(): string
80
+	{
81
+		return $this->accessKey;
82
+	}
83
+
84
+	/**
85
+	 * Validates the signature based on the secretKey.
86
+	 */
87
+	public function validate(string $secretKey): bool
88
+	{
89
+		$contentMD5 = $this->request->getHeader('Content-MD5');
90
+
91
+		if ($contentMD5) {
92
+			// We need to validate the integrity of the request
93
+			$body = $this->request->getBody();
94
+			$this->request->setBody($body);
95
+
96
+			if ($contentMD5 !== base64_encode(md5((string) $body, true))) {
97
+				// content-md5 header did not match md5 signature of body
98
+				$this->errorCode = self::ERR_MD5CHECKSUMWRONG;
99
+
100
+				return false;
101
+			}
102
+		}
103
+
104
+		if (!$requestDate = $this->request->getHeader('x-amz-date')) {
105
+			$requestDate = $this->request->getHeader('Date');
106
+		}
107
+
108
+		if (!$this->validateRFC2616Date((string) $requestDate)) {
109
+			return false;
110
+		}
111
+
112
+		$amzHeaders = $this->getAmzHeaders();
113
+
114
+		$signature = base64_encode(
115
+			$this->hmacsha1($secretKey,
116
+				$this->request->getMethod()."\n".
117
+				$contentMD5."\n".
118
+				$this->request->getHeader('Content-type')."\n".
119
+				$requestDate."\n".
120
+				$amzHeaders.
121
+				$this->request->getUrl()
122
+			)
123
+		);
124
+
125
+		if ($this->signature !== $signature) {
126
+			$this->errorCode = self::ERR_INVALIDSIGNATURE;
127
+
128
+			return false;
129
+		}
130
+
131
+		return true;
132
+	}
133
+
134
+	/**
135
+	 * Returns an HTTP 401 header, forcing login.
136
+	 *
137
+	 * This should be called when username and password are incorrect, or not supplied at all
138
+	 */
139
+	public function requireLogin()
140
+	{
141
+		$this->response->addHeader('WWW-Authenticate', 'AWS');
142
+		$this->response->setStatus(401);
143
+	}
144
+
145
+	/**
146
+	 * Makes sure the supplied value is a valid RFC2616 date.
147
+	 *
148
+	 * If we would just use strtotime to get a valid timestamp, we have no way of checking if a
149
+	 * user just supplied the word 'now' for the date header.
150
+	 *
151
+	 * This function also makes sure the Date header is within 15 minutes of the operating
152
+	 * system date, to prevent replay attacks.
153
+	 */
154
+	protected function validateRFC2616Date(string $dateHeader): bool
155
+	{
156
+		$date = HTTP\parseDate($dateHeader);
157
+
158
+		// Unknown format
159
+		if (!$date) {
160
+			$this->errorCode = self::ERR_INVALIDDATEFORMAT;
161
+
162
+			return false;
163
+		}
164
+
165
+		$min = new \DateTime('-15 minutes');
166
+		$max = new \DateTime('+15 minutes');
167
+
168
+		// We allow 15 minutes around the current date/time
169
+		if ($date > $max || $date < $min) {
170
+			$this->errorCode = self::ERR_REQUESTTIMESKEWED;
171
+
172
+			return false;
173
+		}
174
+
175
+		return true;
176
+	}
177
+
178
+	/**
179
+	 * Returns a list of AMZ headers.
180
+	 */
181
+	protected function getAmzHeaders(): string
182
+	{
183
+		$amzHeaders = [];
184
+		$headers = $this->request->getHeaders();
185
+		foreach ($headers as $headerName => $headerValue) {
186
+			if (0 === strpos(strtolower($headerName), 'x-amz-')) {
187
+				$amzHeaders[strtolower($headerName)] = str_replace(["\r\n"], [' '], $headerValue[0])."\n";
188
+			}
189
+		}
190
+		ksort($amzHeaders);
191
+
192
+		$headerStr = '';
193
+		foreach ($amzHeaders as $h => $v) {
194
+			$headerStr .= $h.':'.$v;
195
+		}
196
+
197
+		return $headerStr;
198
+	}
199
+
200
+	/**
201
+	 * Generates an HMAC-SHA1 signature.
202
+	 */
203
+	private function hmacsha1(string $key, string $message): string
204
+	{
205
+		if (function_exists('hash_hmac')) {
206
+			return hash_hmac('sha1', $message, $key, true);
207
+		}
208
+
209
+		$blocksize = 64;
210
+		if (strlen($key) > $blocksize) {
211
+			$key = pack('H*', sha1($key));
212
+		}
213
+		$key = str_pad($key, $blocksize, chr(0x00));
214
+		$ipad = str_repeat(chr(0x36), $blocksize);
215
+		$opad = str_repeat(chr(0x5c), $blocksize);
216
+		$hmac = pack('H*', sha1(($key ^ $opad).pack('H*', sha1(($key ^ $ipad).$message))));
217
+
218
+		return $hmac;
219
+	}
220 220
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/http/lib/HttpException.php 1 patch
Indentation   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -19,13 +19,13 @@
 block discarded – undo
19 19
  */
20 20
 interface HttpException
21 21
 {
22
-    /**
23
-     * The http status code for the error.
24
-     *
25
-     * This may either be just the number, or a number and a human-readable
26
-     * message, separated by a space.
27
-     *
28
-     * @return string|null
29
-     */
30
-    public function getHttpStatus();
22
+	/**
23
+	 * The http status code for the error.
24
+	 *
25
+	 * This may either be just the number, or a number and a human-readable
26
+	 * message, separated by a space.
27
+	 *
28
+	 * @return string|null
29
+	 */
30
+	public function getHttpStatus();
31 31
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/http/lib/functions.php 3 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -386,7 +386,7 @@  discard block
 block discarded – undo
386 386
  */
387 387
 function encodePath(string $path): string
388 388
 {
389
-    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:@])/', function ($match) {
389
+    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:@])/', function($match) {
390 390
         return '%'.sprintf('%02x', ord($match[0]));
391 391
     }, $path);
392 392
 }
@@ -398,7 +398,7 @@  discard block
 block discarded – undo
398 398
  */
399 399
 function encodePathSegment(string $pathSegment): string
400 400
 {
401
-    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):@])/', function ($match) {
401
+    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):@])/', function($match) {
402 402
         return '%'.sprintf('%02x', ord($match[0]));
403 403
     }, $pathSegment);
404 404
 }
Please login to merge, or discard this patch.
Upper-Lower-Casing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -239,7 +239,7 @@
 block discarded – undo
239 239
 (?: \s* ; (?: .*))?   # Prefer parameters (ignored)
240 240
 $
241 241
 /x
242
-REGEX;
242
+regex;
243 243
 
244 244
     $output = [];
245 245
     foreach (getHeaderValues($input) as $value) {
Please login to merge, or discard this patch.
Indentation   +234 added lines, -234 removed lines patch added patch discarded remove patch
@@ -33,42 +33,42 @@  discard block
 block discarded – undo
33 33
  */
34 34
 function parseDate(string $dateString)
35 35
 {
36
-    // Only the format is checked, valid ranges are checked by strtotime below
37
-    $month = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';
38
-    $weekday = '(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)';
39
-    $wkday = '(Mon|Tue|Wed|Thu|Fri|Sat|Sun)';
40
-    $time = '([0-1]\d|2[0-3])(\:[0-5]\d){2}';
41
-    $date3 = $month.' ([12]\d|3[01]| [1-9])';
42
-    $date2 = '(0[1-9]|[12]\d|3[01])\-'.$month.'\-\d{2}';
43
-    // 4-digit year cannot begin with 0 - unix timestamp begins in 1970
44
-    $date1 = '(0[1-9]|[12]\d|3[01]) '.$month.' [1-9]\d{3}';
45
-
46
-    // ANSI C's asctime() format
47
-    // 4-digit year cannot begin with 0 - unix timestamp begins in 1970
48
-    $asctime_date = $wkday.' '.$date3.' '.$time.' [1-9]\d{3}';
49
-    // RFC 850, obsoleted by RFC 1036
50
-    $rfc850_date = $weekday.', '.$date2.' '.$time.' GMT';
51
-    // RFC 822, updated by RFC 1123
52
-    $rfc1123_date = $wkday.', '.$date1.' '.$time.' GMT';
53
-    // allowed date formats by RFC 2616
54
-    $HTTP_date = "($rfc1123_date|$rfc850_date|$asctime_date)";
55
-
56
-    // allow for space around the string and strip it
57
-    $dateString = trim($dateString, ' ');
58
-    if (!preg_match('/^'.$HTTP_date.'$/', $dateString)) {
59
-        return false;
60
-    }
61
-
62
-    // append implicit GMT timezone to ANSI C time format
63
-    if (false === strpos($dateString, ' GMT')) {
64
-        $dateString .= ' GMT';
65
-    }
66
-
67
-    try {
68
-        return new DateTime($dateString, new \DateTimeZone('UTC'));
69
-    } catch (\Exception $e) {
70
-        return false;
71
-    }
36
+	// Only the format is checked, valid ranges are checked by strtotime below
37
+	$month = '(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)';
38
+	$weekday = '(Monday|Tuesday|Wednesday|Thursday|Friday|Saturday|Sunday)';
39
+	$wkday = '(Mon|Tue|Wed|Thu|Fri|Sat|Sun)';
40
+	$time = '([0-1]\d|2[0-3])(\:[0-5]\d){2}';
41
+	$date3 = $month.' ([12]\d|3[01]| [1-9])';
42
+	$date2 = '(0[1-9]|[12]\d|3[01])\-'.$month.'\-\d{2}';
43
+	// 4-digit year cannot begin with 0 - unix timestamp begins in 1970
44
+	$date1 = '(0[1-9]|[12]\d|3[01]) '.$month.' [1-9]\d{3}';
45
+
46
+	// ANSI C's asctime() format
47
+	// 4-digit year cannot begin with 0 - unix timestamp begins in 1970
48
+	$asctime_date = $wkday.' '.$date3.' '.$time.' [1-9]\d{3}';
49
+	// RFC 850, obsoleted by RFC 1036
50
+	$rfc850_date = $weekday.', '.$date2.' '.$time.' GMT';
51
+	// RFC 822, updated by RFC 1123
52
+	$rfc1123_date = $wkday.', '.$date1.' '.$time.' GMT';
53
+	// allowed date formats by RFC 2616
54
+	$HTTP_date = "($rfc1123_date|$rfc850_date|$asctime_date)";
55
+
56
+	// allow for space around the string and strip it
57
+	$dateString = trim($dateString, ' ');
58
+	if (!preg_match('/^'.$HTTP_date.'$/', $dateString)) {
59
+		return false;
60
+	}
61
+
62
+	// append implicit GMT timezone to ANSI C time format
63
+	if (false === strpos($dateString, ' GMT')) {
64
+		$dateString .= ' GMT';
65
+	}
66
+
67
+	try {
68
+		return new DateTime($dateString, new \DateTimeZone('UTC'));
69
+	} catch (\Exception $e) {
70
+		return false;
71
+	}
72 72
 }
73 73
 
74 74
 /**
@@ -76,12 +76,12 @@  discard block
 block discarded – undo
76 76
  */
77 77
 function toDate(DateTime $dateTime): string
78 78
 {
79
-    // We need to clone it, as we don't want to affect the existing
80
-    // DateTime.
81
-    $dateTime = clone $dateTime;
82
-    $dateTime->setTimezone(new \DateTimeZone('GMT'));
79
+	// We need to clone it, as we don't want to affect the existing
80
+	// DateTime.
81
+	$dateTime = clone $dateTime;
82
+	$dateTime->setTimezone(new \DateTimeZone('GMT'));
83 83
 
84
-    return $dateTime->format('D, d M Y H:i:s \G\M\T');
84
+	return $dateTime->format('D, d M Y H:i:s \G\M\T');
85 85
 }
86 86
 
87 87
 /**
@@ -106,84 +106,84 @@  discard block
 block discarded – undo
106 106
  */
107 107
 function negotiateContentType($acceptHeaderValue, array $availableOptions)
108 108
 {
109
-    if (!$acceptHeaderValue) {
110
-        // Grabbing the first in the list.
111
-        return reset($availableOptions);
112
-    }
113
-
114
-    $proposals = array_map(
115
-        'Sabre\HTTP\parseMimeType',
116
-        explode(',', $acceptHeaderValue)
117
-    );
118
-
119
-    // Ensuring array keys are reset.
120
-    $availableOptions = array_values($availableOptions);
121
-
122
-    $options = array_map(
123
-        'Sabre\HTTP\parseMimeType',
124
-        $availableOptions
125
-    );
126
-
127
-    $lastQuality = 0;
128
-    $lastSpecificity = 0;
129
-    $lastOptionIndex = 0;
130
-    $lastChoice = null;
131
-
132
-    foreach ($proposals as $proposal) {
133
-        // Ignoring broken values.
134
-        if (null === $proposal) {
135
-            continue;
136
-        }
137
-
138
-        // If the quality is lower we don't have to bother comparing.
139
-        if ($proposal['quality'] < $lastQuality) {
140
-            continue;
141
-        }
142
-
143
-        foreach ($options as $optionIndex => $option) {
144
-            if ('*' !== $proposal['type'] && $proposal['type'] !== $option['type']) {
145
-                // no match on type.
146
-                continue;
147
-            }
148
-            if ('*' !== $proposal['subType'] && $proposal['subType'] !== $option['subType']) {
149
-                // no match on subtype.
150
-                continue;
151
-            }
152
-
153
-            // Any parameters appearing on the options must appear on
154
-            // proposals.
155
-            foreach ($option['parameters'] as $paramName => $paramValue) {
156
-                if (!array_key_exists($paramName, $proposal['parameters'])) {
157
-                    continue 2;
158
-                }
159
-                if ($paramValue !== $proposal['parameters'][$paramName]) {
160
-                    continue 2;
161
-                }
162
-            }
163
-
164
-            // If we got here, we have a match on parameters, type and
165
-            // subtype. We need to calculate a score for how specific the
166
-            // match was.
167
-            $specificity =
168
-                ('*' !== $proposal['type'] ? 20 : 0) +
169
-                ('*' !== $proposal['subType'] ? 10 : 0) +
170
-                count($option['parameters']);
171
-
172
-            // Does this entry win?
173
-            if (
174
-                ($proposal['quality'] > $lastQuality) ||
175
-                ($proposal['quality'] === $lastQuality && $specificity > $lastSpecificity) ||
176
-                ($proposal['quality'] === $lastQuality && $specificity === $lastSpecificity && $optionIndex < $lastOptionIndex)
177
-            ) {
178
-                $lastQuality = $proposal['quality'];
179
-                $lastSpecificity = $specificity;
180
-                $lastOptionIndex = $optionIndex;
181
-                $lastChoice = $availableOptions[$optionIndex];
182
-            }
183
-        }
184
-    }
185
-
186
-    return $lastChoice;
109
+	if (!$acceptHeaderValue) {
110
+		// Grabbing the first in the list.
111
+		return reset($availableOptions);
112
+	}
113
+
114
+	$proposals = array_map(
115
+		'Sabre\HTTP\parseMimeType',
116
+		explode(',', $acceptHeaderValue)
117
+	);
118
+
119
+	// Ensuring array keys are reset.
120
+	$availableOptions = array_values($availableOptions);
121
+
122
+	$options = array_map(
123
+		'Sabre\HTTP\parseMimeType',
124
+		$availableOptions
125
+	);
126
+
127
+	$lastQuality = 0;
128
+	$lastSpecificity = 0;
129
+	$lastOptionIndex = 0;
130
+	$lastChoice = null;
131
+
132
+	foreach ($proposals as $proposal) {
133
+		// Ignoring broken values.
134
+		if (null === $proposal) {
135
+			continue;
136
+		}
137
+
138
+		// If the quality is lower we don't have to bother comparing.
139
+		if ($proposal['quality'] < $lastQuality) {
140
+			continue;
141
+		}
142
+
143
+		foreach ($options as $optionIndex => $option) {
144
+			if ('*' !== $proposal['type'] && $proposal['type'] !== $option['type']) {
145
+				// no match on type.
146
+				continue;
147
+			}
148
+			if ('*' !== $proposal['subType'] && $proposal['subType'] !== $option['subType']) {
149
+				// no match on subtype.
150
+				continue;
151
+			}
152
+
153
+			// Any parameters appearing on the options must appear on
154
+			// proposals.
155
+			foreach ($option['parameters'] as $paramName => $paramValue) {
156
+				if (!array_key_exists($paramName, $proposal['parameters'])) {
157
+					continue 2;
158
+				}
159
+				if ($paramValue !== $proposal['parameters'][$paramName]) {
160
+					continue 2;
161
+				}
162
+			}
163
+
164
+			// If we got here, we have a match on parameters, type and
165
+			// subtype. We need to calculate a score for how specific the
166
+			// match was.
167
+			$specificity =
168
+				('*' !== $proposal['type'] ? 20 : 0) +
169
+				('*' !== $proposal['subType'] ? 10 : 0) +
170
+				count($option['parameters']);
171
+
172
+			// Does this entry win?
173
+			if (
174
+				($proposal['quality'] > $lastQuality) ||
175
+				($proposal['quality'] === $lastQuality && $specificity > $lastSpecificity) ||
176
+				($proposal['quality'] === $lastQuality && $specificity === $lastSpecificity && $optionIndex < $lastOptionIndex)
177
+			) {
178
+				$lastQuality = $proposal['quality'];
179
+				$lastSpecificity = $specificity;
180
+				$lastOptionIndex = $optionIndex;
181
+				$lastChoice = $availableOptions[$optionIndex];
182
+			}
183
+		}
184
+	}
185
+
186
+	return $lastChoice;
187 187
 }
188 188
 
189 189
 /**
@@ -214,12 +214,12 @@  discard block
 block discarded – undo
214 214
  */
215 215
 function parsePrefer($input): array
216 216
 {
217
-    $token = '[!#$%&\'*+\-.^_`~A-Za-z0-9]+';
217
+	$token = '[!#$%&\'*+\-.^_`~A-Za-z0-9]+';
218 218
 
219
-    // Work in progress
220
-    $word = '(?: [a-zA-Z0-9]+ | "[a-zA-Z0-9]*" )';
219
+	// Work in progress
220
+	$word = '(?: [a-zA-Z0-9]+ | "[a-zA-Z0-9]*" )';
221 221
 
222
-    $regex = <<<REGEX
222
+	$regex = <<<REGEX
223 223
 /
224 224
 ^
225 225
 (?<name> $token)      # Prefer property name
@@ -232,42 +232,42 @@  discard block
 block discarded – undo
232 232
 /x
233 233
 REGEX;
234 234
 
235
-    $output = [];
236
-    foreach (getHeaderValues($input) as $value) {
237
-        if (!preg_match($regex, $value, $matches)) {
238
-            // Ignore
239
-            continue;
240
-        }
241
-
242
-        // Mapping old values to their new counterparts
243
-        switch ($matches['name']) {
244
-            case 'return-asynch':
245
-                $output['respond-async'] = true;
246
-                break;
247
-            case 'return-representation':
248
-                $output['return'] = 'representation';
249
-                break;
250
-            case 'return-minimal':
251
-                $output['return'] = 'minimal';
252
-                break;
253
-            case 'strict':
254
-                $output['handling'] = 'strict';
255
-                break;
256
-            case 'lenient':
257
-                $output['handling'] = 'lenient';
258
-                break;
259
-            default:
260
-                if (isset($matches['value'])) {
261
-                    $value = trim($matches['value'], '"');
262
-                } else {
263
-                    $value = true;
264
-                }
265
-                $output[strtolower($matches['name'])] = empty($value) ? true : $value;
266
-                break;
267
-        }
268
-    }
269
-
270
-    return $output;
235
+	$output = [];
236
+	foreach (getHeaderValues($input) as $value) {
237
+		if (!preg_match($regex, $value, $matches)) {
238
+			// Ignore
239
+			continue;
240
+		}
241
+
242
+		// Mapping old values to their new counterparts
243
+		switch ($matches['name']) {
244
+			case 'return-asynch':
245
+				$output['respond-async'] = true;
246
+				break;
247
+			case 'return-representation':
248
+				$output['return'] = 'representation';
249
+				break;
250
+			case 'return-minimal':
251
+				$output['return'] = 'minimal';
252
+				break;
253
+			case 'strict':
254
+				$output['handling'] = 'strict';
255
+				break;
256
+			case 'lenient':
257
+				$output['handling'] = 'lenient';
258
+				break;
259
+			default:
260
+				if (isset($matches['value'])) {
261
+					$value = trim($matches['value'], '"');
262
+				} else {
263
+					$value = true;
264
+				}
265
+				$output[strtolower($matches['name'])] = empty($value) ? true : $value;
266
+				break;
267
+		}
268
+	}
269
+
270
+	return $output;
271 271
 }
272 272
 
273 273
 /**
@@ -289,19 +289,19 @@  discard block
 block discarded – undo
289 289
  */
290 290
 function getHeaderValues($values, $values2 = null): array
291 291
 {
292
-    $values = (array) $values;
293
-    if ($values2) {
294
-        $values = array_merge($values, (array) $values2);
295
-    }
296
-
297
-    $result = [];
298
-    foreach ($values as $l1) {
299
-        foreach (explode(',', $l1) as $l2) {
300
-            $result[] = trim($l2);
301
-        }
302
-    }
303
-
304
-    return $result;
292
+	$values = (array) $values;
293
+	if ($values2) {
294
+		$values = array_merge($values, (array) $values2);
295
+	}
296
+
297
+	$result = [];
298
+	foreach ($values as $l1) {
299
+		foreach (explode(',', $l1) as $l2) {
300
+			$result[] = trim($l2);
301
+		}
302
+	}
303
+
304
+	return $result;
305 305
 }
306 306
 
307 307
 /**
@@ -314,56 +314,56 @@  discard block
 block discarded – undo
314 314
  */
315 315
 function parseMimeType(string $str): array
316 316
 {
317
-    $parameters = [];
318
-    // If no q= parameter appears, then quality = 1.
319
-    $quality = 1;
320
-
321
-    $parts = explode(';', $str);
322
-
323
-    // The first part is the mime-type.
324
-    $mimeType = trim(array_shift($parts));
325
-
326
-    if ('*' === $mimeType) {
327
-        $mimeType = '*/*';
328
-    }
329
-
330
-    $mimeType = explode('/', $mimeType);
331
-    if (2 !== count($mimeType)) {
332
-        // Illegal value
333
-        var_dump($mimeType);
334
-        exit();
335
-        // throw new InvalidArgumentException('Not a valid mime-type: '.$str);
336
-    }
337
-    list($type, $subType) = $mimeType;
338
-
339
-    foreach ($parts as $part) {
340
-        $part = trim($part);
341
-        if (strpos($part, '=')) {
342
-            list($partName, $partValue) =
343
-                explode('=', $part, 2);
344
-        } else {
345
-            $partName = $part;
346
-            $partValue = null;
347
-        }
348
-
349
-        // The quality parameter, if it appears, also marks the end of
350
-        // the parameter list. Anything after the q= counts as an
351
-        // 'accept extension' and could introduce new semantics in
352
-        // content-negotiation.
353
-        if ('q' !== $partName) {
354
-            $parameters[$partName] = $part;
355
-        } else {
356
-            $quality = (float) $partValue;
357
-            break; // Stop parsing parts
358
-        }
359
-    }
360
-
361
-    return [
362
-        'type' => $type,
363
-        'subType' => $subType,
364
-        'quality' => $quality,
365
-        'parameters' => $parameters,
366
-    ];
317
+	$parameters = [];
318
+	// If no q= parameter appears, then quality = 1.
319
+	$quality = 1;
320
+
321
+	$parts = explode(';', $str);
322
+
323
+	// The first part is the mime-type.
324
+	$mimeType = trim(array_shift($parts));
325
+
326
+	if ('*' === $mimeType) {
327
+		$mimeType = '*/*';
328
+	}
329
+
330
+	$mimeType = explode('/', $mimeType);
331
+	if (2 !== count($mimeType)) {
332
+		// Illegal value
333
+		var_dump($mimeType);
334
+		exit();
335
+		// throw new InvalidArgumentException('Not a valid mime-type: '.$str);
336
+	}
337
+	list($type, $subType) = $mimeType;
338
+
339
+	foreach ($parts as $part) {
340
+		$part = trim($part);
341
+		if (strpos($part, '=')) {
342
+			list($partName, $partValue) =
343
+				explode('=', $part, 2);
344
+		} else {
345
+			$partName = $part;
346
+			$partValue = null;
347
+		}
348
+
349
+		// The quality parameter, if it appears, also marks the end of
350
+		// the parameter list. Anything after the q= counts as an
351
+		// 'accept extension' and could introduce new semantics in
352
+		// content-negotiation.
353
+		if ('q' !== $partName) {
354
+			$parameters[$partName] = $part;
355
+		} else {
356
+			$quality = (float) $partValue;
357
+			break; // Stop parsing parts
358
+		}
359
+	}
360
+
361
+	return [
362
+		'type' => $type,
363
+		'subType' => $subType,
364
+		'quality' => $quality,
365
+		'parameters' => $parameters,
366
+	];
367 367
 }
368 368
 
369 369
 /**
@@ -373,9 +373,9 @@  discard block
 block discarded – undo
373 373
  */
374 374
 function encodePath(string $path): string
375 375
 {
376
-    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:@])/', function ($match) {
377
-        return '%'.sprintf('%02x', ord($match[0]));
378
-    }, $path);
376
+	return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\)\/:@])/', function ($match) {
377
+		return '%'.sprintf('%02x', ord($match[0]));
378
+	}, $path);
379 379
 }
380 380
 
381 381
 /**
@@ -385,9 +385,9 @@  discard block
 block discarded – undo
385 385
  */
386 386
 function encodePathSegment(string $pathSegment): string
387 387
 {
388
-    return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):@])/', function ($match) {
389
-        return '%'.sprintf('%02x', ord($match[0]));
390
-    }, $pathSegment);
388
+	return preg_replace_callback('/([^A-Za-z0-9_\-\.~\(\):@])/', function ($match) {
389
+		return '%'.sprintf('%02x', ord($match[0]));
390
+	}, $pathSegment);
391 391
 }
392 392
 
393 393
 /**
@@ -395,7 +395,7 @@  discard block
 block discarded – undo
395 395
  */
396 396
 function decodePath(string $path): string
397 397
 {
398
-    return decodePathSegment($path);
398
+	return decodePathSegment($path);
399 399
 }
400 400
 
401 401
 /**
@@ -403,11 +403,11 @@  discard block
 block discarded – undo
403 403
  */
404 404
 function decodePathSegment(string $path): string
405 405
 {
406
-    $path = rawurldecode($path);
406
+	$path = rawurldecode($path);
407 407
 
408
-    if (!mb_check_encoding($path, 'UTF-8') && mb_check_encoding($path, 'ISO-8859-1')) {
409
-        $path = mb_convert_encoding($path, 'UTF-8', 'ISO-8859-1');
410
-    }
408
+	if (!mb_check_encoding($path, 'UTF-8') && mb_check_encoding($path, 'ISO-8859-1')) {
409
+		$path = mb_convert_encoding($path, 'UTF-8', 'ISO-8859-1');
410
+	}
411 411
 
412
-    return $path;
412
+	return $path;
413 413
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/xml/lib/Serializer/functions.php 1 patch
Indentation   +68 added lines, -68 removed lines patch added patch discarded remove patch
@@ -40,9 +40,9 @@  discard block
 block discarded – undo
40 40
  */
41 41
 function enum(Writer $writer, array $values)
42 42
 {
43
-    foreach ($values as $value) {
44
-        $writer->writeElement($value);
45
-    }
43
+	foreach ($values as $value) {
44
+		$writer->writeElement($value);
45
+	}
46 46
 }
47 47
 
48 48
 /**
@@ -58,17 +58,17 @@  discard block
 block discarded – undo
58 58
  */
59 59
 function valueObject(Writer $writer, $valueObject, string $namespace)
60 60
 {
61
-    foreach (get_object_vars($valueObject) as $key => $val) {
62
-        if (is_array($val)) {
63
-            // If $val is an array, it has a special meaning. We need to
64
-            // generate one child element for each item in $val
65
-            foreach ($val as $child) {
66
-                $writer->writeElement('{'.$namespace.'}'.$key, $child);
67
-            }
68
-        } elseif (null !== $val) {
69
-            $writer->writeElement('{'.$namespace.'}'.$key, $val);
70
-        }
71
-    }
61
+	foreach (get_object_vars($valueObject) as $key => $val) {
62
+		if (is_array($val)) {
63
+			// If $val is an array, it has a special meaning. We need to
64
+			// generate one child element for each item in $val
65
+			foreach ($val as $child) {
66
+				$writer->writeElement('{'.$namespace.'}'.$key, $child);
67
+			}
68
+		} elseif (null !== $val) {
69
+			$writer->writeElement('{'.$namespace.'}'.$key, $val);
70
+		}
71
+	}
72 72
 }
73 73
 
74 74
 /**
@@ -88,9 +88,9 @@  discard block
 block discarded – undo
88 88
  */
89 89
 function repeatingElements(Writer $writer, array $items, string $childElementName)
90 90
 {
91
-    foreach ($items as $item) {
92
-        $writer->writeElement($childElementName, $item);
93
-    }
91
+	foreach ($items as $item) {
92
+		$writer->writeElement($childElementName, $item);
93
+	}
94 94
 }
95 95
 
96 96
 /**
@@ -152,57 +152,57 @@  discard block
 block discarded – undo
152 152
  */
153 153
 function standardSerializer(Writer $writer, $value)
154 154
 {
155
-    if (is_scalar($value)) {
156
-        // String, integer, float, boolean
157
-        $writer->text((string) $value);
158
-    } elseif ($value instanceof XmlSerializable) {
159
-        // XmlSerializable classes or Element classes.
160
-        $value->xmlSerialize($writer);
161
-    } elseif (is_object($value) && isset($writer->classMap[get_class($value)])) {
162
-        // It's an object which class appears in the classmap.
163
-        $writer->classMap[get_class($value)]($writer, $value);
164
-    } elseif (is_callable($value)) {
165
-        // A callback
166
-        $value($writer);
167
-    } elseif (is_array($value) && array_key_exists('name', $value)) {
168
-        // if the array had a 'name' element, we assume that this array
169
-        // describes a 'name' and optionally 'attributes' and 'value'.
155
+	if (is_scalar($value)) {
156
+		// String, integer, float, boolean
157
+		$writer->text((string) $value);
158
+	} elseif ($value instanceof XmlSerializable) {
159
+		// XmlSerializable classes or Element classes.
160
+		$value->xmlSerialize($writer);
161
+	} elseif (is_object($value) && isset($writer->classMap[get_class($value)])) {
162
+		// It's an object which class appears in the classmap.
163
+		$writer->classMap[get_class($value)]($writer, $value);
164
+	} elseif (is_callable($value)) {
165
+		// A callback
166
+		$value($writer);
167
+	} elseif (is_array($value) && array_key_exists('name', $value)) {
168
+		// if the array had a 'name' element, we assume that this array
169
+		// describes a 'name' and optionally 'attributes' and 'value'.
170 170
 
171
-        $name = $value['name'];
172
-        $attributes = isset($value['attributes']) ? $value['attributes'] : [];
173
-        $value = isset($value['value']) ? $value['value'] : null;
171
+		$name = $value['name'];
172
+		$attributes = isset($value['attributes']) ? $value['attributes'] : [];
173
+		$value = isset($value['value']) ? $value['value'] : null;
174 174
 
175
-        $writer->startElement($name);
176
-        $writer->writeAttributes($attributes);
177
-        $writer->write($value);
178
-        $writer->endElement();
179
-    } elseif (is_array($value)) {
180
-        foreach ($value as $name => $item) {
181
-            if (is_int($name)) {
182
-                // This item has a numeric index. We just loop through the
183
-                // array and throw it back in the writer.
184
-                standardSerializer($writer, $item);
185
-            } elseif (is_string($name) && is_array($item) && isset($item['attributes'])) {
186
-                // The key is used for a name, but $item has 'attributes' and
187
-                // possibly 'value'
188
-                $writer->startElement($name);
189
-                $writer->writeAttributes($item['attributes']);
190
-                if (isset($item['value'])) {
191
-                    $writer->write($item['value']);
192
-                }
193
-                $writer->endElement();
194
-            } elseif (is_string($name)) {
195
-                // This was a plain key-value array.
196
-                $writer->startElement($name);
197
-                $writer->write($item);
198
-                $writer->endElement();
199
-            } else {
200
-                throw new InvalidArgumentException('The writer does not know how to serialize arrays with keys of type: '.gettype($name));
201
-            }
202
-        }
203
-    } elseif (is_object($value)) {
204
-        throw new InvalidArgumentException('The writer cannot serialize objects of class: '.get_class($value));
205
-    } elseif (!is_null($value)) {
206
-        throw new InvalidArgumentException('The writer cannot serialize values of type: '.gettype($value));
207
-    }
175
+		$writer->startElement($name);
176
+		$writer->writeAttributes($attributes);
177
+		$writer->write($value);
178
+		$writer->endElement();
179
+	} elseif (is_array($value)) {
180
+		foreach ($value as $name => $item) {
181
+			if (is_int($name)) {
182
+				// This item has a numeric index. We just loop through the
183
+				// array and throw it back in the writer.
184
+				standardSerializer($writer, $item);
185
+			} elseif (is_string($name) && is_array($item) && isset($item['attributes'])) {
186
+				// The key is used for a name, but $item has 'attributes' and
187
+				// possibly 'value'
188
+				$writer->startElement($name);
189
+				$writer->writeAttributes($item['attributes']);
190
+				if (isset($item['value'])) {
191
+					$writer->write($item['value']);
192
+				}
193
+				$writer->endElement();
194
+			} elseif (is_string($name)) {
195
+				// This was a plain key-value array.
196
+				$writer->startElement($name);
197
+				$writer->write($item);
198
+				$writer->endElement();
199
+			} else {
200
+				throw new InvalidArgumentException('The writer does not know how to serialize arrays with keys of type: '.gettype($name));
201
+			}
202
+		}
203
+	} elseif (is_object($value)) {
204
+		throw new InvalidArgumentException('The writer cannot serialize objects of class: '.get_class($value));
205
+	} elseif (!is_null($value)) {
206
+		throw new InvalidArgumentException('The writer cannot serialize values of type: '.gettype($value));
207
+	}
208 208
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/xml/lib/XmlDeserializable.php 1 patch
Indentation   +21 added lines, -21 removed lines patch added patch discarded remove patch
@@ -14,25 +14,25 @@
 block discarded – undo
14 14
  */
15 15
 interface XmlDeserializable
16 16
 {
17
-    /**
18
-     * The deserialize method is called during xml parsing.
19
-     *
20
-     * This method is called statically, this is because in theory this method
21
-     * may be used as a type of constructor, or factory method.
22
-     *
23
-     * Often you want to return an instance of the current class, but you are
24
-     * free to return other data as well.
25
-     *
26
-     * You are responsible for advancing the reader to the next element. Not
27
-     * doing anything will result in a never-ending loop.
28
-     *
29
-     * If you just want to skip parsing for this element altogether, you can
30
-     * just call $reader->next();
31
-     *
32
-     * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
33
-     * the next element.
34
-     *
35
-     * @return mixed
36
-     */
37
-    public static function xmlDeserialize(Reader $reader);
17
+	/**
18
+	 * The deserialize method is called during xml parsing.
19
+	 *
20
+	 * This method is called statically, this is because in theory this method
21
+	 * may be used as a type of constructor, or factory method.
22
+	 *
23
+	 * Often you want to return an instance of the current class, but you are
24
+	 * free to return other data as well.
25
+	 *
26
+	 * You are responsible for advancing the reader to the next element. Not
27
+	 * doing anything will result in a never-ending loop.
28
+	 *
29
+	 * If you just want to skip parsing for this element altogether, you can
30
+	 * just call $reader->next();
31
+	 *
32
+	 * $reader->parseInnerTree() will parse the entire sub-tree, and advance to
33
+	 * the next element.
34
+	 *
35
+	 * @return mixed
36
+	 */
37
+	public static function xmlDeserialize(Reader $reader);
38 38
 }
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/xml/lib/Service.php 2 patches
Indentation   +292 added lines, -292 removed lines patch added patch discarded remove patch
@@ -17,296 +17,296 @@
 block discarded – undo
17 17
  */
18 18
 class Service
19 19
 {
20
-    /**
21
-     * This is the element map. It contains a list of XML elements (in clark
22
-     * notation) as keys and PHP class names as values.
23
-     *
24
-     * The PHP class names must implement Sabre\Xml\Element.
25
-     *
26
-     * Values may also be a callable. In that case the function will be called
27
-     * directly.
28
-     *
29
-     * @var array
30
-     */
31
-    public $elementMap = [];
32
-
33
-    /**
34
-     * This is a list of namespaces that you want to give default prefixes.
35
-     *
36
-     * You must make sure you create this entire list before starting to write.
37
-     * They should be registered on the root element.
38
-     *
39
-     * @var array
40
-     */
41
-    public $namespaceMap = [];
42
-
43
-    /**
44
-     * This is a list of custom serializers for specific classes.
45
-     *
46
-     * The writer may use this if you attempt to serialize an object with a
47
-     * class that does not implement XmlSerializable.
48
-     *
49
-     * Instead it will look at this classmap to see if there is a custom
50
-     * serializer here. This is useful if you don't want your value objects
51
-     * to be responsible for serializing themselves.
52
-     *
53
-     * The keys in this classmap need to be fully qualified PHP class names,
54
-     * the values must be callbacks. The callbacks take two arguments. The
55
-     * writer class, and the value that must be written.
56
-     *
57
-     * function (Writer $writer, object $value)
58
-     *
59
-     * @var array
60
-     */
61
-    public $classMap = [];
62
-
63
-    /**
64
-     * A bitmask of the LIBXML_* constants.
65
-     *
66
-     * @var int
67
-     */
68
-    public $options = 0;
69
-
70
-    /**
71
-     * Returns a fresh XML Reader.
72
-     */
73
-    public function getReader(): Reader
74
-    {
75
-        $r = new Reader();
76
-        $r->elementMap = $this->elementMap;
77
-
78
-        return $r;
79
-    }
80
-
81
-    /**
82
-     * Returns a fresh xml writer.
83
-     */
84
-    public function getWriter(): Writer
85
-    {
86
-        $w = new Writer();
87
-        $w->namespaceMap = $this->namespaceMap;
88
-        $w->classMap = $this->classMap;
89
-
90
-        return $w;
91
-    }
92
-
93
-    /**
94
-     * Parses a document in full.
95
-     *
96
-     * Input may be specified as a string or readable stream resource.
97
-     * The returned value is the value of the root document.
98
-     *
99
-     * Specifying the $contextUri allows the parser to figure out what the URI
100
-     * of the document was. This allows relative URIs within the document to be
101
-     * expanded easily.
102
-     *
103
-     * The $rootElementName is specified by reference and will be populated
104
-     * with the root element name of the document.
105
-     *
106
-     * @param string|resource $input
107
-     *
108
-     * @throws ParseException
109
-     *
110
-     * @return array|object|string
111
-     */
112
-    public function parse($input, string $contextUri = null, string &$rootElementName = null)
113
-    {
114
-        if (is_resource($input)) {
115
-            // Unfortunately the XMLReader doesn't support streams. When it
116
-            // does, we can optimize this.
117
-            $input = (string) stream_get_contents($input);
118
-        }
119
-
120
-        // If input is empty, then it's safe to throw an exception
121
-        if (empty($input)) {
122
-            throw new ParseException('The input element to parse is empty. Do not attempt to parse');
123
-        }
124
-
125
-        $r = $this->getReader();
126
-        $r->contextUri = $contextUri;
127
-        $r->XML($input, null, $this->options);
128
-
129
-        $result = $r->parse();
130
-        $rootElementName = $result['name'];
131
-
132
-        return $result['value'];
133
-    }
134
-
135
-    /**
136
-     * Parses a document in full, and specify what the expected root element
137
-     * name is.
138
-     *
139
-     * This function works similar to parse, but the difference is that the
140
-     * user can specify what the expected name of the root element should be,
141
-     * in clark notation.
142
-     *
143
-     * This is useful in cases where you expected a specific document to be
144
-     * passed, and reduces the amount of if statements.
145
-     *
146
-     * It's also possible to pass an array of expected rootElements if your
147
-     * code may expect more than one document type.
148
-     *
149
-     * @param string|string[] $rootElementName
150
-     * @param string|resource $input
151
-     *
152
-     * @throws ParseException
153
-     *
154
-     * @return array|object|string
155
-     */
156
-    public function expect($rootElementName, $input, string $contextUri = null)
157
-    {
158
-        if (is_resource($input)) {
159
-            // Unfortunately the XMLReader doesn't support streams. When it
160
-            // does, we can optimize this.
161
-            $input = (string) stream_get_contents($input);
162
-        }
163
-
164
-        // If input is empty, then it's safe to throw an exception
165
-        if (empty($input)) {
166
-            throw new ParseException('The input element to parse is empty. Do not attempt to parse');
167
-        }
168
-
169
-        $r = $this->getReader();
170
-        $r->contextUri = $contextUri;
171
-        $r->XML($input, null, $this->options);
172
-
173
-        $rootElementName = (array) $rootElementName;
174
-
175
-        foreach ($rootElementName as &$rEl) {
176
-            if ('{' !== $rEl[0]) {
177
-                $rEl = '{}'.$rEl;
178
-            }
179
-        }
180
-
181
-        $result = $r->parse();
182
-        if (!in_array($result['name'], $rootElementName, true)) {
183
-            throw new ParseException('Expected '.implode(' or ', $rootElementName).' but received '.$result['name'].' as the root element');
184
-        }
185
-
186
-        return $result['value'];
187
-    }
188
-
189
-    /**
190
-     * Generates an XML document in one go.
191
-     *
192
-     * The $rootElement must be specified in clark notation.
193
-     * The value must be a string, an array or an object implementing
194
-     * XmlSerializable. Basically, anything that's supported by the Writer
195
-     * object.
196
-     *
197
-     * $contextUri can be used to specify a sort of 'root' of the PHP application,
198
-     * in case the xml document is used as a http response.
199
-     *
200
-     * This allows an implementor to easily create URI's relative to the root
201
-     * of the domain.
202
-     *
203
-     * @param string|array|object|XmlSerializable $value
204
-     *
205
-     * @return string
206
-     */
207
-    public function write(string $rootElementName, $value, string $contextUri = null)
208
-    {
209
-        $w = $this->getWriter();
210
-        $w->openMemory();
211
-        $w->contextUri = $contextUri;
212
-        $w->setIndent(true);
213
-        $w->startDocument();
214
-        $w->writeElement($rootElementName, $value);
215
-
216
-        return $w->outputMemory();
217
-    }
218
-
219
-    /**
220
-     * Map an XML element to a PHP class.
221
-     *
222
-     * Calling this function will automatically set up the Reader and Writer
223
-     * classes to turn a specific XML element to a PHP class.
224
-     *
225
-     * For example, given a class such as :
226
-     *
227
-     * class Author {
228
-     *   public $firstName;
229
-     *   public $lastName;
230
-     * }
231
-     *
232
-     * and an XML element such as:
233
-     *
234
-     * <author xmlns="http://example.org/ns">
235
-     *   <firstName>...</firstName>
236
-     *   <lastName>...</lastName>
237
-     * </author>
238
-     *
239
-     * These can easily be mapped by calling:
240
-     *
241
-     * $service->mapValueObject('{http://example.org}author', 'Author');
242
-     */
243
-    public function mapValueObject(string $elementName, string $className)
244
-    {
245
-        list($namespace) = self::parseClarkNotation($elementName);
246
-
247
-        $this->elementMap[$elementName] = function (Reader $reader) use ($className, $namespace) {
248
-            return \Sabre\Xml\Deserializer\valueObject($reader, $className, $namespace);
249
-        };
250
-        $this->classMap[$className] = function (Writer $writer, $valueObject) use ($namespace) {
251
-            return \Sabre\Xml\Serializer\valueObject($writer, $valueObject, $namespace);
252
-        };
253
-        $this->valueObjectMap[$className] = $elementName;
254
-    }
255
-
256
-    /**
257
-     * Writes a value object.
258
-     *
259
-     * This function largely behaves similar to write(), except that it's
260
-     * intended specifically to serialize a Value Object into an XML document.
261
-     *
262
-     * The ValueObject must have been previously registered using
263
-     * mapValueObject().
264
-     *
265
-     * @param object $object
266
-     *
267
-     * @throws \InvalidArgumentException
268
-     */
269
-    public function writeValueObject($object, string $contextUri = null)
270
-    {
271
-        if (!isset($this->valueObjectMap[get_class($object)])) {
272
-            throw new \InvalidArgumentException('"'.get_class($object).'" is not a registered value object class. Register your class with mapValueObject.');
273
-        }
274
-
275
-        return $this->write(
276
-            $this->valueObjectMap[get_class($object)],
277
-            $object,
278
-            $contextUri
279
-        );
280
-    }
281
-
282
-    /**
283
-     * Parses a clark-notation string, and returns the namespace and element
284
-     * name components.
285
-     *
286
-     * If the string was invalid, it will throw an InvalidArgumentException.
287
-     *
288
-     * @throws \InvalidArgumentException
289
-     */
290
-    public static function parseClarkNotation(string $str): array
291
-    {
292
-        static $cache = [];
293
-
294
-        if (!isset($cache[$str])) {
295
-            if (!preg_match('/^{([^}]*)}(.*)$/', $str, $matches)) {
296
-                throw new \InvalidArgumentException('\''.$str.'\' is not a valid clark-notation formatted string');
297
-            }
298
-
299
-            $cache[$str] = [
300
-                $matches[1],
301
-                $matches[2],
302
-            ];
303
-        }
304
-
305
-        return $cache[$str];
306
-    }
307
-
308
-    /**
309
-     * A list of classes and which XML elements they map to.
310
-     */
311
-    protected $valueObjectMap = [];
20
+	/**
21
+	 * This is the element map. It contains a list of XML elements (in clark
22
+	 * notation) as keys and PHP class names as values.
23
+	 *
24
+	 * The PHP class names must implement Sabre\Xml\Element.
25
+	 *
26
+	 * Values may also be a callable. In that case the function will be called
27
+	 * directly.
28
+	 *
29
+	 * @var array
30
+	 */
31
+	public $elementMap = [];
32
+
33
+	/**
34
+	 * This is a list of namespaces that you want to give default prefixes.
35
+	 *
36
+	 * You must make sure you create this entire list before starting to write.
37
+	 * They should be registered on the root element.
38
+	 *
39
+	 * @var array
40
+	 */
41
+	public $namespaceMap = [];
42
+
43
+	/**
44
+	 * This is a list of custom serializers for specific classes.
45
+	 *
46
+	 * The writer may use this if you attempt to serialize an object with a
47
+	 * class that does not implement XmlSerializable.
48
+	 *
49
+	 * Instead it will look at this classmap to see if there is a custom
50
+	 * serializer here. This is useful if you don't want your value objects
51
+	 * to be responsible for serializing themselves.
52
+	 *
53
+	 * The keys in this classmap need to be fully qualified PHP class names,
54
+	 * the values must be callbacks. The callbacks take two arguments. The
55
+	 * writer class, and the value that must be written.
56
+	 *
57
+	 * function (Writer $writer, object $value)
58
+	 *
59
+	 * @var array
60
+	 */
61
+	public $classMap = [];
62
+
63
+	/**
64
+	 * A bitmask of the LIBXML_* constants.
65
+	 *
66
+	 * @var int
67
+	 */
68
+	public $options = 0;
69
+
70
+	/**
71
+	 * Returns a fresh XML Reader.
72
+	 */
73
+	public function getReader(): Reader
74
+	{
75
+		$r = new Reader();
76
+		$r->elementMap = $this->elementMap;
77
+
78
+		return $r;
79
+	}
80
+
81
+	/**
82
+	 * Returns a fresh xml writer.
83
+	 */
84
+	public function getWriter(): Writer
85
+	{
86
+		$w = new Writer();
87
+		$w->namespaceMap = $this->namespaceMap;
88
+		$w->classMap = $this->classMap;
89
+
90
+		return $w;
91
+	}
92
+
93
+	/**
94
+	 * Parses a document in full.
95
+	 *
96
+	 * Input may be specified as a string or readable stream resource.
97
+	 * The returned value is the value of the root document.
98
+	 *
99
+	 * Specifying the $contextUri allows the parser to figure out what the URI
100
+	 * of the document was. This allows relative URIs within the document to be
101
+	 * expanded easily.
102
+	 *
103
+	 * The $rootElementName is specified by reference and will be populated
104
+	 * with the root element name of the document.
105
+	 *
106
+	 * @param string|resource $input
107
+	 *
108
+	 * @throws ParseException
109
+	 *
110
+	 * @return array|object|string
111
+	 */
112
+	public function parse($input, string $contextUri = null, string &$rootElementName = null)
113
+	{
114
+		if (is_resource($input)) {
115
+			// Unfortunately the XMLReader doesn't support streams. When it
116
+			// does, we can optimize this.
117
+			$input = (string) stream_get_contents($input);
118
+		}
119
+
120
+		// If input is empty, then it's safe to throw an exception
121
+		if (empty($input)) {
122
+			throw new ParseException('The input element to parse is empty. Do not attempt to parse');
123
+		}
124
+
125
+		$r = $this->getReader();
126
+		$r->contextUri = $contextUri;
127
+		$r->XML($input, null, $this->options);
128
+
129
+		$result = $r->parse();
130
+		$rootElementName = $result['name'];
131
+
132
+		return $result['value'];
133
+	}
134
+
135
+	/**
136
+	 * Parses a document in full, and specify what the expected root element
137
+	 * name is.
138
+	 *
139
+	 * This function works similar to parse, but the difference is that the
140
+	 * user can specify what the expected name of the root element should be,
141
+	 * in clark notation.
142
+	 *
143
+	 * This is useful in cases where you expected a specific document to be
144
+	 * passed, and reduces the amount of if statements.
145
+	 *
146
+	 * It's also possible to pass an array of expected rootElements if your
147
+	 * code may expect more than one document type.
148
+	 *
149
+	 * @param string|string[] $rootElementName
150
+	 * @param string|resource $input
151
+	 *
152
+	 * @throws ParseException
153
+	 *
154
+	 * @return array|object|string
155
+	 */
156
+	public function expect($rootElementName, $input, string $contextUri = null)
157
+	{
158
+		if (is_resource($input)) {
159
+			// Unfortunately the XMLReader doesn't support streams. When it
160
+			// does, we can optimize this.
161
+			$input = (string) stream_get_contents($input);
162
+		}
163
+
164
+		// If input is empty, then it's safe to throw an exception
165
+		if (empty($input)) {
166
+			throw new ParseException('The input element to parse is empty. Do not attempt to parse');
167
+		}
168
+
169
+		$r = $this->getReader();
170
+		$r->contextUri = $contextUri;
171
+		$r->XML($input, null, $this->options);
172
+
173
+		$rootElementName = (array) $rootElementName;
174
+
175
+		foreach ($rootElementName as &$rEl) {
176
+			if ('{' !== $rEl[0]) {
177
+				$rEl = '{}'.$rEl;
178
+			}
179
+		}
180
+
181
+		$result = $r->parse();
182
+		if (!in_array($result['name'], $rootElementName, true)) {
183
+			throw new ParseException('Expected '.implode(' or ', $rootElementName).' but received '.$result['name'].' as the root element');
184
+		}
185
+
186
+		return $result['value'];
187
+	}
188
+
189
+	/**
190
+	 * Generates an XML document in one go.
191
+	 *
192
+	 * The $rootElement must be specified in clark notation.
193
+	 * The value must be a string, an array or an object implementing
194
+	 * XmlSerializable. Basically, anything that's supported by the Writer
195
+	 * object.
196
+	 *
197
+	 * $contextUri can be used to specify a sort of 'root' of the PHP application,
198
+	 * in case the xml document is used as a http response.
199
+	 *
200
+	 * This allows an implementor to easily create URI's relative to the root
201
+	 * of the domain.
202
+	 *
203
+	 * @param string|array|object|XmlSerializable $value
204
+	 *
205
+	 * @return string
206
+	 */
207
+	public function write(string $rootElementName, $value, string $contextUri = null)
208
+	{
209
+		$w = $this->getWriter();
210
+		$w->openMemory();
211
+		$w->contextUri = $contextUri;
212
+		$w->setIndent(true);
213
+		$w->startDocument();
214
+		$w->writeElement($rootElementName, $value);
215
+
216
+		return $w->outputMemory();
217
+	}
218
+
219
+	/**
220
+	 * Map an XML element to a PHP class.
221
+	 *
222
+	 * Calling this function will automatically set up the Reader and Writer
223
+	 * classes to turn a specific XML element to a PHP class.
224
+	 *
225
+	 * For example, given a class such as :
226
+	 *
227
+	 * class Author {
228
+	 *   public $firstName;
229
+	 *   public $lastName;
230
+	 * }
231
+	 *
232
+	 * and an XML element such as:
233
+	 *
234
+	 * <author xmlns="http://example.org/ns">
235
+	 *   <firstName>...</firstName>
236
+	 *   <lastName>...</lastName>
237
+	 * </author>
238
+	 *
239
+	 * These can easily be mapped by calling:
240
+	 *
241
+	 * $service->mapValueObject('{http://example.org}author', 'Author');
242
+	 */
243
+	public function mapValueObject(string $elementName, string $className)
244
+	{
245
+		list($namespace) = self::parseClarkNotation($elementName);
246
+
247
+		$this->elementMap[$elementName] = function (Reader $reader) use ($className, $namespace) {
248
+			return \Sabre\Xml\Deserializer\valueObject($reader, $className, $namespace);
249
+		};
250
+		$this->classMap[$className] = function (Writer $writer, $valueObject) use ($namespace) {
251
+			return \Sabre\Xml\Serializer\valueObject($writer, $valueObject, $namespace);
252
+		};
253
+		$this->valueObjectMap[$className] = $elementName;
254
+	}
255
+
256
+	/**
257
+	 * Writes a value object.
258
+	 *
259
+	 * This function largely behaves similar to write(), except that it's
260
+	 * intended specifically to serialize a Value Object into an XML document.
261
+	 *
262
+	 * The ValueObject must have been previously registered using
263
+	 * mapValueObject().
264
+	 *
265
+	 * @param object $object
266
+	 *
267
+	 * @throws \InvalidArgumentException
268
+	 */
269
+	public function writeValueObject($object, string $contextUri = null)
270
+	{
271
+		if (!isset($this->valueObjectMap[get_class($object)])) {
272
+			throw new \InvalidArgumentException('"'.get_class($object).'" is not a registered value object class. Register your class with mapValueObject.');
273
+		}
274
+
275
+		return $this->write(
276
+			$this->valueObjectMap[get_class($object)],
277
+			$object,
278
+			$contextUri
279
+		);
280
+	}
281
+
282
+	/**
283
+	 * Parses a clark-notation string, and returns the namespace and element
284
+	 * name components.
285
+	 *
286
+	 * If the string was invalid, it will throw an InvalidArgumentException.
287
+	 *
288
+	 * @throws \InvalidArgumentException
289
+	 */
290
+	public static function parseClarkNotation(string $str): array
291
+	{
292
+		static $cache = [];
293
+
294
+		if (!isset($cache[$str])) {
295
+			if (!preg_match('/^{([^}]*)}(.*)$/', $str, $matches)) {
296
+				throw new \InvalidArgumentException('\''.$str.'\' is not a valid clark-notation formatted string');
297
+			}
298
+
299
+			$cache[$str] = [
300
+				$matches[1],
301
+				$matches[2],
302
+			];
303
+		}
304
+
305
+		return $cache[$str];
306
+	}
307
+
308
+	/**
309
+	 * A list of classes and which XML elements they map to.
310
+	 */
311
+	protected $valueObjectMap = [];
312 312
 }
Please login to merge, or discard this patch.
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -244,10 +244,10 @@
 block discarded – undo
244 244
     {
245 245
         list($namespace) = self::parseClarkNotation($elementName);
246 246
 
247
-        $this->elementMap[$elementName] = function (Reader $reader) use ($className, $namespace) {
247
+        $this->elementMap[$elementName] = function(Reader $reader) use ($className, $namespace) {
248 248
             return \Sabre\Xml\Deserializer\valueObject($reader, $className, $namespace);
249 249
         };
250
-        $this->classMap[$className] = function (Writer $writer, $valueObject) use ($namespace) {
250
+        $this->classMap[$className] = function(Writer $writer, $valueObject) use ($namespace) {
251 251
             return \Sabre\Xml\Serializer\valueObject($writer, $valueObject, $namespace);
252 252
         };
253 253
         $this->valueObjectMap[$className] = $elementName;
Please login to merge, or discard this patch.
htdocs/includes/sabre/sabre/xml/lib/Element/Elements.php 1 patch
Indentation   +57 added lines, -57 removed lines patch added patch discarded remove patch
@@ -37,64 +37,64 @@
 block discarded – undo
37 37
  */
38 38
 class Elements implements Xml\Element
39 39
 {
40
-    /**
41
-     * Value to serialize.
42
-     *
43
-     * @var array
44
-     */
45
-    protected $value;
40
+	/**
41
+	 * Value to serialize.
42
+	 *
43
+	 * @var array
44
+	 */
45
+	protected $value;
46 46
 
47
-    /**
48
-     * Constructor.
49
-     */
50
-    public function __construct(array $value = [])
51
-    {
52
-        $this->value = $value;
53
-    }
47
+	/**
48
+	 * Constructor.
49
+	 */
50
+	public function __construct(array $value = [])
51
+	{
52
+		$this->value = $value;
53
+	}
54 54
 
55
-    /**
56
-     * The xmlSerialize method is called during xml writing.
57
-     *
58
-     * Use the $writer argument to write its own xml serialization.
59
-     *
60
-     * An important note: do _not_ create a parent element. Any element
61
-     * implementing XmlSerializable should only ever write what's considered
62
-     * its 'inner xml'.
63
-     *
64
-     * The parent of the current element is responsible for writing a
65
-     * containing element.
66
-     *
67
-     * This allows serializers to be re-used for different element names.
68
-     *
69
-     * If you are opening new elements, you must also close them again.
70
-     */
71
-    public function xmlSerialize(Xml\Writer $writer)
72
-    {
73
-        Serializer\enum($writer, $this->value);
74
-    }
55
+	/**
56
+	 * The xmlSerialize method is called during xml writing.
57
+	 *
58
+	 * Use the $writer argument to write its own xml serialization.
59
+	 *
60
+	 * An important note: do _not_ create a parent element. Any element
61
+	 * implementing XmlSerializable should only ever write what's considered
62
+	 * its 'inner xml'.
63
+	 *
64
+	 * The parent of the current element is responsible for writing a
65
+	 * containing element.
66
+	 *
67
+	 * This allows serializers to be re-used for different element names.
68
+	 *
69
+	 * If you are opening new elements, you must also close them again.
70
+	 */
71
+	public function xmlSerialize(Xml\Writer $writer)
72
+	{
73
+		Serializer\enum($writer, $this->value);
74
+	}
75 75
 
76
-    /**
77
-     * The deserialize method is called during xml parsing.
78
-     *
79
-     * This method is called statically, this is because in theory this method
80
-     * may be used as a type of constructor, or factory method.
81
-     *
82
-     * Often you want to return an instance of the current class, but you are
83
-     * free to return other data as well.
84
-     *
85
-     * Important note 2: You are responsible for advancing the reader to the
86
-     * next element. Not doing anything will result in a never-ending loop.
87
-     *
88
-     * If you just want to skip parsing for this element altogether, you can
89
-     * just call $reader->next();
90
-     *
91
-     * $reader->parseSubTree() will parse the entire sub-tree, and advance to
92
-     * the next element.
93
-     *
94
-     * @return mixed
95
-     */
96
-    public static function xmlDeserialize(Xml\Reader $reader)
97
-    {
98
-        return Deserializer\enum($reader);
99
-    }
76
+	/**
77
+	 * The deserialize method is called during xml parsing.
78
+	 *
79
+	 * This method is called statically, this is because in theory this method
80
+	 * may be used as a type of constructor, or factory method.
81
+	 *
82
+	 * Often you want to return an instance of the current class, but you are
83
+	 * free to return other data as well.
84
+	 *
85
+	 * Important note 2: You are responsible for advancing the reader to the
86
+	 * next element. Not doing anything will result in a never-ending loop.
87
+	 *
88
+	 * If you just want to skip parsing for this element altogether, you can
89
+	 * just call $reader->next();
90
+	 *
91
+	 * $reader->parseSubTree() will parse the entire sub-tree, and advance to
92
+	 * the next element.
93
+	 *
94
+	 * @return mixed
95
+	 */
96
+	public static function xmlDeserialize(Xml\Reader $reader)
97
+	{
98
+		return Deserializer\enum($reader);
99
+	}
100 100
 }
Please login to merge, or discard this patch.