Passed
Pull Request — master (#46)
by Neo
33:01
created
api/src/Vfs/Dav/Directory.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -84,7 +84,7 @@
 block discarded – undo
84 84
 	/**
85 85
 	 * Returns available diskspace information
86 86
 	 *
87
-	 * @return array [ available-space, free-space ]
87
+	 * @return false[] [ available-space, free-space ]
88 88
 	 */
89 89
 	function getQuotaInfo()
90 90
 	{
Please login to merge, or discard this patch.
Spacing   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -66,10 +66,10 @@  discard block
 block discarded – undo
66 66
 	function getChild($name)
67 67
 	{
68 68
 		//error_log(__METHOD__."('$name') this->path=$this->path, this->vfs_path=$this->vfs_path");
69
-		$path = $this->vfs_path . '/' . $name;
70
-		$vfs_path = $this->vfs_path . '/' . Vfs::encodePathComponent($name);
69
+		$path = $this->vfs_path.'/'.$name;
70
+		$vfs_path = $this->vfs_path.'/'.Vfs::encodePathComponent($name);
71 71
 
72
-		if (!Vfs::file_exists($vfs_path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
72
+		if (!Vfs::file_exists($vfs_path)) throw new DAV\Exception\NotFound('File with name '.$path.' could not be located');
73 73
 
74 74
 		if (Vfs::is_dir($vfs_path))
75 75
 		{
@@ -88,6 +88,6 @@  discard block
 block discarded – undo
88 88
 	 */
89 89
 	function getQuotaInfo()
90 90
 	{
91
-		return [ false, false ];
91
+		return [false, false];
92 92
 	}
93 93
 }
Please login to merge, or discard this patch.
Braces   +4 added lines, -1 removed lines patch added patch discarded remove patch
@@ -69,7 +69,10 @@
 block discarded – undo
69 69
 		$path = $this->vfs_path . '/' . $name;
70 70
 		$vfs_path = $this->vfs_path . '/' . Vfs::encodePathComponent($name);
71 71
 
72
-		if (!Vfs::file_exists($vfs_path)) throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
72
+		if (!Vfs::file_exists($vfs_path))
73
+		{
74
+			throw new DAV\Exception\NotFound('File with name ' . $path . ' could not be located');
75
+		}
73 76
 
74 77
 		if (Vfs::is_dir($vfs_path))
75 78
 		{
Please login to merge, or discard this patch.
api/src/Vfs/Dav/File.php 1 patch
Doc Comments   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -62,7 +62,7 @@  discard block
 block discarded – undo
62 62
 	 *
63 63
 	 * Return null if the ETag can not effectively be determined
64 64
 	 *
65
-	 * @return mixed
65
+	 * @return string|null
66 66
 	 */
67 67
 	function getETag()
68 68
 	{
@@ -78,7 +78,7 @@  discard block
 block discarded – undo
78 78
 	 *
79 79
 	 * If null is returned, we'll assume application/octet-stream
80 80
 	 *
81
-	 * @return mixed
81
+	 * @return string
82 82
 	 */
83 83
 	function getContentType()
84 84
 	{
Please login to merge, or discard this patch.
api/src/Vfs/Filesystem/StreamWrapper.php 4 patches
Doc Comments   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -271,7 +271,7 @@  discard block
 block discarded – undo
271 271
 	 *
272 272
 	 * If you have cached data in your stream but not yet stored it into the underlying storage, you should do so now.
273 273
 	 *
274
-	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
274
+	 * @return boolean TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
275 275
 	 */
276 276
 	function stream_flush ( )
277 277
 	{
@@ -507,7 +507,7 @@  discard block
 block discarded – undo
507 507
 	 *
508 508
 	 * @param string $url URL that was passed to opendir() and that this object is expected to explore.
509 509
 	 * @param int $options
510
-	 * @return booelan
510
+	 * @return boolean
511 511
 	 */
512 512
 	function dir_opendir ( $url, $options )
513 513
 	{
@@ -616,7 +616,7 @@  discard block
 block discarded – undo
616 616
 	 * It should reset the output generated by dir_readdir(). i.e.:
617 617
 	 * The next call to dir_readdir() should return the first entry in the location returned by dir_opendir().
618 618
 	 *
619
-	 * @return boolean
619
+	 * @return boolean|null
620 620
 	 */
621 621
 	function dir_rewinddir ( )
622 622
 	{
Please login to merge, or discard this patch.
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -228,10 +228,10 @@
 block discarded – undo
228 228
  	 * Important: PHP 5.0 introduced a bug that wasn't fixed until 5.1: the return value has to be the oposite!
229 229
  	 *
230 230
  	 * if(version_compare(PHP_VERSION,'5.0','>=') && version_compare(PHP_VERSION,'5.1','<'))
231
-  	 * {
231
+ 	 * {
232 232
  	 * 		$eof = !$eof;
233 233
  	 * }
234
-  	 *
234
+ 	 *
235 235
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
236 236
  	 */
237 237
 	function stream_eof ( )
Please login to merge, or discard this patch.
Spacing   +84 added lines, -84 removed lines patch added patch discarded remove patch
@@ -51,7 +51,7 @@  discard block
 block discarded – undo
51 51
 	/**
52 52
 	 * Mime type of directories, the old vfs used 'Directory', while eg. WebDAV uses 'httpd/unix-directory'
53 53
 	 */
54
-	const DIR_MIME_TYPE = Vfs::DIR_MIME_TYPE ;
54
+	const DIR_MIME_TYPE = Vfs::DIR_MIME_TYPE;
55 55
 
56 56
 	/**
57 57
 	 * mode-bits, which have to be set for files
@@ -60,7 +60,7 @@  discard block
 block discarded – undo
60 60
 	/**
61 61
 	 * mode-bits, which have to be set for directories
62 62
 	 */
63
-	const MODE_DIR =   040000;
63
+	const MODE_DIR = 040000;
64 64
 
65 65
 	/**
66 66
 	 * optional context param when opening the stream, null if no context passed
@@ -123,50 +123,50 @@  discard block
 block discarded – undo
123 123
 	 * @param string $opened_path full path of the file/resource, if the open was successfull and STREAM_USE_PATH was set
124 124
 	 * @return boolean true if the ressource was opened successful, otherwise false
125 125
 	 */
126
-	function stream_open ( $url, $mode, $options, &$opened_path )
126
+	function stream_open($url, $mode, $options, &$opened_path)
127 127
 	{
128
-		unset($opened_path);	// not used, but required by interface
128
+		unset($opened_path); // not used, but required by interface
129 129
 
130 130
 		$this->opened_stream = $this->opened_stream_url = null;
131
-		$read_only = str_replace('b','',$mode) == 'r';
131
+		$read_only = str_replace('b', '', $mode) == 'r';
132 132
 
133 133
 		// check access rights, based on the eGW mount perms
134
-		if (!($stat = $this->url_stat($url,0)) || $mode[0] == 'x')	// file not found or file should NOT exist
134
+		if (!($stat = $this->url_stat($url, 0)) || $mode[0] == 'x')	// file not found or file should NOT exist
135 135
 		{
136
-			if ($mode[0] == 'r' ||	// does $mode require the file to exist (r,r+)
137
-				$mode[0] == 'x' ||	// or file should not exist, but does
136
+			if ($mode[0] == 'r' || // does $mode require the file to exist (r,r+)
137
+				$mode[0] == 'x' || // or file should not exist, but does
138 138
 				!($dir = Vfs::dirname($url)) ||
139
-				!Vfs::check_access($dir,Vfs::WRITABLE,$dir_stat=$this->url_stat($dir,0)))	// or we are not allowed to 																																			create it
139
+				!Vfs::check_access($dir, Vfs::WRITABLE, $dir_stat = $this->url_stat($dir, 0)))	// or we are not allowed to 																																			create it
140 140
 			{
141 141
 				if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) file does not exist or can not be created!");
142
-				if (!($options & STREAM_URL_STAT_QUIET))
142
+				if (!($options&STREAM_URL_STAT_QUIET))
143 143
 				{
144
-					trigger_error(__METHOD__."($url,$mode,$options) file does not exist or can not be created!",E_USER_WARNING);
144
+					trigger_error(__METHOD__."($url,$mode,$options) file does not exist or can not be created!", E_USER_WARNING);
145 145
 				}
146 146
 				return false;
147 147
 			}
148 148
 		}
149
-		elseif (!$read_only && !Vfs::check_access($url,Vfs::WRITABLE,$stat))	// we are not allowed to edit it
149
+		elseif (!$read_only && !Vfs::check_access($url, Vfs::WRITABLE, $stat))	// we are not allowed to edit it
150 150
 		{
151 151
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) file can not be edited!");
152
-			if (!($options & STREAM_URL_STAT_QUIET))
152
+			if (!($options&STREAM_URL_STAT_QUIET))
153 153
 			{
154
-				trigger_error(__METHOD__."($url,$mode,$options) file can not be edited!",E_USER_WARNING);
154
+				trigger_error(__METHOD__."($url,$mode,$options) file can not be edited!", E_USER_WARNING);
155 155
 			}
156 156
 			return false;
157 157
 		}
158 158
 		if (!$read_only && self::deny_script($url))
159 159
 		{
160 160
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) permission denied, file is a script!");
161
-			if (!($options & STREAM_URL_STAT_QUIET))
161
+			if (!($options&STREAM_URL_STAT_QUIET))
162 162
 			{
163
-				trigger_error(__METHOD__."($url,$mode,$options) permission denied, file is a script!",E_USER_WARNING);
163
+				trigger_error(__METHOD__."($url,$mode,$options) permission denied, file is a script!", E_USER_WARNING);
164 164
 			}
165 165
 			return false;
166 166
 		}
167 167
 
168 168
 		// open the "real" file
169
-		if (!($this->opened_stream = fopen($path=Vfs::decodePath(Vfs::parse_url($url,PHP_URL_PATH)),$mode,$options)))
169
+		if (!($this->opened_stream = fopen($path = Vfs::decodePath(Vfs::parse_url($url, PHP_URL_PATH)), $mode, $options)))
170 170
 		{
171 171
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) fopen('$path','$mode',$options) returned false!");
172 172
 			return false;
@@ -181,7 +181,7 @@  discard block
 block discarded – undo
181 181
 	 *
182 182
 	 * You must release any resources that were locked or allocated by the stream.
183 183
 	 */
184
-	function stream_close ( )
184
+	function stream_close( )
185 185
 	{
186 186
 		$ret = fclose($this->opened_stream);
187 187
 
@@ -201,9 +201,9 @@  discard block
 block discarded – undo
201 201
 	 * @param int $count
202 202
 	 * @return string/false up to count bytes read or false on EOF
203 203
 	 */
204
-	function stream_read ( $count )
204
+	function stream_read($count)
205 205
 	{
206
-		return fread($this->opened_stream,$count);
206
+		return fread($this->opened_stream, $count);
207 207
 	}
208 208
 
209 209
 	/**
@@ -217,9 +217,9 @@  discard block
 block discarded – undo
217 217
 	 * @param string $data
218 218
 	 * @return integer
219 219
 	 */
220
-	function stream_write ( $data )
220
+	function stream_write($data)
221 221
 	{
222
-		return fwrite($this->opened_stream,$data);
222
+		return fwrite($this->opened_stream, $data);
223 223
 	}
224 224
 
225 225
  	/**
@@ -234,7 +234,7 @@  discard block
 block discarded – undo
234 234
   	 *
235 235
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
236 236
  	 */
237
-	function stream_eof ( )
237
+	function stream_eof( )
238 238
 	{
239 239
 		return feof($this->opened_stream);
240 240
 	}
@@ -244,7 +244,7 @@  discard block
 block discarded – undo
244 244
 	 *
245 245
 	 * @return integer current read/write position of the stream
246 246
 	 */
247
- 	function stream_tell ( )
247
+ 	function stream_tell( )
248 248
  	{
249 249
  		return ftell($this->opened_stream);
250 250
  	}
@@ -261,9 +261,9 @@  discard block
 block discarded – undo
261 261
  	 * 							SEEK_END - 2 - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)
262 262
  	 * @return boolean TRUE if the position was updated, FALSE otherwise.
263 263
  	 */
264
-	function stream_seek ( $offset, $whence )
264
+	function stream_seek($offset, $whence)
265 265
 	{
266
-		return !fseek($this->opened_stream,$offset,$whence);	// fseek returns 0 on success and -1 on failure
266
+		return !fseek($this->opened_stream, $offset, $whence); // fseek returns 0 on success and -1 on failure
267 267
 	}
268 268
 
269 269
 	/**
@@ -273,7 +273,7 @@  discard block
 block discarded – undo
273 273
 	 *
274 274
 	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
275 275
 	 */
276
-	function stream_flush ( )
276
+	function stream_flush( )
277 277
 	{
278 278
 		return fflush($this->opened_stream);
279 279
 	}
@@ -292,9 +292,9 @@  discard block
 block discarded – undo
292 292
 	 *
293 293
 	 * @return array containing the same values as appropriate for the stream.
294 294
 	 */
295
-	function stream_stat ( )
295
+	function stream_stat( )
296 296
 	{
297
-		return $this->url_stat($this->opened_stream_url,0);
297
+		return $this->url_stat($this->opened_stream_url, 0);
298 298
 	}
299 299
 
300 300
 	/**
@@ -306,15 +306,15 @@  discard block
 block discarded – undo
306 306
 	 * @param string $url
307 307
 	 * @return boolean TRUE on success or FALSE on failure
308 308
 	 */
309
-	function unlink ( $url )
309
+	function unlink($url)
310 310
 	{
311
-		$path = Vfs::decodePath(Vfs::parse_url($url,PHP_URL_PATH));
311
+		$path = Vfs::decodePath(Vfs::parse_url($url, PHP_URL_PATH));
312 312
 
313 313
 		// check access rights (file need to exist and directory need to be writable
314
-		if (!file_exists($path) || is_dir($path) || !($dir = Vfs::dirname($url)) || !Vfs::check_access($dir,Vfs::WRITABLE))
314
+		if (!file_exists($path) || is_dir($path) || !($dir = Vfs::dirname($url)) || !Vfs::check_access($dir, Vfs::WRITABLE))
315 315
 		{
316 316
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
317
-			return false;	// no permission or file does not exist
317
+			return false; // no permission or file does not exist
318 318
 		}
319 319
 		return unlink($path);
320 320
 	}
@@ -331,21 +331,21 @@  discard block
 block discarded – undo
331 331
 	 * @param string $url_to
332 332
 	 * @return boolean TRUE on success or FALSE on failure
333 333
 	 */
334
-	function rename ( $url_from, $url_to )
334
+	function rename($url_from, $url_to)
335 335
 	{
336 336
 		$from = Vfs::parse_url($url_from);
337 337
 		$to   = Vfs::parse_url($url_to);
338 338
 
339 339
 		// check access rights
340
-		if (!($from_stat = $this->url_stat($url_from,0)) || !($dir = Vfs::dirname($url_from)) || !Vfs::check_access($dir,Vfs::WRITABLE))
340
+		if (!($from_stat = $this->url_stat($url_from, 0)) || !($dir = Vfs::dirname($url_from)) || !Vfs::check_access($dir, Vfs::WRITABLE))
341 341
 		{
342 342
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url_from,$url_to): $from[path] permission denied!");
343
-			return false;	// no permission or file does not exist
343
+			return false; // no permission or file does not exist
344 344
 		}
345
-		if (!($to_dir = Vfs::dirname($url_to)) || !Vfs::check_access($to_dir,Vfs::WRITABLE,$to_dir_stat = $this->url_stat($to_dir,0)))
345
+		if (!($to_dir = Vfs::dirname($url_to)) || !Vfs::check_access($to_dir, Vfs::WRITABLE, $to_dir_stat = $this->url_stat($to_dir, 0)))
346 346
 		{
347 347
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url_from,$url_to): $to_dir permission denied!");
348
-			return false;	// no permission or parent-dir does not exist
348
+			return false; // no permission or parent-dir does not exist
349 349
 		}
350 350
 		if (self::deny_script($url_to))
351 351
 		{
@@ -354,12 +354,12 @@  discard block
 block discarded – undo
354 354
 		}
355 355
 		// the filesystem stream-wrapper does NOT allow to rename files to directories, as this makes problems
356 356
 		// for our vfs too, we abort here with an error, like the filesystem one does
357
-		if (($to_stat = $this->url_stat($to['path'],0)) &&
357
+		if (($to_stat = $this->url_stat($to['path'], 0)) &&
358 358
 			($to_stat['mime'] === self::DIR_MIME_TYPE) !== ($from_stat['mime'] === self::DIR_MIME_TYPE))
359 359
 		{
360 360
 			$is_dir = $to_stat['mime'] === self::DIR_MIME_TYPE ? 'a' : 'no';
361 361
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url_to,$url_from) $to[path] is $is_dir directory!");
362
-			return false;	// no permission or file does not exist
362
+			return false; // no permission or file does not exist
363 363
 		}
364 364
 		// if destination file already exists, delete it
365 365
 		if ($to_stat && !self::unlink($url_to))
@@ -367,7 +367,7 @@  discard block
 block discarded – undo
367 367
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url_to,$url_from) can't unlink existing $url_to!");
368 368
 			return false;
369 369
 		}
370
-		return rename(Vfs::decodePath($from['path']),Vfs::decodePath($to['path']));
370
+		return rename(Vfs::decodePath($from['path']), Vfs::decodePath($to['path']));
371 371
 	}
372 372
 
373 373
 	/**
@@ -381,12 +381,12 @@  discard block
 block discarded – undo
381 381
 	 * @param int $options Posible values include STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE
382 382
 	 * @return boolean TRUE on success or FALSE on failure
383 383
 	 */
384
-	function mkdir ( $url, $mode, $options )
384
+	function mkdir($url, $mode, $options)
385 385
 	{
386
-		unset($mode);	// not used, but required by interface
386
+		unset($mode); // not used, but required by interface
387 387
 
388
-		$path = Vfs::decodePath(Vfs::parse_url($url,PHP_URL_PATH));
389
-		$recursive = (bool)($options & STREAM_MKDIR_RECURSIVE);
388
+		$path = Vfs::decodePath(Vfs::parse_url($url, PHP_URL_PATH));
389
+		$recursive = (bool)($options&STREAM_MKDIR_RECURSIVE);
390 390
 
391 391
 		// find the real parent (might be more then one level if $recursive!)
392 392
 		do {
@@ -397,12 +397,12 @@  discard block
 block discarded – undo
397 397
 		//echo __METHOD__."($url,$mode,$options) path=$path, recursive=$recursive, parent=$parent, Vfs::check_access(parent_url=$parent_url,Vfs::WRITABLE)=".(int)Vfs::check_access($parent_url,Vfs::WRITABLE)."\n";
398 398
 
399 399
 		// check access rights (in real filesystem AND by mount perms)
400
-		if (!$parent_url || file_exists($path) || !file_exists($parent) || !is_writable($parent) || !Vfs::check_access($parent_url,Vfs::WRITABLE))
400
+		if (!$parent_url || file_exists($path) || !file_exists($parent) || !is_writable($parent) || !Vfs::check_access($parent_url, Vfs::WRITABLE))
401 401
 		{
402 402
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
403 403
 			return false;
404 404
 		}
405
-		return mkdir($path, 0700, $recursive);	// setting mode 0700 allows (only) apache to write into the dir
405
+		return mkdir($path, 0700, $recursive); // setting mode 0700 allows (only) apache to write into the dir
406 406
 	}
407 407
 
408 408
 	/**
@@ -415,11 +415,11 @@  discard block
 block discarded – undo
415 415
 	 * @param int $options Possible values include STREAM_REPORT_ERRORS.
416 416
 	 * @return boolean TRUE on success or FALSE on failure.
417 417
 	 */
418
-	function rmdir ( $url, $options )
418
+	function rmdir($url, $options)
419 419
 	{
420
-		unset($options);	// not used, but required by interface
420
+		unset($options); // not used, but required by interface
421 421
 
422
-		$path = Vfs::decodePath(Vfs::parse_url($url,PHP_URL_PATH));
422
+		$path = Vfs::decodePath(Vfs::parse_url($url, PHP_URL_PATH));
423 423
 		$parent = dirname($path);
424 424
 
425 425
 		// check access rights (in real filesystem AND by mount perms)
@@ -449,7 +449,7 @@  discard block
 block discarded – undo
449 449
 	{
450 450
  		if ($option != STREAM_META_TOUCH)
451 451
 		{
452
-			return false;	// not implemented / supported
452
+			return false; // not implemented / supported
453 453
 		}
454 454
 
455 455
 		$path = Vfs::decodePath(Vfs::parse_url($url, PHP_URL_PATH));
@@ -473,13 +473,13 @@  discard block
 block discarded – undo
473 473
 	 * @param int $options
474 474
 	 * @return booelan
475 475
 	 */
476
-	function dir_opendir ( $url, $options )
476
+	function dir_opendir($url, $options)
477 477
 	{
478 478
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$options)");
479 479
 
480 480
 		$this->opened_dir = null;
481 481
 
482
-		$path = Vfs::decodePath(Vfs::parse_url($this->opened_dir_url = $url,PHP_URL_PATH));
482
+		$path = Vfs::decodePath(Vfs::parse_url($this->opened_dir_url = $url, PHP_URL_PATH));
483 483
 
484 484
 		// ToDo: check access rights
485 485
 
@@ -517,31 +517,31 @@  discard block
 block discarded – undo
517 517
 	 *                          stat triggers it's own warning anyway, so it makes no sense to trigger one by our stream-wrapper!
518 518
 	 * @return array
519 519
 	 */
520
-	function url_stat ( $url, $flags )
520
+	function url_stat($url, $flags)
521 521
 	{
522 522
 		$parts = Vfs::parse_url($url);
523 523
 		$path = Vfs::decodePath($parts['path']);
524 524
 
525
-		$stat = @stat($path);	// suppressed the stat failed warnings
525
+		$stat = @stat($path); // suppressed the stat failed warnings
526 526
 
527 527
 		if ($stat)
528 528
 		{
529 529
 			// set owner, group and mode from mount options
530 530
 			$uid = $gid = $mode = null;
531
-			if (!self::parse_query($parts['query'],$uid,$gid,$mode))
531
+			if (!self::parse_query($parts['query'], $uid, $gid, $mode))
532 532
 			{
533 533
 				return false;
534 534
 			}
535 535
 			$stat['uid'] = $stat[4] = $uid;
536 536
 			$stat['gid'] = $stat[5] = $gid;
537
-			$stat['mode'] = $stat[2] = $stat['mode'] & self::MODE_DIR ? self::MODE_DIR | $mode : self::MODE_FILE | ($mode & ~0111);
537
+			$stat['mode'] = $stat[2] = $stat['mode']&self::MODE_DIR ? self::MODE_DIR|$mode : self::MODE_FILE|($mode&~0111);
538 538
 			// write rights also depend on the write rights of the webserver
539 539
 			if (!is_writable($path))
540 540
 			{
541
-				$stat['mode'] = $stat[2] = $stat['mode'] & ~0222;
541
+				$stat['mode'] = $stat[2] = $stat['mode']&~0222;
542 542
 			}
543 543
 		}
544
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$flags) path=$path, mount_mode=".sprintf('0%o',$mode).", mode=".sprintf('0%o',$stat['mode']).'='.Vfs::int2mode($stat['mode']));
544
+		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$flags) path=$path, mount_mode=".sprintf('0%o', $mode).", mode=".sprintf('0%o', $stat['mode']).'='.Vfs::int2mode($stat['mode']));
545 545
 		return $stat;
546 546
 	}
547 547
 
@@ -555,13 +555,13 @@  discard block
 block discarded – undo
555 555
 	 *
556 556
 	 * @return string
557 557
 	 */
558
-	function dir_readdir ( )
558
+	function dir_readdir( )
559 559
 	{
560 560
 		do {
561 561
 			$file = readdir($this->opened_dir);
562 562
 
563
-			$ignore = !($file === false ||							// stop if no more dirs or
564
-				($file != '.' && $file != '..' ));					// file not . or ..
563
+			$ignore = !($file === false || // stop if no more dirs or
564
+				($file != '.' && $file != '..')); // file not . or ..
565 565
 			if (self::LOG_LEVEL > 1 && $ignore) error_log(__METHOD__.'() ignoring '.array2string($file));
566 566
 		}
567 567
 		while ($ignore);
@@ -582,7 +582,7 @@  discard block
 block discarded – undo
582 582
 	 *
583 583
 	 * @return boolean
584 584
 	 */
585
-	function dir_rewinddir ( )
585
+	function dir_rewinddir( )
586 586
 	{
587 587
 		return rewinddir($this->opened_dir);
588 588
 	}
@@ -594,7 +594,7 @@  discard block
 block discarded – undo
594 594
 	 *
595 595
 	 * @return boolean
596 596
 	 */
597
-	function dir_closedir ( )
597
+	function dir_closedir( )
598 598
 	{
599 599
 		closedir($this->opened_dir);
600 600
 
@@ -612,18 +612,18 @@  discard block
 block discarded – undo
612 612
 	 * @param int &$mode default if not set is 05 r-x for others
613 613
 	 * @return boolean true on successfull parse, false on error
614 614
 	 */
615
-	static function parse_query($query,&$uid,&$gid,&$mode)
615
+	static function parse_query($query, &$uid, &$gid, &$mode)
616 616
 	{
617 617
 		$params = null;
618
-		parse_str(is_array($query) ? $query['query'] : $query,$params);
618
+		parse_str(is_array($query) ? $query['query'] : $query, $params);
619 619
 
620 620
 		// setting the default perms root.root r-x for other
621 621
 		$uid = $gid = 0;
622 622
 		$mode = 05;
623 623
 
624
-		foreach($params as $name => $value)
624
+		foreach ($params as $name => $value)
625 625
 		{
626
-			switch($name)
626
+			switch ($name)
627 627
 			{
628 628
 				case 'user':
629 629
 					if (!is_numeric($value))
@@ -632,10 +632,10 @@  discard block
 block discarded – undo
632 632
 						{
633 633
 							$value = 0;
634 634
 						}
635
-						elseif (($value = $GLOBALS['egw']->accounts->name2id($value,'account_lid','u')) === false)
635
+						elseif (($value = $GLOBALS['egw']->accounts->name2id($value, 'account_lid', 'u')) === false)
636 636
 						{
637 637
 							error_log(__METHOD__."('$query') unknown user-name '$value'!");
638
-							return false;	// wrong user-name
638
+							return false; // wrong user-name
639 639
 						}
640 640
 					}
641 641
 					// fall-through
@@ -654,12 +654,12 @@  discard block
 block discarded – undo
654 654
 						{
655 655
 							$value = 0;
656 656
 						}
657
-						elseif (($value = $GLOBALS['egw']->accounts->name2id($value,'account_lid','g')) === false)
657
+						elseif (($value = $GLOBALS['egw']->accounts->name2id($value, 'account_lid', 'g')) === false)
658 658
 						{
659 659
 							error_log(__METHOD__."('$query') unknown group-name '$value'!");
660
-							return false;	// wrong group-name
660
+							return false; // wrong group-name
661 661
 						}
662
-						$value = -$value;	// vfs uses positiv gid's!
662
+						$value = -$value; // vfs uses positiv gid's!
663 663
 					}
664 664
 					// fall-through
665 665
 				case 'gid':
@@ -695,9 +695,9 @@  discard block
 block discarded – undo
695 695
 	{
696 696
 		$parts = Vfs::parse_url($url);
697 697
 		$get = null;
698
-		parse_str($parts['query'],$get);
698
+		parse_str($parts['query'], $get);
699 699
 
700
-		$deny = !$get['exec'] && preg_match(self::SCRIPT_EXTENSIONS_PREG,$parts['path']);
700
+		$deny = !$get['exec'] && preg_match(self::SCRIPT_EXTENSIONS_PREG, $parts['path']);
701 701
 
702 702
 		if (self::LOG_LEVEL > 1 || self::LOG_LEVEL > 0 && $deny)
703 703
 		{
@@ -717,21 +717,21 @@  discard block
 block discarded – undo
717 717
 	 * @todo get $force_download working through webdav
718 718
 	 * @return string|false string with full download url or false to use default webdav.php url
719 719
 	 */
720
-	static function download_url($_url,$force_download=false)
720
+	static function download_url($_url, $force_download = false)
721 721
 	{
722
-		unset($force_download);	// not used, but required by interface
722
+		unset($force_download); // not used, but required by interface
723 723
 
724
-		list($url,$query) = explode('?',$_url,2);
724
+		list($url, $query) = explode('?', $_url, 2);
725 725
 		$get = null;
726
-		parse_str($query,$get);
727
-		if (empty($get['url'])) return false;	// no download url given for this mount-point
726
+		parse_str($query, $get);
727
+		if (empty($get['url'])) return false; // no download url given for this mount-point
728 728
 
729
-		if (!($mount_url = Vfs::mount_url($_url))) return false;	// no mount url found, should not happen
730
-		list($mount_url) = explode('?',$mount_url);
729
+		if (!($mount_url = Vfs::mount_url($_url))) return false; // no mount url found, should not happen
730
+		list($mount_url) = explode('?', $mount_url);
731 731
 
732
-		$relpath = substr($url,strlen($mount_url));
732
+		$relpath = substr($url, strlen($mount_url));
733 733
 
734
-		$download_url = Vfs::concat($get['url'],$relpath);
734
+		$download_url = Vfs::concat($get['url'], $relpath);
735 735
 		if ($download_url[0] == '/')
736 736
 		{
737 737
 			$download_url = ($_SERVER['HTTPS'] ? 'https://' : 'http://').
Please login to merge, or discard this patch.
Braces   +87 added lines, -22 removed lines patch added patch discarded remove patch
@@ -131,7 +131,9 @@  discard block
 block discarded – undo
131 131
 		$read_only = str_replace('b','',$mode) == 'r';
132 132
 
133 133
 		// check access rights, based on the eGW mount perms
134
-		if (!($stat = $this->url_stat($url,0)) || $mode[0] == 'x')	// file not found or file should NOT exist
134
+		if (!($stat = $this->url_stat($url,0)) || $mode[0] == 'x')
135
+		{
136
+			// file not found or file should NOT exist
135 137
 		{
136 138
 			if ($mode[0] == 'r' ||	// does $mode require the file to exist (r,r+)
137 139
 				$mode[0] == 'x' ||	// or file should not exist, but does
@@ -139,6 +141,7 @@  discard block
 block discarded – undo
139 141
 				!Vfs::check_access($dir,Vfs::WRITABLE,$dir_stat=$this->url_stat($dir,0)))	// or we are not allowed to 																																			create it
140 142
 			{
141 143
 				if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) file does not exist or can not be created!");
144
+		}
142 145
 				if (!($options & STREAM_URL_STAT_QUIET))
143 146
 				{
144 147
 					trigger_error(__METHOD__."($url,$mode,$options) file does not exist or can not be created!",E_USER_WARNING);
@@ -146,9 +149,12 @@  discard block
 block discarded – undo
146 149
 				return false;
147 150
 			}
148 151
 		}
149
-		elseif (!$read_only && !Vfs::check_access($url,Vfs::WRITABLE,$stat))	// we are not allowed to edit it
152
+		elseif (!$read_only && !Vfs::check_access($url,Vfs::WRITABLE,$stat))
153
+		{
154
+			// we are not allowed to edit it
150 155
 		{
151 156
 			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) file can not be edited!");
157
+		}
152 158
 			if (!($options & STREAM_URL_STAT_QUIET))
153 159
 			{
154 160
 				trigger_error(__METHOD__."($url,$mode,$options) file can not be edited!",E_USER_WARNING);
@@ -157,7 +163,10 @@  discard block
 block discarded – undo
157 163
 		}
158 164
 		if (!$read_only && self::deny_script($url))
159 165
 		{
160
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) permission denied, file is a script!");
166
+			if (self::LOG_LEVEL)
167
+			{
168
+				error_log(__METHOD__."($url,$mode,$options) permission denied, file is a script!");
169
+			}
161 170
 			if (!($options & STREAM_URL_STAT_QUIET))
162 171
 			{
163 172
 				trigger_error(__METHOD__."($url,$mode,$options) permission denied, file is a script!",E_USER_WARNING);
@@ -168,7 +177,10 @@  discard block
 block discarded – undo
168 177
 		// open the "real" file
169 178
 		if (!($this->opened_stream = fopen($path=Vfs::decodePath(Vfs::parse_url($url,PHP_URL_PATH)),$mode,$options)))
170 179
 		{
171
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url,$mode,$options) fopen('$path','$mode',$options) returned false!");
180
+			if (self::LOG_LEVEL)
181
+			{
182
+				error_log(__METHOD__."($url,$mode,$options) fopen('$path','$mode',$options) returned false!");
183
+			}
172 184
 			return false;
173 185
 		}
174 186
 		$this->opened_stream_url = $url;
@@ -313,7 +325,10 @@  discard block
 block discarded – undo
313 325
 		// check access rights (file need to exist and directory need to be writable
314 326
 		if (!file_exists($path) || is_dir($path) || !($dir = Vfs::dirname($url)) || !Vfs::check_access($dir,Vfs::WRITABLE))
315 327
 		{
316
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
328
+			if (self::LOG_LEVEL)
329
+			{
330
+				error_log(__METHOD__."($url) permission denied!");
331
+			}
317 332
 			return false;	// no permission or file does not exist
318 333
 		}
319 334
 		return unlink($path);
@@ -339,17 +354,26 @@  discard block
 block discarded – undo
339 354
 		// check access rights
340 355
 		if (!($from_stat = $this->url_stat($url_from,0)) || !($dir = Vfs::dirname($url_from)) || !Vfs::check_access($dir,Vfs::WRITABLE))
341 356
 		{
342
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url_from,$url_to): $from[path] permission denied!");
357
+			if (self::LOG_LEVEL)
358
+			{
359
+				error_log(__METHOD__."($url_from,$url_to): $from[path] permission denied!");
360
+			}
343 361
 			return false;	// no permission or file does not exist
344 362
 		}
345 363
 		if (!($to_dir = Vfs::dirname($url_to)) || !Vfs::check_access($to_dir,Vfs::WRITABLE,$to_dir_stat = $this->url_stat($to_dir,0)))
346 364
 		{
347
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url_from,$url_to): $to_dir permission denied!");
365
+			if (self::LOG_LEVEL)
366
+			{
367
+				error_log(__METHOD__."($url_from,$url_to): $to_dir permission denied!");
368
+			}
348 369
 			return false;	// no permission or parent-dir does not exist
349 370
 		}
350 371
 		if (self::deny_script($url_to))
351 372
 		{
352
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url_from,$url_to) permission denied, file is a script!");
373
+			if (self::LOG_LEVEL)
374
+			{
375
+				error_log(__METHOD__."($url_from,$url_to) permission denied, file is a script!");
376
+			}
353 377
 			return false;
354 378
 		}
355 379
 		// the filesystem stream-wrapper does NOT allow to rename files to directories, as this makes problems
@@ -358,13 +382,19 @@  discard block
 block discarded – undo
358 382
 			($to_stat['mime'] === self::DIR_MIME_TYPE) !== ($from_stat['mime'] === self::DIR_MIME_TYPE))
359 383
 		{
360 384
 			$is_dir = $to_stat['mime'] === self::DIR_MIME_TYPE ? 'a' : 'no';
361
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url_to,$url_from) $to[path] is $is_dir directory!");
385
+			if (self::LOG_LEVEL)
386
+			{
387
+				error_log(__METHOD__."($url_to,$url_from) $to[path] is $is_dir directory!");
388
+			}
362 389
 			return false;	// no permission or file does not exist
363 390
 		}
364 391
 		// if destination file already exists, delete it
365 392
 		if ($to_stat && !self::unlink($url_to))
366 393
 		{
367
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url_to,$url_from) can't unlink existing $url_to!");
394
+			if (self::LOG_LEVEL)
395
+			{
396
+				error_log(__METHOD__."($url_to,$url_from) can't unlink existing $url_to!");
397
+			}
368 398
 			return false;
369 399
 		}
370 400
 		return rename(Vfs::decodePath($from['path']),Vfs::decodePath($to['path']));
@@ -399,7 +429,10 @@  discard block
 block discarded – undo
399 429
 		// check access rights (in real filesystem AND by mount perms)
400 430
 		if (!$parent_url || file_exists($path) || !file_exists($parent) || !is_writable($parent) || !Vfs::check_access($parent_url,Vfs::WRITABLE))
401 431
 		{
402
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
432
+			if (self::LOG_LEVEL)
433
+			{
434
+				error_log(__METHOD__."($url) permission denied!");
435
+			}
403 436
 			return false;
404 437
 		}
405 438
 		return mkdir($path, 0700, $recursive);	// setting mode 0700 allows (only) apache to write into the dir
@@ -425,7 +458,10 @@  discard block
 block discarded – undo
425 458
 		// check access rights (in real filesystem AND by mount perms)
426 459
 		if (!file_exists($path) || !is_writable($parent) || !($dir = Vfs::dirname($url)) || !Vfs::check_access($dir, Vfs::WRITABLE))
427 460
 		{
428
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
461
+			if (self::LOG_LEVEL)
462
+			{
463
+				error_log(__METHOD__."($url) permission denied!");
464
+			}
429 465
 			return false;
430 466
 		}
431 467
 		return rmdir($path);
@@ -448,7 +484,7 @@  discard block
 block discarded – undo
448 484
 	function stream_metadata($url, $option, $value)
449 485
 	{
450 486
  		if ($option != STREAM_META_TOUCH)
451
-		{
487
+ 		{
452 488
 			return false;	// not implemented / supported
453 489
 		}
454 490
 
@@ -458,7 +494,10 @@  discard block
 block discarded – undo
458 494
 		// check access rights (in real filesystem AND by mount perms)
459 495
 		if (!file_exists($path) || !is_writable($parent) || !($dir = Vfs::dirname($url)) || !Vfs::check_access($dir, Vfs::WRITABLE))
460 496
 		{
461
-			if (self::LOG_LEVEL) error_log(__METHOD__."($url) permission denied!");
497
+			if (self::LOG_LEVEL)
498
+			{
499
+				error_log(__METHOD__."($url) permission denied!");
500
+			}
462 501
 			return false;
463 502
 		}
464 503
 
@@ -475,7 +514,10 @@  discard block
 block discarded – undo
475 514
 	 */
476 515
 	function dir_opendir ( $url, $options )
477 516
 	{
478
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$options)");
517
+		if (self::LOG_LEVEL > 1)
518
+		{
519
+			error_log(__METHOD__."($url,$options)");
520
+		}
479 521
 
480 522
 		$this->opened_dir = null;
481 523
 
@@ -485,7 +527,10 @@  discard block
 block discarded – undo
485 527
 
486 528
 		if (!($this->opened_dir = opendir($path)))
487 529
 		{
488
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__."($url,$options) opendir('$path') failed!");
530
+			if (self::LOG_LEVEL > 0)
531
+			{
532
+				error_log(__METHOD__."($url,$options) opendir('$path') failed!");
533
+			}
489 534
 			return false;
490 535
 		}
491 536
 		return true;
@@ -541,7 +586,10 @@  discard block
 block discarded – undo
541 586
 				$stat['mode'] = $stat[2] = $stat['mode'] & ~0222;
542 587
 			}
543 588
 		}
544
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$flags) path=$path, mount_mode=".sprintf('0%o',$mode).", mode=".sprintf('0%o',$stat['mode']).'='.Vfs::int2mode($stat['mode']));
589
+		if (self::LOG_LEVEL > 1)
590
+		{
591
+			error_log(__METHOD__."($url,$flags) path=$path, mount_mode=".sprintf('0%o',$mode).", mode=".sprintf('0%o',$stat['mode']).'='.Vfs::int2mode($stat['mode']));
592
+		}
545 593
 		return $stat;
546 594
 	}
547 595
 
@@ -562,14 +610,23 @@  discard block
 block discarded – undo
562 610
 
563 611
 			$ignore = !($file === false ||							// stop if no more dirs or
564 612
 				($file != '.' && $file != '..' ));					// file not . or ..
565
-			if (self::LOG_LEVEL > 1 && $ignore) error_log(__METHOD__.'() ignoring '.array2string($file));
613
+			if (self::LOG_LEVEL > 1 && $ignore)
614
+			{
615
+				error_log(__METHOD__.'() ignoring '.array2string($file));
616
+			}
566 617
 		}
567 618
 		while ($ignore);
568 619
 
569 620
 		// encode special chars messing up url's
570
-		if ($file !== false) $file = Vfs::encodePathComponent($file);
621
+		if ($file !== false)
622
+		{
623
+			$file = Vfs::encodePathComponent($file);
624
+		}
571 625
 
572
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__.'() returning '.array2string($file));
626
+		if (self::LOG_LEVEL > 1)
627
+		{
628
+			error_log(__METHOD__.'() returning '.array2string($file));
629
+		}
573 630
 
574 631
 		return $file;
575 632
 	}
@@ -724,9 +781,17 @@  discard block
 block discarded – undo
724 781
 		list($url,$query) = explode('?',$_url,2);
725 782
 		$get = null;
726 783
 		parse_str($query,$get);
727
-		if (empty($get['url'])) return false;	// no download url given for this mount-point
784
+		if (empty($get['url']))
785
+		{
786
+			return false;
787
+		}
788
+		// no download url given for this mount-point
728 789
 
729
-		if (!($mount_url = Vfs::mount_url($_url))) return false;	// no mount url found, should not happen
790
+		if (!($mount_url = Vfs::mount_url($_url)))
791
+		{
792
+			return false;
793
+		}
794
+		// no mount url found, should not happen
730 795
 		list($mount_url) = explode('?',$mount_url);
731 796
 
732 797
 		$relpath = substr($url,strlen($mount_url));
Please login to merge, or discard this patch.
api/src/Vfs/Hooks.php 3 patches
Doc Comments   -15 removed lines patch added patch discarded remove patch
@@ -37,8 +37,6 @@  discard block
 block discarded – undo
37 37
 	 * Hook called after new accounts have been added
38 38
 	 *
39 39
 	 * @param array $data
40
-	 * @param int $data['account_id'] numerical id
41
-	 * @param string $data['account_lid'] account-name
42 40
 	 */
43 41
 	static function addAccount($data)
44 42
 	{
@@ -58,9 +56,6 @@  discard block
 block discarded – undo
58 56
 	 * Hook called after accounts has been modified
59 57
 	 *
60 58
 	 * @param array $data
61
-	 * @param int $data['account_id'] numerical id
62
-	 * @param string $data['account_lid'] new account-name
63
-	 * @param string $data['old_loginid'] old account-name
64 59
 	 */
65 60
 	static function editAccount($data)
66 61
 	{
@@ -79,9 +74,6 @@  discard block
 block discarded – undo
79 74
 	 * Hook called before an account get deleted
80 75
 	 *
81 76
 	 * @param array $data
82
-	 * @param int $data['account_id'] numerical id
83
-	 * @param string $data['account_lid'] account-name
84
-	 * @param int $data['new_owner'] account-id of new owner, or false if data should get deleted
85 77
 	 */
86 78
 	static function deleteAccount($data)
87 79
 	{
@@ -114,8 +106,6 @@  discard block
 block discarded – undo
114 106
 	 * Hook called after new groups have been added
115 107
 	 *
116 108
 	 * @param array $data
117
-	 * @param int $data['account_id'] numerical id
118
-	 * @param string $data['account_lid'] group-name
119 109
 	 */
120 110
 	static function addGroup($data)
121 111
 	{
@@ -140,9 +130,6 @@  discard block
 block discarded – undo
140 130
 	 * or if the group directory exists and creates it if not.
141 131
 	 *
142 132
 	 * @param array $data
143
-	 * @param int $data['account_id'] numerical id
144
-	 * @param string $data['account_lid'] new group-name
145
-	 * @param string $data['old_name'] old account-name
146 133
 	 */
147 134
 	static function editGroup($data)
148 135
 	{
@@ -170,8 +157,6 @@  discard block
 block discarded – undo
170 157
 	 * Hook called before a group get deleted
171 158
 	 *
172 159
 	 * @param array $data
173
-	 * @param int $data['account_id'] numerical id
174
-	 * @param string $data['account_lid'] account-name
175 160
 	 */
176 161
 	static function deleteGroup($data)
177 162
 	{
Please login to merge, or discard this patch.
Spacing   +15 added lines, -15 removed lines patch added patch discarded remove patch
@@ -45,11 +45,11 @@  discard block
 block discarded – undo
45 45
 		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
46 46
 		// create a user-dir
47 47
 		Api\Vfs::$is_root = true;
48
-		if (Api\Vfs::file_exists($dir='/home/'.$data['account_lid']) || Api\Vfs::mkdir($dir, 0700, 0))
48
+		if (Api\Vfs::file_exists($dir = '/home/'.$data['account_lid']) || Api\Vfs::mkdir($dir, 0700, 0))
49 49
 		{
50
-			Api\Vfs::chown($dir,(int)$data['account_id']);
51
-			Api\Vfs::chgrp($dir,0);
52
-			Api\Vfs::chmod($dir,0700);	// only user has access
50
+			Api\Vfs::chown($dir, (int)$data['account_id']);
51
+			Api\Vfs::chgrp($dir, 0);
52
+			Api\Vfs::chmod($dir, 0700); // only user has access
53 53
 		}
54 54
 		Api\Vfs::$is_root = false;
55 55
 	}
@@ -67,11 +67,11 @@  discard block
 block discarded – undo
67 67
 		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
68 68
 		if (empty($data['account_lid']) || empty($data['old_loginid']) || $data['account_lid'] == $data['old_loginid'])
69 69
 		{
70
-			return;	// nothing to do here
70
+			return; // nothing to do here
71 71
 		}
72 72
 		// rename the user-dir
73 73
 		Api\Vfs::$is_root = true;
74
-		Api\Vfs::rename('/home/'.$data['old_loginid'],'/home/'.$data['account_lid']);
74
+		Api\Vfs::rename('/home/'.$data['old_loginid'], '/home/'.$data['account_lid']);
75 75
 		Api\Vfs::$is_root = false;
76 76
 	}
77 77
 
@@ -90,15 +90,15 @@  discard block
 block discarded – undo
90 90
 		if ($data['new_owner'] && ($new_lid = $GLOBALS['egw']->accounts->id2name($data['new_owner'])))
91 91
 		{
92 92
 			// copy content of user-dir to new owner's user-dir as old-home-$name
93
-			for ($i=''; file_exists(Api\Vfs::PREFIX.($new_dir = '/home/'.$new_lid.'/old-home-'.$data['account_lid'].$i)); $i++)
93
+			for ($i = ''; file_exists(Api\Vfs::PREFIX.($new_dir = '/home/'.$new_lid.'/old-home-'.$data['account_lid'].$i)); $i++)
94 94
 			{
95 95
 
96 96
 			}
97
-			Api\Vfs::rename('/home/'.$data['account_lid'],$new_dir);
97
+			Api\Vfs::rename('/home/'.$data['account_lid'], $new_dir);
98 98
 			// make the new owner the owner of the dir and it's content
99 99
 			Api\Vfs::find($new_dir, array(), 'EGroupware\Api\Vfs::chown', $data['new_owner']);
100 100
 		}
101
-		elseif(!empty($data['account_lid']) && $data['account_lid'] != '/')
101
+		elseif (!empty($data['account_lid']) && $data['account_lid'] != '/')
102 102
 		{
103 103
 			// delete the user-directory
104 104
 			Api\Vfs::remove('/home/'.$data['account_lid']);
@@ -124,11 +124,11 @@  discard block
 block discarded – undo
124 124
 
125 125
 		// create a group-dir
126 126
 		Api\Vfs::$is_root = true;
127
-		if (Api\Vfs::file_exists($dir='/home/'.$data['account_lid']) || Api\Vfs::mkdir($dir, 0070, 0))
127
+		if (Api\Vfs::file_exists($dir = '/home/'.$data['account_lid']) || Api\Vfs::mkdir($dir, 0070, 0))
128 128
 		{
129
-			Api\Vfs::chown($dir,0);
130
-			Api\Vfs::chgrp($dir,abs($data['account_id']));	// gid in Vfs is positiv!
131
-			Api\Vfs::chmod($dir,0070);	// only group has access
129
+			Api\Vfs::chown($dir, 0);
130
+			Api\Vfs::chgrp($dir, abs($data['account_id'])); // gid in Vfs is positiv!
131
+			Api\Vfs::chmod($dir, 0070); // only group has access
132 132
 		}
133 133
 		Api\Vfs::$is_root = false;
134 134
 	}
@@ -161,7 +161,7 @@  discard block
 block discarded – undo
161 161
 		{
162 162
 			// rename the group-dir
163 163
 			Api\Vfs::$is_root = true;
164
-			Api\Vfs::rename('/home/'.$data['old_name'],'/home/'.$data['account_lid']);
164
+			Api\Vfs::rename('/home/'.$data['old_name'], '/home/'.$data['account_lid']);
165 165
 			Api\Vfs::$is_root = false;
166 166
 		}
167 167
 	}
@@ -177,7 +177,7 @@  discard block
 block discarded – undo
177 177
 	{
178 178
 		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
179 179
 
180
-		if(empty($data['account_lid']) || $data['account_lid'] == '/')
180
+		if (empty($data['account_lid']) || $data['account_lid'] == '/')
181 181
 		{
182 182
 			throw new Api\Exception\AssertionFailed(__METHOD__.'('.array2string($data).') account_lid NOT set!');
183 183
 		}
Please login to merge, or discard this patch.
Braces   +32 added lines, -8 removed lines patch added patch discarded remove patch
@@ -42,7 +42,10 @@  discard block
 block discarded – undo
42 42
 	 */
43 43
 	static function addAccount($data)
44 44
 	{
45
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
45
+		if (self::LOG_LEVEL > 0)
46
+		{
47
+			error_log(__METHOD__.'('.array2string($data).')');
48
+		}
46 49
 		// create a user-dir
47 50
 		Api\Vfs::$is_root = true;
48 51
 		if (Api\Vfs::file_exists($dir='/home/'.$data['account_lid']) || Api\Vfs::mkdir($dir, 0700, 0))
@@ -64,7 +67,10 @@  discard block
 block discarded – undo
64 67
 	 */
65 68
 	static function editAccount($data)
66 69
 	{
67
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
70
+		if (self::LOG_LEVEL > 0)
71
+		{
72
+			error_log(__METHOD__.'('.array2string($data).')');
73
+		}
68 74
 		if (empty($data['account_lid']) || empty($data['old_loginid']) || $data['account_lid'] == $data['old_loginid'])
69 75
 		{
70 76
 			return;	// nothing to do here
@@ -85,7 +91,10 @@  discard block
 block discarded – undo
85 91
 	 */
86 92
 	static function deleteAccount($data)
87 93
 	{
88
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
94
+		if (self::LOG_LEVEL > 0)
95
+		{
96
+			error_log(__METHOD__.'('.array2string($data).')');
97
+		}
89 98
 		Api\Vfs::$is_root = true;
90 99
 		if ($data['new_owner'] && ($new_lid = $GLOBALS['egw']->accounts->id2name($data['new_owner'])))
91 100
 		{
@@ -119,8 +128,14 @@  discard block
 block discarded – undo
119 128
 	 */
120 129
 	static function addGroup($data)
121 130
 	{
122
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
123
-		if (empty($data['account_lid'])) throw new Api\Exception\WrongParameter('account_lid must not be empty!');
131
+		if (self::LOG_LEVEL > 0)
132
+		{
133
+			error_log(__METHOD__.'('.array2string($data).')');
134
+		}
135
+		if (empty($data['account_lid']))
136
+		{
137
+			throw new Api\Exception\WrongParameter('account_lid must not be empty!');
138
+		}
124 139
 
125 140
 		// create a group-dir
126 141
 		Api\Vfs::$is_root = true;
@@ -146,8 +161,14 @@  discard block
 block discarded – undo
146 161
 	 */
147 162
 	static function editGroup($data)
148 163
 	{
149
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
150
-		if (empty($data['account_lid']) || empty($data['old_name'])) throw new Api\Exception\WrongParameter('account_lid and old_name must not be empty!');
164
+		if (self::LOG_LEVEL > 0)
165
+		{
166
+			error_log(__METHOD__.'('.array2string($data).')');
167
+		}
168
+		if (empty($data['account_lid']) || empty($data['old_name']))
169
+		{
170
+			throw new Api\Exception\WrongParameter('account_lid and old_name must not be empty!');
171
+		}
151 172
 
152 173
 		if ($data['account_lid'] == $data['old_name'])
153 174
 		{
@@ -175,7 +196,10 @@  discard block
 block discarded – undo
175 196
 	 */
176 197
 	static function deleteGroup($data)
177 198
 	{
178
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($data).')');
199
+		if (self::LOG_LEVEL > 0)
200
+		{
201
+			error_log(__METHOD__.'('.array2string($data).')');
202
+		}
179 203
 
180 204
 		if(empty($data['account_lid']) || $data['account_lid'] == '/')
181 205
 		{
Please login to merge, or discard this patch.
api/src/Vfs/Links/StreamWrapper.php 3 patches
Doc Comments   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -316,7 +316,7 @@
 block discarded – undo
316 316
 	 *
317 317
 	 * @param string $url URL that was passed to opendir() and that this object is expected to explore.
318 318
 	 * @param $options
319
-	 * @return booelan
319
+	 * @return boolean
320 320
 	 */
321 321
 	function dir_opendir ( $url, $options )
322 322
 	{
Please login to merge, or discard this patch.
Spacing   +54 added lines, -54 removed lines patch added patch discarded remove patch
@@ -76,34 +76,34 @@  discard block
 block discarded – undo
76 76
 	 * @param int $check mode to check: one or more or'ed together of: 4 = read, 2 = write, 1 = executable
77 77
 	 * @return boolean
78 78
 	 */
79
-	static function check_extended_acl($url,$check)
79
+	static function check_extended_acl($url, $check)
80 80
 	{
81 81
 		if (Vfs::$is_root)
82 82
 		{
83 83
 			return true;
84 84
 		}
85
-		$path = Vfs::parse_url($url,PHP_URL_PATH);
85
+		$path = Vfs::parse_url($url, PHP_URL_PATH);
86 86
 
87
-		list(,$apps,$app,$id,$rel_path) = explode('/',$path,5);
87
+		list(,$apps, $app, $id, $rel_path) = explode('/', $path, 5);
88 88
 
89 89
 		if ($apps != 'apps')
90 90
 		{
91
-			$access = false;							// no access to anything, but /apps
91
+			$access = false; // no access to anything, but /apps
92 92
 			$what = '!= apps';
93 93
 		}
94 94
 		elseif (!$app)
95 95
 		{
96
-			$access = !($check & Vfs::WRITABLE);	// always grant read access to /apps
96
+			$access = !($check&Vfs::WRITABLE); // always grant read access to /apps
97 97
 			$what = '!$app';
98 98
 		}
99 99
 		elseif (!self::check_app_rights($app))
100 100
 		{
101
-			$access = false;							// user has no access to the $app application
101
+			$access = false; // user has no access to the $app application
102 102
 			$what = 'no app-rights';
103 103
 		}
104 104
 		elseif (!$id)
105 105
 		{
106
-			$access = true;								// grant read&write access to /apps/$app
106
+			$access = true; // grant read&write access to /apps/$app
107 107
 			$what = 'app dir';
108 108
 		}
109 109
 		// allow applications to implement their own access control to the file storage
@@ -112,11 +112,11 @@  discard block
 block discarded – undo
112 112
 		else
113 113
 		{
114 114
 			// vfs & stream-wrapper use posix rights, Api\Link::file_access uses Api\Acl::{EDIT|READ}!
115
-			$required = $check & Vfs::WRITABLE ? Api\Acl::EDIT : Api\Acl::READ;
116
-			$access = Api\Link::file_access($app,$id,$required,$rel_path,Vfs::$user);
115
+			$required = $check&Vfs::WRITABLE ? Api\Acl::EDIT : Api\Acl::READ;
116
+			$access = Api\Link::file_access($app, $id, $required, $rel_path, Vfs::$user);
117 117
 			$what = "from Api\Link::file_access('$app',$id,$required,'$rel_path,".Vfs::$user.")";
118 118
 		}
119
-		if (self::DEBUG) error_log(__METHOD__."($url,$check) user=".Vfs::$user." ($what) ".($access?"access granted ($app:$id:$rel_path)":'no access!!!'));
119
+		if (self::DEBUG) error_log(__METHOD__."($url,$check) user=".Vfs::$user." ($what) ".($access ? "access granted ($app:$id:$rel_path)" : 'no access!!!'));
120 120
 		return $access;
121 121
 	}
122 122
 
@@ -157,19 +157,19 @@  discard block
 block discarded – undo
157 157
 	 *                          stat triggers it's own warning anyway, so it makes no sense to trigger one by our stream-wrapper!
158 158
 	 * @return array
159 159
 	 */
160
-	function url_stat ( $url, $flags )
160
+	function url_stat($url, $flags)
161 161
 	{
162
-		$eacl_check=self::check_extended_acl($url,Vfs::READABLE);
162
+		$eacl_check = self::check_extended_acl($url, Vfs::READABLE);
163 163
 
164 164
 		// return vCard as /.entry
165
-		if ( $eacl_check && substr($url,-7) == '/.entry' &&
166
-			(list($app) = array_slice(explode('/',$url),-3,1)) && $app === 'addressbook')
165
+		if ($eacl_check && substr($url, -7) == '/.entry' &&
166
+			(list($app) = array_slice(explode('/', $url), -3, 1)) && $app === 'addressbook')
167 167
 		{
168 168
 			$ret = array(
169 169
 				'ino'   => '#'.md5($url),
170 170
 				'name'  => '.entry',
171
-				'mode'  => self::MODE_FILE|Vfs::READABLE,	// required by the stream wrapper
172
-				'size'  => 1024,	// fmail does NOT attach files with size 0!
171
+				'mode'  => self::MODE_FILE|Vfs::READABLE, // required by the stream wrapper
172
+				'size'  => 1024, // fmail does NOT attach files with size 0!
173 173
 				'uid'   => 0,
174 174
 				'gid'   => 0,
175 175
 				'mtime' => time(),
@@ -180,15 +180,15 @@  discard block
 block discarded – undo
180 180
 			);
181 181
 		}
182 182
 		// if entry directory does not exist --> return fake directory
183
-		elseif (!($ret = parent::url_stat($url,$flags)) && $eacl_check)
183
+		elseif (!($ret = parent::url_stat($url, $flags)) && $eacl_check)
184 184
 		{
185
-			list(,/*$apps*/,/*$app*/,$id,$rel_path) = explode('/', Vfs::parse_url($url, PHP_URL_PATH), 5);
185
+			list(,/*$apps*/, /*$app*/, $id, $rel_path) = explode('/', Vfs::parse_url($url, PHP_URL_PATH), 5);
186 186
 			if ($id && !isset($rel_path))
187 187
 			{
188 188
 				$ret = array(
189 189
 					'ino'   => '#'.md5($url),
190 190
 					'name'  => $id,
191
-					'mode'  => self::MODE_DIR,	// required by the stream wrapper
191
+					'mode'  => self::MODE_DIR, // required by the stream wrapper
192 192
 					'size'  => 0,
193 193
 					'uid'   => 0,
194 194
 					'gid'   => 0,
@@ -215,9 +215,9 @@  discard block
 block discarded – undo
215 215
 	 * @param int $fs_id =null fs_id to use, to not query it again (eg. because it's already deleted)
216 216
 	 * @return boolean true if acl is set/deleted, false on error
217 217
 	 */
218
-	static function eacl($path,$rights=null,$owner=null,$fs_id=null)
218
+	static function eacl($path, $rights = null, $owner = null, $fs_id = null)
219 219
 	{
220
-		unset($path, $rights, $owner, $fs_id);	// not used, but required by function signature
220
+		unset($path, $rights, $owner, $fs_id); // not used, but required by function signature
221 221
 
222 222
 		return false;
223 223
 	}
@@ -232,7 +232,7 @@  discard block
 block discarded – undo
232 232
 	 */
233 233
 	static function get_eacl($path)
234 234
 	{
235
-		unset($path);	// not used, but required by function signature
235
+		unset($path); // not used, but required by function signature
236 236
 
237 237
 		return false;
238 238
 	}
@@ -252,26 +252,26 @@  discard block
 block discarded – undo
252 252
 	 * @param int $options Posible values include STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE, we allways use recursive!
253 253
 	 * @return boolean TRUE on success or FALSE on failure
254 254
 	 */
255
-	function mkdir($path,$mode,$options)
255
+	function mkdir($path, $mode, $options)
256 256
 	{
257
-		unset($mode);	// not used, but required by function signature
257
+		unset($mode); // not used, but required by function signature
258 258
 
259
-		if($path[0] != '/')
259
+		if ($path[0] != '/')
260 260
 		{
261
-			if (strpos($path,'?') !== false) $query = Vfs::parse_url($path,PHP_URL_QUERY);
262
-			$path = Vfs::parse_url($path,PHP_URL_PATH).($query ? '?'.$query : '');
261
+			if (strpos($path, '?') !== false) $query = Vfs::parse_url($path, PHP_URL_QUERY);
262
+			$path = Vfs::parse_url($path, PHP_URL_PATH).($query ? '?'.$query : '');
263 263
 		}
264
-		list(,$apps,$app,$id) = explode('/',$path);
264
+		list(,$apps, $app, $id) = explode('/', $path);
265 265
 
266 266
 		$ret = false;
267
-		if ($apps == 'apps' && $app && !$id || self::check_extended_acl($path,Vfs::WRITABLE))	// app directory itself is allways ok
267
+		if ($apps == 'apps' && $app && !$id || self::check_extended_acl($path, Vfs::WRITABLE))	// app directory itself is allways ok
268 268
 		{
269 269
 			$current_is_root = Vfs::$is_root; Vfs::$is_root = true;
270 270
 			$current_user = Vfs::$user; Vfs::$user = 0;
271 271
 
272 272
 			$sqlfs = new parent();
273
-			$ret = $sqlfs->mkdir($path,0,$options|STREAM_MKDIR_RECURSIVE);
274
-			if ($id) $sqlfs->chmod($path,0);	// no other rights
273
+			$ret = $sqlfs->mkdir($path, 0, $options|STREAM_MKDIR_RECURSIVE);
274
+			if ($id) $sqlfs->chmod($path, 0); // no other rights
275 275
 
276 276
 			Vfs::$user = $current_user;
277 277
 			Vfs::$is_root = $current_is_root;
@@ -290,18 +290,18 @@  discard block
 block discarded – undo
290 290
 	 * @param int $options Possible values include STREAM_REPORT_ERRORS.
291 291
 	 * @return boolean TRUE on success or FALSE on failure.
292 292
 	 */
293
-	function rmdir ( $url, $options )
293
+	function rmdir($url, $options)
294 294
 	{
295
-		$path = $url != '/' ? Vfs::parse_url($url,PHP_URL_PATH) : $url;
295
+		$path = $url != '/' ? Vfs::parse_url($url, PHP_URL_PATH) : $url;
296 296
 
297
-		list(,/*$apps*/,/*$app*/,/*$id*/,$rest) = explode('/',$path);
297
+		list(,/*$apps*/, /*$app*/, /*$id*/, $rest) = explode('/', $path);
298 298
 
299 299
 		// never delete entry-dir, as it makes attic inaccessible
300 300
 		if (empty($rest))
301 301
 		{
302 302
 			return true;
303 303
 		}
304
-		return parent::rmdir( $path, $options );
304
+		return parent::rmdir($path, $options);
305 305
 	}
306 306
 
307 307
 	/**
@@ -319,23 +319,23 @@  discard block
 block discarded – undo
319 319
 	 * @param string $opened_path full path of the file/resource, if the open was successfull and STREAM_USE_PATH was set
320 320
 	 * @return boolean true if the ressource was opened successful, otherwise false
321 321
 	 */
322
-	function stream_open ( $url, $mode, $options, &$opened_path )
322
+	function stream_open($url, $mode, $options, &$opened_path)
323 323
 	{
324 324
 		// the following call is necessary to fill sqlfs_stream_wrapper::$stat_cache, WITH the extendes ACL!
325
-		$stat = $this->url_stat($url,0);
325
+		$stat = $this->url_stat($url, 0);
326 326
 		//error_log(__METHOD__."('$url', '$mode', $options) stat=".array2string($stat));
327 327
 
328 328
 		// return vCard as /.entry
329
-		if ($stat && $mode[0] == 'r' && substr($url,-7) === '/.entry' &&
330
-			(list($app) = array_slice(explode('/',$url),-3,1)) && $app === 'addressbook')
329
+		if ($stat && $mode[0] == 'r' && substr($url, -7) === '/.entry' &&
330
+			(list($app) = array_slice(explode('/', $url), -3, 1)) && $app === 'addressbook')
331 331
 		{
332
-			list($id) = array_slice(explode('/',$url),-2,1);
333
-			$ab_vcard = new addressbook_vcal('addressbook','text/vcard');
332
+			list($id) = array_slice(explode('/', $url), -2, 1);
333
+			$ab_vcard = new addressbook_vcal('addressbook', 'text/vcard');
334 334
 			if (!($charset = $GLOBALS['egw_info']['user']['preferences']['addressbook']['vcard_charset']))
335 335
 			{
336 336
 				$charset = 'utf-8';
337 337
 			}
338
-			if (!($vcard =& $ab_vcard->getVCard($id, $charset)))
338
+			if (!($vcard = & $ab_vcard->getVCard($id, $charset)))
339 339
 			{
340 340
 				error_log(__METHOD__."('$url', '$mode', $options) addressbook_vcal::getVCard($id) returned false!");
341 341
 				return false;
@@ -350,9 +350,9 @@  discard block
 block discarded – undo
350 350
 		if ($mode[0] != 'r' && ($dir = Vfs::dirname($url)) &&
351 351
 			!parent::url_stat($dir, 0) && self::check_extended_acl($dir, Vfs::WRITABLE))
352 352
 		{
353
-			$this->mkdir($dir,0,STREAM_MKDIR_RECURSIVE);
353
+			$this->mkdir($dir, 0, STREAM_MKDIR_RECURSIVE);
354 354
 		}
355
-		return parent::stream_open($url,$mode,$options,$opened_path);
355
+		return parent::stream_open($url, $mode, $options, $opened_path);
356 356
 	}
357 357
 
358 358
 	/**
@@ -364,7 +364,7 @@  discard block
 block discarded – undo
364 364
 	 * @param $options
365 365
 	 * @return booelan
366 366
 	 */
367
-	function dir_opendir ( $url, $options )
367
+	function dir_opendir($url, $options)
368 368
 	{
369 369
 		if (!parent::url_stat($url, STREAM_URL_STAT_QUIET) && $this->url_stat($url, STREAM_URL_STAT_QUIET))
370 370
 		{
@@ -381,20 +381,20 @@  discard block
 block discarded – undo
381 381
 	 * @param int $time =null modification time (unix timestamp), default null = current time
382 382
 	 * @param int $atime =null access time (unix timestamp), default null = current time, not implemented in the vfs!
383 383
 	 */
384
-	protected function touch($url,$time=null,$atime=null)
384
+	protected function touch($url, $time = null, $atime = null)
385 385
 	{
386 386
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$time,$atime)");
387 387
 
388
- 		if (!($stat = $this->url_stat($url,STREAM_URL_STAT_QUIET)))
388
+ 		if (!($stat = $this->url_stat($url, STREAM_URL_STAT_QUIET)))
389 389
 		{
390 390
 			// file does not exist --> create an empty one
391
-			if (!($f = fopen(self::SCHEME.'://default'.Vfs::parse_url($url,PHP_URL_PATH),'w')) || !fclose($f))
391
+			if (!($f = fopen(self::SCHEME.'://default'.Vfs::parse_url($url, PHP_URL_PATH), 'w')) || !fclose($f))
392 392
 			{
393 393
 				return false;
394 394
 			}
395 395
 		}
396 396
 
397
-		return is_null($time) ? true : parent::touch($url,$time,$atime);
397
+		return is_null($time) ? true : parent::touch($url, $time, $atime);
398 398
 	}
399 399
 
400 400
 	/**
@@ -406,20 +406,20 @@  discard block
 block discarded – undo
406 406
 	 * @param string $path_to
407 407
 	 * @return boolean TRUE on success or FALSE on failure
408 408
 	 */
409
-	function rename ( $path_from, $path_to )
409
+	function rename($path_from, $path_to)
410 410
 	{
411 411
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path_from,$path_to)");
412 412
 
413 413
 		// Check to make sure target _really_ exists, not just fake dir from Links/StreamWrapper
414 414
 		$path = Vfs::parse_url($path_to, PHP_URL_PATH);
415
-		list(,/*$apps*/,/*$app*/,$id) = explode('/', $path);
415
+		list(,/*$apps*/, /*$app*/, $id) = explode('/', $path);
416 416
 
417
-		if($id && !parent::url_stat(Vfs::dirname($path_to),STREAM_URL_STAT_QUIET))
417
+		if ($id && !parent::url_stat(Vfs::dirname($path_to), STREAM_URL_STAT_QUIET))
418 418
 		{
419
-			$this->mkdir(Vfs::dirname($path), 0, STREAM_MKDIR_RECURSIVE );
419
+			$this->mkdir(Vfs::dirname($path), 0, STREAM_MKDIR_RECURSIVE);
420 420
 		}
421 421
 
422
-		return parent::rename($path_from,$path_to);
422
+		return parent::rename($path_from, $path_to);
423 423
 	}
424 424
 
425 425
 	/**
Please login to merge, or discard this patch.
Braces   +35 added lines, -10 removed lines patch added patch discarded remove patch
@@ -26,7 +26,9 @@  discard block
 block discarded – undo
26 26
  */
27 27
 if (!class_exists('EGroupware\\Api\\Vfs\\Links\\LinksParent', false))
28 28
 {
29
-	class LinksParent extends Vfs\Sqlfs\StreamWrapper {}
29
+	class LinksParent extends Vfs\Sqlfs\StreamWrapper
30
+	{
31
+}
30 32
 }
31 33
 
32 34
 /**
@@ -116,7 +118,10 @@  discard block
 block discarded – undo
116 118
 			$access = Api\Link::file_access($app,$id,$required,$rel_path,Vfs::$user);
117 119
 			$what = "from Api\Link::file_access('$app',$id,$required,'$rel_path,".Vfs::$user.")";
118 120
 		}
119
-		if (self::DEBUG) error_log(__METHOD__."($url,$check) user=".Vfs::$user." ($what) ".($access?"access granted ($app:$id:$rel_path)":'no access!!!'));
121
+		if (self::DEBUG)
122
+		{
123
+			error_log(__METHOD__."($url,$check) user=".Vfs::$user." ($what) ".($access?"access granted ($app:$id:$rel_path)":'no access!!!'));
124
+		}
120 125
 		return $access;
121 126
 	}
122 127
 
@@ -200,7 +205,10 @@  discard block
 block discarded – undo
200 205
 				);
201 206
 			}
202 207
 		}
203
-		if (self::DEBUG) error_log(__METHOD__."('$url', $flags) calling parent::url_stat(,,".array2string($eacl_check).') returning '.array2string($ret));
208
+		if (self::DEBUG)
209
+		{
210
+			error_log(__METHOD__."('$url', $flags) calling parent::url_stat(,,".array2string($eacl_check).') returning '.array2string($ret));
211
+		}
204 212
 		return $ret;
205 213
 	}
206 214
 
@@ -258,20 +266,31 @@  discard block
 block discarded – undo
258 266
 
259 267
 		if($path[0] != '/')
260 268
 		{
261
-			if (strpos($path,'?') !== false) $query = Vfs::parse_url($path,PHP_URL_QUERY);
269
+			if (strpos($path,'?') !== false)
270
+			{
271
+				$query = Vfs::parse_url($path,PHP_URL_QUERY);
272
+			}
262 273
 			$path = Vfs::parse_url($path,PHP_URL_PATH).($query ? '?'.$query : '');
263 274
 		}
264 275
 		list(,$apps,$app,$id) = explode('/',$path);
265 276
 
266 277
 		$ret = false;
267
-		if ($apps == 'apps' && $app && !$id || self::check_extended_acl($path,Vfs::WRITABLE))	// app directory itself is allways ok
278
+		if ($apps == 'apps' && $app && !$id || self::check_extended_acl($path,Vfs::WRITABLE))
279
+		{
280
+			// app directory itself is allways ok
268 281
 		{
269
-			$current_is_root = Vfs::$is_root; Vfs::$is_root = true;
282
+			$current_is_root = Vfs::$is_root;
283
+		}
284
+		Vfs::$is_root = true;
270 285
 			$current_user = Vfs::$user; Vfs::$user = 0;
271 286
 
272 287
 			$sqlfs = new parent();
273 288
 			$ret = $sqlfs->mkdir($path,0,$options|STREAM_MKDIR_RECURSIVE);
274
-			if ($id) $sqlfs->chmod($path,0);	// no other rights
289
+			if ($id)
290
+			{
291
+				$sqlfs->chmod($path,0);
292
+			}
293
+			// no other rights
275 294
 
276 295
 			Vfs::$user = $current_user;
277 296
 			Vfs::$is_root = $current_is_root;
@@ -383,10 +402,13 @@  discard block
 block discarded – undo
383 402
 	 */
384 403
 	protected function touch($url,$time=null,$atime=null)
385 404
 	{
386
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($url,$time,$atime)");
405
+		if (self::LOG_LEVEL > 1)
406
+		{
407
+			error_log(__METHOD__."($url,$time,$atime)");
408
+		}
387 409
 
388 410
  		if (!($stat = $this->url_stat($url,STREAM_URL_STAT_QUIET)))
389
-		{
411
+ 		{
390 412
 			// file does not exist --> create an empty one
391 413
 			if (!($f = fopen(self::SCHEME.'://default'.Vfs::parse_url($url,PHP_URL_PATH),'w')) || !fclose($f))
392 414
 			{
@@ -408,7 +430,10 @@  discard block
 block discarded – undo
408 430
 	 */
409 431
 	function rename ( $path_from, $path_to )
410 432
 	{
411
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path_from,$path_to)");
433
+		if (self::LOG_LEVEL > 1)
434
+		{
435
+			error_log(__METHOD__."($path_from,$path_to)");
436
+		}
412 437
 
413 438
 		// Check to make sure target _really_ exists, not just fake dir from Links/StreamWrapper
414 439
 		$path = Vfs::parse_url($path_to, PHP_URL_PATH);
Please login to merge, or discard this patch.
api/src/Vfs/StreamWrapper.php 4 patches
Doc Comments   +4 added lines, -4 removed lines patch added patch discarded remove patch
@@ -454,7 +454,7 @@  discard block
 block discarded – undo
454 454
 	 *
455 455
 	 * If you have cached data in your stream but not yet stored it into the underlying storage, you should do so now.
456 456
 	 *
457
-	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
457
+	 * @return boolean TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
458 458
 	 */
459 459
 	function stream_flush ( )
460 460
 	{
@@ -856,7 +856,7 @@  discard block
 block discarded – undo
856 856
 	 * This method is called immediately when your stream object is created for examining directory contents with opendir().
857 857
 	 *
858 858
 	 * @param string $path URL that was passed to opendir() and that this object is expected to explore.
859
-	 * @return booelan
859
+	 * @return boolean
860 860
 	 */
861 861
 	function dir_opendir ( $path, $options )
862 862
 	{
@@ -1213,7 +1213,7 @@  discard block
 block discarded – undo
1213 1213
 	 * It should reset the output generated by dir_readdir(). i.e.:
1214 1214
 	 * The next call to dir_readdir() should return the first entry in the location returned by dir_opendir().
1215 1215
 	 *
1216
-	 * @return boolean
1216
+	 * @return boolean|null
1217 1217
 	 */
1218 1218
 	function dir_rewinddir ( )
1219 1219
 	{
@@ -1227,7 +1227,7 @@  discard block
 block discarded – undo
1227 1227
 	 *
1228 1228
 	 * You should release any resources which were locked or allocated during the opening and use of the directory stream.
1229 1229
 	 *
1230
-	 * @return boolean
1230
+	 * @return boolean|null
1231 1231
 	 */
1232 1232
 	function dir_closedir ( )
1233 1233
 	{
Please login to merge, or discard this patch.
Indentation   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -405,10 +405,10 @@  discard block
 block discarded – undo
405 405
  	 * Important: PHP 5.0 introduced a bug that wasn't fixed until 5.1: the return value has to be the oposite!
406 406
  	 *
407 407
  	 * if(version_compare(PHP_VERSION,'5.0','>=') && version_compare(PHP_VERSION,'5.1','<'))
408
-  	 * {
408
+ 	 * {
409 409
  	 * 		$eof = !$eof;
410 410
  	 * }
411
-  	 *
411
+ 	 *
412 412
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
413 413
  	 */
414 414
 	function stream_eof ( )
@@ -916,7 +916,7 @@  discard block
 block discarded – undo
916 916
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url'): ".function_backtrace(1));
917 917
 
918 918
 		while (($rel_path = Vfs::basename($url).($rel_path ? '/'.$rel_path : '')) &&
919
-		       ($url = Vfs::dirname($url)))
919
+			   ($url = Vfs::dirname($url)))
920 920
 		{
921 921
 			if (($stat = $this->url_stat($url, 0, false, false)))
922 922
 			{
Please login to merge, or discard this patch.
Spacing   +132 added lines, -133 removed lines patch added patch discarded remove patch
@@ -157,14 +157,14 @@  discard block
 block discarded – undo
157 157
 	 * @param array|boolean &$stat=null on return: stat of existing file or false for non-existing files
158 158
 	 * @return string|boolean false if the url cant be resolved, should not happen if fstab has a root entry
159 159
 	 */
160
-	function resolve_url_symlinks($_path,$file_exists=true,$resolve_last_symlink=true,&$stat=null)
160
+	function resolve_url_symlinks($_path, $file_exists = true, $resolve_last_symlink = true, &$stat = null)
161 161
 	{
162 162
 		$path = self::get_path($_path);
163 163
 
164
-		if (!($stat = $this->url_stat($path,$resolve_last_symlink?0:STREAM_URL_STAT_LINK)) && !$file_exists)
164
+		if (!($stat = $this->url_stat($path, $resolve_last_symlink ? 0 : STREAM_URL_STAT_LINK)) && !$file_exists)
165 165
 		{
166 166
 			$url = null;
167
-			$stat = self::check_symlink_components($path,0,$url);
167
+			$stat = self::check_symlink_components($path, 0, $url);
168 168
 			if (self::LOG_LEVEL > 1) $log = " (check_symlink_components('$path',0,'$url') = $stat)";
169 169
 		}
170 170
 		else
@@ -172,9 +172,9 @@  discard block
 block discarded – undo
172 172
 			$url = $stat['url'];
173 173
 		}
174 174
 		// if the url resolves to a symlink to the vfs, resolve this vfs:// url direct
175
-		if ($url && Vfs::parse_url($url,PHP_URL_SCHEME) == self::SCHEME)
175
+		if ($url && Vfs::parse_url($url, PHP_URL_SCHEME) == self::SCHEME)
176 176
 		{
177
-			$url = self::resolve_url(Vfs::parse_url($url,PHP_URL_PATH));
177
+			$url = self::resolve_url(Vfs::parse_url($url, PHP_URL_PATH));
178 178
 		}
179 179
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path,file_exists=$file_exists,resolve_last_symlink=$resolve_last_symlink) = '$url'$log");
180 180
 		return $url;
@@ -197,7 +197,7 @@  discard block
 block discarded – undo
197 197
 	 * @param boolean $fix_url_query =false true append relativ path to url query parameter, default not
198 198
 	 * @return string|boolean false if the url cant be resolved, should not happen if fstab has a root entry
199 199
 	 */
200
-	static function resolve_url($_path,$do_symlink=true,$use_symlinkcache=true,$replace_user_pass_host=true,$fix_url_query=false)
200
+	static function resolve_url($_path, $do_symlink = true, $use_symlinkcache = true, $replace_user_pass_host = true, $fix_url_query = false)
201 201
 	{
202 202
 		$path = self::get_path($_path);
203 203
 
@@ -210,52 +210,52 @@  discard block
 block discarded – undo
210 210
 		// check if we can already resolve path (or a part of it) with a known symlinks
211 211
 		if ($use_symlinkcache)
212 212
 		{
213
-			$path = self::symlinkCache_resolve($path,$do_symlink);
213
+			$path = self::symlinkCache_resolve($path, $do_symlink);
214 214
 		}
215 215
 		// setting default user, passwd and domain, if it's not contained int the url
216
-		static $defaults=null;
216
+		static $defaults = null;
217 217
 		if (is_null($defaults))
218 218
 		{
219 219
 			$defaults = array(
220 220
 				'user' => $GLOBALS['egw_info']['user']['account_lid'],
221 221
 				'pass' => urlencode($GLOBALS['egw_info']['user']['passwd']),
222 222
 				'host' => $GLOBALS['egw_info']['user']['domain'],
223
-				'home' => str_replace(array('\\\\','\\'),array('','/'),$GLOBALS['egw_info']['user']['homedirectory']),
223
+				'home' => str_replace(array('\\\\', '\\'), array('', '/'), $GLOBALS['egw_info']['user']['homedirectory']),
224 224
 			);
225 225
 		}
226
-		$parts = array_merge(Vfs::parse_url($path),$defaults);
227
-		if (!$parts['host']) $parts['host'] = 'default';	// otherwise we get an invalid url (scheme:///path/to/something)!
226
+		$parts = array_merge(Vfs::parse_url($path), $defaults);
227
+		if (!$parts['host']) $parts['host'] = 'default'; // otherwise we get an invalid url (scheme:///path/to/something)!
228 228
 
229 229
 		if (!empty($parts['scheme']) && $parts['scheme'] != self::SCHEME)
230 230
 		{
231 231
 			if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path') = '$path' (path is already an url)");
232
-			return $path;	// path is already a non-vfs url --> nothing to do
232
+			return $path; // path is already a non-vfs url --> nothing to do
233 233
 		}
234 234
 		if (empty($parts['path'])) $parts['path'] = '/';
235 235
 
236
-		foreach(array_reverse(self::$fstab) as $mounted => $url)
236
+		foreach (array_reverse(self::$fstab) as $mounted => $url)
237 237
 		{
238
-			if ($mounted == '/' || $mounted == $parts['path'] || $mounted.'/' == substr($parts['path'],0,strlen($mounted)+1))
238
+			if ($mounted == '/' || $mounted == $parts['path'] || $mounted.'/' == substr($parts['path'], 0, strlen($mounted) + 1))
239 239
 			{
240
-				$scheme = Vfs::parse_url($url,PHP_URL_SCHEME);
241
-				if (is_null(self::$wrappers) || !in_array($scheme,self::$wrappers))
240
+				$scheme = Vfs::parse_url($url, PHP_URL_SCHEME);
241
+				if (is_null(self::$wrappers) || !in_array($scheme, self::$wrappers))
242 242
 				{
243 243
 					self::load_wrapper($scheme);
244 244
 				}
245
-				if (($relative = substr($parts['path'],strlen($mounted))))
245
+				if (($relative = substr($parts['path'], strlen($mounted))))
246 246
 				{
247
-					$url = Vfs::concat($url,$relative);
247
+					$url = Vfs::concat($url, $relative);
248 248
 				}
249 249
 				// if url contains url parameter, eg. from filesystem streamwrapper, we need to append relative path here too
250 250
 				$matches = null;
251 251
 				if ($fix_url_query && preg_match('|([?&]url=)([^&]+)|', $url, $matches))
252 252
 				{
253
-					$url = str_replace($matches[0], $matches[1].Vfs::concat($matches[2], substr($parts['path'],strlen($mounted))), $url);
253
+					$url = str_replace($matches[0], $matches[1].Vfs::concat($matches[2], substr($parts['path'], strlen($mounted))), $url);
254 254
 				}
255 255
 
256 256
 				if ($replace_user_pass_host)
257 257
 				{
258
-					$url = str_replace(array('$user','$pass','$host','$home'),array($parts['user'],$parts['pass'],$parts['host'],$parts['home']),$url);
258
+					$url = str_replace(array('$user', '$pass', '$host', '$home'), array($parts['user'], $parts['pass'], $parts['host'], $parts['home']), $url);
259 259
 				}
260 260
 				if ($parts['query']) $url .= '?'.$parts['query'];
261 261
 				if ($parts['fragment']) $url .= '#'.$parts['fragment'];
@@ -268,7 +268,7 @@  discard block
 block discarded – undo
268 268
 			}
269 269
 		}
270 270
 		if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path') can't resolve path!\n");
271
-		trigger_error(__METHOD__."($path) can't resolve path!\n",E_USER_WARNING);
271
+		trigger_error(__METHOD__."($path) can't resolve path!\n", E_USER_WARNING);
272 272
 		return false;
273 273
 	}
274 274
 
@@ -280,10 +280,10 @@  discard block
 block discarded – undo
280 280
 	 */
281 281
 	static function mount_url($fullurl)
282 282
 	{
283
-		foreach(array_reverse(self::$fstab) as $url)
283
+		foreach (array_reverse(self::$fstab) as $url)
284 284
 		{
285
-			list($url_no_query) = explode('?',$url);
286
-			if (substr($fullurl,0,1+strlen($url_no_query)) === $url_no_query.'/')
285
+			list($url_no_query) = explode('?', $url);
286
+			if (substr($fullurl, 0, 1 + strlen($url_no_query)) === $url_no_query.'/')
287 287
 			{
288 288
 				return $url;
289 289
 			}
@@ -303,13 +303,13 @@  discard block
 block discarded – undo
303 303
 	 * @param string $opened_path full path of the file/resource, if the open was successfull and STREAM_USE_PATH was set
304 304
 	 * @return boolean true if the ressource was opened successful, otherwise false
305 305
 	 */
306
-	function stream_open ( $path, $mode, $options, &$opened_path )
306
+	function stream_open($path, $mode, $options, &$opened_path)
307 307
 	{
308
-		unset($options,$opened_path);	// not used but required by function signature
308
+		unset($options, $opened_path); // not used but required by function signature
309 309
 		$this->opened_stream = null;
310 310
 
311 311
 		$stat = null;
312
-		if (!($url = $this->resolve_url_symlinks($path,$mode[0]=='r',true,$stat)))
312
+		if (!($url = $this->resolve_url_symlinks($path, $mode[0] == 'r', true, $stat)))
313 313
 		{
314 314
 			return false;
315 315
 		}
@@ -345,7 +345,7 @@  discard block
 block discarded – undo
345 345
 	 *
346 346
 	 * VFS calls either "vfs_read", "vfs_added" or "vfs_modified" hook
347 347
 	 */
348
-	function stream_close ( )
348
+	function stream_close( )
349 349
 	{
350 350
 		$ret = fclose($this->opened_stream);
351 351
 		// clear PHP's stat cache, it contains wrong size of just closed file,
@@ -355,12 +355,11 @@  discard block
 block discarded – undo
355 355
 		if (!class_exists('setup_process', false))
356 356
 		{
357 357
 			Api\Hooks::process(array(
358
-				'location' => str_replace('b','',$this->opened_stream_mode) == 'r' ? 'vfs_read' :
359
-					($this->opened_stream_is_new ? 'vfs_added' : 'vfs_modified'),
358
+				'location' => str_replace('b', '', $this->opened_stream_mode) == 'r' ? 'vfs_read' : ($this->opened_stream_is_new ? 'vfs_added' : 'vfs_modified'),
360 359
 				'path' => $this->opened_stream_path,
361 360
 				'mode' => $this->opened_stream_mode,
362 361
 				'url'  => $this->opened_stream_url,
363
-			),'',true);
362
+			), '', true);
364 363
 		}
365 364
 		$this->opened_stream = $this->opened_stream_mode = $this->opened_stream_path = $this->opened_stream_url = $this->opened_stream_is_new = null;
366 365
 
@@ -378,9 +377,9 @@  discard block
 block discarded – undo
378 377
 	 * @param int $count
379 378
 	 * @return string/false up to count bytes read or false on EOF
380 379
 	 */
381
-	function stream_read ( $count )
380
+	function stream_read($count)
382 381
 	{
383
-		return fread($this->opened_stream,$count);
382
+		return fread($this->opened_stream, $count);
384 383
 	}
385 384
 
386 385
 	/**
@@ -394,9 +393,9 @@  discard block
 block discarded – undo
394 393
 	 * @param string $data
395 394
 	 * @return integer
396 395
 	 */
397
-	function stream_write ( $data )
396
+	function stream_write($data)
398 397
 	{
399
-		return fwrite($this->opened_stream,$data);
398
+		return fwrite($this->opened_stream, $data);
400 399
 	}
401 400
 
402 401
  	/**
@@ -411,7 +410,7 @@  discard block
 block discarded – undo
411 410
   	 *
412 411
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
413 412
  	 */
414
-	function stream_eof ( )
413
+	function stream_eof( )
415 414
 	{
416 415
 		return feof($this->opened_stream);
417 416
 	}
@@ -421,7 +420,7 @@  discard block
 block discarded – undo
421 420
 	 *
422 421
 	 * @return integer current read/write position of the stream
423 422
 	 */
424
- 	function stream_tell ( )
423
+ 	function stream_tell( )
425 424
  	{
426 425
  		return ftell($this->opened_stream);
427 426
  	}
@@ -438,9 +437,9 @@  discard block
 block discarded – undo
438 437
  	 * 							SEEK_END - 2 - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)
439 438
  	 * @return boolean TRUE if the position was updated, FALSE otherwise.
440 439
  	 */
441
-	function stream_seek ( $offset, $whence )
440
+	function stream_seek($offset, $whence)
442 441
 	{
443
-		return !fseek($this->opened_stream,$offset,$whence);	// fseek returns 0 on success and -1 on failure
442
+		return !fseek($this->opened_stream, $offset, $whence); // fseek returns 0 on success and -1 on failure
444 443
 	}
445 444
 
446 445
 	/**
@@ -450,7 +449,7 @@  discard block
 block discarded – undo
450 449
 	 *
451 450
 	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
452 451
 	 */
453
-	function stream_flush ( )
452
+	function stream_flush( )
454 453
 	{
455 454
 		return fflush($this->opened_stream);
456 455
 	}
@@ -469,7 +468,7 @@  discard block
 block discarded – undo
469 468
 	 *
470 469
 	 * @return array containing the same values as appropriate for the stream.
471 470
 	 */
472
-	function stream_stat ( )
471
+	function stream_stat( )
473 472
 	{
474 473
 		return fstat($this->opened_stream);
475 474
 	}
@@ -498,10 +497,10 @@  discard block
 block discarded – undo
498 497
 		}
499 498
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path', $option, ".array2string($value).") url=$url");
500 499
 
501
-		switch($option)
500
+		switch ($option)
502 501
 		{
503 502
 			case STREAM_META_TOUCH:
504
-				return touch($url, $value[0]);	// atime is not supported
503
+				return touch($url, $value[0]); // atime is not supported
505 504
 
506 505
 			case STREAM_META_ACCESS:
507 506
 				return chmod($url, $value);
@@ -532,9 +531,9 @@  discard block
 block discarded – undo
532 531
 	 * @param string $path
533 532
 	 * @return boolean TRUE on success or FALSE on failure
534 533
 	 */
535
-	function unlink ( $path )
534
+	function unlink($path)
536 535
 	{
537
-		if (!($url = $this->resolve_url_symlinks($path,true,false)))	// true,false file need to exist, but do not resolve last component
536
+		if (!($url = $this->resolve_url_symlinks($path, true, false)))	// true,false file need to exist, but do not resolve last component
538 537
 		{
539 538
 			return false;
540 539
 		}
@@ -555,7 +554,7 @@  discard block
 block discarded – undo
555 554
 				'path' => $path[0] == '/' ? $path : Vfs::parse_url($path, PHP_URL_PATH),
556 555
 				'url'  => $url,
557 556
 				'stat' => $stat,
558
-			),'',true);
557
+			), '', true);
559 558
 		}
560 559
 		return $ok;
561 560
 	}
@@ -573,14 +572,14 @@  discard block
 block discarded – undo
573 572
 	 * @return boolean TRUE on success or FALSE on failure
574 573
 	 * @throws Exception\ProtectedDirectory if trying to delete a protected directory, see Vfs::isProtected()
575 574
 	 */
576
-	function rename ( $path_from, $path_to )
575
+	function rename($path_from, $path_to)
577 576
 	{
578 577
 		if (Vfs::isProtectedDir($path_from))
579 578
 		{
580 579
 			throw new Exception\ProtectedDirectory("Renaming protected directory '$path_from' rejected!");
581 580
 		}
582
-		if (!($url_from = $this->resolve_url_symlinks($path_from,true,false)) ||
583
-			!($url_to = $this->resolve_url_symlinks($path_to,false)))
581
+		if (!($url_from = $this->resolve_url_symlinks($path_from, true, false)) ||
582
+			!($url_to = $this->resolve_url_symlinks($path_to, false)))
584 583
 		{
585 584
 			return false;
586 585
 		}
@@ -590,14 +589,14 @@  discard block
 block discarded – undo
590 589
 			return false;
591 590
 		}
592 591
 		// if file is moved from one filesystem / wrapper to an other --> copy it (rename fails cross wrappers)
593
-		if (Vfs::parse_url($url_from,PHP_URL_SCHEME) == Vfs::parse_url($url_to,PHP_URL_SCHEME))
592
+		if (Vfs::parse_url($url_from, PHP_URL_SCHEME) == Vfs::parse_url($url_to, PHP_URL_SCHEME))
594 593
 		{
595 594
 			self::symlinkCache_remove($path_from);
596
-			$ret = rename($url_from,$url_to);
595
+			$ret = rename($url_from, $url_to);
597 596
 		}
598
-		elseif (($from = fopen($url_from,'r')) && ($to = fopen($url_to,'w')))
597
+		elseif (($from = fopen($url_from, 'r')) && ($to = fopen($url_to, 'w')))
599 598
 		{
600
-			$ret = stream_copy_to_stream($from,$to) !== false;
599
+			$ret = stream_copy_to_stream($from, $to) !== false;
601 600
 			fclose($from);
602 601
 			fclose($to);
603 602
 			if ($ret) $this->unlink($path_from);
@@ -619,7 +618,7 @@  discard block
 block discarded – undo
619 618
 				'to' => $path_to[0] == '/' ? $path_to : Vfs::parse_url($path_to, PHP_URL_PATH),
620 619
 				'url_from' => $url_from,
621 620
 				'url_to' => $url_to,
622
-			),'',true);
621
+			), '', true);
623 622
 		}
624 623
 		return $ret;
625 624
 	}
@@ -635,9 +634,9 @@  discard block
 block discarded – undo
635 634
 	 * @param int $options Posible values include STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE
636 635
 	 * @return boolean TRUE on success or FALSE on failure
637 636
 	 */
638
-	function mkdir ( $path, $mode, $options )
637
+	function mkdir($path, $mode, $options)
639 638
 	{
640
-		if (!($url = $this->resolve_url_symlinks($path,false)))	// false = directory does not need to exists
639
+		if (!($url = $this->resolve_url_symlinks($path, false)))	// false = directory does not need to exists
641 640
 		{
642 641
 			return false;
643 642
 		}
@@ -647,7 +646,7 @@  discard block
 block discarded – undo
647 646
 			return false;
648 647
 		}
649 648
 		// check if recursive option is set and needed
650
-		if (($options & STREAM_MKDIR_RECURSIVE) &&
649
+		if (($options&STREAM_MKDIR_RECURSIVE) &&
651 650
 			($parent_url = Vfs::dirname($url)) &&
652 651
 			!($this->url_stat($parent_url, STREAM_URL_STAT_QUIET)) &&
653 652
 			Vfs::parse_url($parent_url, PHP_URL_PATH) !== '/')
@@ -657,7 +656,7 @@  discard block
 block discarded – undo
657 656
 		// unset it now, as it was handled above
658 657
 		$options &= ~STREAM_MKDIR_RECURSIVE;
659 658
 
660
-		$ret = mkdir($url,$mode,$options);
659
+		$ret = mkdir($url, $mode, $options);
661 660
 
662 661
 		// call "vfs_mkdir" hook
663 662
 		if ($ret && !class_exists('setup_process', false))
@@ -666,7 +665,7 @@  discard block
 block discarded – undo
666 665
 				'location' => 'vfs_mkdir',
667 666
 				'path' => $path[0] == '/' ? $path : Vfs::parse_url($path, PHP_URL_PATH),
668 667
 				'url' => $url,
669
-			),'',true);
668
+			), '', true);
670 669
 		}
671 670
 		return $ret;
672 671
 	}
@@ -682,13 +681,13 @@  discard block
 block discarded – undo
682 681
 	 * @return boolean TRUE on success or FALSE on failure.
683 682
 	 * @throws Exception\ProtectedDirectory if trying to delete a protected directory, see Vfs::isProtected()
684 683
 	 */
685
-	function rmdir ( $path, $options )
684
+	function rmdir($path, $options)
686 685
 	{
687 686
 		if (Vfs::isProtectedDir($path))
688 687
 		{
689 688
 			throw new Exception\ProtectedDirectory("Deleting protected directory '$path' rejected!");
690 689
 		}
691
-		unset($options);	// not uses but required by function signature
690
+		unset($options); // not uses but required by function signature
692 691
 		if (!($url = $this->resolve_url_symlinks($path)))
693 692
 		{
694 693
 			return false;
@@ -710,7 +709,7 @@  discard block
 block discarded – undo
710 709
 				'path' => $path[0] == '/' ? $path : Vfs::parse_url($path, PHP_URL_PATH),
711 710
 				'url' => $url,
712 711
 				'stat' => $stat,
713
-			),'',true);
712
+			), '', true);
714 713
 		}
715 714
 		return $ok;
716 715
 	}
@@ -721,7 +720,7 @@  discard block
 block discarded – undo
721 720
 	 * @param string $path URL that was passed to opendir() and that this object is expected to explore.
722 721
 	 * @return booelan
723 722
 	 */
724
-	function dir_opendir ( $path, $options )
723
+	function dir_opendir($path, $options)
725 724
 	{
726 725
 		$this->opened_dir = $this->extra_dirs = null;
727 726
 		$this->dir_url_params = array();
@@ -738,15 +737,15 @@  discard block
 block discarded – undo
738 737
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__."( $path,$options) opendir($this->opened_dir_url) failed!");
739 738
 			return false;
740 739
 		}
741
-		$this->opened_dir_writable = Vfs::check_access($this->opened_dir_url,Vfs::WRITABLE);
740
+		$this->opened_dir_writable = Vfs::check_access($this->opened_dir_url, Vfs::WRITABLE);
742 741
 		// check our fstab if we need to add some of the mountpoints
743
-		$basepath = Vfs::parse_url($path,PHP_URL_PATH);
744
-		foreach(array_keys(self::$fstab) as $mounted)
742
+		$basepath = Vfs::parse_url($path, PHP_URL_PATH);
743
+		foreach (array_keys(self::$fstab) as $mounted)
745 744
 		{
746 745
 			if (((Vfs::dirname($mounted) == $basepath || Vfs::dirname($mounted).'/' == $basepath) && $mounted != '/') &&
747 746
 				// only return children readable by the user, if dir is not writable
748 747
 				(!self::HIDE_UNREADABLES || $this->opened_dir_writable ||
749
-					Vfs::check_access($mounted,Vfs::READABLE)))
748
+					Vfs::check_access($mounted, Vfs::READABLE)))
750 749
 			{
751 750
 				$this->extra_dirs[] = Vfs::basename($mounted);
752 751
 			}
@@ -785,24 +784,24 @@  discard block
 block discarded – undo
785 784
 	 * @param boolean $check_symlink_components =true check if path contains symlinks in path components other then the last one
786 785
 	 * @return array
787 786
 	 */
788
-	function url_stat ( $path, $flags, $try_create_home=false, $check_symlink_components=true, $check_symlink_depth=self::MAX_SYMLINK_DEPTH, $try_reconnect=true )
787
+	function url_stat($path, $flags, $try_create_home = false, $check_symlink_components = true, $check_symlink_depth = self::MAX_SYMLINK_DEPTH, $try_reconnect = true)
789 788
 	{
790
-		if (!($url = self::resolve_url($path,!($flags & STREAM_URL_STAT_LINK), $check_symlink_components)))
789
+		if (!($url = self::resolve_url($path, !($flags&STREAM_URL_STAT_LINK), $check_symlink_components)))
791 790
 		{
792 791
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path',$flags) can NOT resolve path!");
793 792
 			return false;
794 793
 		}
795 794
 
796 795
 		try {
797
-			if ($flags & STREAM_URL_STAT_LINK)
796
+			if ($flags&STREAM_URL_STAT_LINK)
798 797
 			{
799
-				$stat = @lstat($url);	// suppressed the stat failed warnings
798
+				$stat = @lstat($url); // suppressed the stat failed warnings
800 799
 			}
801 800
 			else
802 801
 			{
803
-				$stat = @stat($url);	// suppressed the stat failed warnings
802
+				$stat = @stat($url); // suppressed the stat failed warnings
804 803
 
805
-				if ($stat && ($stat['mode'] & self::MODE_LINK))
804
+				if ($stat && ($stat['mode']&self::MODE_LINK))
806 805
 				{
807 806
 					if (!$check_symlink_depth)
808 807
 					{
@@ -813,25 +812,25 @@  discard block
 block discarded – undo
813 812
 					{
814 813
 						if ($lpath[0] != '/')	// concat relative path
815 814
 						{
816
-							$lpath = Vfs::concat(Vfs::parse_url($path,PHP_URL_PATH),'../'.$lpath);
815
+							$lpath = Vfs::concat(Vfs::parse_url($path, PHP_URL_PATH), '../'.$lpath);
817 816
 						}
818
-						$u_query = parse_url($url,PHP_URL_QUERY);
817
+						$u_query = parse_url($url, PHP_URL_QUERY);
819 818
 						$url = Vfs::PREFIX.$lpath;
820 819
 						if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path,$flags) symlif (substr($path,-1) == '/' && $path != '/') $path = substr($path,0,-1);	// remove trailing slash eg. added by WebDAVink found and resolved to $url");
821 820
 						// try reading the stat of the link
822
-						if (($stat = $this->url_stat($lpath, STREAM_URL_STAT_QUIET, false, true, $check_symlink_depth-1)))
821
+						if (($stat = $this->url_stat($lpath, STREAM_URL_STAT_QUIET, false, true, $check_symlink_depth - 1)))
823 822
 						{
824 823
 							$stat_query = parse_url($stat['url'], PHP_URL_QUERY);
825
-							if($u_query || $stat_query)
824
+							if ($u_query || $stat_query)
826 825
 							{
827 826
 								$stat_url = parse_url($stat['url']);
828
-								parse_str($stat_query,$stat_query);
827
+								parse_str($stat_query, $stat_query);
829 828
 								parse_str($u_query, $u_query);
830 829
 								$stat_query = http_build_query(array_merge($stat_query, $u_query));
831 830
 								$stat['url'] = $stat_url['scheme'].'://'.$stat_url['host'].$stat_url['path'].'?'.$stat_query;
832 831
 							}
833
-							if(isset($stat['url'])) $url = $stat['url'];	// if stat returns an url use that, as there might be more links ...
834
-							self::symlinkCache_add($path,$url);
832
+							if (isset($stat['url'])) $url = $stat['url']; // if stat returns an url use that, as there might be more links ...
833
+							self::symlinkCache_add($path, $url);
835 834
 						}
836 835
 					}
837 836
 				}
@@ -851,7 +850,7 @@  discard block
 block discarded – undo
851 850
 			throw $e;
852 851
 		}
853 852
 		// check if a failed url_stat was for a home dir, in that case silently create it
854
-		if (!$stat && $try_create_home && Vfs::dirname(Vfs::parse_url($path,PHP_URL_PATH)) == '/home' &&
853
+		if (!$stat && $try_create_home && Vfs::dirname(Vfs::parse_url($path, PHP_URL_PATH)) == '/home' &&
855 854
 			($id = $GLOBALS['egw']->accounts->name2id(Vfs::basename($path))) &&
856 855
 			$GLOBALS['egw']->accounts->id2name($id) == Vfs::basename($path))	// make sure path has the right case!
857 856
 		{
@@ -861,25 +860,25 @@  discard block
 block discarded – undo
861 860
 				'account_lid' => Vfs::basename($path),
862 861
 				'account_name' => Vfs::basename($path),
863 862
 			);
864
-			call_user_func(array(__NAMESPACE__.'\\Hooks',$hook_data['location']),$hook_data);
863
+			call_user_func(array(__NAMESPACE__.'\\Hooks', $hook_data['location']), $hook_data);
865 864
 			unset($hook_data);
866
-			$stat = $this->url_stat($path,$flags,false);
865
+			$stat = $this->url_stat($path, $flags, false);
867 866
 		}
868 867
 		$query = parse_url($url, PHP_URL_QUERY);
869 868
 		if (!$stat && $check_symlink_components)	// check if there's a symlink somewhere inbetween the path
870 869
 		{
871
-			$stat = self::check_symlink_components($path,$flags,$url);
872
-			if ($stat && isset($stat['url']) && !$query) self::symlinkCache_add($path,$stat['url']);
870
+			$stat = self::check_symlink_components($path, $flags, $url);
871
+			if ($stat && isset($stat['url']) && !$query) self::symlinkCache_add($path, $stat['url']);
873 872
 		}
874
-		elseif(is_array($stat) && !isset($stat['url']))
873
+		elseif (is_array($stat) && !isset($stat['url']))
875 874
 		{
876 875
 			$stat['url'] = $url;
877 876
 		}
878
-		if (($stat['mode'] & 0222) && self::url_is_readonly($stat['url']))
877
+		if (($stat['mode']&0222) && self::url_is_readonly($stat['url']))
879 878
 		{
880 879
 			$stat['mode'] &= ~0222;
881 880
 		}
882
-		if($stat['url'] && $query && strpos($stat['url'],'?'.$query)===false)
881
+		if ($stat['url'] && $query && strpos($stat['url'], '?'.$query) === false)
883 882
 		{
884 883
 			$stat['url'] .= '?'.$query;
885 884
 		}
@@ -906,7 +905,7 @@  discard block
 block discarded – undo
906 905
 	 * @param string &$url=null already resolved path
907 906
 	 * @return array|boolean stat array or false if not found
908 907
 	 */
909
-	private function check_symlink_components($path,$flags=0,&$url=null)
908
+	private function check_symlink_components($path, $flags = 0, &$url = null)
910 909
 	{
911 910
 		if (is_null($url) && !($url = self::resolve_url($path)))
912 911
 		{
@@ -926,20 +925,20 @@  discard block
 block discarded – undo
926 925
 
927 926
 					if ($lpath[0] != '/')
928 927
 					{
929
-						$lpath = Vfs::concat(Vfs::parse_url($url,PHP_URL_PATH),'../'.$lpath);
928
+						$lpath = Vfs::concat(Vfs::parse_url($url, PHP_URL_PATH), '../'.$lpath);
930 929
 					}
931 930
 					//self::symlinkCache_add($path,Vfs::PREFIX.$lpath);
932
-					$url = Vfs::PREFIX.Vfs::concat($lpath,$rel_path);
931
+					$url = Vfs::PREFIX.Vfs::concat($lpath, $rel_path);
933 932
 					if (self::LOG_LEVEL > 1) error_log("$log --> lpath='$lpath', url='$url'");
934
-					return $this->url_stat($url,$flags);
933
+					return $this->url_stat($url, $flags);
935 934
 				}
936
-				$url = Vfs::concat($url,$rel_path);
935
+				$url = Vfs::concat($url, $rel_path);
937 936
 				if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url') returning null");
938 937
 				return null;
939 938
 			}
940 939
 		}
941 940
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url') returning false");
942
-		return false;	// $path does not exist
941
+		return false; // $path does not exist
943 942
 	}
944 943
 
945 944
 	/**
@@ -955,13 +954,13 @@  discard block
 block discarded – undo
955 954
 	 * @param string $_path vfs path
956 955
 	 * @param string $target target path
957 956
 	 */
958
-	static protected function symlinkCache_add($_path,$target)
957
+	static protected function symlinkCache_add($_path, $target)
959 958
 	{
960 959
 		$path = self::get_path($_path);
961 960
 
962
-		if (isset(self::$symlink_cache[$path])) return;	// nothing to do
961
+		if (isset(self::$symlink_cache[$path])) return; // nothing to do
963 962
 
964
-		if ($target[0] != '/') $target = Vfs::parse_url($target,PHP_URL_PATH);
963
+		if ($target[0] != '/') $target = Vfs::parse_url($target, PHP_URL_PATH);
965 964
 
966 965
 		self::$symlink_cache[$path] = $target;
967 966
 
@@ -995,25 +994,25 @@  discard block
 block discarded – undo
995 994
 	 * @param boolean $do_symlink =true is a direct match allowed, default yes (must be false for a lstat or readlink!)
996 995
 	 * @return string target or path, if path not found
997 996
 	 */
998
-	static public function symlinkCache_resolve($_path,$do_symlink=true)
997
+	static public function symlinkCache_resolve($_path, $do_symlink = true)
999 998
 	{
1000 999
 		// remove vfs scheme, but no other schemes (eg. filesystem!)
1001 1000
 		$path = self::get_path($_path);
1002 1001
 
1003 1002
 		$strlen_path = strlen($path);
1004 1003
 
1005
-		foreach(self::$symlink_cache as $p => $t)
1004
+		foreach (self::$symlink_cache as $p => $t)
1006 1005
 		{
1007
-			if (($strlen_p = strlen($p)) > $strlen_path) continue;	// $path can NOT start with $p
1006
+			if (($strlen_p = strlen($p)) > $strlen_path) continue; // $path can NOT start with $p
1008 1007
 
1009 1008
 			if ($path == $p)
1010 1009
 			{
1011 1010
 				if ($do_symlink) $target = $t;
1012 1011
 				break;
1013 1012
 			}
1014
-			elseif (substr($path,0,$strlen_p+1) == $p.'/')
1013
+			elseif (substr($path, 0, $strlen_p + 1) == $p.'/')
1015 1014
 			{
1016
-				$target = $t . substr($path,$strlen_p);
1015
+				$target = $t.substr($path, $strlen_p);
1017 1016
 				break;
1018 1017
 			}
1019 1018
 		}
@@ -1041,7 +1040,7 @@  discard block
 block discarded – undo
1041 1040
 	 *
1042 1041
 	 * @return string
1043 1042
 	 */
1044
-	function dir_readdir ( )
1043
+	function dir_readdir( )
1045 1044
 	{
1046 1045
 		if ($this->extra_dirs && count($this->extra_dirs) > $this->extra_dir_ptr)
1047 1046
 		{
@@ -1053,10 +1052,10 @@  discard block
 block discarded – undo
1053 1052
 			do {
1054 1053
 				$file = readdir($this->opened_dir);
1055 1054
 			}
1056
-			while($file !== false &&
1057
-				(is_array($this->extra_dirs) && in_array($file,$this->extra_dirs) || // do NOT return extra_dirs twice
1055
+			while ($file !== false &&
1056
+				(is_array($this->extra_dirs) && in_array($file, $this->extra_dirs) || // do NOT return extra_dirs twice
1058 1057
 				self::HIDE_UNREADABLES && !$this->opened_dir_writable &&
1059
-				!Vfs::check_access(Vfs::concat($this->opened_dir_url,$file),Vfs::READABLE)));
1058
+				!Vfs::check_access(Vfs::concat($this->opened_dir_url, $file), Vfs::READABLE)));
1060 1059
 		}
1061 1060
 		if (self::LOG_LEVEL > 1) error_log(__METHOD__."( $this->opened_dir ) = '$file'");
1062 1061
 		return $file;
@@ -1070,7 +1069,7 @@  discard block
 block discarded – undo
1070 1069
 	 *
1071 1070
 	 * @return boolean
1072 1071
 	 */
1073
-	function dir_rewinddir ( )
1072
+	function dir_rewinddir( )
1074 1073
 	{
1075 1074
 		$this->extra_dir_ptr = 0;
1076 1075
 
@@ -1084,7 +1083,7 @@  discard block
 block discarded – undo
1084 1083
 	 *
1085 1084
 	 * @return boolean
1086 1085
 	 */
1087
-	function dir_closedir ( )
1086
+	function dir_closedir( )
1088 1087
 	{
1089 1088
 		$ret = closedir($this->opened_dir);
1090 1089
 
@@ -1101,9 +1100,9 @@  discard block
 block discarded – undo
1101 1100
 	 */
1102 1101
 	static function load_wrapper($scheme)
1103 1102
 	{
1104
-		if (!in_array($scheme,self::get_wrappers()))
1103
+		if (!in_array($scheme, self::get_wrappers()))
1105 1104
 		{
1106
-			switch($scheme)
1105
+			switch ($scheme)
1107 1106
 			{
1108 1107
 				case 'webdav':
1109 1108
 				case 'webdavs':
@@ -1111,16 +1110,16 @@  discard block
 block discarded – undo
1111 1110
 					self::$wrappers[] = $scheme;
1112 1111
 					break;
1113 1112
 				case '':
1114
-					break;	// default file, always loaded
1113
+					break; // default file, always loaded
1115 1114
 				default:
1116 1115
 					// check if scheme is buildin in php or one of our own stream wrappers
1117
-					if (in_array($scheme,stream_get_wrappers()) || class_exists(self::scheme2class($scheme)))
1116
+					if (in_array($scheme, stream_get_wrappers()) || class_exists(self::scheme2class($scheme)))
1118 1117
 					{
1119 1118
 						self::$wrappers[] = $scheme;
1120 1119
 					}
1121 1120
 					else
1122 1121
 					{
1123
-						trigger_error("Can't load stream-wrapper for scheme '$scheme'!",E_USER_WARNING);
1122
+						trigger_error("Can't load stream-wrapper for scheme '$scheme'!", E_USER_WARNING);
1124 1123
 						return false;
1125 1124
 					}
1126 1125
 			}
@@ -1154,10 +1153,10 @@  discard block
 block discarded – undo
1154 1153
 	static function scheme2class($scheme)
1155 1154
 	{
1156 1155
 		list($app, $app_scheme) = explode('.', $scheme);
1157
-		foreach(array(
1158
-			empty($app_scheme) ? 'EGroupware\\Api\\Vfs\\'.ucfirst($scheme).'\\StreamWrapper' :	// streamwrapper in Api\Vfs
1156
+		foreach (array(
1157
+			empty($app_scheme) ? 'EGroupware\\Api\\Vfs\\'.ucfirst($scheme).'\\StreamWrapper' : // streamwrapper in Api\Vfs
1159 1158
 				'EGroupware\\'.ucfirst($app).'\\Vfs\\'.ucfirst($app_scheme).'\\StreamWrapper', // streamwrapper in $app\Vfs
1160
-			str_replace('.','_',$scheme).'_stream_wrapper',	// old (flat) name
1159
+			str_replace('.', '_', $scheme).'_stream_wrapper', // old (flat) name
1161 1160
 		) as $class)
1162 1161
 		{
1163 1162
 			//error_log(__METHOD__."('$scheme') class_exists('$class')=".array2string(class_exists($class)));
@@ -1172,7 +1171,7 @@  discard block
 block discarded – undo
1172 1171
 	 * @param string $only_remove_scheme =self::SCHEME if given only that scheme get's removed
1173 1172
 	 * @return string path without training slash
1174 1173
 	 */
1175
-	static protected function get_path($path,$only_remove_scheme=self::SCHEME)
1174
+	static protected function get_path($path, $only_remove_scheme = self::SCHEME)
1176 1175
 	{
1177 1176
 		if ($path[0] != '/' && (!$only_remove_scheme || Vfs::parse_url($path, PHP_URL_SCHEME) == $only_remove_scheme))
1178 1177
 		{
@@ -1183,7 +1182,7 @@  discard block
 block discarded – undo
1183 1182
 		{
1184 1183
 			while (mb_substr($path, -1) == '/' && $path != '/' && ($path[0] == '/' || Vfs::parse_url($path, PHP_URL_PATH) != '/'))
1185 1184
 			{
1186
-				$path = mb_substr($path,0,-1);
1185
+				$path = mb_substr($path, 0, -1);
1187 1186
 			}
1188 1187
 		}
1189 1188
 		return $path;
@@ -1198,7 +1197,7 @@  discard block
 block discarded – undo
1198 1197
 	static function url_is_readonly($url)
1199 1198
 	{
1200 1199
 		static $cache = array();
1201
-		$ret =& $cache[$url];
1200
+		$ret = & $cache[$url];
1202 1201
 		if (!isset($ret))
1203 1202
 		{
1204 1203
 			$matches = null;
@@ -1220,9 +1219,9 @@  discard block
 block discarded – undo
1220 1219
 	 * @param boolean $clear_fstab =false true clear current fstab, false (default) only add given mount
1221 1220
 	 * @return array|boolean array with fstab, if called without parameter or true on successful mount
1222 1221
 	 */
1223
-	static function mount($url=null,$path=null,$check_url=null,$persitent_mount=true,$clear_fstab=false)
1222
+	static function mount($url = null, $path = null, $check_url = null, $persitent_mount = true, $clear_fstab = false)
1224 1223
 	{
1225
-		if (is_null($check_url)) $check_url = strpos($url,'$') === false;
1224
+		if (is_null($check_url)) $check_url = strpos($url, '$') === false;
1226 1225
 
1227 1226
 		if (!isset($GLOBALS['egw_info']['server']['vfs_fstab']))	// happens eg. in setup
1228 1227
 		{
@@ -1248,7 +1247,7 @@  discard block
 block discarded – undo
1248 1247
 		if (!Vfs::$is_root)
1249 1248
 		{
1250 1249
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') permission denied, you are NOT root!');
1251
-			return false;	// only root can mount
1250
+			return false; // only root can mount
1252 1251
 		}
1253 1252
 		if ($clear_fstab)
1254 1253
 		{
@@ -1257,14 +1256,14 @@  discard block
 block discarded – undo
1257 1256
 		if (isset(self::$fstab[$path]) && self::$fstab[$path] === $url)
1258 1257
 		{
1259 1258
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') already mounted.');
1260
-			return true;	// already mounted
1259
+			return true; // already mounted
1261 1260
 		}
1262
-		self::load_wrapper(Vfs::parse_url($url,PHP_URL_SCHEME));
1261
+		self::load_wrapper(Vfs::parse_url($url, PHP_URL_SCHEME));
1263 1262
 
1264 1263
 		if ($check_url && (!file_exists($url) || opendir($url) === false))
1265 1264
 		{
1266 1265
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') url does NOT exist!');
1267
-			return false;	// url does not exist
1266
+			return false; // url does not exist
1268 1267
 		}
1269 1268
 		self::$fstab[$path] = $url;
1270 1269
 
@@ -1275,10 +1274,10 @@  discard block
 block discarded – undo
1275 1274
 
1276 1275
 		if ($persitent_mount)
1277 1276
 		{
1278
-			Api\Config::save_value('vfs_fstab',self::$fstab,'phpgwapi');
1277
+			Api\Config::save_value('vfs_fstab', self::$fstab, 'phpgwapi');
1279 1278
 			$GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab;
1280 1279
 			// invalidate session cache
1281
-			if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))	// egw object in setup is limited
1280
+			if (method_exists($GLOBALS['egw'], 'invalidate_session_cache'))	// egw object in setup is limited
1282 1281
 			{
1283 1282
 				$GLOBALS['egw']->invalidate_session_cache();
1284 1283
 			}
@@ -1297,19 +1296,19 @@  discard block
 block discarded – undo
1297 1296
 		if (!Vfs::$is_root)
1298 1297
 		{
1299 1298
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($path).','.array2string($path).') permission denied, you are NOT root!');
1300
-			return false;	// only root can mount
1299
+			return false; // only root can mount
1301 1300
 		}
1302
-		if (!isset(self::$fstab[$path]) && ($path = array_search($path,self::$fstab)) === false)
1301
+		if (!isset(self::$fstab[$path]) && ($path = array_search($path, self::$fstab)) === false)
1303 1302
 		{
1304 1303
 			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($path).') NOT mounted!');
1305
-			return false;	// $path not mounted
1304
+			return false; // $path not mounted
1306 1305
 		}
1307 1306
 		unset(self::$fstab[$path]);
1308 1307
 
1309
-		Api\Config::save_value('vfs_fstab',self::$fstab,'phpgwapi');
1308
+		Api\Config::save_value('vfs_fstab', self::$fstab, 'phpgwapi');
1310 1309
 		$GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab;
1311 1310
 		// invalidate session cache
1312
-		if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))	// egw object in setup is limited
1311
+		if (method_exists($GLOBALS['egw'], 'invalidate_session_cache'))	// egw object in setup is limited
1313 1312
 		{
1314 1313
 			$GLOBALS['egw']->invalidate_session_cache();
1315 1314
 		}
@@ -1326,7 +1325,7 @@  discard block
 block discarded – undo
1326 1325
 		if (in_array(self::SCHEME, stream_get_wrappers())) {
1327 1326
 			stream_wrapper_unregister(self::SCHEME);
1328 1327
 		}
1329
-		stream_register_wrapper(self::SCHEME,__CLASS__);
1328
+		stream_register_wrapper(self::SCHEME, __CLASS__);
1330 1329
 
1331 1330
 		if (($fstab = $GLOBALS['egw_info']['server']['vfs_fstab']) && is_array($fstab) && count($fstab))
1332 1331
 		{
Please login to merge, or discard this patch.
Braces   +236 added lines, -59 removed lines patch added patch discarded remove patch
@@ -165,7 +165,10 @@  discard block
 block discarded – undo
165 165
 		{
166 166
 			$url = null;
167 167
 			$stat = self::check_symlink_components($path,0,$url);
168
-			if (self::LOG_LEVEL > 1) $log = " (check_symlink_components('$path',0,'$url') = $stat)";
168
+			if (self::LOG_LEVEL > 1)
169
+			{
170
+				$log = " (check_symlink_components('$path',0,'$url') = $stat)";
171
+			}
169 172
 		}
170 173
 		else
171 174
 		{
@@ -176,7 +179,10 @@  discard block
 block discarded – undo
176 179
 		{
177 180
 			$url = self::resolve_url(Vfs::parse_url($url,PHP_URL_PATH));
178 181
 		}
179
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path,file_exists=$file_exists,resolve_last_symlink=$resolve_last_symlink) = '$url'$log");
182
+		if (self::LOG_LEVEL > 1)
183
+		{
184
+			error_log(__METHOD__."($path,file_exists=$file_exists,resolve_last_symlink=$resolve_last_symlink) = '$url'$log");
185
+		}
180 186
 		return $url;
181 187
 	}
182 188
 
@@ -204,7 +210,10 @@  discard block
 block discarded – undo
204 210
 		// we do some caching here
205 211
 		if (isset(self::$resolve_url_cache[$path]) && $replace_user_pass_host)
206 212
 		{
207
-			if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path') = '".self::$resolve_url_cache[$path]."' (from cache)");
213
+			if (self::LOG_LEVEL > 1)
214
+			{
215
+				error_log(__METHOD__."('$path') = '".self::$resolve_url_cache[$path]."' (from cache)");
216
+			}
208 217
 			return self::$resolve_url_cache[$path];
209 218
 		}
210 219
 		// check if we can already resolve path (or a part of it) with a known symlinks
@@ -224,14 +233,24 @@  discard block
 block discarded – undo
224 233
 			);
225 234
 		}
226 235
 		$parts = array_merge(Vfs::parse_url($path),$defaults);
227
-		if (!$parts['host']) $parts['host'] = 'default';	// otherwise we get an invalid url (scheme:///path/to/something)!
236
+		if (!$parts['host'])
237
+		{
238
+			$parts['host'] = 'default';
239
+		}
240
+		// otherwise we get an invalid url (scheme:///path/to/something)!
228 241
 
229 242
 		if (!empty($parts['scheme']) && $parts['scheme'] != self::SCHEME)
230 243
 		{
231
-			if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path') = '$path' (path is already an url)");
244
+			if (self::LOG_LEVEL > 1)
245
+			{
246
+				error_log(__METHOD__."('$path') = '$path' (path is already an url)");
247
+			}
232 248
 			return $path;	// path is already a non-vfs url --> nothing to do
233 249
 		}
234
-		if (empty($parts['path'])) $parts['path'] = '/';
250
+		if (empty($parts['path']))
251
+		{
252
+			$parts['path'] = '/';
253
+		}
235 254
 
236 255
 		foreach(array_reverse(self::$fstab) as $mounted => $url)
237 256
 		{
@@ -257,17 +276,32 @@  discard block
 block discarded – undo
257 276
 				{
258 277
 					$url = str_replace(array('$user','$pass','$host','$home'),array($parts['user'],$parts['pass'],$parts['host'],$parts['home']),$url);
259 278
 				}
260
-				if ($parts['query']) $url .= '?'.$parts['query'];
261
-				if ($parts['fragment']) $url .= '#'.$parts['fragment'];
279
+				if ($parts['query'])
280
+				{
281
+					$url .= '?'.$parts['query'];
282
+				}
283
+				if ($parts['fragment'])
284
+				{
285
+					$url .= '#'.$parts['fragment'];
286
+				}
262 287
 
263
-				if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path') = '$url'");
288
+				if (self::LOG_LEVEL > 1)
289
+				{
290
+					error_log(__METHOD__."('$path') = '$url'");
291
+				}
264 292
 
265
-				if ($replace_user_pass_host) self::$resolve_url_cache[$path] = $url;
293
+				if ($replace_user_pass_host)
294
+				{
295
+					self::$resolve_url_cache[$path] = $url;
296
+				}
266 297
 
267 298
 				return $url;
268 299
 			}
269 300
 		}
270
-		if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path') can't resolve path!\n");
301
+		if (self::LOG_LEVEL > 0)
302
+		{
303
+			error_log(__METHOD__."('$path') can't resolve path!\n");
304
+		}
271 305
 		trigger_error(__METHOD__."($path) can't resolve path!\n",E_USER_WARNING);
272 306
 		return false;
273 307
 	}
@@ -488,15 +522,21 @@  discard block
 block discarded – undo
488 522
 	 */
489 523
 	function stream_metadata($path, $option, $value)
490 524
 	{
491
-		if (!($url = $this->resolve_url_symlinks($path, $option != STREAM_META_TOUCH, false)))	// true,false file need to exist, but do not resolve last component
525
+		if (!($url = $this->resolve_url_symlinks($path, $option != STREAM_META_TOUCH, false)))
526
+		{
527
+			// true,false file need to exist, but do not resolve last component
492 528
 		{
493 529
 			return false;
494 530
 		}
531
+		}
495 532
 		if (self::url_is_readonly($url))
496 533
 		{
497 534
 			return false;
498 535
 		}
499
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path', $option, ".array2string($value).") url=$url");
536
+		if (self::LOG_LEVEL > 1)
537
+		{
538
+			error_log(__METHOD__."('$path', $option, ".array2string($value).") url=$url");
539
+		}
500 540
 
501 541
 		switch($option)
502 542
 		{
@@ -508,14 +548,18 @@  discard block
 block discarded – undo
508 548
 
509 549
 			case STREAM_META_OWNER_NAME:
510 550
 				if (($value = $GLOBALS['egw']->accounts->name2id($value, 'account_lid', 'u')) === false)
511
-					return false;
551
+				{
552
+									return false;
553
+				}
512 554
 				// fall through
513 555
 			case STREAM_META_OWNER:
514 556
 				return chown($url, $value);
515 557
 
516 558
 			case STREAM_META_GROUP_NAME:
517 559
 				if (($value = $GLOBALS['egw']->accounts->name2id($value, 'account_lid', 'g')) === false)
518
-					return false;
560
+				{
561
+									return false;
562
+				}
519 563
 				// fall through
520 564
 			case STREAM_META_GROUP:
521 565
 				return chgrp($url, $value);
@@ -534,10 +578,13 @@  discard block
 block discarded – undo
534 578
 	 */
535 579
 	function unlink ( $path )
536 580
 	{
537
-		if (!($url = $this->resolve_url_symlinks($path,true,false)))	// true,false file need to exist, but do not resolve last component
581
+		if (!($url = $this->resolve_url_symlinks($path,true,false)))
582
+		{
583
+			// true,false file need to exist, but do not resolve last component
538 584
 		{
539 585
 			return false;
540 586
 		}
587
+		}
541 588
 		if (self::url_is_readonly($url))
542 589
 		{
543 590
 			return false;
@@ -600,7 +647,10 @@  discard block
 block discarded – undo
600 647
 			$ret = stream_copy_to_stream($from,$to) !== false;
601 648
 			fclose($from);
602 649
 			fclose($to);
603
-			if ($ret) $this->unlink($path_from);
650
+			if ($ret)
651
+			{
652
+				$this->unlink($path_from);
653
+			}
604 654
 		}
605 655
 		else
606 656
 		{
@@ -637,10 +687,13 @@  discard block
 block discarded – undo
637 687
 	 */
638 688
 	function mkdir ( $path, $mode, $options )
639 689
 	{
640
-		if (!($url = $this->resolve_url_symlinks($path,false)))	// false = directory does not need to exists
690
+		if (!($url = $this->resolve_url_symlinks($path,false)))
691
+		{
692
+			// false = directory does not need to exists
641 693
 		{
642 694
 			return false;
643 695
 		}
696
+		}
644 697
 		// refuse to modify readonly target (eg. readonly share)
645 698
 		if (self::url_is_readonly($url))
646 699
 		{
@@ -652,7 +705,10 @@  discard block
 block discarded – undo
652 705
 			!($this->url_stat($parent_url, STREAM_URL_STAT_QUIET)) &&
653 706
 			Vfs::parse_url($parent_url, PHP_URL_PATH) !== '/')
654 707
 		{
655
-			if (!mkdir($parent_url, $mode, $options)) return false;
708
+			if (!mkdir($parent_url, $mode, $options))
709
+			{
710
+				return false;
711
+			}
656 712
 		}
657 713
 		// unset it now, as it was handled above
658 714
 		$options &= ~STREAM_MKDIR_RECURSIVE;
@@ -729,13 +785,19 @@  discard block
 block discarded – undo
729 785
 
730 786
 		if (!($this->opened_dir_url = $this->resolve_url_symlinks($path)))
731 787
 		{
732
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__."( $path,$options) resolve_url_symlinks() failed!");
788
+			if (self::LOG_LEVEL > 0)
789
+			{
790
+				error_log(__METHOD__."( $path,$options) resolve_url_symlinks() failed!");
791
+			}
733 792
 			return false;
734 793
 		}
735 794
 		if (!($this->opened_dir = $this->context ?
736 795
 			opendir($this->opened_dir_url, $this->context) : opendir($this->opened_dir_url)))
737 796
 		{
738
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__."( $path,$options) opendir($this->opened_dir_url) failed!");
797
+			if (self::LOG_LEVEL > 0)
798
+			{
799
+				error_log(__METHOD__."( $path,$options) opendir($this->opened_dir_url) failed!");
800
+			}
739 801
 			return false;
740 802
 		}
741 803
 		$this->opened_dir_writable = Vfs::check_access($this->opened_dir_url,Vfs::WRITABLE);
@@ -753,7 +815,10 @@  discard block
 block discarded – undo
753 815
 		}
754 816
 
755 817
 
756
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."( $path,$options): opendir($this->opened_dir_url)=$this->opened_dir, extra_dirs=".array2string($this->extra_dirs).', '.function_backtrace());
818
+		if (self::LOG_LEVEL > 1)
819
+		{
820
+			error_log(__METHOD__."( $path,$options): opendir($this->opened_dir_url)=$this->opened_dir, extra_dirs=".array2string($this->extra_dirs).', '.function_backtrace());
821
+		}
757 822
 		return true;
758 823
 	}
759 824
 
@@ -789,7 +854,10 @@  discard block
 block discarded – undo
789 854
 	{
790 855
 		if (!($url = self::resolve_url($path,!($flags & STREAM_URL_STAT_LINK), $check_symlink_components)))
791 856
 		{
792
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path',$flags) can NOT resolve path!");
857
+			if (self::LOG_LEVEL > 0)
858
+			{
859
+				error_log(__METHOD__."('$path',$flags) can NOT resolve path!");
860
+			}
793 861
 			return false;
794 862
 		}
795 863
 
@@ -806,18 +874,27 @@  discard block
 block discarded – undo
806 874
 				{
807 875
 					if (!$check_symlink_depth)
808 876
 					{
809
-						if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path',$flags) maximum symlink depth exceeded, might be a circular symlink!");
877
+						if (self::LOG_LEVEL > 0)
878
+						{
879
+							error_log(__METHOD__."('$path',$flags) maximum symlink depth exceeded, might be a circular symlink!");
880
+						}
810 881
 						$stat = false;
811 882
 					}
812 883
 					elseif (($lpath = Vfs::readlink($url)))
813 884
 					{
814
-						if ($lpath[0] != '/')	// concat relative path
885
+						if ($lpath[0] != '/')
886
+						{
887
+							// concat relative path
815 888
 						{
816 889
 							$lpath = Vfs::concat(Vfs::parse_url($path,PHP_URL_PATH),'../'.$lpath);
817 890
 						}
891
+						}
818 892
 						$u_query = parse_url($url,PHP_URL_QUERY);
819 893
 						$url = Vfs::PREFIX.$lpath;
820
-						if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path,$flags) symlif (substr($path,-1) == '/' && $path != '/') $path = substr($path,0,-1);	// remove trailing slash eg. added by WebDAVink found and resolved to $url");
894
+						if (self::LOG_LEVEL > 1)
895
+						{
896
+							error_log(__METHOD__."($path,$flags) symlif (substr($path,-1) == '/' && $path != '/') $path = substr($path,0,-1);	// remove trailing slash eg. added by WebDAVink found and resolved to $url");
897
+						}
821 898
 						// try reading the stat of the link
822 899
 						if (($stat = $this->url_stat($lpath, STREAM_URL_STAT_QUIET, false, true, $check_symlink_depth-1)))
823 900
 						{
@@ -830,7 +907,11 @@  discard block
 block discarded – undo
830 907
 								$stat_query = http_build_query(array_merge($stat_query, $u_query));
831 908
 								$stat['url'] = $stat_url['scheme'].'://'.$stat_url['host'].$stat_url['path'].'?'.$stat_query;
832 909
 							}
833
-							if(isset($stat['url'])) $url = $stat['url'];	// if stat returns an url use that, as there might be more links ...
910
+							if(isset($stat['url']))
911
+							{
912
+								$url = $stat['url'];
913
+							}
914
+							// if stat returns an url use that, as there might be more links ...
834 915
 							self::symlinkCache_add($path,$url);
835 916
 						}
836 917
 					}
@@ -853,7 +934,9 @@  discard block
 block discarded – undo
853 934
 		// check if a failed url_stat was for a home dir, in that case silently create it
854 935
 		if (!$stat && $try_create_home && Vfs::dirname(Vfs::parse_url($path,PHP_URL_PATH)) == '/home' &&
855 936
 			($id = $GLOBALS['egw']->accounts->name2id(Vfs::basename($path))) &&
856
-			$GLOBALS['egw']->accounts->id2name($id) == Vfs::basename($path))	// make sure path has the right case!
937
+			$GLOBALS['egw']->accounts->id2name($id) == Vfs::basename($path))
938
+		{
939
+			// make sure path has the right case!
857 940
 		{
858 941
 			$hook_data = array(
859 942
 				'location' => $GLOBALS['egw']->accounts->get_type($id) == 'g' ? 'addgroup' : 'addaccount',
@@ -861,15 +944,22 @@  discard block
 block discarded – undo
861 944
 				'account_lid' => Vfs::basename($path),
862 945
 				'account_name' => Vfs::basename($path),
863 946
 			);
947
+		}
864 948
 			call_user_func(array(__NAMESPACE__.'\\Hooks',$hook_data['location']),$hook_data);
865 949
 			unset($hook_data);
866 950
 			$stat = $this->url_stat($path,$flags,false);
867 951
 		}
868 952
 		$query = parse_url($url, PHP_URL_QUERY);
869
-		if (!$stat && $check_symlink_components)	// check if there's a symlink somewhere inbetween the path
953
+		if (!$stat && $check_symlink_components)
954
+		{
955
+			// check if there's a symlink somewhere inbetween the path
870 956
 		{
871 957
 			$stat = self::check_symlink_components($path,$flags,$url);
872
-			if ($stat && isset($stat['url']) && !$query) self::symlinkCache_add($path,$stat['url']);
958
+		}
959
+			if ($stat && isset($stat['url']) && !$query)
960
+			{
961
+				self::symlinkCache_add($path,$stat['url']);
962
+			}
873 963
 		}
874 964
 		elseif(is_array($stat) && !isset($stat['url']))
875 965
 		{
@@ -884,7 +974,10 @@  discard block
 block discarded – undo
884 974
 			$stat['url'] .= '?'.$query;
885 975
 		}
886 976
 
887
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,try_create_home=$try_create_home,check_symlink_components=$check_symlink_components) returning ".array2string($stat));
977
+		if (self::LOG_LEVEL > 1)
978
+		{
979
+			error_log(__METHOD__."('$path',$flags,try_create_home=$try_create_home,check_symlink_components=$check_symlink_components) returning ".array2string($stat));
980
+		}
888 981
 
889 982
 		return $stat;
890 983
 
@@ -910,10 +1003,16 @@  discard block
 block discarded – undo
910 1003
 	{
911 1004
 		if (is_null($url) && !($url = self::resolve_url($path)))
912 1005
 		{
913
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__."('$path',$flags,'$url') can NOT resolve path: ".function_backtrace(1));
1006
+			if (self::LOG_LEVEL > 0)
1007
+			{
1008
+				error_log(__METHOD__."('$path',$flags,'$url') can NOT resolve path: ".function_backtrace(1));
1009
+			}
914 1010
 			return false;
915 1011
 		}
916
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url'): ".function_backtrace(1));
1012
+		if (self::LOG_LEVEL > 1)
1013
+		{
1014
+			error_log(__METHOD__."('$path',$flags,'$url'): ".function_backtrace(1));
1015
+		}
917 1016
 
918 1017
 		while (($rel_path = Vfs::basename($url).($rel_path ? '/'.$rel_path : '')) &&
919 1018
 		       ($url = Vfs::dirname($url)))
@@ -922,7 +1021,10 @@  discard block
 block discarded – undo
922 1021
 			{
923 1022
 				if (is_link($url) && ($lpath = Vfs::readlink($url)))
924 1023
 				{
925
-					if (self::LOG_LEVEL > 1) $log = "rel_path='$rel_path', url='$url': lpath='$lpath'";
1024
+					if (self::LOG_LEVEL > 1)
1025
+					{
1026
+						$log = "rel_path='$rel_path', url='$url': lpath='$lpath'";
1027
+					}
926 1028
 
927 1029
 					if ($lpath[0] != '/')
928 1030
 					{
@@ -930,15 +1032,24 @@  discard block
 block discarded – undo
930 1032
 					}
931 1033
 					//self::symlinkCache_add($path,Vfs::PREFIX.$lpath);
932 1034
 					$url = Vfs::PREFIX.Vfs::concat($lpath,$rel_path);
933
-					if (self::LOG_LEVEL > 1) error_log("$log --> lpath='$lpath', url='$url'");
1035
+					if (self::LOG_LEVEL > 1)
1036
+					{
1037
+						error_log("$log --> lpath='$lpath', url='$url'");
1038
+					}
934 1039
 					return $this->url_stat($url,$flags);
935 1040
 				}
936 1041
 				$url = Vfs::concat($url,$rel_path);
937
-				if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url') returning null");
1042
+				if (self::LOG_LEVEL > 1)
1043
+				{
1044
+					error_log(__METHOD__."('$path',$flags,'$url') returning null");
1045
+				}
938 1046
 				return null;
939 1047
 			}
940 1048
 		}
941
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."('$path',$flags,'$url') returning false");
1049
+		if (self::LOG_LEVEL > 1)
1050
+		{
1051
+			error_log(__METHOD__."('$path',$flags,'$url') returning false");
1052
+		}
942 1053
 		return false;	// $path does not exist
943 1054
 	}
944 1055
 
@@ -959,9 +1070,16 @@  discard block
 block discarded – undo
959 1070
 	{
960 1071
 		$path = self::get_path($_path);
961 1072
 
962
-		if (isset(self::$symlink_cache[$path])) return;	// nothing to do
1073
+		if (isset(self::$symlink_cache[$path]))
1074
+		{
1075
+			return;
1076
+		}
1077
+		// nothing to do
963 1078
 
964
-		if ($target[0] != '/') $target = Vfs::parse_url($target,PHP_URL_PATH);
1079
+		if ($target[0] != '/')
1080
+		{
1081
+			$target = Vfs::parse_url($target,PHP_URL_PATH);
1082
+		}
965 1083
 
966 1084
 		self::$symlink_cache[$path] = $target;
967 1085
 
@@ -970,7 +1088,10 @@  discard block
 block discarded – undo
970 1088
 		{
971 1089
 			return strlen($a) - strlen($b);
972 1090
 		});
973
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path,$target) cache now ".array2string(self::$symlink_cache));
1091
+		if (self::LOG_LEVEL > 1)
1092
+		{
1093
+			error_log(__METHOD__."($path,$target) cache now ".array2string(self::$symlink_cache));
1094
+		}
974 1095
 	}
975 1096
 
976 1097
 	/**
@@ -983,7 +1104,10 @@  discard block
 block discarded – undo
983 1104
 		$path = self::get_path($_path);
984 1105
 
985 1106
 		unset(self::$symlink_cache[$path]);
986
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."($path) cache now ".array2string(self::$symlink_cache));
1107
+		if (self::LOG_LEVEL > 1)
1108
+		{
1109
+			error_log(__METHOD__."($path) cache now ".array2string(self::$symlink_cache));
1110
+		}
987 1111
 	}
988 1112
 
989 1113
 	/**
@@ -1004,11 +1128,18 @@  discard block
 block discarded – undo
1004 1128
 
1005 1129
 		foreach(self::$symlink_cache as $p => $t)
1006 1130
 		{
1007
-			if (($strlen_p = strlen($p)) > $strlen_path) continue;	// $path can NOT start with $p
1131
+			if (($strlen_p = strlen($p)) > $strlen_path)
1132
+			{
1133
+				continue;
1134
+			}
1135
+			// $path can NOT start with $p
1008 1136
 
1009 1137
 			if ($path == $p)
1010 1138
 			{
1011
-				if ($do_symlink) $target = $t;
1139
+				if ($do_symlink)
1140
+				{
1141
+					$target = $t;
1142
+				}
1012 1143
 				break;
1013 1144
 			}
1014 1145
 			elseif (substr($path,0,$strlen_p+1) == $p.'/')
@@ -1017,7 +1148,10 @@  discard block
 block discarded – undo
1017 1148
 				break;
1018 1149
 			}
1019 1150
 		}
1020
-		if (self::LOG_LEVEL > 1 && isset($target)) error_log(__METHOD__."($path) = $target");
1151
+		if (self::LOG_LEVEL > 1 && isset($target))
1152
+		{
1153
+			error_log(__METHOD__."($path) = $target");
1154
+		}
1021 1155
 		return isset($target) ? $target : $path;
1022 1156
 	}
1023 1157
 
@@ -1058,7 +1192,10 @@  discard block
 block discarded – undo
1058 1192
 				self::HIDE_UNREADABLES && !$this->opened_dir_writable &&
1059 1193
 				!Vfs::check_access(Vfs::concat($this->opened_dir_url,$file),Vfs::READABLE)));
1060 1194
 		}
1061
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__."( $this->opened_dir ) = '$file'");
1195
+		if (self::LOG_LEVEL > 1)
1196
+		{
1197
+			error_log(__METHOD__."( $this->opened_dir ) = '$file'");
1198
+		}
1062 1199
 		return $file;
1063 1200
 	}
1064 1201
 
@@ -1161,7 +1298,10 @@  discard block
 block discarded – undo
1161 1298
 		) as $class)
1162 1299
 		{
1163 1300
 			//error_log(__METHOD__."('$scheme') class_exists('$class')=".array2string(class_exists($class)));
1164
-			if (class_exists($class))  return $class;
1301
+			if (class_exists($class))
1302
+			{
1303
+				return $class;
1304
+			}
1165 1305
 		}
1166 1306
 	}
1167 1307
 
@@ -1222,11 +1362,17 @@  discard block
 block discarded – undo
1222 1362
 	 */
1223 1363
 	static function mount($url=null,$path=null,$check_url=null,$persitent_mount=true,$clear_fstab=false)
1224 1364
 	{
1225
-		if (is_null($check_url)) $check_url = strpos($url,'$') === false;
1365
+		if (is_null($check_url))
1366
+		{
1367
+			$check_url = strpos($url,'$') === false;
1368
+		}
1226 1369
 
1227
-		if (!isset($GLOBALS['egw_info']['server']['vfs_fstab']))	// happens eg. in setup
1370
+		if (!isset($GLOBALS['egw_info']['server']['vfs_fstab']))
1371
+		{
1372
+			// happens eg. in setup
1228 1373
 		{
1229 1374
 			$api_config = Api\Config::read('phpgwapi');
1375
+		}
1230 1376
 			if (isset($api_config['vfs_fstab']) && is_array($api_config['vfs_fstab']))
1231 1377
 			{
1232 1378
 				self::$fstab = $api_config['vfs_fstab'];
@@ -1242,12 +1388,18 @@  discard block
 block discarded – undo
1242 1388
 		}
1243 1389
 		if (is_null($url) || is_null($path))
1244 1390
 		{
1245
-			if (self::LOG_LEVEL > 1) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') returns '.array2string(self::$fstab));
1391
+			if (self::LOG_LEVEL > 1)
1392
+			{
1393
+				error_log(__METHOD__.'('.array2string($url).','.array2string($path).') returns '.array2string(self::$fstab));
1394
+			}
1246 1395
 			return self::$fstab;
1247 1396
 		}
1248 1397
 		if (!Vfs::$is_root)
1249 1398
 		{
1250
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') permission denied, you are NOT root!');
1399
+			if (self::LOG_LEVEL > 0)
1400
+			{
1401
+				error_log(__METHOD__.'('.array2string($url).','.array2string($path).') permission denied, you are NOT root!');
1402
+			}
1251 1403
 			return false;	// only root can mount
1252 1404
 		}
1253 1405
 		if ($clear_fstab)
@@ -1256,14 +1408,20 @@  discard block
 block discarded – undo
1256 1408
 		}
1257 1409
 		if (isset(self::$fstab[$path]) && self::$fstab[$path] === $url)
1258 1410
 		{
1259
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') already mounted.');
1411
+			if (self::LOG_LEVEL > 0)
1412
+			{
1413
+				error_log(__METHOD__.'('.array2string($url).','.array2string($path).') already mounted.');
1414
+			}
1260 1415
 			return true;	// already mounted
1261 1416
 		}
1262 1417
 		self::load_wrapper(Vfs::parse_url($url,PHP_URL_SCHEME));
1263 1418
 
1264 1419
 		if ($check_url && (!file_exists($url) || opendir($url) === false))
1265 1420
 		{
1266
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') url does NOT exist!');
1421
+			if (self::LOG_LEVEL > 0)
1422
+			{
1423
+				error_log(__METHOD__.'('.array2string($url).','.array2string($path).') url does NOT exist!');
1424
+			}
1267 1425
 			return false;	// url does not exist
1268 1426
 		}
1269 1427
 		self::$fstab[$path] = $url;
@@ -1278,12 +1436,18 @@  discard block
 block discarded – undo
1278 1436
 			Api\Config::save_value('vfs_fstab',self::$fstab,'phpgwapi');
1279 1437
 			$GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab;
1280 1438
 			// invalidate session cache
1281
-			if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))	// egw object in setup is limited
1439
+			if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))
1440
+			{
1441
+				// egw object in setup is limited
1282 1442
 			{
1283 1443
 				$GLOBALS['egw']->invalidate_session_cache();
1284 1444
 			}
1445
+			}
1446
+		}
1447
+		if (self::LOG_LEVEL > 1)
1448
+		{
1449
+			error_log(__METHOD__.'('.array2string($url).','.array2string($path).') returns true (successful new mount).');
1285 1450
 		}
1286
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__.'('.array2string($url).','.array2string($path).') returns true (successful new mount).');
1287 1451
 		return true;
1288 1452
 	}
1289 1453
 
@@ -1296,12 +1460,18 @@  discard block
 block discarded – undo
1296 1460
 	{
1297 1461
 		if (!Vfs::$is_root)
1298 1462
 		{
1299
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($path).','.array2string($path).') permission denied, you are NOT root!');
1463
+			if (self::LOG_LEVEL > 0)
1464
+			{
1465
+				error_log(__METHOD__.'('.array2string($path).','.array2string($path).') permission denied, you are NOT root!');
1466
+			}
1300 1467
 			return false;	// only root can mount
1301 1468
 		}
1302 1469
 		if (!isset(self::$fstab[$path]) && ($path = array_search($path,self::$fstab)) === false)
1303 1470
 		{
1304
-			if (self::LOG_LEVEL > 0) error_log(__METHOD__.'('.array2string($path).') NOT mounted!');
1471
+			if (self::LOG_LEVEL > 0)
1472
+			{
1473
+				error_log(__METHOD__.'('.array2string($path).') NOT mounted!');
1474
+			}
1305 1475
 			return false;	// $path not mounted
1306 1476
 		}
1307 1477
 		unset(self::$fstab[$path]);
@@ -1309,11 +1479,17 @@  discard block
 block discarded – undo
1309 1479
 		Api\Config::save_value('vfs_fstab',self::$fstab,'phpgwapi');
1310 1480
 		$GLOBALS['egw_info']['server']['vfs_fstab'] = self::$fstab;
1311 1481
 		// invalidate session cache
1312
-		if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))	// egw object in setup is limited
1482
+		if (method_exists($GLOBALS['egw'],'invalidate_session_cache'))
1483
+		{
1484
+			// egw object in setup is limited
1313 1485
 		{
1314 1486
 			$GLOBALS['egw']->invalidate_session_cache();
1315 1487
 		}
1316
-		if (self::LOG_LEVEL > 1) error_log(__METHOD__.'('.array2string($path).') returns true (successful unmount).');
1488
+		}
1489
+		if (self::LOG_LEVEL > 1)
1490
+		{
1491
+			error_log(__METHOD__.'('.array2string($path).') returns true (successful unmount).');
1492
+		}
1317 1493
 		return true;
1318 1494
 	}
1319 1495
 
@@ -1323,7 +1499,8 @@  discard block
 block discarded – undo
1323 1499
 	 */
1324 1500
 	static function init_static()
1325 1501
 	{
1326
-		if (in_array(self::SCHEME, stream_get_wrappers())) {
1502
+		if (in_array(self::SCHEME, stream_get_wrappers()))
1503
+		{
1327 1504
 			stream_wrapper_unregister(self::SCHEME);
1328 1505
 		}
1329 1506
 		stream_register_wrapper(self::SCHEME,__CLASS__);
Please login to merge, or discard this patch.
api/src/Vfs/StreamWrapperIface.php 3 patches
Doc Comments   +4 added lines, -3 removed lines patch added patch discarded remove patch
@@ -45,6 +45,7 @@  discard block
 block discarded – undo
45 45
 	 * This method is called when the stream is closed, using fclose().
46 46
 	 *
47 47
 	 * You must release any resources that were locked or allocated by the stream.
48
+	 * @return boolean
48 49
 	 */
49 50
 	function stream_close ( );
50 51
 
@@ -57,7 +58,7 @@  discard block
 block discarded – undo
57 58
 	 * You must also update the read/write position of the stream by the number of bytes that were successfully read.
58 59
 	 *
59 60
 	 * @param int $count
60
-	 * @return string/false up to count bytes read or false on EOF
61
+	 * @return string|false up to count bytes read or false on EOF
61 62
 	 */
62 63
 	function stream_read ( $count );
63 64
 
@@ -114,7 +115,7 @@  discard block
 block discarded – undo
114 115
 	 *
115 116
 	 * If you have cached data in your stream but not yet stored it into the underlying storage, you should do so now.
116 117
 	 *
117
-	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
118
+	 * @return boolean TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
118 119
 	 */
119 120
 	function stream_flush ( );
120 121
 
@@ -188,7 +189,7 @@  discard block
 block discarded – undo
188 189
 	 * This method is called immediately when your stream object is created for examining directory contents with opendir().
189 190
 	 *
190 191
 	 * @param string $path URL that was passed to opendir() and that this object is expected to explore.
191
-	 * @return booelan
192
+	 * @return boolean
192 193
 	 */
193 194
 	function dir_opendir ( $path, $options );
194 195
 
Please login to merge, or discard this patch.
Indentation   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -80,10 +80,10 @@
 block discarded – undo
80 80
  	 * Important: PHP 5.0 introduced a bug that wasn't fixed until 5.1: the return value has to be the oposite!
81 81
  	 *
82 82
  	 * if(version_compare(PHP_VERSION,'5.0','>=') && version_compare(PHP_VERSION,'5.1','<'))
83
-  	 * {
83
+ 	 * {
84 84
  	 * 		$eof = !$eof;
85 85
  	 * }
86
-  	 *
86
+ 	 *
87 87
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
88 88
  	 */
89 89
 	function stream_eof ( );
Please login to merge, or discard this patch.
Spacing   +18 added lines, -18 removed lines patch added patch discarded remove patch
@@ -39,14 +39,14 @@  discard block
 block discarded – undo
39 39
 	 * @param string $opened_path full path of the file/resource, if the open was successfull and STREAM_USE_PATH was set
40 40
 	 * @return boolean true if the ressource was opened successful, otherwise false
41 41
 	 */
42
-	function stream_open ( $path, $mode, $options, &$opened_path );
42
+	function stream_open($path, $mode, $options, &$opened_path);
43 43
 
44 44
 	/**
45 45
 	 * This method is called when the stream is closed, using fclose().
46 46
 	 *
47 47
 	 * You must release any resources that were locked or allocated by the stream.
48 48
 	 */
49
-	function stream_close ( );
49
+	function stream_close( );
50 50
 
51 51
 	/**
52 52
 	 * This method is called in response to fread() and fgets() calls on the stream.
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	 * @param int $count
60 60
 	 * @return string/false up to count bytes read or false on EOF
61 61
 	 */
62
-	function stream_read ( $count );
62
+	function stream_read($count);
63 63
 
64 64
 	/**
65 65
 	 * This method is called in response to fwrite() calls on the stream.
@@ -72,7 +72,7 @@  discard block
 block discarded – undo
72 72
 	 * @param string $data
73 73
 	 * @return integer
74 74
 	 */
75
-	function stream_write ( $data );
75
+	function stream_write($data);
76 76
 
77 77
  	/**
78 78
  	 * This method is called in response to feof() calls on the stream.
@@ -86,14 +86,14 @@  discard block
 block discarded – undo
86 86
   	 *
87 87
  	 * @return boolean true if the read/write position is at the end of the stream and no more data availible, false otherwise
88 88
  	 */
89
-	function stream_eof ( );
89
+	function stream_eof( );
90 90
 
91 91
 	/**
92 92
 	 * This method is called in response to ftell() calls on the stream.
93 93
 	 *
94 94
 	 * @return integer current read/write position of the stream
95 95
 	 */
96
- 	function stream_tell ( );
96
+ 	function stream_tell( );
97 97
 
98 98
  	/**
99 99
  	 * This method is called in response to fseek() calls on the stream.
@@ -107,7 +107,7 @@  discard block
 block discarded – undo
107 107
  	 * 							SEEK_END - Set position to end-of-file plus offset. (To move to a position before the end-of-file, you need to pass a negative value in offset.)
108 108
  	 * @return boolean TRUE if the position was updated, FALSE otherwise.
109 109
  	 */
110
-	function stream_seek ( $offset, $whence );
110
+	function stream_seek($offset, $whence);
111 111
 
112 112
 	/**
113 113
 	 * This method is called in response to fflush() calls on the stream.
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
 	 *
117 117
 	 * @return booelan TRUE if the cached data was successfully stored (or if there was no data to store), or FALSE if the data could not be stored.
118 118
 	 */
119
-	function stream_flush ( );
119
+	function stream_flush( );
120 120
 
121 121
 	/**
122 122
 	 * This method is called in response to fstat() calls on the stream.
@@ -132,7 +132,7 @@  discard block
 block discarded – undo
132 132
 	 *
133 133
 	 * @return array containing the same values as appropriate for the stream.
134 134
 	 */
135
-	function stream_stat ( );
135
+	function stream_stat( );
136 136
 
137 137
 	/**
138 138
 	 * This method is called in response to unlink() calls on URL paths associated with the wrapper.
@@ -143,7 +143,7 @@  discard block
 block discarded – undo
143 143
 	 * @param string $path
144 144
 	 * @return boolean TRUE on success or FALSE on failure
145 145
 	 */
146
-	function unlink ( $path );
146
+	function unlink($path);
147 147
 
148 148
 	/**
149 149
 	 * This method is called in response to rename() calls on URL paths associated with the wrapper.
@@ -157,7 +157,7 @@  discard block
 block discarded – undo
157 157
 	 * @param string $path_to
158 158
 	 * @return boolean TRUE on success or FALSE on failure
159 159
 	 */
160
-	function rename ( $path_from, $path_to );
160
+	function rename($path_from, $path_to);
161 161
 
162 162
 	/**
163 163
 	 * This method is called in response to mkdir() calls on URL paths associated with the wrapper.
@@ -170,7 +170,7 @@  discard block
 block discarded – undo
170 170
 	 * @param int $options Posible values include STREAM_REPORT_ERRORS and STREAM_MKDIR_RECURSIVE
171 171
 	 * @return boolean TRUE on success or FALSE on failure
172 172
 	 */
173
-	function mkdir ( $path, $mode, $options );
173
+	function mkdir($path, $mode, $options);
174 174
 
175 175
 	/**
176 176
 	 * This method is called in response to rmdir() calls on URL paths associated with the wrapper.
@@ -182,7 +182,7 @@  discard block
 block discarded – undo
182 182
 	 * @param int $options Possible values include STREAM_REPORT_ERRORS.
183 183
 	 * @return boolean TRUE on success or FALSE on failure.
184 184
 	 */
185
-	function rmdir ( $path, $options );
185
+	function rmdir($path, $options);
186 186
 
187 187
 	/**
188 188
 	 * This method is called immediately when your stream object is created for examining directory contents with opendir().
@@ -190,7 +190,7 @@  discard block
 block discarded – undo
190 190
 	 * @param string $path URL that was passed to opendir() and that this object is expected to explore.
191 191
 	 * @return booelan
192 192
 	 */
193
-	function dir_opendir ( $path, $options );
193
+	function dir_opendir($path, $options);
194 194
 
195 195
 	/**
196 196
 	 * This method is called in response to stat() calls on the URL paths associated with the wrapper.
@@ -218,7 +218,7 @@  discard block
 block discarded – undo
218 218
 	 *                          stat triggers it's own warning anyway, so it makes no sense to trigger one by our stream-wrapper!
219 219
 	 * @return array
220 220
 	 */
221
-	function url_stat ( $path, $flags );
221
+	function url_stat($path, $flags);
222 222
 
223 223
 	/**
224 224
 	 * This method is called in response to readdir().
@@ -227,7 +227,7 @@  discard block
 block discarded – undo
227 227
 	 *
228 228
 	 * @return string
229 229
 	 */
230
-	function dir_readdir ( );
230
+	function dir_readdir( );
231 231
 
232 232
 	/**
233 233
 	 * This method is called in response to rewinddir().
@@ -237,7 +237,7 @@  discard block
 block discarded – undo
237 237
 	 *
238 238
 	 * @return boolean
239 239
 	 */
240
-	function dir_rewinddir ( );
240
+	function dir_rewinddir( );
241 241
 
242 242
 	/**
243 243
 	 * This method is called in response to closedir().
@@ -246,5 +246,5 @@  discard block
 block discarded – undo
246 246
 	 *
247 247
 	 * @return boolean
248 248
 	 */
249
-	function dir_closedir ( );
249
+	function dir_closedir( );
250 250
 }
Please login to merge, or discard this patch.
api/src/Vfs/WebDAV.php 5 patches
Doc Comments   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -57,7 +57,7 @@  discard block
 block discarded – undo
57 57
 	* Reimplemented to not check our vfs base path with realpath and connect to mysql DB
58 58
 	*
59 59
 	* @access public
60
-    * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
60
+    * @param  string $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
61 61
 	*/
62 62
 	function ServeRequest($prefix=null)
63 63
 	{
@@ -76,7 +76,7 @@  discard block
 block discarded – undo
76 76
 	* DELETE method handler
77 77
 	*
78 78
 	* @param  array  general parameter passing array
79
-	* @return bool   true on success
79
+	* @return string   true on success
80 80
 	*/
81 81
 	function DELETE($options)
82 82
 	{
@@ -116,7 +116,7 @@  discard block
 block discarded – undo
116 116
      * Reimplemented to NOT use dirname/basename, which has problems with utf-8 chars
117 117
      *
118 118
      * @param  array  general parameter passing array
119
-     * @return bool   true on success
119
+     * @return string   true on success
120 120
      */
121 121
     function MKCOL($options)
122 122
     {
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
      * COPY method handler
152 152
      *
153 153
      * @param  array  general parameter passing array
154
-     * @return bool   true on success
154
+     * @return string   true on success
155 155
      */
156 156
     function COPY($options, $del=false)
157 157
     {
@@ -477,7 +477,7 @@  discard block
 block discarded – undo
477 477
 	 * but in the regular vfs attributes.
478 478
 	 *
479 479
 	 * @param  array  general parameter passing array
480
-	 * @return bool   true on success
480
+	 * @return string   true on success
481 481
 	 */
482 482
 	function PROPPATCH(&$options)
483 483
 	{
@@ -557,7 +557,7 @@  discard block
 block discarded – undo
557 557
 	 * LOCK method handler
558 558
 	 *
559 559
 	 * @param  array  general parameter passing array
560
-	 * @return bool   true on success
560
+	 * @return string|boolean   true on success
561 561
 	 */
562 562
 	function LOCK(&$options)
563 563
 	{
@@ -583,7 +583,7 @@  discard block
 block discarded – undo
583 583
 	 * UNLOCK method handler
584 584
 	 *
585 585
 	 * @param  array  general parameter passing array
586
-	 * @return bool   true on success
586
+	 * @return string   true on success
587 587
 	 */
588 588
 	function UNLOCK(&$options)
589 589
 	{
@@ -640,7 +640,7 @@  discard block
 block discarded – undo
640 640
 	 * Reimplement to add a Content-Disposition header, if ?download is appended to the REQUEST_URI
641 641
 	 *
642 642
 	 * @param  array  parameter passing array
643
-	 * @return bool   true on success
643
+	 * @return boolean|null   true on success
644 644
 	 */
645 645
 	function GET(&$options)
646 646
 	{
Please login to merge, or discard this patch.
Switch Indentation   +10 added lines, -10 removed lines patch added patch discarded remove patch
@@ -171,16 +171,16 @@
 block discarded – undo
171 171
 
172 172
         if (is_dir($source)) { // resource is a collection
173 173
             switch ($options["depth"]) {
174
-            case "infinity": // valid
175
-                break;
176
-            case "0": // valid for COPY only
177
-                if ($del) { // MOVE?
178
-                    return "400 Bad request";
179
-                }
180
-                break;
181
-            case "1": // invalid for both COPY and MOVE
182
-            default:
183
-                return "400 Bad request";
174
+            	case "infinity": // valid
175
+                	break;
176
+            	case "0": // valid for COPY only
177
+                	if ($del) { // MOVE?
178
+                    	return "400 Bad request";
179
+                	}
180
+                	break;
181
+            	case "1": // invalid for both COPY and MOVE
182
+            	default:
183
+                	return "400 Bad request";
184 184
             }
185 185
         }
186 186
 
Please login to merge, or discard this patch.
Indentation   +196 added lines, -196 removed lines patch added patch discarded remove patch
@@ -52,13 +52,13 @@  discard block
 block discarded – undo
52 52
 	var $debug = 0;
53 53
 
54 54
 	/**
55
-	* Serve a webdav request
56
-	*
57
-	* Reimplemented to not check our vfs base path with realpath and connect to mysql DB
58
-	*
59
-	* @access public
60
-    * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
61
-	*/
55
+	 * Serve a webdav request
56
+	 *
57
+	 * Reimplemented to not check our vfs base path with realpath and connect to mysql DB
58
+	 *
59
+	 * @access public
60
+	 * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
61
+	 */
62 62
 	function ServeRequest($prefix=null)
63 63
 	{
64 64
 		// special treatment for litmus compliance test
@@ -73,11 +73,11 @@  discard block
 block discarded – undo
73 73
 	}
74 74
 
75 75
 	/**
76
-	* DELETE method handler
77
-	*
78
-	* @param  array  general parameter passing array
79
-	* @return bool   true on success
80
-	*/
76
+	 * DELETE method handler
77
+	 *
78
+	 * @param  array  general parameter passing array
79
+	 * @return bool   true on success
80
+	 */
81 81
 	function DELETE($options)
82 82
 	{
83 83
 		$path = $this->base . $options['path'];
@@ -110,117 +110,117 @@  discard block
 block discarded – undo
110 110
 		return '204 No Content';
111 111
 	}
112 112
 
113
-    /**
114
-     * MKCOL method handler
115
-     *
116
-     * Reimplemented to NOT use dirname/basename, which has problems with utf-8 chars
117
-     *
118
-     * @param  array  general parameter passing array
119
-     * @return bool   true on success
120
-     */
121
-    function MKCOL($options)
122
-    {
123
-        $path   = $this->_unslashify($this->base .$options["path"]);
124
-        $parent = Vfs::dirname($path);
125
-
126
-        if (!file_exists($parent)) {
127
-            return "409 Conflict";
128
-        }
129
-
130
-        if (!is_dir($parent)) {
131
-            return "403 Forbidden";
132
-        }
133
-
134
-        if ( file_exists($path) ) {
135
-            return "405 Method not allowed";
136
-        }
137
-
138
-        if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
139
-            return "415 Unsupported media type";
140
-        }
141
-
142
-        $stat = mkdir($path, 0777);
143
-        if (!$stat) {
144
-            return "403 Forbidden";
145
-        }
146
-
147
-        return ("201 Created");
148
-    }
113
+	/**
114
+	 * MKCOL method handler
115
+	 *
116
+	 * Reimplemented to NOT use dirname/basename, which has problems with utf-8 chars
117
+	 *
118
+	 * @param  array  general parameter passing array
119
+	 * @return bool   true on success
120
+	 */
121
+	function MKCOL($options)
122
+	{
123
+		$path   = $this->_unslashify($this->base .$options["path"]);
124
+		$parent = Vfs::dirname($path);
125
+
126
+		if (!file_exists($parent)) {
127
+			return "409 Conflict";
128
+		}
129
+
130
+		if (!is_dir($parent)) {
131
+			return "403 Forbidden";
132
+		}
133
+
134
+		if ( file_exists($path) ) {
135
+			return "405 Method not allowed";
136
+		}
137
+
138
+		if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
139
+			return "415 Unsupported media type";
140
+		}
141
+
142
+		$stat = mkdir($path, 0777);
143
+		if (!$stat) {
144
+			return "403 Forbidden";
145
+		}
146
+
147
+		return ("201 Created");
148
+	}
149 149
 
150 150
 	/**
151
-     * COPY method handler
152
-     *
153
-     * @param  array  general parameter passing array
154
-     * @return bool   true on success
155
-     */
156
-    function COPY($options, $del=false)
157
-    {
158
-        // TODO Property updates still broken (Litmus should detect this?)
159
-
160
-        if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
161
-            return "415 Unsupported media type";
162
-        }
163
-
164
-        // no copying to different WebDAV Servers yet
165
-        if (isset($options["dest_url"])) {
166
-            return "502 bad gateway";
167
-        }
168
-
169
-        $source = $this->base .$options["path"];
170
-        if (!file_exists($source)) return "404 Not found";
171
-
172
-        if (is_dir($source)) { // resource is a collection
173
-            switch ($options["depth"]) {
174
-            case "infinity": // valid
175
-                break;
176
-            case "0": // valid for COPY only
177
-                if ($del) { // MOVE?
178
-                    return "400 Bad request";
179
-                }
180
-                break;
181
-            case "1": // invalid for both COPY and MOVE
182
-            default:
183
-                return "400 Bad request";
184
-            }
185
-        }
186
-
187
-        $dest         = $this->base . $options["dest"];
188
-        $destdir      = dirname($dest);
189
-
190
-        if (!file_exists($destdir) || !is_dir($destdir)) {
191
-            return "409 Conflict";
192
-        }
193
-
194
-        $new          = !file_exists($dest);
195
-        $existing_col = false;
196
-
197
-        if (!$new) {
198
-            if ($del && is_dir($dest)) {
199
-                if (!$options["overwrite"]) {
200
-                    return "412 precondition failed";
201
-                }
202
-                $dest .= Vfs::basename($source);
203
-                if (file_exists($dest)) {
204
-                    $options["dest"] .= Vfs::basename($source);
205
-                } else {
206
-                    $new          = true;
207
-                    $existing_col = true;
208
-                }
209
-            }
210
-        }
211
-
212
-        if (!$new) {
213
-            if ($options["overwrite"]) {
214
-                $stat = $this->DELETE(array("path" => $options["dest"]));
215
-                if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) {
216
-                    return $stat;
217
-                }
218
-            } else {
219
-                return "412 precondition failed";
220
-            }
221
-        }
222
-
223
-        if ($del) {
151
+	 * COPY method handler
152
+	 *
153
+	 * @param  array  general parameter passing array
154
+	 * @return bool   true on success
155
+	 */
156
+	function COPY($options, $del=false)
157
+	{
158
+		// TODO Property updates still broken (Litmus should detect this?)
159
+
160
+		if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
161
+			return "415 Unsupported media type";
162
+		}
163
+
164
+		// no copying to different WebDAV Servers yet
165
+		if (isset($options["dest_url"])) {
166
+			return "502 bad gateway";
167
+		}
168
+
169
+		$source = $this->base .$options["path"];
170
+		if (!file_exists($source)) return "404 Not found";
171
+
172
+		if (is_dir($source)) { // resource is a collection
173
+			switch ($options["depth"]) {
174
+			case "infinity": // valid
175
+				break;
176
+			case "0": // valid for COPY only
177
+				if ($del) { // MOVE?
178
+					return "400 Bad request";
179
+				}
180
+				break;
181
+			case "1": // invalid for both COPY and MOVE
182
+			default:
183
+				return "400 Bad request";
184
+			}
185
+		}
186
+
187
+		$dest         = $this->base . $options["dest"];
188
+		$destdir      = dirname($dest);
189
+
190
+		if (!file_exists($destdir) || !is_dir($destdir)) {
191
+			return "409 Conflict";
192
+		}
193
+
194
+		$new          = !file_exists($dest);
195
+		$existing_col = false;
196
+
197
+		if (!$new) {
198
+			if ($del && is_dir($dest)) {
199
+				if (!$options["overwrite"]) {
200
+					return "412 precondition failed";
201
+				}
202
+				$dest .= Vfs::basename($source);
203
+				if (file_exists($dest)) {
204
+					$options["dest"] .= Vfs::basename($source);
205
+				} else {
206
+					$new          = true;
207
+					$existing_col = true;
208
+				}
209
+			}
210
+		}
211
+
212
+		if (!$new) {
213
+			if ($options["overwrite"]) {
214
+				$stat = $this->DELETE(array("path" => $options["dest"]));
215
+				if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) {
216
+					return $stat;
217
+				}
218
+			} else {
219
+				return "412 precondition failed";
220
+			}
221
+		}
222
+
223
+		if ($del) {
224 224
 			try {
225 225
 				if (!rename($source, $dest)) {
226 226
 					return "500 Internal server error";
@@ -229,51 +229,51 @@  discard block
 block discarded – undo
229 229
 			catch (Exception\ProtectedDirectory $e) {
230 230
 				return "403 Forbidden: ".$e->getMessage();
231 231
 			}
232
-        } else {
233
-            if (is_dir($source) && $options['depth'] == 'infinity') {
234
-            	$files = Vfs::find($source,array('depth' => true,'url' => true));	// depth=true: return dirs first, url=true: allow urls!
235
-            } else {
236
-                $files = array($source);
237
-            }
238
-
239
-            if (!is_array($files) || empty($files)) {
240
-                return "500 Internal server error";
241
-            }
242
-
243
-
244
-            foreach ($files as $file) {
245
-                if (is_dir($file)) {
246
-                    $file = $this->_slashify($file);
247
-                }
248
-
249
-                $destfile = str_replace($source, $dest, $file);
250
-
251
-                if (is_dir($file)) {
252
-                    if (!is_dir($destfile)) {
253
-                        // TODO "mkdir -p" here? (only natively supported by PHP 5)
254
-                        if (!@mkdir($destfile)) {
255
-                            return "409 Conflict";
256
-                        }
257
-                    }
258
-                } else {
259
-                    if (!@copy($file, $destfile)) {
260
-                        return "409 Conflict";
261
-                    }
262
-                }
263
-            }
264
-        }
265
-        // adding Location header as shown in example in rfc2518 section 8.9.5
232
+		} else {
233
+			if (is_dir($source) && $options['depth'] == 'infinity') {
234
+				$files = Vfs::find($source,array('depth' => true,'url' => true));	// depth=true: return dirs first, url=true: allow urls!
235
+			} else {
236
+				$files = array($source);
237
+			}
238
+
239
+			if (!is_array($files) || empty($files)) {
240
+				return "500 Internal server error";
241
+			}
242
+
243
+
244
+			foreach ($files as $file) {
245
+				if (is_dir($file)) {
246
+					$file = $this->_slashify($file);
247
+				}
248
+
249
+				$destfile = str_replace($source, $dest, $file);
250
+
251
+				if (is_dir($file)) {
252
+					if (!is_dir($destfile)) {
253
+						// TODO "mkdir -p" here? (only natively supported by PHP 5)
254
+						if (!@mkdir($destfile)) {
255
+							return "409 Conflict";
256
+						}
257
+					}
258
+				} else {
259
+					if (!@copy($file, $destfile)) {
260
+						return "409 Conflict";
261
+					}
262
+				}
263
+			}
264
+		}
265
+		// adding Location header as shown in example in rfc2518 section 8.9.5
266 266
 		header('Location: '.$this->base_uri.$options['dest']);
267 267
 
268
-        return ($new && !$existing_col) ? "201 Created" : "204 No Content";
269
-    }
268
+		return ($new && !$existing_col) ? "201 Created" : "204 No Content";
269
+	}
270 270
 
271
-    /**
272
-	* Get properties for a single file/resource
273
-	*
274
-	* @param  string  $_path resource path
275
-	* @return array   resource properties
276
-	*/
271
+	/**
272
+	 * Get properties for a single file/resource
273
+	 *
274
+	 * @param  string  $_path resource path
275
+	 * @return array   resource properties
276
+	 */
277 277
 	function fileinfo($_path)
278 278
 	{
279 279
 		// internally we require some url-encoding, as vfs_stream_wrapper uses URL's internally
@@ -301,9 +301,9 @@  discard block
 block discarded – undo
301 301
 		$info['props'][] = self::mkprop	('creationdate',    filectime($fspath));
302 302
 		$info['props'][] = self::mkprop	('getlastmodified', filemtime($fspath));
303 303
 
304
-        // Microsoft extensions: last access time and 'hidden' status
305
-        $info["props"][] = self::mkprop("lastaccessed",    fileatime($fspath));
306
-        $info["props"][] = self::mkprop("ishidden",        Vfs::is_hidden($fspath));
304
+		// Microsoft extensions: last access time and 'hidden' status
305
+		$info["props"][] = self::mkprop("lastaccessed",    fileatime($fspath));
306
+		$info["props"][] = self::mkprop("ishidden",        Vfs::is_hidden($fspath));
307 307
 
308 308
 		// type and size (caller already made sure that path exists)
309 309
 		if (is_dir($fspath)) {
@@ -441,38 +441,38 @@  discard block
 block discarded – undo
441 441
 	}
442 442
 
443 443
  	/**
444
-	 * Used eg. by get
445
-	 *
446
-	 * @todo replace all calls to _mimetype with Vfs::mime_content_type()
447
-	 * @param string $path
448
-	 * @return string
449
-	 */
444
+ 	 * Used eg. by get
445
+ 	 *
446
+ 	 * @todo replace all calls to _mimetype with Vfs::mime_content_type()
447
+ 	 * @param string $path
448
+ 	 * @return string
449
+ 	 */
450 450
 	function _mimetype($path)
451 451
 	{
452 452
 		return Vfs::mime_content_type($path);
453 453
 	}
454 454
 
455
-    /**
456
-     * Check if path is readable by current user
457
-     *
458
-     * @param string $fspath
459
-     * @return boolean
460
-     */
461
-    function _is_readable($fspath)
462
-    {
463
-    	return Vfs::is_readable($fspath);
464
-    }
465
-
466
-    /**
467
-     * Check if path is writable by current user
468
-     *
469
-     * @param string $fspath
470
-     * @return boolean
471
-     */
472
-    function _is_writable($fspath)
473
-    {
474
-    	return Vfs::is_writable($fspath);
475
-    }
455
+	/**
456
+	 * Check if path is readable by current user
457
+	 *
458
+	 * @param string $fspath
459
+	 * @return boolean
460
+	 */
461
+	function _is_readable($fspath)
462
+	{
463
+		return Vfs::is_readable($fspath);
464
+	}
465
+
466
+	/**
467
+	 * Check if path is writable by current user
468
+	 *
469
+	 * @param string $fspath
470
+	 * @return boolean
471
+	 */
472
+	function _is_writable($fspath)
473
+	{
474
+		return Vfs::is_writable($fspath);
475
+	}
476 476
 
477 477
 	/**
478 478
 	 * PROPPATCH method handler
@@ -615,13 +615,13 @@  discard block
 block discarded – undo
615 615
 	 * @param  string  directory path
616 616
 	 * @return void    function has to handle HTTP response itself
617 617
 	 */
618
-    function GetDir($fspath, &$options)
619
-    {
618
+	function GetDir($fspath, &$options)
619
+	{
620 620
 		// add a content-type header to overwrite an existing default charset in apache (AddDefaultCharset directiv)
621 621
 		header('Content-type: text/html; charset='.Api\Translation::charset());
622 622
 
623 623
 		parent::GetDir($fspath, $options);
624
-    }
624
+	}
625 625
 
626 626
 	private $force_download = false;
627 627
 
Please login to merge, or discard this patch.
Spacing   +85 added lines, -85 removed lines patch added patch discarded remove patch
@@ -59,7 +59,7 @@  discard block
 block discarded – undo
59 59
 	* @access public
60 60
     * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
61 61
 	*/
62
-	function ServeRequest($prefix=null)
62
+	function ServeRequest($prefix = null)
63 63
 	{
64 64
 		// special treatment for litmus compliance test
65 65
 		// reply on its identifier header
@@ -80,7 +80,7 @@  discard block
 block discarded – undo
80 80
 	*/
81 81
 	function DELETE($options)
82 82
 	{
83
-		$path = $this->base . $options['path'];
83
+		$path = $this->base.$options['path'];
84 84
 
85 85
 		if (!file_exists($path))
86 86
 		{
@@ -120,7 +120,7 @@  discard block
 block discarded – undo
120 120
      */
121 121
     function MKCOL($options)
122 122
     {
123
-        $path   = $this->_unslashify($this->base .$options["path"]);
123
+        $path   = $this->_unslashify($this->base.$options["path"]);
124 124
         $parent = Vfs::dirname($path);
125 125
 
126 126
         if (!file_exists($parent)) {
@@ -131,7 +131,7 @@  discard block
 block discarded – undo
131 131
             return "403 Forbidden";
132 132
         }
133 133
 
134
-        if ( file_exists($path) ) {
134
+        if (file_exists($path)) {
135 135
             return "405 Method not allowed";
136 136
         }
137 137
 
@@ -153,7 +153,7 @@  discard block
 block discarded – undo
153 153
      * @param  array  general parameter passing array
154 154
      * @return bool   true on success
155 155
      */
156
-    function COPY($options, $del=false)
156
+    function COPY($options, $del = false)
157 157
     {
158 158
         // TODO Property updates still broken (Litmus should detect this?)
159 159
 
@@ -166,7 +166,7 @@  discard block
 block discarded – undo
166 166
             return "502 bad gateway";
167 167
         }
168 168
 
169
-        $source = $this->base .$options["path"];
169
+        $source = $this->base.$options["path"];
170 170
         if (!file_exists($source)) return "404 Not found";
171 171
 
172 172
         if (is_dir($source)) { // resource is a collection
@@ -184,7 +184,7 @@  discard block
 block discarded – undo
184 184
             }
185 185
         }
186 186
 
187
-        $dest         = $this->base . $options["dest"];
187
+        $dest         = $this->base.$options["dest"];
188 188
         $destdir      = dirname($dest);
189 189
 
190 190
         if (!file_exists($destdir) || !is_dir($destdir)) {
@@ -231,7 +231,7 @@  discard block
 block discarded – undo
231 231
 			}
232 232
         } else {
233 233
             if (is_dir($source) && $options['depth'] == 'infinity') {
234
-            	$files = Vfs::find($source,array('depth' => true,'url' => true));	// depth=true: return dirs first, url=true: allow urls!
234
+            	$files = Vfs::find($source, array('depth' => true, 'url' => true)); // depth=true: return dirs first, url=true: allow urls!
235 235
             } else {
236 236
                 $files = array($source);
237 237
             }
@@ -277,16 +277,16 @@  discard block
 block discarded – undo
277 277
 	function fileinfo($_path)
278 278
 	{
279 279
 		// internally we require some url-encoding, as vfs_stream_wrapper uses URL's internally
280
-		$path = str_replace(array('#','?'),array('%23','%3F'),$_path);
280
+		$path = str_replace(array('#', '?'), array('%23', '%3F'), $_path);
281 281
 
282 282
 		//error_log(__METHOD__."($path)");
283 283
 		// map URI path to filesystem path
284
-		$fspath = $this->base . $path;
284
+		$fspath = $this->base.$path;
285 285
 
286 286
 		// create result array
287 287
 		$info = array();
288 288
 		// TODO remove slash append code when base class is able to do it itself
289
-		$info['path']  = is_dir($fspath) ? $this->_slashify($path) : $path;
289
+		$info['path'] = is_dir($fspath) ? $this->_slashify($path) : $path;
290 290
 
291 291
 		// remove all urlencoding we need internally in EGw, HTTP_WebDAV_Server will add it's own!
292 292
 		// rawurldecode does NOT touch +
@@ -295,32 +295,32 @@  discard block
 block discarded – undo
295 295
 		$info['props'] = array();
296 296
 
297 297
 		// no special beautified displayname here ...
298
-		$info['props'][] = self::mkprop	('displayname', Vfs::basename(self::_unslashify($info['path'])));
298
+		$info['props'][] = self::mkprop('displayname', Vfs::basename(self::_unslashify($info['path'])));
299 299
 
300 300
 		// creation and modification time
301
-		$info['props'][] = self::mkprop	('creationdate',    filectime($fspath));
302
-		$info['props'][] = self::mkprop	('getlastmodified', filemtime($fspath));
301
+		$info['props'][] = self::mkprop('creationdate', filectime($fspath));
302
+		$info['props'][] = self::mkprop('getlastmodified', filemtime($fspath));
303 303
 
304 304
         // Microsoft extensions: last access time and 'hidden' status
305
-        $info["props"][] = self::mkprop("lastaccessed",    fileatime($fspath));
306
-        $info["props"][] = self::mkprop("ishidden",        Vfs::is_hidden($fspath));
305
+        $info["props"][] = self::mkprop("lastaccessed", fileatime($fspath));
306
+        $info["props"][] = self::mkprop("ishidden", Vfs::is_hidden($fspath));
307 307
 
308 308
 		// type and size (caller already made sure that path exists)
309 309
 		if (is_dir($fspath)) {
310 310
 			// directory (WebDAV collection)
311
-			$info['props'][] = self::mkprop	('resourcetype', array(
311
+			$info['props'][] = self::mkprop('resourcetype', array(
312 312
 			 	self::mkprop('collection', '')));
313
-			$info['props'][] = self::mkprop	('getcontenttype', 'httpd/unix-directory');
313
+			$info['props'][] = self::mkprop('getcontenttype', 'httpd/unix-directory');
314 314
 		} else {
315 315
 			// plain file (WebDAV resource)
316
-			$info['props'][] = self::mkprop	('resourcetype', '');
316
+			$info['props'][] = self::mkprop('resourcetype', '');
317 317
 			if (Vfs::is_readable($path)) {
318
-				$info['props'][] = self::mkprop	('getcontenttype', Vfs::mime_content_type($path));
318
+				$info['props'][] = self::mkprop('getcontenttype', Vfs::mime_content_type($path));
319 319
 			} else {
320 320
 				error_log(__METHOD__."($path) $fspath is not readable!");
321
-				$info['props'][] = self::mkprop	('getcontenttype', 'application/x-non-readable');
321
+				$info['props'][] = self::mkprop('getcontenttype', 'application/x-non-readable');
322 322
 			}
323
-			$info['props'][] = self::mkprop	('getcontentlength', filesize($fspath));
323
+			$info['props'][] = self::mkprop('getcontentlength', filesize($fspath));
324 324
 		}
325 325
 		// generate etag from inode (sqlfs: fs_id), modification time and size
326 326
 		$stat = stat($fspath);
@@ -374,21 +374,21 @@  discard block
 block discarded – undo
374 374
 	 */
375 375
 	function PROPFIND(&$options, &$files)
376 376
 	{
377
-		if (!parent::PROPFIND($options,$files))
377
+		if (!parent::PROPFIND($options, $files))
378 378
 		{
379 379
 			return false;
380 380
 		}
381 381
 		$path2n = array();
382
-		foreach($files['files'] as $n => $info)
382
+		foreach ($files['files'] as $n => $info)
383 383
 		{
384 384
 			// do NOT report /clientsync/.favorites/, as it fails
385
-			if (strpos($info['path'],'/clientsync/.favorites/') === 0)
385
+			if (strpos($info['path'], '/clientsync/.favorites/') === 0)
386 386
 			{
387 387
 				unset($files['files'][$n]);
388 388
 				continue;
389 389
 			}
390 390
 			$_path = $info['path'];
391
-			if (!$n && $info['path'] != '/' && substr($info['path'],-1) == '/') $_path = substr($info['path'],0,-1);
391
+			if (!$n && $info['path'] != '/' && substr($info['path'], -1) == '/') $_path = substr($info['path'], 0, -1);
392 392
 
393 393
 			// need to encode path again, as $info['path'] is NOT encoded, but Vfs::(stat|propfind) require it
394 394
 			// otherwise pathes containing url special chars like ? or # will not stat
@@ -398,21 +398,21 @@  discard block
 block discarded – undo
398 398
 			// adding some properties used instead of regular DAV times
399 399
 			if (($stat = Vfs::stat($path)))
400 400
 			{
401
-				$fileprops =& $files['files'][$path2n[$path]]['props'];
402
-				foreach(self::$auto_props as $attr => $props)
401
+				$fileprops = & $files['files'][$path2n[$path]]['props'];
402
+				foreach (self::$auto_props as $attr => $props)
403 403
 				{
404
-					switch($attr)
404
+					switch ($attr)
405 405
 					{
406 406
 						case 'ctime':
407 407
 						case 'mtime':
408 408
 						case 'atime':
409
-							$value = gmdate('D, d M Y H:i:s T',$stat[$attr]);
409
+							$value = gmdate('D, d M Y H:i:s T', $stat[$attr]);
410 410
 							break;
411 411
 
412 412
 						default:
413 413
 							continue 2;
414 414
 					}
415
-					foreach($props as $prop)
415
+					foreach ($props as $prop)
416 416
 					{
417 417
 						$prop['val'] = $value;
418 418
 						$fileprops[] = $prop;
@@ -420,17 +420,17 @@  discard block
 block discarded – undo
420 420
 				}
421 421
 			}
422 422
 		}
423
-		if ($path2n && ($path2props = Vfs::propfind(array_keys($path2n),null)))
423
+		if ($path2n && ($path2props = Vfs::propfind(array_keys($path2n), null)))
424 424
 		{
425
-			foreach($path2props as $path => $props)
425
+			foreach ($path2props as $path => $props)
426 426
 			{
427
-				$fileprops =& $files['files'][$path2n[$path]]['props'];
428
-				foreach($props as $prop)
427
+				$fileprops = & $files['files'][$path2n[$path]]['props'];
428
+				foreach ($props as $prop)
429 429
 				{
430 430
 					if ($prop['ns'] == Vfs::DEFAULT_PROP_NAMESPACE && $prop['name'][0] == '#')	// eGW's customfields
431 431
 					{
432 432
 						$prop['ns'] .= 'customfields/';
433
-						$prop['name'] = substr($prop['name'],1);
433
+						$prop['name'] = substr($prop['name'], 1);
434 434
 					}
435 435
 					$fileprops[] = $prop;
436 436
 				}
@@ -486,36 +486,36 @@  discard block
 block discarded – undo
486 486
 	 */
487 487
 	function PROPPATCH(&$options)
488 488
 	{
489
-		$path = Api\Translation::convert($options['path'],'utf-8');
489
+		$path = Api\Translation::convert($options['path'], 'utf-8');
490 490
 
491 491
 		foreach ($options['props'] as $key => $prop) {
492 492
 			$attributes = array();
493
-			switch($prop['ns'])
493
+			switch ($prop['ns'])
494 494
 			{
495 495
 				// allow Webdrive to set creation and modification time
496 496
 				case 'http://www.southrivertech.com/':
497
-					switch($prop['name'])
497
+					switch ($prop['name'])
498 498
 					{
499 499
 						case 'srt_modifiedtime':
500 500
 						case 'getlastmodified':
501
-							Vfs::touch($path,strtotime($prop['val']));
501
+							Vfs::touch($path, strtotime($prop['val']));
502 502
 							break;
503 503
 						//case 'srt_creationtime':
504 504
 							// no streamwrapper interface / php function to set the ctime currently
505 505
 							//$attributes['created'] = strtotime($prop['val']);
506 506
 							//break;
507 507
 						default:
508
-							if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
508
+							if (!Vfs::proppatch($path, array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
509 509
 							break;
510 510
 					}
511 511
 					break;
512 512
 
513 513
 				case 'DAV:':
514
-					switch($prop['name'])
514
+					switch ($prop['name'])
515 515
 					{
516 516
 						// allow netdrive to change the modification time
517 517
 						case 'getlastmodified':
518
-							Vfs::touch($path,strtotime($prop['val']));
518
+							Vfs::touch($path, strtotime($prop['val']));
519 519
 							break;
520 520
 						// not sure why, the filesystem example of the WebDAV class does it ...
521 521
 						default:
@@ -525,16 +525,16 @@  discard block
 block discarded – undo
525 525
 					break;
526 526
 
527 527
 				case 'urn:schemas-microsoft-com:':
528
-					switch($prop['name'])
528
+					switch ($prop['name'])
529 529
 					{
530 530
 						case 'Win32LastModifiedTime':
531
-							Vfs::touch($path,strtotime($prop['val']));
531
+							Vfs::touch($path, strtotime($prop['val']));
532 532
 							break;
533 533
 						case 'Win32CreationTime':	// eg. "Wed, 14 Sep 2011 15:48:26 GMT"
534 534
 						case 'Win32LastAccessTime':
535 535
 						case 'Win32FileAttributes':	// not sure what that is, it was always "00000000"
536 536
 						default:
537
-							if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
537
+							if (!Vfs::proppatch($path, array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
538 538
 							break;
539 539
 					}
540 540
 					break;
@@ -544,18 +544,18 @@  discard block
 block discarded – undo
544 544
 					$prop['name'] = '#'.$prop['name'];
545 545
 					// fall through
546 546
 				default:
547
-					if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
547
+					if (!Vfs::proppatch($path, array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
548 548
 					break;
549 549
 			}
550 550
 			if ($this->debug) $props[] = '('.$prop['ns'].')'.$prop['name'].'='.$prop['val'];
551 551
 		}
552 552
 		if ($this->debug)
553 553
 		{
554
-			error_log(__METHOD__.": path=$options[path], props=".implode(', ',$props));
555
-			if ($attributes) error_log(__METHOD__.": path=$options[path], set attributes=".str_replace("\n",' ',print_r($attributes,true)));
554
+			error_log(__METHOD__.": path=$options[path], props=".implode(', ', $props));
555
+			if ($attributes) error_log(__METHOD__.": path=$options[path], set attributes=".str_replace("\n", ' ', print_r($attributes, true)));
556 556
 		}
557 557
 
558
-		return '';	// this is as the filesystem example handler does it, no true or false ...
558
+		return ''; // this is as the filesystem example handler does it, no true or false ...
559 559
 	}
560 560
 
561 561
 	/**
@@ -566,18 +566,18 @@  discard block
 block discarded – undo
566 566
 	 */
567 567
 	function LOCK(&$options)
568 568
 	{
569
-		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
569
+		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n", '    '), '', print_r($options, true)).')');
570 570
 		// TODO recursive locks on directories not supported yet
571
-		if (is_dir($this->base . $options['path']) && !empty($options['depth']))
571
+		if (is_dir($this->base.$options['path']) && !empty($options['depth']))
572 572
 		{
573 573
 			return '409 Conflict';
574 574
 		}
575
-		$options['timeout'] = time()+300; // 5min. hardcoded
575
+		$options['timeout'] = time() + 300; // 5min. hardcoded
576 576
 
577 577
 		// dont know why, but HTTP_WebDAV_Server passes the owner in D:href tags, which get's passed unchanged to checkLock/PROPFIND
578 578
 		// that's wrong according to the standard and cadaver does not show it on discover --> strip_tags removes eventual tags
579
-		if (($ret = Vfs::lock($options['path'],$options['locktoken'],$options['timeout'],strip_tags($options['owner']),
580
-			$options['scope'],$options['type'],isset($options['update']))) && !isset($options['update']))
579
+		if (($ret = Vfs::lock($options['path'], $options['locktoken'], $options['timeout'], strip_tags($options['owner']),
580
+			$options['scope'], $options['type'], isset($options['update']))) && !isset($options['update']))
581 581
 		{
582 582
 			return $ret ? '200 OK' : '409 Conflict';
583 583
 		}
@@ -592,8 +592,8 @@  discard block
 block discarded – undo
592 592
 	 */
593 593
 	function UNLOCK(&$options)
594 594
 	{
595
-		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
596
-		return Vfs::unlock($options['path'],$options['token']) ? '204 No Content' : '409 Conflict';
595
+		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n", '    '), '', print_r($options, true)).')');
596
+		return Vfs::unlock($options['path'], $options['token']) ? '204 No Content' : '409 Conflict';
597 597
 	}
598 598
 
599 599
 	/**
@@ -632,9 +632,9 @@  discard block
 block discarded – undo
632 632
 	 */
633 633
 	function __construct()
634 634
 	{
635
-		if ($_SERVER['REQUEST_METHOD'] == 'GET' && (($this->force_download = strpos($_SERVER['REQUEST_URI'],'?download')) !== false))
635
+		if ($_SERVER['REQUEST_METHOD'] == 'GET' && (($this->force_download = strpos($_SERVER['REQUEST_URI'], '?download')) !== false))
636 636
 		{
637
-			$_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'],0,$this->force_download);
637
+			$_SERVER['REQUEST_URI'] = substr($_SERVER['REQUEST_URI'], 0, $this->force_download);
638 638
 		}
639 639
 		parent::__construct();
640 640
 	}
@@ -649,7 +649,7 @@  discard block
 block discarded – undo
649 649
 	 */
650 650
 	function GET(&$options)
651 651
 	{
652
-		if (is_dir($this->base . $options["path"]))
652
+		if (is_dir($this->base.$options["path"]))
653 653
 		{
654 654
 			return $this->autoindex($options);
655 655
 		}
@@ -657,11 +657,11 @@  discard block
 block discarded – undo
657 657
 		{
658 658
 			// mitigate risks of serving javascript or css from our domain
659 659
 			Api\Header\Content::safe($options['stream'], $options['path'], $options['mimetype'], $options['size'], false,
660
-				$this->force_download, true);	// true = do not send content-type and content-length header, but modify values
660
+				$this->force_download, true); // true = do not send content-type and content-length header, but modify values
661 661
 
662 662
 			if (!is_resource($options['stream']))
663 663
 			{
664
-				$options['data'] =& $options['stream'];
664
+				$options['data'] = & $options['stream'];
665 665
 				unset($options['stream']);
666 666
 			}
667 667
 		}
@@ -680,9 +680,9 @@  discard block
 block discarded – undo
680 680
 			'depth' => 1,
681 681
 		);
682 682
 		$files = array();
683
-		if (($ret = $this->PROPFIND($propfind_options,$files)) !== true)
683
+		if (($ret = $this->PROPFIND($propfind_options, $files)) !== true)
684 684
 		{
685
-			return $ret;	// no collection
685
+			return $ret; // no collection
686 686
 		}
687 687
 		header('Content-type: text/html; charset='.Api\Translation::charset());
688 688
 		echo "<html>\n<head>\n\t<title>".'EGroupware WebDAV server '.htmlspecialchars($options['path'])."</title>\n";
@@ -694,10 +694,10 @@  discard block
 block discarded – undo
694 694
 		echo '<h1>WebDAV ';
695 695
 		list(,$base) = explode(parse_url($GLOBALS['egw_info']['server']['webserver_url'], PHP_URL_PATH), $this->base_uri, 2);
696 696
 		$path = $base;
697
-		foreach(explode('/',$this->_unslashify($options['path'])) as $n => $name)
697
+		foreach (explode('/', $this->_unslashify($options['path'])) as $n => $name)
698 698
 		{
699 699
 			$path .= ($n != 1 ? '/' : '').$name;
700
-			echo Api\Html::a_href(htmlspecialchars($name.'/'),$path);
700
+			echo Api\Html::a_href(htmlspecialchars($name.'/'), $path);
701 701
 		}
702 702
 		echo "</h1>\n";
703 703
 
@@ -714,18 +714,18 @@  discard block
 block discarded – undo
714 714
 		);
715 715
 		$n = 0;
716 716
 		$collection_props = null;
717
-		foreach($files['files'] as $file)
717
+		foreach ($files['files'] as $file)
718 718
 		{
719 719
 			if (!isset($collection_props))
720 720
 			{
721 721
 				$collection_props = $this->props2array($file['props']);
722 722
 				echo '<h3>'.lang('Collection listing').': '.htmlspecialchars($collection_props['DAV:displayname'])."</h3>\n";
723
-				continue;	// own entry --> displaying properies later
723
+				continue; // own entry --> displaying properies later
724 724
 			}
725
-			if(!$n++)
725
+			if (!$n++)
726 726
 			{
727 727
 				echo "<table>\n\t<tr class='th'>\n\t\t<th>#</th>\n\t\t<th>".lang('Name')."</th>";
728
-				foreach($props2show as $label)
728
+				foreach ($props2show as $label)
729 729
 				{
730 730
 					echo "\t\t<th>".lang($label)."</th>\n";
731 731
 				}
@@ -735,9 +735,9 @@  discard block
 block discarded – undo
735 735
 			//echo $file['path']; _debug_array($props);
736 736
 			$class = $class == 'row_on' ? 'row_off' : 'row_on';
737 737
 
738
-			if (substr($file['path'],-1) == '/')
738
+			if (substr($file['path'], -1) == '/')
739 739
 			{
740
-				$name = Vfs::basename(substr($file['path'],0,-1)).'/';
740
+				$name = Vfs::basename(substr($file['path'], 0, -1)).'/';
741 741
 			}
742 742
 			else
743 743
 			{
@@ -745,14 +745,14 @@  discard block
 block discarded – undo
745 745
 			}
746 746
 
747 747
 			echo "\t<tr class='$class'>\n\t\t<td>$n</td>\n\t\t<td>".
748
-				Api\Html::a_href(htmlspecialchars($name),$base.strtr($file['path'], array(
748
+				Api\Html::a_href(htmlspecialchars($name), $base.strtr($file['path'], array(
749 749
 					'%' => '%25',
750 750
 					'#' => '%23',
751 751
 					'?' => '%3F',
752 752
 				)))."</td>\n";
753
-			foreach($props2show as $prop => $label)
753
+			foreach ($props2show as $prop => $label)
754 754
 			{
755
-				echo "\t\t<td>".($prop=='DAV:getlastmodified'&&!empty($props[$prop])?date('Y-m-d H:i:s',$props[$prop]):$props[$prop])."</td>\n";
755
+				echo "\t\t<td>".($prop == 'DAV:getlastmodified' && !empty($props[$prop]) ?date('Y-m-d H:i:s', $props[$prop]) : $props[$prop])."</td>\n";
756 756
 			}
757 757
 			echo "\t</tr>\n";
758 758
 		}
@@ -766,12 +766,12 @@  discard block
 block discarded – undo
766 766
 		}
767 767
 		echo '<h3>'.lang('Properties')."</h3>\n";
768 768
 		echo "<table>\n\t<tr class='th'><th>".lang('Namespace')."</th><th>".lang('Name')."</th><th>".lang('Value')."</th></tr>\n";
769
-		foreach($collection_props as $name => $value)
769
+		foreach ($collection_props as $name => $value)
770 770
 		{
771 771
 			$class = $class == 'row_on' ? 'row_off' : 'row_on';
772
-			$parts = explode(':',$name);
772
+			$parts = explode(':', $name);
773 773
 			$name = array_pop($parts);
774
-			$ns = implode(':',$parts);
774
+			$ns = implode(':', $parts);
775 775
 			echo "\t<tr class='$class'>\n\t\t<td>".htmlspecialchars($ns)."</td><td style='white-space: nowrap'>".htmlspecialchars($name)."</td>\n";
776 776
 			echo "\t\t<td>".$value."</td>\n\t</tr>\n";
777 777
 		}
@@ -814,11 +814,11 @@  discard block
 block discarded – undo
814 814
 				'wrap'            => 0,
815 815
 			));
816 816
 		}
817
-		if (($href=preg_match('/\<(D:)?href\>[^<]+\<\/(D:)?href\>/i',$value)))
817
+		if (($href = preg_match('/\<(D:)?href\>[^<]+\<\/(D:)?href\>/i', $value)))
818 818
 		{
819
-			$value = preg_replace('/\<(D:)?href\>('.preg_quote($this->base_uri.'/','/').')?([^<]+)\<\/(D:)?href\>/i','<\\1href><a href="\\2\\3">\\3</a></\\4href>',$value);
819
+			$value = preg_replace('/\<(D:)?href\>('.preg_quote($this->base_uri.'/', '/').')?([^<]+)\<\/(D:)?href\>/i', '<\\1href><a href="\\2\\3">\\3</a></\\4href>', $value);
820 820
 		}
821
-		$ret = $value[0] == '<'  || strpos($value, "\n") !== false ?
821
+		$ret = $value[0] == '<' || strpos($value, "\n") !== false ?
822 822
 			'<pre>'.htmlspecialchars($value).'</pre>' : htmlspecialchars($value);
823 823
 
824 824
 		if ($href)
@@ -838,10 +838,10 @@  discard block
 block discarded – undo
838 838
 	protected function props2array(array $props)
839 839
 	{
840 840
 		$arr = array();
841
-		foreach($props as $prop)
841
+		foreach ($props as $prop)
842 842
 		{
843 843
 			$ns_hash = array('DAV:' => 'D');
844
-			switch($prop['ns'])
844
+			switch ($prop['ns'])
845 845
 			{
846 846
 				case 'DAV:';
847 847
 					$ns = 'DAV';
@@ -851,10 +851,10 @@  discard block
 block discarded – undo
851 851
 			}
852 852
 			if (is_array($prop['val']))
853 853
 			{
854
-				$prop['val'] = $this->_hierarchical_prop_encode($prop['val'], $prop['ns'], $ns_defs='', $ns_hash);
854
+				$prop['val'] = $this->_hierarchical_prop_encode($prop['val'], $prop['ns'], $ns_defs = '', $ns_hash);
855 855
 				// hack to show real namespaces instead of not (visibly) defined shortcuts
856 856
 				unset($ns_hash['DAV:']);
857
-				$value = strtr($v=$this->prop_value($prop['val']),array_flip($ns_hash));
857
+				$value = strtr($v = $this->prop_value($prop['val']), array_flip($ns_hash));
858 858
 			}
859 859
 			else
860 860
 			{
Please login to merge, or discard this patch.
Braces   +133 added lines, -50 removed lines patch added patch discarded remove patch
@@ -64,7 +64,8 @@  discard block
 block discarded – undo
64 64
 		// special treatment for litmus compliance test
65 65
 		// reply on its identifier header
66 66
 		// not needed for the test itself but eases debugging
67
-		if (isset($this->_SERVER['HTTP_X_LITMUS'])) {
67
+		if (isset($this->_SERVER['HTTP_X_LITMUS']))
68
+		{
68 69
 			error_log("Litmus test ".$this->_SERVER['HTTP_X_LITMUS']);
69 70
 			header("X-Litmus-reply: ".$this->_SERVER['HTTP_X_LITMUS']);
70 71
 		}
@@ -123,24 +124,30 @@  discard block
 block discarded – undo
123 124
         $path   = $this->_unslashify($this->base .$options["path"]);
124 125
         $parent = Vfs::dirname($path);
125 126
 
126
-        if (!file_exists($parent)) {
127
+        if (!file_exists($parent))
128
+        {
127 129
             return "409 Conflict";
128 130
         }
129 131
 
130
-        if (!is_dir($parent)) {
132
+        if (!is_dir($parent))
133
+        {
131 134
             return "403 Forbidden";
132 135
         }
133 136
 
134
-        if ( file_exists($path) ) {
137
+        if ( file_exists($path) )
138
+        {
135 139
             return "405 Method not allowed";
136 140
         }
137 141
 
138
-        if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
142
+        if (!empty($this->_SERVER["CONTENT_LENGTH"]))
143
+        {
144
+// no body parsing yet
139 145
             return "415 Unsupported media type";
140 146
         }
141 147
 
142 148
         $stat = mkdir($path, 0777);
143
-        if (!$stat) {
149
+        if (!$stat)
150
+        {
144 151
             return "403 Forbidden";
145 152
         }
146 153
 
@@ -157,24 +164,35 @@  discard block
 block discarded – undo
157 164
     {
158 165
         // TODO Property updates still broken (Litmus should detect this?)
159 166
 
160
-        if (!empty($this->_SERVER["CONTENT_LENGTH"])) { // no body parsing yet
167
+        if (!empty($this->_SERVER["CONTENT_LENGTH"]))
168
+        {
169
+// no body parsing yet
161 170
             return "415 Unsupported media type";
162 171
         }
163 172
 
164 173
         // no copying to different WebDAV Servers yet
165
-        if (isset($options["dest_url"])) {
174
+        if (isset($options["dest_url"]))
175
+        {
166 176
             return "502 bad gateway";
167 177
         }
168 178
 
169 179
         $source = $this->base .$options["path"];
170
-        if (!file_exists($source)) return "404 Not found";
180
+        if (!file_exists($source))
181
+        {
182
+        	return "404 Not found";
183
+        }
171 184
 
172
-        if (is_dir($source)) { // resource is a collection
173
-            switch ($options["depth"]) {
185
+        if (is_dir($source))
186
+        {
187
+// resource is a collection
188
+            switch ($options["depth"])
189
+            {
174 190
             case "infinity": // valid
175 191
                 break;
176 192
             case "0": // valid for COPY only
177
-                if ($del) { // MOVE?
193
+                if ($del)
194
+                {
195
+// MOVE?
178 196
                     return "400 Bad request";
179 197
                 }
180 198
                 break;
@@ -187,76 +205,104 @@  discard block
 block discarded – undo
187 205
         $dest         = $this->base . $options["dest"];
188 206
         $destdir      = dirname($dest);
189 207
 
190
-        if (!file_exists($destdir) || !is_dir($destdir)) {
208
+        if (!file_exists($destdir) || !is_dir($destdir))
209
+        {
191 210
             return "409 Conflict";
192 211
         }
193 212
 
194 213
         $new          = !file_exists($dest);
195 214
         $existing_col = false;
196 215
 
197
-        if (!$new) {
198
-            if ($del && is_dir($dest)) {
199
-                if (!$options["overwrite"]) {
216
+        if (!$new)
217
+        {
218
+            if ($del && is_dir($dest))
219
+            {
220
+                if (!$options["overwrite"])
221
+                {
200 222
                     return "412 precondition failed";
201 223
                 }
202 224
                 $dest .= Vfs::basename($source);
203
-                if (file_exists($dest)) {
225
+                if (file_exists($dest))
226
+                {
204 227
                     $options["dest"] .= Vfs::basename($source);
205
-                } else {
228
+                }
229
+                else
230
+                {
206 231
                     $new          = true;
207 232
                     $existing_col = true;
208 233
                 }
209 234
             }
210 235
         }
211 236
 
212
-        if (!$new) {
213
-            if ($options["overwrite"]) {
237
+        if (!$new)
238
+        {
239
+            if ($options["overwrite"])
240
+            {
214 241
                 $stat = $this->DELETE(array("path" => $options["dest"]));
215
-                if (($stat{0} != "2") && (substr($stat, 0, 3) != "404")) {
242
+                if (($stat{0} != "2") && (substr($stat, 0, 3) != "404"))
243
+                {
216 244
                     return $stat;
217 245
                 }
218
-            } else {
246
+            }
247
+            else
248
+            {
219 249
                 return "412 precondition failed";
220 250
             }
221 251
         }
222 252
 
223
-        if ($del) {
253
+        if ($del)
254
+        {
224 255
 			try {
225
-				if (!rename($source, $dest)) {
256
+				if (!rename($source, $dest))
257
+				{
226 258
 					return "500 Internal server error";
227 259
 				}
228 260
 			}
229 261
 			catch (Exception\ProtectedDirectory $e) {
230 262
 				return "403 Forbidden: ".$e->getMessage();
231 263
 			}
232
-        } else {
233
-            if (is_dir($source) && $options['depth'] == 'infinity') {
264
+        }
265
+        else
266
+        {
267
+            if (is_dir($source) && $options['depth'] == 'infinity')
268
+            {
234 269
             	$files = Vfs::find($source,array('depth' => true,'url' => true));	// depth=true: return dirs first, url=true: allow urls!
235
-            } else {
270
+            }
271
+            else
272
+            {
236 273
                 $files = array($source);
237 274
             }
238 275
 
239
-            if (!is_array($files) || empty($files)) {
276
+            if (!is_array($files) || empty($files))
277
+            {
240 278
                 return "500 Internal server error";
241 279
             }
242 280
 
243 281
 
244
-            foreach ($files as $file) {
245
-                if (is_dir($file)) {
282
+            foreach ($files as $file)
283
+            {
284
+                if (is_dir($file))
285
+                {
246 286
                     $file = $this->_slashify($file);
247 287
                 }
248 288
 
249 289
                 $destfile = str_replace($source, $dest, $file);
250 290
 
251
-                if (is_dir($file)) {
252
-                    if (!is_dir($destfile)) {
291
+                if (is_dir($file))
292
+                {
293
+                    if (!is_dir($destfile))
294
+                    {
253 295
                         // TODO "mkdir -p" here? (only natively supported by PHP 5)
254
-                        if (!@mkdir($destfile)) {
296
+                        if (!@mkdir($destfile))
297
+                        {
255 298
                             return "409 Conflict";
256 299
                         }
257 300
                     }
258
-                } else {
259
-                    if (!@copy($file, $destfile)) {
301
+                }
302
+                else
303
+                {
304
+                    if (!@copy($file, $destfile))
305
+                    {
260 306
                         return "409 Conflict";
261 307
                     }
262 308
                 }
@@ -306,17 +352,23 @@  discard block
 block discarded – undo
306 352
         $info["props"][] = self::mkprop("ishidden",        Vfs::is_hidden($fspath));
307 353
 
308 354
 		// type and size (caller already made sure that path exists)
309
-		if (is_dir($fspath)) {
355
+		if (is_dir($fspath))
356
+		{
310 357
 			// directory (WebDAV collection)
311 358
 			$info['props'][] = self::mkprop	('resourcetype', array(
312 359
 			 	self::mkprop('collection', '')));
313 360
 			$info['props'][] = self::mkprop	('getcontenttype', 'httpd/unix-directory');
314
-		} else {
361
+		}
362
+		else
363
+		{
315 364
 			// plain file (WebDAV resource)
316 365
 			$info['props'][] = self::mkprop	('resourcetype', '');
317
-			if (Vfs::is_readable($path)) {
366
+			if (Vfs::is_readable($path))
367
+			{
318 368
 				$info['props'][] = self::mkprop	('getcontenttype', Vfs::mime_content_type($path));
319
-			} else {
369
+			}
370
+			else
371
+			{
320 372
 				error_log(__METHOD__."($path) $fspath is not readable!");
321 373
 				$info['props'][] = self::mkprop	('getcontenttype', 'application/x-non-readable');
322 374
 			}
@@ -388,7 +440,10 @@  discard block
 block discarded – undo
388 440
 				continue;
389 441
 			}
390 442
 			$_path = $info['path'];
391
-			if (!$n && $info['path'] != '/' && substr($info['path'],-1) == '/') $_path = substr($info['path'],0,-1);
443
+			if (!$n && $info['path'] != '/' && substr($info['path'],-1) == '/')
444
+			{
445
+				$_path = substr($info['path'],0,-1);
446
+			}
392 447
 
393 448
 			// need to encode path again, as $info['path'] is NOT encoded, but Vfs::(stat|propfind) require it
394 449
 			// otherwise pathes containing url special chars like ? or # will not stat
@@ -427,16 +482,22 @@  discard block
 block discarded – undo
427 482
 				$fileprops =& $files['files'][$path2n[$path]]['props'];
428 483
 				foreach($props as $prop)
429 484
 				{
430
-					if ($prop['ns'] == Vfs::DEFAULT_PROP_NAMESPACE && $prop['name'][0] == '#')	// eGW's customfields
485
+					if ($prop['ns'] == Vfs::DEFAULT_PROP_NAMESPACE && $prop['name'][0] == '#')
486
+					{
487
+						// eGW's customfields
431 488
 					{
432 489
 						$prop['ns'] .= 'customfields/';
490
+					}
433 491
 						$prop['name'] = substr($prop['name'],1);
434 492
 					}
435 493
 					$fileprops[] = $prop;
436 494
 				}
437 495
 			}
438 496
 		}
439
-		if ($this->debug) error_log(__METHOD__."() props=".array2string($files['files']));
497
+		if ($this->debug)
498
+		{
499
+			error_log(__METHOD__."() props=".array2string($files['files']));
500
+		}
440 501
 		return true;
441 502
 	}
442 503
 
@@ -488,7 +549,8 @@  discard block
 block discarded – undo
488 549
 	{
489 550
 		$path = Api\Translation::convert($options['path'],'utf-8');
490 551
 
491
-		foreach ($options['props'] as $key => $prop) {
552
+		foreach ($options['props'] as $key => $prop)
553
+		{
492 554
 			$attributes = array();
493 555
 			switch($prop['ns'])
494 556
 			{
@@ -505,7 +567,10 @@  discard block
 block discarded – undo
505 567
 							//$attributes['created'] = strtotime($prop['val']);
506 568
 							//break;
507 569
 						default:
508
-							if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
570
+							if (!Vfs::proppatch($path,array($prop)))
571
+							{
572
+								$options['props'][$key]['status'] = '403 Forbidden';
573
+							}
509 574
 							break;
510 575
 					}
511 576
 					break;
@@ -534,7 +599,10 @@  discard block
 block discarded – undo
534 599
 						case 'Win32LastAccessTime':
535 600
 						case 'Win32FileAttributes':	// not sure what that is, it was always "00000000"
536 601
 						default:
537
-							if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
602
+							if (!Vfs::proppatch($path,array($prop)))
603
+							{
604
+								$options['props'][$key]['status'] = '403 Forbidden';
605
+							}
538 606
 							break;
539 607
 					}
540 608
 					break;
@@ -544,15 +612,24 @@  discard block
 block discarded – undo
544 612
 					$prop['name'] = '#'.$prop['name'];
545 613
 					// fall through
546 614
 				default:
547
-					if (!Vfs::proppatch($path,array($prop))) $options['props'][$key]['status'] = '403 Forbidden';
615
+					if (!Vfs::proppatch($path,array($prop)))
616
+					{
617
+						$options['props'][$key]['status'] = '403 Forbidden';
618
+					}
548 619
 					break;
549 620
 			}
550
-			if ($this->debug) $props[] = '('.$prop['ns'].')'.$prop['name'].'='.$prop['val'];
621
+			if ($this->debug)
622
+			{
623
+				$props[] = '('.$prop['ns'].')'.$prop['name'].'='.$prop['val'];
624
+			}
551 625
 		}
552 626
 		if ($this->debug)
553 627
 		{
554 628
 			error_log(__METHOD__.": path=$options[path], props=".implode(', ',$props));
555
-			if ($attributes) error_log(__METHOD__.": path=$options[path], set attributes=".str_replace("\n",' ',print_r($attributes,true)));
629
+			if ($attributes)
630
+			{
631
+				error_log(__METHOD__.": path=$options[path], set attributes=".str_replace("\n",' ',print_r($attributes,true)));
632
+			}
556 633
 		}
557 634
 
558 635
 		return '';	// this is as the filesystem example handler does it, no true or false ...
@@ -566,7 +643,10 @@  discard block
 block discarded – undo
566 643
 	 */
567 644
 	function LOCK(&$options)
568 645
 	{
569
-		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
646
+		if ($this->debug)
647
+		{
648
+			error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
649
+		}
570 650
 		// TODO recursive locks on directories not supported yet
571 651
 		if (is_dir($this->base . $options['path']) && !empty($options['depth']))
572 652
 		{
@@ -592,7 +672,10 @@  discard block
 block discarded – undo
592 672
 	 */
593 673
 	function UNLOCK(&$options)
594 674
 	{
595
-		if ($this->debug) error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
675
+		if ($this->debug)
676
+		{
677
+			error_log(__METHOD__.'('.str_replace(array("\n",'    '),'',print_r($options,true)).')');
678
+		}
596 679
 		return Vfs::unlock($options['path'],$options['token']) ? '204 No Content' : '409 Conflict';
597 680
 	}
598 681
 
Please login to merge, or discard this patch.
api/src/WebDAV/Server.php 6 patches
Doc Comments   +9 added lines, -1 removed lines patch added patch discarded remove patch
@@ -2170,6 +2170,9 @@  discard block
 block discarded – undo
2170 2170
 
2171 2171
     // {{{ _copymove()
2172 2172
 
2173
+    /**
2174
+     * @param string $what
2175
+     */
2173 2176
     function _copymove($what)
2174 2177
     {
2175 2178
         $options         = Array();
@@ -2509,7 +2512,7 @@  discard block
 block discarded – undo
2509 2512
      * defined in RFC 2518 section 9.4
2510 2513
      *
2511 2514
      * @param  void
2512
-     * @return void
2515
+     * @return boolean
2513 2516
      */
2514 2517
     function _check_if_header_conditions()
2515 2518
     {
@@ -2581,6 +2584,7 @@  discard block
 block discarded – undo
2581 2584
      *
2582 2585
      * @param  string  path of resource to check
2583 2586
      * @param  bool    exclusive lock?
2587
+     * @param string $path
2584 2588
      */
2585 2589
     function _check_lock_status($path, $exclusive_only = false)
2586 2590
     {
@@ -2733,6 +2737,7 @@  discard block
 block discarded – undo
2733 2737
      * not really needed but added for completenes
2734 2738
      *
2735 2739
      * @param  string  URL to decode
2740
+     * @param string $path
2736 2741
      * @return string  decoded URL
2737 2742
      */
2738 2743
     public static function _urldecode($path)
@@ -2835,6 +2840,7 @@  discard block
 block discarded – undo
2835 2840
      * UTF-8 encode property values if not already done so
2836 2841
      *
2837 2842
      * @param  string  text to encode
2843
+     * @param string $text
2838 2844
      * @return string  utf-8 encoded text
2839 2845
      */
2840 2846
     function _prop_encode($text)
@@ -2876,6 +2882,7 @@  discard block
 block discarded – undo
2876 2882
      *
2877 2883
      * @param   string directory path
2878 2884
      * @returns string directory path wihtout trailing slash
2885
+     * @return string
2879 2886
      */
2880 2887
     public static function _unslashify($path)
2881 2888
     {
@@ -2892,6 +2899,7 @@  discard block
 block discarded – undo
2892 2899
      *
2893 2900
      * @param  string  parent path
2894 2901
      * @param  string  child path
2902
+     * @param string $child
2895 2903
      * @return string  merged path
2896 2904
      */
2897 2905
     public static function _mergePaths($parent, $child)
Please login to merge, or discard this patch.
Upper-Lower-Casing   +13 added lines, -13 removed lines patch added patch discarded remove patch
@@ -655,8 +655,8 @@  discard block
 block discarded – undo
655 655
      */
656 656
     function http_PROPFIND($handler='PROPFIND')
657 657
     {
658
-        $options = Array();
659
-        $files   = Array();
658
+        $options = array();
659
+        $files   = array();
660 660
 
661 661
         $options["path"] = $this->path;
662 662
 
@@ -1164,7 +1164,7 @@  discard block
 block discarded – undo
1164 1164
     function http_PROPPATCH()
1165 1165
     {
1166 1166
         if ($this->_check_lock_status($this->path)) {
1167
-            $options = Array();
1167
+            $options = array();
1168 1168
 
1169 1169
             $options["path"] = $this->path;
1170 1170
 
@@ -1222,7 +1222,7 @@  discard block
 block discarded – undo
1222 1222
      */
1223 1223
     function http_MKCOL()
1224 1224
     {
1225
-        $options = Array();
1225
+        $options = array();
1226 1226
 
1227 1227
         $options["path"] = $this->path;
1228 1228
 
@@ -1269,7 +1269,7 @@  discard block
 block discarded – undo
1269 1269
     function http_GET()
1270 1270
     {
1271 1271
         // TODO check for invalid stream
1272
-        $options         = Array();
1272
+        $options         = array();
1273 1273
         $options["path"] = $this->path;
1274 1274
 
1275 1275
         $this->_get_ranges($options);
@@ -1478,7 +1478,7 @@  discard block
 block discarded – undo
1478 1478
     function http_HEAD()
1479 1479
     {
1480 1480
         $status          = false;
1481
-        $options         = Array();
1481
+        $options         = array();
1482 1482
         $options["path"] = $this->path;
1483 1483
 
1484 1484
         if (method_exists($this, "HEAD")) {
@@ -1524,7 +1524,7 @@  discard block
 block discarded – undo
1524 1524
     function http_POST()
1525 1525
     {
1526 1526
         $status          = '405 Method not allowed';
1527
-        $options         = Array();
1527
+        $options         = array();
1528 1528
         $options['path'] = $this->path;
1529 1529
 
1530 1530
         if (isset($this->_SERVER['CONTENT_LENGTH']))
@@ -1704,7 +1704,7 @@  discard block
 block discarded – undo
1704 1704
     function http_PUT()
1705 1705
     {
1706 1706
         if ($this->_check_lock_status($this->path)) {
1707
-            $options                   = Array();
1707
+            $options                   = array();
1708 1708
             $options["path"]           = $this->path;
1709 1709
 
1710 1710
             if (isset($this->_SERVER['CONTENT_LENGTH']))
@@ -1923,7 +1923,7 @@  discard block
 block discarded – undo
1923 1923
         // check lock status
1924 1924
         if ($this->_check_lock_status($this->path)) {
1925 1925
             // ok, proceed
1926
-            $options         = Array();
1926
+            $options         = array();
1927 1927
             $options["path"] = $this->path;
1928 1928
 
1929 1929
             $stat = $this->DELETE($options);
@@ -1985,7 +1985,7 @@  discard block
 block discarded – undo
1985 1985
      */
1986 1986
     function http_LOCK()
1987 1987
     {
1988
-        $options         = Array();
1988
+        $options         = array();
1989 1989
         $options["path"] = $this->path;
1990 1990
 
1991 1991
         if (isset($this->_SERVER['HTTP_DEPTH'])) {
@@ -2103,7 +2103,7 @@  discard block
 block discarded – undo
2103 2103
      */
2104 2104
     function http_UNLOCK()
2105 2105
     {
2106
-        $options         = Array();
2106
+        $options         = array();
2107 2107
         $options["path"] = $this->path;
2108 2108
 
2109 2109
         if (isset($this->_SERVER['HTTP_DEPTH'])) {
@@ -2133,7 +2133,7 @@  discard block
 block discarded – undo
2133 2133
      */
2134 2134
     function http_ACL()
2135 2135
     {
2136
-        $options         = Array();
2136
+        $options         = array();
2137 2137
         $options['path'] = $this->path;
2138 2138
         $options['errors'] = array();
2139 2139
 
@@ -2172,7 +2172,7 @@  discard block
 block discarded – undo
2172 2172
 
2173 2173
     function _copymove($what)
2174 2174
     {
2175
-        $options         = Array();
2175
+        $options         = array();
2176 2176
         $options["path"] = $this->path;
2177 2177
 
2178 2178
         if (isset($this->_SERVER["HTTP_DEPTH"])) {
Please login to merge, or discard this patch.
Switch Indentation   +179 added lines, -179 removed lines patch added patch discarded remove patch
@@ -816,34 +816,34 @@  discard block
 block discarded – undo
816 816
 	            	// this can happen if we have allprop and prop in one propfind:
817 817
 	            	// <allprop /><prop><blah /></prop>, eg. blah is not automatic returned by allprop
818 818
 	                switch(is_array($props) ? $props[0] : $props) {
819
-	                case "all":
820
-	                    // nothing to remove
821
-	                    break;
822
-
823
-	                case "names":
824
-	                    // only the names of all existing properties were requested
825
-	                    // so we remove all values
826
-	                    unset($prop["val"]);
827
-	                    break;
828
-
829
-	                default:
830
-	                    $found = false;
831
-
832
-	                    // search property name in requested properties
833
-	                    foreach ((array)$props as $reqprop) {
834
-	                        if (   $reqprop["name"]  == $prop["name"]
835
-	                               && @$reqprop["xmlns"] == $prop["ns"]) {
836
-	                            $found = true;
837
-	                            break;
838
-	                        }
839
-	                    }
840
-
841
-	                    // unset property and continue with next one if not found/requested
842
-	                    if (!$found) {
843
-	                        $prop="";
844
-	                        continue(2);
845
-	                    }
846
-	                    break;
819
+	                	case "all":
820
+	                    	// nothing to remove
821
+	                    	break;
822
+
823
+	                	case "names":
824
+	                    	// only the names of all existing properties were requested
825
+	                    	// so we remove all values
826
+	                    	unset($prop["val"]);
827
+	                    	break;
828
+
829
+	                	default:
830
+	                    	$found = false;
831
+
832
+	                    	// search property name in requested properties
833
+	                    	foreach ((array)$props as $reqprop) {
834
+	                        	if (   $reqprop["name"]  == $prop["name"]
835
+	                               	&& @$reqprop["xmlns"] == $prop["ns"]) {
836
+	                            	$found = true;
837
+	                            	break;
838
+	                        	}
839
+	                    	}
840
+
841
+	                    	// unset property and continue with next one if not found/requested
842
+	                    	if (!$found) {
843
+	                        	$prop="";
844
+	                        	continue(2);
845
+	                    	}
846
+	                    	break;
847 847
 	                }
848 848
 
849 849
 	                // namespace handling
@@ -964,49 +964,49 @@  discard block
 block discarded – undo
964 964
                     } else if ($prop["ns"] == "DAV:") {
965 965
                         // some WebDAV properties need special treatment
966 966
                         switch ($prop["name"]) {
967
-                        case "creationdate":
968
-                            echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
969
-                                . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
970
-                                . '</'.($this->crrnd?'':'D:')."creationdate>\n";
971
-                            break;
972
-                        case "getlastmodified":
973
-                            echo '     <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
974
-                                . gmdate("D, d M Y H:i:s ", $prop['val'])
975
-                                . "GMT</".($this->crrnd?'':'D:')."getlastmodified>\n";
976
-                            break;
977
-                        case "supportedlock":
978
-                            echo '     <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]</".($this->crrnd?'':'D:')."supportedlock>\n";
979
-                            break;
980
-                        case "lockdiscovery":
981
-                            echo '     <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
982
-                            echo $prop["val"];
983
-                            echo '     </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
984
-                            break;
985
-                        // the following are non-standard Microsoft extensions to the DAV namespace
986
-                        case "lastaccessed":
987
-                            echo '     <'.($this->crrnd?'':'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
988
-                                . gmdate("D, d M Y H:i:s ", $prop['val'])
989
-                                . 'GMT</'.($this->crrnd?'':'D:')."lastaccessed>\n";
990
-                            break;
991
-                        case "ishidden":
992
-                            echo '     <'.($this->crrnd?'':'D:')."ishidden>"
993
-                                . is_string($prop['val']) ? $prop['val'] : ($prop['val'] ? 'true' : 'false')
994
-                                . '</'.($this->crrnd?'':'D:')."</D:ishidden>\n";
995
-                            break;
996
-                        default:
997
-                        	$ns_defs = '';
998
-                            if (is_array($prop['val']))
999
-                            {
1000
-                            	$hns_hash = $ns_hash;
1001
-                            	$val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash);
1002
-                            } elseif (isset($prop['raw'])) {
1003
-                            	$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
1004
-                            } else {
1005
-	                    		$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1006
-                            }
1007
-	                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1008
-	                        	'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1009
-                            break;
967
+                        	case "creationdate":
968
+                            	echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
969
+                                	. gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
970
+                                	. '</'.($this->crrnd?'':'D:')."creationdate>\n";
971
+                            	break;
972
+                        	case "getlastmodified":
973
+                            	echo '     <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
974
+                                	. gmdate("D, d M Y H:i:s ", $prop['val'])
975
+                                	. "GMT</".($this->crrnd?'':'D:')."getlastmodified>\n";
976
+                            	break;
977
+                        	case "supportedlock":
978
+                            	echo '     <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]</".($this->crrnd?'':'D:')."supportedlock>\n";
979
+                            	break;
980
+                        	case "lockdiscovery":
981
+                            	echo '     <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
982
+                            	echo $prop["val"];
983
+                            	echo '     </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
984
+                            	break;
985
+                        	// the following are non-standard Microsoft extensions to the DAV namespace
986
+                        	case "lastaccessed":
987
+                            	echo '     <'.($this->crrnd?'':'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
988
+                                	. gmdate("D, d M Y H:i:s ", $prop['val'])
989
+                                	. 'GMT</'.($this->crrnd?'':'D:')."lastaccessed>\n";
990
+                            	break;
991
+                        	case "ishidden":
992
+                            	echo '     <'.($this->crrnd?'':'D:')."ishidden>"
993
+                                	. is_string($prop['val']) ? $prop['val'] : ($prop['val'] ? 'true' : 'false')
994
+                                	. '</'.($this->crrnd?'':'D:')."</D:ishidden>\n";
995
+                            	break;
996
+                        	default:
997
+                        		$ns_defs = '';
998
+                            	if (is_array($prop['val']))
999
+                            	{
1000
+                            		$hns_hash = $ns_hash;
1001
+                            		$val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash);
1002
+                            	} elseif (isset($prop['raw'])) {
1003
+                            		$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
1004
+                            	} else {
1005
+	                    			$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1006
+                            	}
1007
+	                        	echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1008
+	                        		'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1009
+                            	break;
1010 1010
                         }
1011 1011
                     } else {
1012 1012
                         // allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set
@@ -1761,9 +1761,9 @@  discard block
 block discarded – undo
1761 1761
             foreach ($this->_SERVER as $key => $val) {
1762 1762
                 if (strncmp($key, "HTTP_CONTENT", 11)) continue;
1763 1763
                 switch ($key) {
1764
-                case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1765
-		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1766
-		        	{
1764
+                	case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1765
+		        		switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1766
+		        		{
1767 1767
 		        		case 'gzip':
1768 1768
 		        		case 'deflate':	//zlib
1769 1769
 		        			if (extension_loaded('zlib')) break;
@@ -1772,67 +1772,67 @@  discard block
 block discarded – undo
1772 1772
 					        $this->http_status('415 Unsupported Media Type');
1773 1773
 					        echo "The service does not support '$val' content encoding";
1774 1774
 					        return;
1775
-		        	}
1775
+		        		}
1776 1776
 		        	break;
1777 1777
 
1778
-                case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1779
-                    // we assume it is not critical if this one is ignored
1780
-                    // in the actual PUT implementation ...
1781
-                    $options["content_language"] = $val;
1782
-                    break;
1778
+                	case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1779
+                    	// we assume it is not critical if this one is ignored
1780
+                    	// in the actual PUT implementation ...
1781
+                    	$options["content_language"] = $val;
1782
+                    	break;
1783 1783
 
1784
-                case 'HTTP_CONTENT_LENGTH':
1785
-                    // defined on IIS and has the same value as CONTENT_LENGTH
1786
-                    break;
1784
+                	case 'HTTP_CONTENT_LENGTH':
1785
+                    	// defined on IIS and has the same value as CONTENT_LENGTH
1786
+                    	break;
1787 1787
 
1788
-                case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1789
-                    /* The meaning of the Content-Location header in PUT
1788
+                	case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1789
+                    	/* The meaning of the Content-Location header in PUT
1790 1790
                      or POST requests is undefined; servers are free
1791 1791
                      to ignore it in those cases. */
1792
-                    break;
1793
-
1794
-                case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1795
-                    // single byte range requests are supported
1796
-                    // the header format is also specified in RFC 2616 14.16
1797
-                    // TODO we have to ensure that implementations support this or send 501 instead
1798
-					$matches = null;
1799
-                    if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1800
-                        $this->http_status("400 bad request");
1801
-                        echo "The service does only support single byte ranges";
1802
-                        return;
1803
-                    }
1804
-
1805
-                    $range = array("start" => $matches[1], "end" => $matches[2]);
1806
-                    if (is_numeric($matches[3])) {
1807
-                        $range["total_length"] = $matches[3];
1808
-                    }
1809
-
1810
-                    if (!isset($options['ranges'])) {
1811
-                        $options['ranges'] = array();
1812
-                    }
1813
-
1814
-                    $options["ranges"][] = $range;
1815
-
1816
-                    // TODO make sure the implementation supports partial PUT
1817
-                    // this has to be done in advance to avoid data being overwritten
1818
-                    // on implementations that do not support this ...
1819
-                    break;
1820
-
1821
-                case 'HTTP_CONTENT_TYPE':
1822
-                    // defined on IIS and has the same value as CONTENT_TYPE
1823
-                    break;
1824
-
1825
-                case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1826
-                    // TODO: maybe we can just pretend here?
1827
-                    $this->http_status("501 not implemented");
1828
-                    echo "The service does not support content MD5 checksum verification";
1829
-                    return;
1830
-
1831
-                default:
1832
-                    // any other unknown Content-* headers
1833
-                    $this->http_status("501 not implemented");
1834
-                    echo "The service does not support '$key'";
1835
-                    return;
1792
+                    	break;
1793
+
1794
+                	case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1795
+                    	// single byte range requests are supported
1796
+                    	// the header format is also specified in RFC 2616 14.16
1797
+                    	// TODO we have to ensure that implementations support this or send 501 instead
1798
+						$matches = null;
1799
+                    	if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1800
+                        	$this->http_status("400 bad request");
1801
+                        	echo "The service does only support single byte ranges";
1802
+                        	return;
1803
+                    	}
1804
+
1805
+                    	$range = array("start" => $matches[1], "end" => $matches[2]);
1806
+                    	if (is_numeric($matches[3])) {
1807
+                        	$range["total_length"] = $matches[3];
1808
+                    	}
1809
+
1810
+                    	if (!isset($options['ranges'])) {
1811
+                        	$options['ranges'] = array();
1812
+                    	}
1813
+
1814
+                    	$options["ranges"][] = $range;
1815
+
1816
+                    	// TODO make sure the implementation supports partial PUT
1817
+                    	// this has to be done in advance to avoid data being overwritten
1818
+                    	// on implementations that do not support this ...
1819
+                    	break;
1820
+
1821
+                	case 'HTTP_CONTENT_TYPE':
1822
+                    	// defined on IIS and has the same value as CONTENT_TYPE
1823
+                    	break;
1824
+
1825
+                	case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1826
+                    	// TODO: maybe we can just pretend here?
1827
+                    	$this->http_status("501 not implemented");
1828
+                    	echo "The service does not support content MD5 checksum verification";
1829
+                    	return;
1830
+
1831
+                	default:
1832
+                    	// any other unknown Content-* headers
1833
+                    	$this->http_status("501 not implemented");
1834
+                    	echo "The service does not support '$key'";
1835
+                    	return;
1836 1836
                 }
1837 1837
             }
1838 1838
 
@@ -2390,34 +2390,34 @@  discard block
 block discarded – undo
2390 2390
 
2391 2391
         // now it depends on what we found
2392 2392
         switch ($c) {
2393
-        case "<":
2394
-            // URIs are enclosed in <...>
2395
-            $pos2 = strpos($string, ">", $pos);
2396
-            $uri  = substr($string, $pos, $pos2 - $pos);
2397
-            $pos  = $pos2 + 1;
2398
-            return array("URI", $uri);
2399
-
2400
-        case "[":
2401
-            //Etags are enclosed in [...]
2402
-            if ($string{$pos} == "W") {
2403
-                $type = "ETAG_WEAK";
2404
-                $pos += 2;
2405
-            } else {
2406
-                $type = "ETAG_STRONG";
2407
-            }
2408
-            $pos2 = strpos($string, "]", $pos);
2409
-            $etag = substr($string, $pos + 1, $pos2 - $pos - 2);
2410
-            $pos  = $pos2 + 1;
2411
-            return array($type, $etag);
2412
-
2413
-        case "N":
2414
-            // "N" indicates negation
2415
-            $pos += 2;
2416
-            return array("NOT", "Not");
2417
-
2418
-        default:
2419
-            // anything else is passed verbatim char by char
2420
-            return array("CHAR", $c);
2393
+        	case "<":
2394
+            	// URIs are enclosed in <...>
2395
+            	$pos2 = strpos($string, ">", $pos);
2396
+            	$uri  = substr($string, $pos, $pos2 - $pos);
2397
+            	$pos  = $pos2 + 1;
2398
+            	return array("URI", $uri);
2399
+
2400
+        	case "[":
2401
+            	//Etags are enclosed in [...]
2402
+            	if ($string{$pos} == "W") {
2403
+                	$type = "ETAG_WEAK";
2404
+                	$pos += 2;
2405
+            	} else {
2406
+                	$type = "ETAG_STRONG";
2407
+            	}
2408
+            	$pos2 = strpos($string, "]", $pos);
2409
+            	$etag = substr($string, $pos + 1, $pos2 - $pos - 2);
2410
+            	$pos  = $pos2 + 1;
2411
+            	return array($type, $etag);
2412
+
2413
+        	case "N":
2414
+            	// "N" indicates negation
2415
+            	$pos += 2;
2416
+            	return array("NOT", "Not");
2417
+
2418
+        	default:
2419
+            	// anything else is passed verbatim char by char
2420
+            	return array("CHAR", $c);
2421 2421
         }
2422 2422
     }
2423 2423
 
@@ -2461,33 +2461,33 @@  discard block
 block discarded – undo
2461 2461
                     continue;
2462 2462
                 }
2463 2463
                 switch ($token[0]) {
2464
-                case "CHAR":
2465
-                    switch ($token[1]) {
2466
-                    case "(":
2467
-                        $level++;
2468
-                        break;
2469
-                    case ")":
2470
-                        $level--;
2471
-                        break;
2472
-                    default:
2473
-                        return false;
2474
-                    }
2464
+                	case "CHAR":
2465
+                    	switch ($token[1]) {
2466
+                    		case "(":
2467
+                        		$level++;
2468
+                        		break;
2469
+                    		case ")":
2470
+                        		$level--;
2471
+                        		break;
2472
+                    		default:
2473
+                        		return false;
2474
+                    	}
2475 2475
                     break;
2476 2476
 
2477
-                case "URI":
2478
-                    $list[] = $not."<$token[1]>";
2479
-                    break;
2477
+                	case "URI":
2478
+                    	$list[] = $not."<$token[1]>";
2479
+                    	break;
2480 2480
 
2481
-                case "ETAG_WEAK":
2482
-                    $list[] = $not."[W/'$token[1]']>";
2483
-                    break;
2481
+                	case "ETAG_WEAK":
2482
+                    	$list[] = $not."[W/'$token[1]']>";
2483
+                    	break;
2484 2484
 
2485
-                case "ETAG_STRONG":
2486
-                    $list[] = $not."['$token[1]']>";
2487
-                    break;
2485
+                	case "ETAG_STRONG":
2486
+                    	$list[] = $not."['$token[1]']>";
2487
+                    	break;
2488 2488
 
2489
-                default:
2490
-                    return false;
2489
+                	default:
2490
+                    	return false;
2491 2491
                 }
2492 2492
                 $not = "";
2493 2493
             }
Please login to merge, or discard this patch.
Spacing   +141 added lines, -143 removed lines patch added patch discarded remove patch
@@ -193,7 +193,7 @@  discard block
 block discarded – undo
193 193
      * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
194 194
      * @return void
195 195
      */
196
-    function ServeRequest($prefix=null)
196
+    function ServeRequest($prefix = null)
197 197
     {
198 198
         // prevent warning in litmus check 'delete_fragment'
199 199
         if (strstr($this->_SERVER["REQUEST_URI"], '#')) {
@@ -205,7 +205,7 @@  discard block
 block discarded – undo
205 205
         if ($this->client_require_href_as_url)
206 206
         {
207 207
 	        // default uri is the complete request uri
208
-	        $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:") . '//'.$this->_SERVER['HTTP_HOST'];
208
+	        $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:").'//'.$this->_SERVER['HTTP_HOST'];
209 209
         }
210 210
         $uri .= $this->_SERVER["SCRIPT_NAME"];
211 211
 
@@ -214,7 +214,7 @@  discard block
 block discarded – undo
214 214
         // of the request URI ourselves
215 215
         // if request URI contains a full url, remove schema and domain
216 216
 		$matches = null;
217
-        if (preg_match('|^https?://[^/]+(/.*)$|', $path_info=$this->_SERVER["REQUEST_URI"], $matches))
217
+        if (preg_match('|^https?://[^/]+(/.*)$|', $path_info = $this->_SERVER["REQUEST_URI"], $matches))
218 218
         {
219 219
         	$path_info = $matches[1];
220 220
         }
@@ -234,13 +234,13 @@  discard block
 block discarded – undo
234 234
         }
235 235
 
236 236
         $this->base_uri = $uri;
237
-        $this->uri      = $uri . $path_info;
237
+        $this->uri      = $uri.$path_info;
238 238
 
239 239
         // set path
240 240
         // $_SERVER['PATH_INFO'] is already urldecoded
241 241
         //$this->path = self::_urldecode($path_info);
242 242
         // quote '#' (e.g. OpenOffice uses this for lock-files)
243
-        $this->path = strtr($path_info,array(
243
+        $this->path = strtr($path_info, array(
244 244
         	'%' => '%25',
245 245
         	'#' => '%23',
246 246
         	'?' => '%3F',
@@ -273,7 +273,7 @@  discard block
 block discarded – undo
273 273
         // check authentication
274 274
         // for the motivation for not checking OPTIONS requests on / see
275 275
         // http://pear.php.net/bugs/bug.php?id=5363
276
-        if ( (   !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/")))
276
+        if ((!(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/")))
277 277
              && (!$this->_check_auth())) {
278 278
             // RFC2518 says we must use Digest instead of Basic
279 279
             // but Microsoft Clients do not support Digest
@@ -289,7 +289,7 @@  discard block
 block discarded – undo
289 289
         }
290 290
 
291 291
         // check
292
-        if (! $this->_check_if_header_conditions()) {
292
+        if (!$this->_check_if_header_conditions()) {
293 293
             return;
294 294
         }
295 295
 
@@ -303,19 +303,19 @@  discard block
 block discarded – undo
303 303
         }
304 304
 
305 305
         if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) {
306
-            $this->$wrapper();  // call method by name
306
+            $this->$wrapper(); // call method by name
307 307
         } else { // method not found/implemented
308 308
             if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") {
309 309
             	$error = '412 Precondition failed';
310 310
             } else {
311 311
                 $error = '405 Method not allowed';
312
-                header("Allow: ".join(", ", $this->_allow()));  // tell client what's allowed
312
+                header("Allow: ".join(", ", $this->_allow())); // tell client what's allowed
313 313
             }
314 314
             $this->http_status($error);
315 315
             echo "<html><head><title>Error $error</title></head>\n";
316 316
             echo "<body><h1>$error</h1>\n";
317 317
             echo "The requested could not by handled by this server.\n";
318
-            echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")<br>\n<br>\n";
318
+            echo '(URI '.$this->_SERVER['REQUEST_URI'].")<br>\n<br>\n";
319 319
             echo "</body></html>\n";
320 320
         }
321 321
     }
@@ -611,19 +611,19 @@  discard block
 block discarded – undo
611 611
         $allow = $this->_allow();
612 612
 
613 613
         // dav header
614
-        $dav = array(1);        // assume we are always dav class 1 compliant
614
+        $dav = array(1); // assume we are always dav class 1 compliant
615 615
         if (isset($allow['LOCK'])) {
616
-            $dav[] = 2;         // dav class 2 requires that locking is supported
616
+            $dav[] = 2; // dav class 2 requires that locking is supported
617 617
         }
618 618
 
619 619
         // allow extending class to modify DAV and Allow headers
620
-		if (method_exists($this,'OPTIONS')) {
621
-			$this->OPTIONS($this->path,$dav,$allow);
620
+		if (method_exists($this, 'OPTIONS')) {
621
+			$this->OPTIONS($this->path, $dav, $allow);
622 622
 		}
623 623
 
624 624
         // tell clients what we found
625 625
         $this->http_status("200 OK");
626
-        header("DAV: "  .join(", ", $dav));
626
+        header("DAV: ".join(", ", $dav));
627 627
         header("Allow: ".join(", ", $allow));
628 628
 
629 629
         header("Content-length: 0");
@@ -653,7 +653,7 @@  discard block
 block discarded – undo
653 653
      * @param  string $handler ='PROPFIND' allows to use method eg. for CalDAV REPORT
654 654
      * @return void
655 655
      */
656
-    function http_PROPFIND($handler='PROPFIND')
656
+    function http_PROPFIND($handler = 'PROPFIND')
657 657
     {
658 658
         $options = Array();
659 659
         $files   = Array();
@@ -682,21 +682,21 @@  discard block
 block discarded – undo
682 682
 			$options['other'] = $propinfo->other;
683 683
 
684 684
         // call user handler
685
-        if (!($retval =$this->$handler($options, $files))) {
685
+        if (!($retval = $this->$handler($options, $files))) {
686 686
             $files = array("files" => array());
687 687
             if (method_exists($this, "checkLock")) {
688 688
                 // is locked?
689 689
                 $lock = $this->checkLock($this->path);
690 690
 
691 691
                 if (is_array($lock) && count($lock)) {
692
-                    $created          = isset($lock['created'])  ? $lock['created']  : time();
692
+                    $created          = isset($lock['created']) ? $lock['created'] : time();
693 693
                     $modified         = isset($lock['modified']) ? $lock['modified'] : time();
694 694
                     $files['files'][] = array("path"  => self::_slashify($this->path),
695
-                                              "props" => array($this->mkprop("displayname",      $this->path),
696
-                                                               $this->mkprop("creationdate",     $created),
697
-                                                               $this->mkprop("getlastmodified",  $modified),
698
-                                                               $this->mkprop("resourcetype",     ""),
699
-                                                               $this->mkprop("getcontenttype",   ""),
695
+                                              "props" => array($this->mkprop("displayname", $this->path),
696
+                                                               $this->mkprop("creationdate", $created),
697
+                                                               $this->mkprop("getlastmodified", $modified),
698
+                                                               $this->mkprop("resourcetype", ""),
699
+                                                               $this->mkprop("getcontenttype", ""),
700 700
                                                                $this->mkprop("getcontentlength", 0))
701 701
                                               );
702 702
                 }
@@ -719,7 +719,7 @@  discard block
 block discarded – undo
719 719
 			header('Content-Type: text/html');
720 720
 			echo "<html><head><title>Error $retval</title></head>\n";
721 721
 			echo "<body><h1>$retval</h1>\n";
722
-			switch (substr($retval, 0 ,3))
722
+			switch (substr($retval, 0, 3))
723 723
 			{
724 724
 				case '501': // Not Implemented
725 725
 					echo "The requested feature is not (yet) supported by this server.\n";
@@ -727,19 +727,19 @@  discard block
 block discarded – undo
727 727
 				default:
728 728
 					echo "The request could not be handled by this server.\n";
729 729
 			}
730
-			echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")<br>\n<br>\n";
730
+			echo '(URI '.$this->_SERVER['REQUEST_URI'].")<br>\n<br>\n";
731 731
 			echo "</body></html>\n";
732 732
 			return;
733 733
 		}
734 734
 		// dav header
735
-        $dav = array(1);        // assume we are always dav class 1 compliant
735
+        $dav = array(1); // assume we are always dav class 1 compliant
736 736
         $allow = false;
737 737
 
738 738
         // allow extending class to modify DAV
739
-		if (method_exists($this,'OPTIONS')) {
740
-			$this->OPTIONS($this->path,$dav,$allow);
739
+		if (method_exists($this, 'OPTIONS')) {
740
+			$this->OPTIONS($this->path, $dav, $allow);
741 741
 		}
742
-        header("DAV: "  .join(", ", $dav));
742
+        header("DAV: ".join(", ", $dav));
743 743
         header('Content-Type: text/xml; charset="utf-8"');
744 744
 
745 745
         // add Vary and Preference-Applied header for Prefer: return=minimal
@@ -759,12 +759,11 @@  discard block
 block discarded – undo
759 759
         if (isset($files['sync-token']))
760 760
         {
761 761
             echo ($this->crrnd ? " <" : " <D:")."sync-token>".
762
-            	htmlspecialchars(!is_callable($files['sync-token']) ? $files['sync-token'] :
763
-            		call_user_func_array($files['sync-token'], (array)$files['sync-token-params'])).
762
+            	htmlspecialchars(!is_callable($files['sync-token']) ? $files['sync-token'] : call_user_func_array($files['sync-token'], (array)$files['sync-token-params'])).
764 763
             	($this->crrnd ? "</" : "</D:")."sync-token>\n";
765 764
         }
766 765
 
767
-        echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
766
+        echo '</'.($this->crrnd ? '' : 'D:')."multistatus>\n";
768 767
     }
769 768
 
770 769
     /**
@@ -773,7 +772,7 @@  discard block
 block discarded – undo
773 772
      * @param array|Iterator $files
774 773
      * @param array|string $props
775 774
      */
776
-    function multistatus_responses(&$files, $props, $initial_ns_hash=null, $initial_ns_defs=null)
775
+    function multistatus_responses(&$files, $props, $initial_ns_hash = null, $initial_ns_defs = null)
777 776
     {
778 777
     	if (!isset($initial_ns_hash)) $initial_ns_hash = array('DAV:' => 'D');
779 778
     	if (!isset($initial_ns_defs)) $initial_ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"';
@@ -786,7 +785,7 @@  discard block
 block discarded – undo
786 785
         }
787 786
         // support for "Prefer: depth-noroot" header on PROPFIND
788 787
         $skip_root = $this->_SERVER['REQUEST_METHOD'] == 'PROPFIND' &&
789
-        	!isset($initial_ns_hash) &&	// multistatus_response calls itself, do NOT apply skip in that case
788
+        	!isset($initial_ns_hash) && // multistatus_response calls itself, do NOT apply skip in that case
790 789
         	isset($this->_SERVER['HTTP_PREFER']) && in_array('depth-noroot', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER']));
791 790
 
792 791
         // now we loop over all returned file entries
@@ -815,9 +814,8 @@  discard block
 block discarded – undo
815 814
 
816 815
 	            	// this can happen if we have allprop and prop in one propfind:
817 816
 	            	// <allprop /><prop><blah /></prop>, eg. blah is not automatic returned by allprop
818
-	                switch(is_array($props) ? $props[0] : $props) {
819
-	                case "all":
820
-	                    // nothing to remove
817
+	                switch (is_array($props) ? $props[0] : $props) {
818
+	                case "all" : // nothing to remove
821 819
 	                    break;
822 820
 
823 821
 	                case "names":
@@ -831,7 +829,7 @@  discard block
 block discarded – undo
831 829
 
832 830
 	                    // search property name in requested properties
833 831
 	                    foreach ((array)$props as $reqprop) {
834
-	                        if (   $reqprop["name"]  == $prop["name"]
832
+	                        if ($reqprop["name"] == $prop["name"]
835 833
 	                               && @$reqprop["xmlns"] == $prop["ns"]) {
836 834
 	                            $found = true;
837 835
 	                            break;
@@ -840,7 +838,7 @@  discard block
 block discarded – undo
840 838
 
841 839
 	                    // unset property and continue with next one if not found/requested
842 840
 	                    if (!$found) {
843
-	                        $prop="";
841
+	                        $prop = "";
844 842
 	                        continue(2);
845 843
 	                    }
846 844
 	                    break;
@@ -862,7 +860,7 @@  discard block
 block discarded – undo
862 860
 	            // but for which no values where returned by the user handler
863 861
 	            if (is_array($props)) {
864 862
 	                foreach ($props as $reqprop) {
865
-	                    if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if <allprop /> used together with <prop>
863
+	                    if (!is_array($reqprop) || $reqprop['name'] == "") continue; // skip empty entries, or 'all' if <allprop /> used together with <prop>
866 864
 
867 865
 	                    $found = false;
868 866
 
@@ -876,7 +874,7 @@  discard block
 block discarded – undo
876 874
 	                    }
877 875
 
878 876
 	                    if (!$found) {
879
-	                        if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") {
877
+	                        if ($reqprop["xmlns"] === "DAV:" && $reqprop["name"] === "lockdiscovery") {
880 878
 	                            // lockdiscovery is handled by the base class
881 879
 	                            $file["props"][]
882 880
 	                                = $this->mkprop("DAV:",
@@ -903,7 +901,7 @@  discard block
 block discarded – undo
903 901
             // ignore empty or incomplete entries
904 902
             if (!is_array($file) || empty($file) || !isset($file["path"])) continue;
905 903
             $path = $file['path'];
906
-            if (!is_string($path) || $path==="") continue;
904
+            if (!is_string($path) || $path === "") continue;
907 905
 
908 906
             if ($this->crrnd)
909 907
             {
@@ -933,8 +931,8 @@  discard block
 block discarded – undo
933 931
 
934 932
             // report all found properties and their values (if any)
935 933
             if (isset($file["props"]) && is_array($file["props"])) {
936
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
937
-                echo '    <'.($this->crrnd?'':'D:')."prop>\n";
934
+                echo '   <'.($this->crrnd ? '' : 'D:')."propstat>\n";
935
+                echo '    <'.($this->crrnd ? '' : 'D:')."prop>\n";
938 936
 
939 937
                 foreach ($file["props"] as &$prop) {
940 938
 
@@ -943,8 +941,8 @@  discard block
 block discarded – undo
943 941
 
944 942
                     if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) {
945 943
                         // empty properties (cannot use empty() for check as "0" is a legal value here)
946
-                        if ($prop["ns"]=="DAV:") {
947
-                            echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
944
+                        if ($prop["ns"] == "DAV:") {
945
+                            echo '     <'.($this->crrnd ? '' : 'D:')."$prop[name]/>\n";
948 946
                         } else if (!empty($prop["ns"])) {
949 947
                             echo "     <".$ns_hash[$prop["ns"]].":$prop[name]/>\n";
950 948
                         } else {
@@ -952,7 +950,7 @@  discard block
 block discarded – undo
952 950
                         }
953 951
                     }
954 952
                     // multiple level of responses required for expand-property reports
955
-                    elseif(isset($prop['props']) && is_array($prop['val']))
953
+                    elseif (isset($prop['props']) && is_array($prop['val']))
956 954
                     {
957 955
                         if ($prop['ns'] && !isset($ns_hash[$prop['ns']])) {
958 956
                             $ns_name = "ns".(count($ns_hash) + 1);
@@ -965,33 +963,33 @@  discard block
 block discarded – undo
965 963
                         // some WebDAV properties need special treatment
966 964
                         switch ($prop["name"]) {
967 965
                         case "creationdate":
968
-                            echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
966
+                            echo '     <'.($this->crrnd ? '' : 'D:')."creationdate ns0:dt=\"dateTime.tz\">"
969 967
                                 . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
970
-                                . '</'.($this->crrnd?'':'D:')."creationdate>\n";
968
+                                . '</'.($this->crrnd ? '' : 'D:')."creationdate>\n";
971 969
                             break;
972 970
                         case "getlastmodified":
973
-                            echo '     <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
971
+                            echo '     <'.($this->crrnd ? '' : 'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
974 972
                                 . gmdate("D, d M Y H:i:s ", $prop['val'])
975
-                                . "GMT</".($this->crrnd?'':'D:')."getlastmodified>\n";
973
+                                . "GMT</".($this->crrnd ? '' : 'D:')."getlastmodified>\n";
976 974
                             break;
977 975
                         case "supportedlock":
978
-                            echo '     <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]</".($this->crrnd?'':'D:')."supportedlock>\n";
976
+                            echo '     <'.($this->crrnd ? '' : 'D:')."supportedlock>$prop[val]</".($this->crrnd ? '' : 'D:')."supportedlock>\n";
979 977
                             break;
980 978
                         case "lockdiscovery":
981
-                            echo '     <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
979
+                            echo '     <'.($this->crrnd ? '' : 'D:')."lockdiscovery>\n";
982 980
                             echo $prop["val"];
983
-                            echo '     </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
981
+                            echo '     </'.($this->crrnd ? '' : 'D:')."lockdiscovery>\n";
984 982
                             break;
985 983
                         // the following are non-standard Microsoft extensions to the DAV namespace
986 984
                         case "lastaccessed":
987
-                            echo '     <'.($this->crrnd?'':'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
985
+                            echo '     <'.($this->crrnd ? '' : 'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
988 986
                                 . gmdate("D, d M Y H:i:s ", $prop['val'])
989
-                                . 'GMT</'.($this->crrnd?'':'D:')."lastaccessed>\n";
987
+                                . 'GMT</'.($this->crrnd ? '' : 'D:')."lastaccessed>\n";
990 988
                             break;
991 989
                         case "ishidden":
992
-                            echo '     <'.($this->crrnd?'':'D:')."ishidden>"
990
+                            echo '     <'.($this->crrnd ? '' : 'D:')."ishidden>"
993 991
                                 . is_string($prop['val']) ? $prop['val'] : ($prop['val'] ? 'true' : 'false')
994
-                                . '</'.($this->crrnd?'':'D:')."</D:ishidden>\n";
992
+                                . '</'.($this->crrnd ? '' : 'D:')."</D:ishidden>\n";
995 993
                             break;
996 994
                         default:
997 995
                         	$ns_defs = '';
@@ -1004,8 +1002,8 @@  discard block
 block discarded – undo
1004 1002
                             } else {
1005 1003
 	                    		$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1006 1004
                             }
1007
-	                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1008
-	                        	'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1005
+	                        echo '     <'.($this->crrnd ? '' : 'D:')."$prop[name]$ns_defs>$val".
1006
+	                        	'</'.($this->crrnd ? '' : 'D:')."$prop[name]>\n";
1009 1007
                             break;
1010 1008
                         }
1011 1009
                     } else {
@@ -1016,7 +1014,7 @@  discard block
 block discarded – undo
1016 1014
                                 $ns_hash[$prop['ns']] = $ns_name;
1017 1015
                     		}
1018 1016
                   			$vals = $extra_ns = '';
1019
-                    		foreach($prop['val'] as $subprop)
1017
+                    		foreach ($prop['val'] as $subprop)
1020 1018
                     		{
1021 1019
                     			if ($subprop['ns'] && $subprop['ns'] != 'DAV:') {
1022 1020
 		                    		// register property namespace if not known yet
@@ -1026,7 +1024,7 @@  discard block
 block discarded – undo
1026 1024
 		                    		} else {
1027 1025
 			                    		$ns_name = $ns_hash[$subprop['ns']];
1028 1026
 		                    		}
1029
-		                    		if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) {
1027
+		                    		if (strchr($extra_ns, $extra = ' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) {
1030 1028
 			                    		$extra_ns .= $extra;
1031 1029
 		                    		}
1032 1030
 		                    		$ns_name .= ':';
@@ -1046,7 +1044,7 @@  discard block
 block discarded – undo
1046 1044
 	                    			}
1047 1045
 	                    			else	// val contains only attributes, no value
1048 1046
 	                    			{
1049
-			                    		foreach($subprop['val'] as $attr => $val)
1047
+			                    		foreach ($subprop['val'] as $attr => $val)
1050 1048
 										{
1051 1049
 				                    		$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
1052 1050
 										}
@@ -1059,7 +1057,7 @@  discard block
 block discarded – undo
1059 1057
 	                    			if (isset($subprop['raw'])) {
1060 1058
 	                    				$vals .= '<![CDATA['.$subprop['val'].']]>';
1061 1059
 	                    			} else {
1062
-	                    				if($subprop['name'] == 'href') $subprop['val'] = $this->_urlencode($subprop['val']);
1060
+	                    				if ($subprop['name'] == 'href') $subprop['val'] = $this->_urlencode($subprop['val']);
1063 1061
 		                    			$vals .= htmlspecialchars($subprop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1064 1062
 	                    			}
1065 1063
 	                    			$vals .= "</$ns_name$subprop[name]>";
@@ -1078,10 +1076,10 @@  discard block
 block discarded – undo
1078 1076
 	                        if ($prop['ns']) {
1079 1077
 		                        if ($this->crrnd) {
1080 1078
 			                        echo "     <$prop[name] xmlns=".'"'.$prop["ns"].'">'
1081
-									. $val . "</$prop[name]>\n";
1079
+									. $val."</$prop[name]>\n";
1082 1080
 		                        } else {
1083
-			                        echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]>"
1084
-									. $val . '</'.$ns_hash[$prop['ns']].":$prop[name]>\n";
1081
+			                        echo "     <".$ns_hash[$prop["ns"]].":$prop[name]>"
1082
+									. $val.'</'.$ns_hash[$prop['ns']].":$prop[name]>\n";
1085 1083
 		                        }
1086 1084
 	                        } else {
1087 1085
 		                        echo "     <$prop[name] xmlns=\"\">$val</$prop[name]>\n";
@@ -1106,16 +1104,16 @@  discard block
 block discarded – undo
1106 1104
 
1107 1105
             // now report all properties requested but not found
1108 1106
             if (isset($file["noprops"])) {
1109
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1110
-                echo '    <'.($this->crrnd?'':'D:')."prop>\n";
1107
+                echo '   <'.($this->crrnd ? '' : 'D:')."propstat>\n";
1108
+                echo '    <'.($this->crrnd ? '' : 'D:')."prop>\n";
1111 1109
 
1112 1110
                 foreach ($file["noprops"] as &$prop) {
1113 1111
                     if ($prop["ns"] == "DAV:") {
1114
-                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
1112
+                        echo '     <'.($this->crrnd ? '' : 'D:')."$prop[name]/>\n";
1115 1113
                     } else if ($prop["ns"] == "") {
1116 1114
                         echo "     <$prop[name] xmlns=\"\"/>\n";
1117 1115
                     } else {
1118
-                        echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n";
1116
+                        echo "     <".$ns_hash[$prop["ns"]].":$prop[name]/>\n";
1119 1117
                     }
1120 1118
                 }
1121 1119
 
@@ -1146,7 +1144,7 @@  discard block
 block discarded – undo
1146 1144
                 }
1147 1145
             }
1148 1146
 
1149
-            echo ' </'.($this->crrnd?'':'D:')."response>\n";
1147
+            echo ' </'.($this->crrnd ? '' : 'D:')."response>\n";
1150 1148
         }
1151 1149
     }
1152 1150
 
@@ -1186,24 +1184,24 @@  discard block
 block discarded – undo
1186 1184
             echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
1187 1185
 
1188 1186
             echo "<D:multistatus xmlns:D=\"DAV:\">\n";
1189
-            echo ' <'.($this->crrnd?'':'D:')."response>\n";
1190
-            echo '  <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)).'</'.($this->crrnd?'':'D:')."href>\n";
1187
+            echo ' <'.($this->crrnd ? '' : 'D:')."response>\n";
1188
+            echo '  <'.($this->crrnd ? '' : 'D:')."href>".$this->_urlencode($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)).'</'.($this->crrnd ? '' : 'D:')."href>\n";
1191 1189
 
1192 1190
             foreach ($options["props"] as $prop) {
1193
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1194
-                echo '    <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/></".($this->crrnd?'':'D:')."prop>\n";
1195
-                echo '    <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]</".($this->crrnd?'':'D:')."status>\n";
1196
-                echo '   </'.($this->crrnd?'':'D:')."propstat>\n";
1191
+                echo '   <'.($this->crrnd ? '' : 'D:')."propstat>\n";
1192
+                echo '    <'.($this->crrnd ? '' : 'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/></".($this->crrnd ? '' : 'D:')."prop>\n";
1193
+                echo '    <'.($this->crrnd ? '' : 'D:')."status>HTTP/1.1 $prop[status]</".($this->crrnd ? '' : 'D:')."status>\n";
1194
+                echo '   </'.($this->crrnd ? '' : 'D:')."propstat>\n";
1197 1195
             }
1198 1196
 
1199 1197
             if ($responsedescr) {
1200
-                echo '  <'.($this->crrnd?'':'D:')."responsedescription>".
1198
+                echo '  <'.($this->crrnd ? '' : 'D:')."responsedescription>".
1201 1199
                     $this->_prop_encode(htmlspecialchars($responsedescr, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8')).
1202
-                    '</'.($this->crrnd?'':'D:')."responsedescription>\n";
1200
+                    '</'.($this->crrnd ? '' : 'D:')."responsedescription>\n";
1203 1201
             }
1204 1202
 
1205
-            echo ' </'.($this->crrnd?'':'D:')."response>\n";
1206
-            echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
1203
+            echo ' </'.($this->crrnd ? '' : 'D:')."response>\n";
1204
+            echo '</'.($this->crrnd ? '' : 'D:')."multistatus>\n";
1207 1205
         } else {
1208 1206
             $this->http_status("423 Locked");
1209 1207
         }
@@ -1243,12 +1241,12 @@  discard block
 block discarded – undo
1243 1241
 	 * @param boolean $set =null
1244 1242
 	 * @return boolean true if we use compression, false otherwise
1245 1243
 	 */
1246
-	public static function use_compression($set=null)
1244
+	public static function use_compression($set = null)
1247 1245
 	{
1248 1246
 		static $compression = null;
1249 1247
 		if (isset($set))
1250 1248
 		{
1251
-			ini_set('zlib.output_compression', $compression=(boolean)$set);
1249
+			ini_set('zlib.output_compression', $compression = (boolean)$set);
1252 1250
 		}
1253 1251
 		elseif (!isset($compression))
1254 1252
 		{
@@ -1284,7 +1282,7 @@  discard block
 block discarded – undo
1284 1282
                 // switching off zlib.output_compression for everything but text files,
1285 1283
                 // as the double compression of zip files makes problems eg. with lighttpd
1286 1284
                 // and anyway little sense with with other content like pictures
1287
-                if (substr($options['mimetype'],0,5) != 'text/')
1285
+                if (substr($options['mimetype'], 0, 5) != 'text/')
1288 1286
                 {
1289 1287
 					self::use_compression(false);
1290 1288
                 }
@@ -1301,7 +1299,7 @@  discard block
 block discarded – undo
1301 1299
 
1302 1300
                 if (isset($options['stream'])) {
1303 1301
                     // GET handler returned a stream
1304
-                    if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) {
1302
+                    if (!empty($options['ranges']) && (0 === fseek($options['stream'], 0, SEEK_SET))) {
1305 1303
                         // partial request and stream is seekable
1306 1304
 
1307 1305
                         if (count($options['ranges']) === 1) {
@@ -1315,7 +1313,7 @@  discard block
 block discarded – undo
1315 1313
                                 }
1316 1314
 
1317 1315
                                 if (!empty($range['end'])) {
1318
-                                    $size = $range['end']-$range['start']+1;
1316
+                                    $size = $range['end'] - $range['start'] + 1;
1319 1317
                                     $this->http_status($status = "206 Partial content");
1320 1318
                                     if (!self::use_compression()) header("Content-Length: $size");
1321 1319
                                     header("Content-Range: bytes $range[start]-$range[end]/"
@@ -1330,7 +1328,7 @@  discard block
 block discarded – undo
1330 1328
                                     if (isset($options['size'])) {
1331 1329
                                         if (!self::use_compression()) header("Content-Length: ".($options['size'] - $range['start']));
1332 1330
                                         header("Content-Range: bytes ".$range['start']."-".
1333
-											(isset($options['size']) ? $options['size']-1 : "")."/"
1331
+											(isset($options['size']) ? $options['size'] - 1 : "")."/"
1334 1332
 										   . (isset($options['size']) ? $options['size'] : "*"));
1335 1333
                                     }
1336 1334
                                     fpassthru($options['stream']);
@@ -1346,10 +1344,10 @@  discard block
 block discarded – undo
1346 1344
                                 // TODO what if size unknown? 500?
1347 1345
                                 if (isset($range['start'])) {
1348 1346
                                     $from = $range['start'];
1349
-                                    $to   = !empty($range['end']) ? $range['end'] : $options['size']-1;
1347
+                                    $to   = !empty($range['end']) ? $range['end'] : $options['size'] - 1;
1350 1348
                                 } else {
1351
-                                    $from = $options['size'] - $range['last']-1;
1352
-                                    $to   = $options['size'] -1;
1349
+                                    $from = $options['size'] - $range['last'] - 1;
1350
+                                    $to   = $options['size'] - 1;
1353 1351
                                 }
1354 1352
                                 $total = isset($options['size']) ? $options['size'] : "*";
1355 1353
                                 $size  = $to - $from + 1;
@@ -1415,7 +1413,7 @@  discard block
 block discarded – undo
1415 1413
                 foreach (explode(",", $matches[1]) as $range) {
1416 1414
                     // ranges are either from-to pairs or just end positions
1417 1415
                     list($start, $end) = explode("-", $range);
1418
-                    $options["ranges"][] = ($start==="")
1416
+                    $options["ranges"][] = ($start === "")
1419 1417
                         ? array("last"=>$end)
1420 1418
                         : array("start"=>$start, "end"=>$end);
1421 1419
                 }
@@ -1436,7 +1434,7 @@  discard block
 block discarded – undo
1436 1434
      * @param  int     end   byte position
1437 1435
      * @param  int     total resource byte size
1438 1436
      */
1439
-    function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false)
1437
+    function _multipart_byterange_header($mimetype = false, $from = false, $to = false, $total = false)
1440 1438
     {
1441 1439
         if ($mimetype === false) {
1442 1440
             if (!isset($this->multipart_separator)) {
@@ -1458,7 +1456,7 @@  discard block
 block discarded – undo
1458 1456
             // generate separator and header for next part
1459 1457
             echo "\n--{$this->multipart_separator}\n";
1460 1458
             echo "Content-type: $mimetype\n";
1461
-            echo "Content-range: $from-$to/". ($total === false ? "*" : $total);
1459
+            echo "Content-range: $from-$to/".($total === false ? "*" : $total);
1462 1460
             echo "\n\n";
1463 1461
         }
1464 1462
     }
@@ -1552,7 +1550,7 @@  discard block
 block discarded – undo
1552 1550
         }
1553 1551
 
1554 1552
         $options['stream'] = fopen('php://input', 'r');
1555
-    	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1553
+    	switch ($this->_SERVER['HTTP_CONTENT_ENCODING'])
1556 1554
     	{
1557 1555
     		case 'gzip':
1558 1556
     		case 'deflate':	//zlib
@@ -1565,11 +1563,11 @@  discard block
 block discarded – undo
1565 1563
 		if ($this->store_request)
1566 1564
 		{
1567 1565
 			$options['content'] = '';
1568
-			while(!feof($options['stream']))
1566
+			while (!feof($options['stream']))
1569 1567
 			{
1570
-				$options['content'] .= fread($options['stream'],8192);
1568
+				$options['content'] .= fread($options['stream'], 8192);
1571 1569
 			}
1572
-			$this->request =& $options['content'];
1570
+			$this->request = & $options['content'];
1573 1571
 			unset($options['stream']);
1574 1572
 		}
1575 1573
 
@@ -1582,7 +1580,7 @@  discard block
 block discarded – undo
1582 1580
 	        if (strncmp($key, 'HTTP_CONTENT', 11)) continue;
1583 1581
 	        switch ($key) {
1584 1582
 		        case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1585
-		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1583
+		        	switch ($this->_SERVER['HTTP_CONTENT_ENCODING'])
1586 1584
 		        	{
1587 1585
 		        		case 'gzip':
1588 1586
 		        		case 'deflate':	//zlib
@@ -1670,7 +1668,7 @@  discard block
 block discarded – undo
1670 1668
 		        if (!empty($options['ranges'])) {
1671 1669
 			        // TODO multipart support is missing (see also above)
1672 1670
 			        if (0 == fseek($stream, $range[0]['start'], SEEK_SET)) {
1673
-				        $length = $range[0]['end']-$range[0]['start']+1;
1671
+				        $length = $range[0]['end'] - $range[0]['start'] + 1;
1674 1672
 				        if (!fwrite($stream, fread($options['stream'], $length))) {
1675 1673
 					        $status = '403 Forbidden';
1676 1674
 				        }
@@ -1732,7 +1730,7 @@  discard block
 block discarded – undo
1732 1730
             }
1733 1731
 
1734 1732
             $options["stream"] = fopen("php://input", "r");
1735
-	    	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1733
+	    	switch ($this->_SERVER['HTTP_CONTENT_ENCODING'])
1736 1734
 	    	{
1737 1735
 	    		case 'gzip':
1738 1736
 	    		case 'deflate':	//zlib
@@ -1745,11 +1743,11 @@  discard block
 block discarded – undo
1745 1743
 			if ($this->store_request)
1746 1744
 			{
1747 1745
 				$options['content'] = '';
1748
-				while(!feof($options['stream']))
1746
+				while (!feof($options['stream']))
1749 1747
 				{
1750
-					$options['content'] .= fread($options['stream'],8192);
1748
+					$options['content'] .= fread($options['stream'], 8192);
1751 1749
 				}
1752
-				$this->request =& $options['content'];
1750
+				$this->request = & $options['content'];
1753 1751
 				unset($options['stream']);
1754 1752
 			}
1755 1753
 
@@ -1762,7 +1760,7 @@  discard block
 block discarded – undo
1762 1760
                 if (strncmp($key, "HTTP_CONTENT", 11)) continue;
1763 1761
                 switch ($key) {
1764 1762
                 case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1765
-		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1763
+		        	switch ($this->_SERVER['HTTP_CONTENT_ENCODING'])
1766 1764
 		        	{
1767 1765
 		        		case 'gzip':
1768 1766
 		        		case 'deflate':	//zlib
@@ -1848,7 +1846,7 @@  discard block
 block discarded – undo
1848 1846
                 if (!empty($options["ranges"])) {
1849 1847
                     // TODO multipart support is missing (see also above)
1850 1848
                     if (0 == fseek($stream, $options['ranges'][0]["start"], SEEK_SET)) {
1851
-                        $length = $options['ranges'][0]["end"] - $options['ranges'][0]["start"]+1;
1849
+                        $length = $options['ranges'][0]["end"] - $options['ranges'][0]["start"] + 1;
1852 1850
 
1853 1851
                         while (!feof($options['stream'])) {
1854 1852
                             if ($length <= 0) {
@@ -1908,7 +1906,7 @@  discard block
 block discarded – undo
1908 1906
         // check RFC 2518 Section 9.2, last paragraph
1909 1907
         if (isset($this->_SERVER["HTTP_DEPTH"])) {
1910 1908
             if ($this->_SERVER["HTTP_DEPTH"] != "infinity") {
1911
-				if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false)
1909
+				if (stripos($_SERVER['HTTP_USER_AGENT'], 'webdrive') !== false)
1912 1910
 				{
1913 1911
 					// pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections
1914 1912
 				}
@@ -2057,8 +2055,8 @@  discard block
 block discarded – undo
2057 2055
                 if (is_numeric($options["timeout"])) {
2058 2056
                     // more than a million is considered an absolute timestamp
2059 2057
                     // less is more likely a relative value
2060
-                    if ($options["timeout"]>1000000) {
2061
-                        $timeout = "Second-".($options['timeout']-time());
2058
+                    if ($options["timeout"] > 1000000) {
2059
+                        $timeout = "Second-".($options['timeout'] - time());
2062 2060
                     } else {
2063 2061
                         $timeout = "Second-$options[timeout]";
2064 2062
                     }
@@ -2076,17 +2074,17 @@  discard block
 block discarded – undo
2076 2074
             header("Lock-Token: <$options[locktoken]>");
2077 2075
             echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2078 2076
             echo "<D:prop xmlns:D=\"DAV:\">\n";
2079
-            echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2080
-            echo '  <'.($this->crrnd?'':'D:')."activelock>\n";
2081
-            echo '   <'.($this->crrnd?'':'D:')."lockscope><D:$options[scope]/></".($this->crrnd?'':'D:')."lockscope>\n";
2082
-            echo '   <'.($this->crrnd?'':'D:')."locktype><D:$options[type]/></".($this->crrnd?'':'D:')."locktype>\n";
2083
-            echo '   <'.($this->crrnd?'':'D:')."depth>$options[depth]</".($this->crrnd?'':'D:')."depth>\n";
2084
-            echo '   <'.($this->crrnd?'':'D:')."owner>$options[owner]</".($this->crrnd?'':'D:')."owner>\n";
2085
-            echo '   <'.($this->crrnd?'':'D:')."timeout>$timeout</".($this->crrnd?'':'D:')."timeout>\n";
2086
-            echo '   <'.($this->crrnd?'':'D:')."locktoken><D:href>$options[locktoken]</D:href></".($this->crrnd?'':'D:')."locktoken>\n";
2087
-            echo '  </'.($this->crrnd?'':'D:')."activelock>\n";
2088
-            echo ' </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2089
-            echo '</'.($this->crrnd?'':'D:')."prop>\n\n";
2077
+            echo ' <'.($this->crrnd ? '' : 'D:')."lockdiscovery>\n";
2078
+            echo '  <'.($this->crrnd ? '' : 'D:')."activelock>\n";
2079
+            echo '   <'.($this->crrnd ? '' : 'D:')."lockscope><D:$options[scope]/></".($this->crrnd ? '' : 'D:')."lockscope>\n";
2080
+            echo '   <'.($this->crrnd ? '' : 'D:')."locktype><D:$options[type]/></".($this->crrnd ? '' : 'D:')."locktype>\n";
2081
+            echo '   <'.($this->crrnd ? '' : 'D:')."depth>$options[depth]</".($this->crrnd ? '' : 'D:')."depth>\n";
2082
+            echo '   <'.($this->crrnd ? '' : 'D:')."owner>$options[owner]</".($this->crrnd ? '' : 'D:')."owner>\n";
2083
+            echo '   <'.($this->crrnd ? '' : 'D:')."timeout>$timeout</".($this->crrnd ? '' : 'D:')."timeout>\n";
2084
+            echo '   <'.($this->crrnd ? '' : 'D:')."locktoken><D:href>$options[locktoken]</D:href></".($this->crrnd ? '' : 'D:')."locktoken>\n";
2085
+            echo '  </'.($this->crrnd ? '' : 'D:')."activelock>\n";
2086
+            echo ' </'.($this->crrnd ? '' : 'D:')."lockdiscovery>\n";
2087
+            echo '</'.($this->crrnd ? '' : 'D:')."prop>\n\n";
2090 2088
         }
2091 2089
     }
2092 2090
 
@@ -2156,9 +2154,9 @@  discard block
 block discarded – undo
2156 2154
 	        $content .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2157 2155
 	        $content .= "<D:error xmlns:D=\"DAV:\"> \n";
2158 2156
 	        foreach ($options['errors'] as $violation) {
2159
-	        	$content .= '<'.($this->crrnd?'':'D:')."$violation/>\n";
2157
+	        	$content .= '<'.($this->crrnd ? '' : 'D:')."$violation/>\n";
2160 2158
 	        }
2161
-	        $content .=  '</'.($this->crrnd?'':'D:')."error>\n";
2159
+	        $content .= '</'.($this->crrnd ? '' : 'D:')."error>\n";
2162 2160
         }
2163 2161
         if (!self::use_compression()) header("Content-Length: ".self::bytes($content));
2164 2162
         if ($content) echo $options['content'];
@@ -2190,7 +2188,7 @@  discard block
 block discarded – undo
2190 2188
             // TODO check url scheme, too
2191 2189
             $http_host = $url["host"];
2192 2190
             if (isset($url["port"]) && $url["port"] != 80)
2193
-                $http_host.= ":".$url["port"];
2191
+                $http_host .= ":".$url["port"];
2194 2192
         } else {
2195 2193
             // only path given, set host to self
2196 2194
             $http_host = $http_header_host;
@@ -2335,17 +2333,17 @@  discard block
 block discarded – undo
2335 2333
         }
2336 2334
 
2337 2335
         // fallback
2338
-        $uuid = md5(microtime().getmypid());    // this should be random enough for now
2336
+        $uuid = md5(microtime().getmypid()); // this should be random enough for now
2339 2337
 
2340 2338
         // set variant and version fields for 'true' random uuid
2341 2339
         $uuid{12} = "4";
2342
-        $n = 8 + (ord($uuid{16}) & 3);
2340
+        $n = 8 + (ord($uuid{16})&3);
2343 2341
         $hex = "0123456789abcdef";
2344 2342
         $uuid{16} = $hex{$n};
2345 2343
 
2346 2344
         // return formated uuid
2347
-        return substr($uuid,  0, 8)."-"
2348
-            .  substr($uuid,  8, 4)."-"
2345
+        return substr($uuid, 0, 8)."-"
2346
+            .  substr($uuid, 8, 4)."-"
2349 2347
             .  substr($uuid, 12, 4)."-"
2350 2348
             .  substr($uuid, 16, 4)."-"
2351 2349
             .  substr($uuid, 20);
@@ -2562,7 +2560,7 @@  discard block
 block discarded – undo
2562 2560
      */
2563 2561
     function _check_uri_condition($uri, $condition)
2564 2562
     {
2565
-		unset($uri);	// not used, but required by function signature
2563
+		unset($uri); // not used, but required by function signature
2566 2564
         // not really implemented here,
2567 2565
         // implementations must override
2568 2566
 
@@ -2638,7 +2636,7 @@  discard block
 block discarded – undo
2638 2636
             // genreate response block
2639 2637
             if ($this->crrnd)
2640 2638
             {
2641
-	            $activelocks.= "
2639
+	            $activelocks .= "
2642 2640
 		            <activelock>
2643 2641
 		            <lockscope><$lock[scope]/></lockscope>
2644 2642
 		            <locktype><$lock[type]/></locktype>
@@ -2651,7 +2649,7 @@  discard block
 block discarded – undo
2651 2649
             }
2652 2650
             else
2653 2651
             {
2654
-	            $activelocks.= "
2652
+	            $activelocks .= "
2655 2653
 		            <D:activelock>
2656 2654
 		            <D:lockscope><D:$lock[scope]/></D:lockscope>
2657 2655
 		            <D:locktype><D:$lock[type]/></D:locktype>
@@ -2704,15 +2702,15 @@  discard block
 block discarded – undo
2704 2702
     {
2705 2703
 		// cadaver (and probably all neon using agents) need a more complete url encoding
2706 2704
 		// otherwise special chars like "$,()'" in filenames do NOT work
2707
-		if (strpos($_SERVER['HTTP_USER_AGENT'],'neon') !== false ||
2705
+		if (strpos($_SERVER['HTTP_USER_AGENT'], 'neon') !== false ||
2708 2706
 			// old netdrive does NOT use a User-Agent, but requires full urlencoding for non-ascii chars (eg. German Umlauts)
2709 2707
 			!isset($_SERVER['HTTP_USER_AGENT']) ||
2710 2708
 			// current netdrive uses "NetDrive 2.5.8" as user-agent
2711
-			stripos($_SERVER['HTTP_USER_AGENT'],'NetDrive') !== false ||
2709
+			stripos($_SERVER['HTTP_USER_AGENT'], 'NetDrive') !== false ||
2712 2710
 			// OS X Finder (WebDAVFS/3.0.0 (03008000) Darwin/14.3.0 (x86_64))
2713
-			stripos($_SERVER['HTTP_USER_AGENT'],'WebDAVFS') !== false && stripos($_SERVER['HTTP_USER_AGENT'],'Darwin'))
2711
+			stripos($_SERVER['HTTP_USER_AGENT'], 'WebDAVFS') !== false && stripos($_SERVER['HTTP_USER_AGENT'], 'Darwin'))
2714 2712
 		{
2715
-			return strtr(rawurlencode($url),array(
2713
+			return strtr(rawurlencode($url), array(
2716 2714
 				'%2F' => '/',
2717 2715
 				'%3A' => ':',
2718 2716
 			));
@@ -2769,7 +2767,7 @@  discard block
 block discarded – undo
2769 2767
     	//error_log(__METHOD__.'('.array2string($props).')');
2770 2768
     	if (isset($props['name'])) $props = array($props);
2771 2769
 
2772
-    	foreach($props as $prop)
2770
+    	foreach ($props as $prop)
2773 2771
 		{
2774 2772
 	    	if (!isset($ns_hash[$prop['ns']])) // unknown namespace
2775 2773
 	    	{
@@ -2791,13 +2789,13 @@  discard block
 block discarded – undo
2791 2789
 		    	{
2792 2790
 			    	$vals = '';
2793 2791
 
2794
-			    	foreach($subprop as $attr => $val)
2792
+			    	foreach ($subprop as $attr => $val)
2795 2793
 					{
2796 2794
 				    	$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
2797 2795
 					}
2798 2796
 
2799 2797
 		             $ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2800
-				    	$vals .'/>';
2798
+				    	$vals.'/>';
2801 2799
 		    	}
2802 2800
 	    	}
2803 2801
 	    	else
@@ -2808,7 +2806,7 @@  discard block
 block discarded – undo
2808 2806
 		    	}
2809 2807
 		    	else
2810 2808
 		    	{
2811
-			    	if(isset($prop['raw']))
2809
+			    	if (isset($prop['raw']))
2812 2810
 					{
2813 2811
 						$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
2814 2812
 					} else {
@@ -2850,7 +2848,7 @@  discard block
 block discarded – undo
2850 2848
 			case "iso-8859-15":
2851 2849
 			case "latin-1":
2852 2850
 			default:
2853
-				error_log( __METHOD__."utf8 encode\n" .print_r(utf8_encode($text),true));
2851
+				error_log(__METHOD__."utf8 encode\n".print_r(utf8_encode($text), true));
2854 2852
 				return utf8_encode($text);
2855 2853
         }
2856 2854
     }
@@ -2864,7 +2862,7 @@  discard block
 block discarded – undo
2864 2862
     public static function _slashify($path)
2865 2863
     {
2866 2864
 		//error_log(__METHOD__." called with $path");
2867
-		if ($path[self::bytes($path)-1] != '/') {
2865
+		if ($path[self::bytes($path) - 1] != '/') {
2868 2866
 			//error_log(__METHOD__." added slash at the end of path");
2869 2867
 			$path = $path."/";
2870 2868
 		}
@@ -2880,7 +2878,7 @@  discard block
 block discarded – undo
2880 2878
     public static function _unslashify($path)
2881 2879
     {
2882 2880
         //error_log(__METHOD__." called with $path");
2883
-        if ($path[self::bytes($path)-1] == '/') {
2881
+        if ($path[self::bytes($path) - 1] == '/') {
2884 2882
             $path = substr($path, 0, -1);
2885 2883
 			//error_log(__METHOD__." removed slash at the end of path");
2886 2884
         }
@@ -2913,13 +2911,13 @@  discard block
 block discarded – undo
2913 2911
      */
2914 2912
     public static function bytes($str)
2915 2913
     {
2916
-    	static $func_overload=null;
2914
+    	static $func_overload = null;
2917 2915
 
2918 2916
     	if (is_null($func_overload))
2919 2917
     	{
2920 2918
     		$func_overload = @extension_loaded('mbstring') ? ini_get('mbstring.func_overload') : 0;
2921 2919
     	}
2922
-    	return $func_overload & 2 ? mb_strlen($str,'ascii') : strlen($str);
2920
+    	return $func_overload&2 ? mb_strlen($str, 'ascii') : strlen($str);
2923 2921
     }
2924 2922
 }
2925 2923
 
Please login to merge, or discard this patch.
Indentation   +2524 added lines, -2524 removed lines patch added patch discarded remove patch
@@ -48,633 +48,633 @@  discard block
 block discarded – undo
48 48
  */
49 49
 class HTTP_WebDAV_Server
50 50
 {
51
-    // {{{ Member Variables
51
+	// {{{ Member Variables
52 52
 
53
-    /**
54
-     * complete URI for this request
55
-     *
56
-     * @var string
57
-     */
58
-    var $uri;
53
+	/**
54
+	 * complete URI for this request
55
+	 *
56
+	 * @var string
57
+	 */
58
+	var $uri;
59 59
 
60
-    /**
61
-     * base URI for this request
62
-     *
63
-     * @var string
64
-     */
65
-    var $base_uri;
60
+	/**
61
+	 * base URI for this request
62
+	 *
63
+	 * @var string
64
+	 */
65
+	var $base_uri;
66 66
 
67
-    /**
68
-     * Set if client requires <D:href> to be a url (true) or a path (false).
69
-     * RFC 4918 allows both: http://www.webdav.org/specs/rfc4918.html#ELEMENT_href
70
-     * But some clients can NOT deal with one or the other!
71
-     *
72
-     * @var boolean
73
-     */
74
-    var $client_require_href_as_url;
75
-
76
-     /**
77
-     * Set if client requires or does not allow namespace redundacy.
78
-     * The XML Namespace specification does allow both
79
-     * But some clients can NOT deal with one or the other!
80
-     *
81
-     * $this->crrnd === false:
82
-     * <D:multistatus xmlns:D="DAV:">
83
-     *  <D:response xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
84
-     *   <D:href>/egroupware/webdav.php/home/ralf/</D:href>
85
-     *    <D:propstat>
86
-     *     <D:prop>
87
-     *      <D:resourcetype><D:collection /></D:resourcetype>
88
-     *     </D:prop>
89
-     *    <D:status>HTTP/1.1 200 OK</D:status>
90
-     *   </D:propstat>
91
-     *  </D:response>
92
-     * </D:multistatus>
93
-     *
94
-     * $this->crrnd === true:
95
-     * <multistatus xmlns="DAV:">
96
-     *  <response xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
97
-     *   <href>/egroupware/webdav.php/home/ralf/</href>
98
-     *    <propstat>
99
-     *     <prop>
100
-     *      <resourcetype><collection /></resourcetype>
101
-     *     </prop>
102
-     *    <status>HTTP/1.1 200 OK</status>
103
-     *   </propstat>
104
-     *  </response>
105
-     * </multistatus>
106
-     *
107
-     * @var boolean (client_refuses_redundand_namespace_declarations)
108
-     */
109
-    var $crrnd = false;
67
+	/**
68
+	 * Set if client requires <D:href> to be a url (true) or a path (false).
69
+	 * RFC 4918 allows both: http://www.webdav.org/specs/rfc4918.html#ELEMENT_href
70
+	 * But some clients can NOT deal with one or the other!
71
+	 *
72
+	 * @var boolean
73
+	 */
74
+	var $client_require_href_as_url;
75
+
76
+	 /**
77
+	  * Set if client requires or does not allow namespace redundacy.
78
+	  * The XML Namespace specification does allow both
79
+	  * But some clients can NOT deal with one or the other!
80
+	  *
81
+	  * $this->crrnd === false:
82
+	  * <D:multistatus xmlns:D="DAV:">
83
+	  *  <D:response xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
84
+	  *   <D:href>/egroupware/webdav.php/home/ralf/</D:href>
85
+	  *    <D:propstat>
86
+	  *     <D:prop>
87
+	  *      <D:resourcetype><D:collection /></D:resourcetype>
88
+	  *     </D:prop>
89
+	  *    <D:status>HTTP/1.1 200 OK</D:status>
90
+	  *   </D:propstat>
91
+	  *  </D:response>
92
+	  * </D:multistatus>
93
+	  *
94
+	  * $this->crrnd === true:
95
+	  * <multistatus xmlns="DAV:">
96
+	  *  <response xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/">
97
+	  *   <href>/egroupware/webdav.php/home/ralf/</href>
98
+	  *    <propstat>
99
+	  *     <prop>
100
+	  *      <resourcetype><collection /></resourcetype>
101
+	  *     </prop>
102
+	  *    <status>HTTP/1.1 200 OK</status>
103
+	  *   </propstat>
104
+	  *  </response>
105
+	  * </multistatus>
106
+	  *
107
+	  * @var boolean (client_refuses_redundand_namespace_declarations)
108
+	  */
109
+	var $crrnd = false;
110 110
 
111
-    /**
111
+	/**
112 112
 
113 113
 
114 114
     /**
115
-     * URI path for this request
116
-     *
117
-     * @var string
118
-     */
119
-    var $path;
115
+	 * URI path for this request
116
+	 *
117
+	 * @var string
118
+	 */
119
+	var $path;
120 120
 
121
-    /**
122
-     * Realm string to be used in authentification popups
123
-     *
124
-     * @var string
125
-     */
126
-    var $http_auth_realm = "PHP WebDAV";
121
+	/**
122
+	 * Realm string to be used in authentification popups
123
+	 *
124
+	 * @var string
125
+	 */
126
+	var $http_auth_realm = "PHP WebDAV";
127 127
 
128
-    /**
129
-     * String to be used in "X-Dav-Powered-By" header
130
-     *
131
-     * @var string
132
-     */
133
-    var $dav_powered_by = "";
128
+	/**
129
+	 * String to be used in "X-Dav-Powered-By" header
130
+	 *
131
+	 * @var string
132
+	 */
133
+	var $dav_powered_by = "";
134 134
 
135
-    /**
136
-     * Remember parsed If: (RFC2518/9.4) header conditions
137
-     *
138
-     * @var array
139
-     */
140
-    var $_if_header_uris = array();
135
+	/**
136
+	 * Remember parsed If: (RFC2518/9.4) header conditions
137
+	 *
138
+	 * @var array
139
+	 */
140
+	var $_if_header_uris = array();
141 141
 
142
-    /**
143
-     * HTTP response status/message
144
-     *
145
-     * @var string
146
-     */
147
-    var $_http_status = "200 OK";
142
+	/**
143
+	 * HTTP response status/message
144
+	 *
145
+	 * @var string
146
+	 */
147
+	var $_http_status = "200 OK";
148 148
 
149
-    /**
150
-     * encoding of property values passed in
151
-     *
152
-     * @var string
153
-     */
154
-    var $_prop_encoding = "utf-8";
149
+	/**
150
+	 * encoding of property values passed in
151
+	 *
152
+	 * @var string
153
+	 */
154
+	var $_prop_encoding = "utf-8";
155 155
 
156
-    /**
157
-     * Copy of $_SERVER superglobal array
158
-     *
159
-     * Derived classes may extend the constructor to
160
-     * modify its contents
161
-     *
162
-     * @var array
163
-     */
164
-    var $_SERVER;
156
+	/**
157
+	 * Copy of $_SERVER superglobal array
158
+	 *
159
+	 * Derived classes may extend the constructor to
160
+	 * modify its contents
161
+	 *
162
+	 * @var array
163
+	 */
164
+	var $_SERVER;
165 165
 
166
-    // }}}
166
+	// }}}
167 167
 
168
-    // {{{ Constructor
168
+	// {{{ Constructor
169 169
 
170
-    /**
171
-     * Constructor
172
-     *
173
-     * @param void
174
-     */
175
-    function __construct()
176
-    {
177
-        // PHP messages destroy XML output -> switch them off
178
-        ini_set("display_errors", 0);
179
-
180
-        // copy $_SERVER variables to local _SERVER array
181
-        // so that derived classes can simply modify these
182
-        $this->_SERVER = $_SERVER;
183
-    }
184
-
185
-    // }}}
186
-
187
-    // {{{ ServeRequest()
188
-    /**
189
-     * Serve WebDAV HTTP request
190
-     *
191
-     * dispatch WebDAV HTTP request to the apropriate method handler
192
-     *
193
-     * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
194
-     * @return void
195
-     */
196
-    function ServeRequest($prefix=null)
197
-    {
198
-        // prevent warning in litmus check 'delete_fragment'
199
-        if (strstr($this->_SERVER["REQUEST_URI"], '#')) {
200
-            $this->http_status("400 Bad Request");
201
-            return;
202
-        }
203
-
204
-        // default is currently to use just the path, extending class can set $this->client_require_href_as_url depending on user-agent
205
-        if ($this->client_require_href_as_url)
206
-        {
207
-	        // default uri is the complete request uri
208
-	        $uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:") . '//'.$this->_SERVER['HTTP_HOST'];
209
-        }
210
-        $uri .= $this->_SERVER["SCRIPT_NAME"];
211
-
212
-        // WebDAV has no concept of a query string and clients (including cadaver)
213
-        // seem to pass '?' unencoded, so we need to extract the path info out
214
-        // of the request URI ourselves
215
-        // if request URI contains a full url, remove schema and domain
170
+	/**
171
+	 * Constructor
172
+	 *
173
+	 * @param void
174
+	 */
175
+	function __construct()
176
+	{
177
+		// PHP messages destroy XML output -> switch them off
178
+		ini_set("display_errors", 0);
179
+
180
+		// copy $_SERVER variables to local _SERVER array
181
+		// so that derived classes can simply modify these
182
+		$this->_SERVER = $_SERVER;
183
+	}
184
+
185
+	// }}}
186
+
187
+	// {{{ ServeRequest()
188
+	/**
189
+	 * Serve WebDAV HTTP request
190
+	 *
191
+	 * dispatch WebDAV HTTP request to the apropriate method handler
192
+	 *
193
+	 * @param  $prefix =null prefix filesystem path with given path, eg. "/webdav" for owncloud 4.5 remote.php
194
+	 * @return void
195
+	 */
196
+	function ServeRequest($prefix=null)
197
+	{
198
+		// prevent warning in litmus check 'delete_fragment'
199
+		if (strstr($this->_SERVER["REQUEST_URI"], '#')) {
200
+			$this->http_status("400 Bad Request");
201
+			return;
202
+		}
203
+
204
+		// default is currently to use just the path, extending class can set $this->client_require_href_as_url depending on user-agent
205
+		if ($this->client_require_href_as_url)
206
+		{
207
+			// default uri is the complete request uri
208
+			$uri = (@$this->_SERVER["HTTPS"] === "on" ? "https:" : "http:") . '//'.$this->_SERVER['HTTP_HOST'];
209
+		}
210
+		$uri .= $this->_SERVER["SCRIPT_NAME"];
211
+
212
+		// WebDAV has no concept of a query string and clients (including cadaver)
213
+		// seem to pass '?' unencoded, so we need to extract the path info out
214
+		// of the request URI ourselves
215
+		// if request URI contains a full url, remove schema and domain
216 216
 		$matches = null;
217
-        if (preg_match('|^https?://[^/]+(/.*)$|', $path_info=$this->_SERVER["REQUEST_URI"], $matches))
218
-        {
219
-        	$path_info = $matches[1];
220
-        }
221
-        $path_info_raw = substr($path_info, strlen($this->_SERVER["SCRIPT_NAME"]));
222
-
223
-        // just in case the path came in empty ...
224
-        if (empty($path_info_raw)) {
225
-            $path_info_raw = "/";
226
-        }
227
-
228
-        $path_info = self::_urldecode($path_info_raw);
229
-
230
-        if ($prefix && strpos($path_info, $prefix) === 0)
231
-        {
232
-        	$uri .= $prefix;
233
-        	list(,$path_info) = explode($prefix, $path_info, 2);
234
-        }
235
-
236
-        $this->base_uri = $uri;
237
-        $this->uri      = $uri . $path_info;
238
-
239
-        // set path
240
-        // $_SERVER['PATH_INFO'] is already urldecoded
241
-        //$this->path = self::_urldecode($path_info);
242
-        // quote '#' (e.g. OpenOffice uses this for lock-files)
243
-        $this->path = strtr($path_info,array(
244
-        	'%' => '%25',
245
-        	'#' => '%23',
246
-        	'?' => '%3F',
247
-        ));
248
-        if (!strlen($this->path)) {
249
-            if ($this->_SERVER["REQUEST_METHOD"] == "GET") {
250
-                // redirect clients that try to GET a collection
251
-                // WebDAV clients should never try this while
252
-                // regular HTTP clients might ...
253
-                header("Location: ".$this->base_uri."/");
254
-                return;
255
-            } else {
256
-                // if a WebDAV client didn't give a path we just assume '/'
257
-                $this->path = "/";
258
-            }
259
-        }
260
-
261
-        if (ini_get("magic_quotes_gpc")) {
262
-            $this->path = stripslashes($this->path);
263
-        }
264
-
265
-
266
-        // identify ourselves
267
-        if (empty($this->dav_powered_by)) {
268
-            header("X-Dav-Powered-By: PHP class: ".get_class($this));
269
-        } else {
270
-            header("X-Dav-Powered-By: ".$this->dav_powered_by);
271
-        }
272
-
273
-        // check authentication
274
-        // for the motivation for not checking OPTIONS requests on / see
275
-        // http://pear.php.net/bugs/bug.php?id=5363
276
-        if ( (   !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/")))
277
-             && (!$this->_check_auth())) {
278
-            // RFC2518 says we must use Digest instead of Basic
279
-            // but Microsoft Clients do not support Digest
280
-            // and we don't support NTLM and Kerberos
281
-            // so we are stuck with Basic here
282
-            header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"');
283
-
284
-            // Windows seems to require this being the last header sent
285
-            // (changed according to PECL bug #3138)
286
-            $this->http_status('401 Unauthorized');
287
-
288
-            return;
289
-        }
290
-
291
-        // check
292
-        if (! $this->_check_if_header_conditions()) {
293
-            return;
294
-        }
295
-
296
-        // detect requested method names
297
-        $method  = strtolower($this->_SERVER["REQUEST_METHOD"]);
298
-        $wrapper = "http_".$method;
299
-
300
-        // activate HEAD emulation by GET if no HEAD method found
301
-        if ($method == "head" && !method_exists($this, "head")) {
302
-            $method = "get";
303
-        }
304
-
305
-        if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) {
306
-            $this->$wrapper();  // call method by name
307
-        } else { // method not found/implemented
308
-            if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") {
309
-            	$error = '412 Precondition failed';
310
-            } else {
311
-                $error = '405 Method not allowed';
312
-                header("Allow: ".join(", ", $this->_allow()));  // tell client what's allowed
313
-            }
314
-            $this->http_status($error);
315
-            echo "<html><head><title>Error $error</title></head>\n";
316
-            echo "<body><h1>$error</h1>\n";
317
-            echo "The requested could not by handled by this server.\n";
318
-            echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")<br>\n<br>\n";
319
-            echo "</body></html>\n";
320
-        }
321
-    }
322
-
323
-    // }}}
324
-
325
-    // {{{ abstract WebDAV methods
326
-
327
-    // {{{ GET()
328
-    /**
329
-     * GET implementation
330
-     *
331
-     * overload this method to retrieve resources from your server
332
-     * <br>
333
-     *
334
-     *
335
-     * @abstract
336
-     * @param array &$params Array of input and output parameters
337
-     * <br><b>input</b><ul>
338
-     * <li> path -
339
-     * </ul>
340
-     * <br><b>output</b><ul>
341
-     * <li> size -
342
-     * </ul>
343
-     * @returns int HTTP-Statuscode
344
-     */
345
-
346
-    /* abstract
217
+		if (preg_match('|^https?://[^/]+(/.*)$|', $path_info=$this->_SERVER["REQUEST_URI"], $matches))
218
+		{
219
+			$path_info = $matches[1];
220
+		}
221
+		$path_info_raw = substr($path_info, strlen($this->_SERVER["SCRIPT_NAME"]));
222
+
223
+		// just in case the path came in empty ...
224
+		if (empty($path_info_raw)) {
225
+			$path_info_raw = "/";
226
+		}
227
+
228
+		$path_info = self::_urldecode($path_info_raw);
229
+
230
+		if ($prefix && strpos($path_info, $prefix) === 0)
231
+		{
232
+			$uri .= $prefix;
233
+			list(,$path_info) = explode($prefix, $path_info, 2);
234
+		}
235
+
236
+		$this->base_uri = $uri;
237
+		$this->uri      = $uri . $path_info;
238
+
239
+		// set path
240
+		// $_SERVER['PATH_INFO'] is already urldecoded
241
+		//$this->path = self::_urldecode($path_info);
242
+		// quote '#' (e.g. OpenOffice uses this for lock-files)
243
+		$this->path = strtr($path_info,array(
244
+			'%' => '%25',
245
+			'#' => '%23',
246
+			'?' => '%3F',
247
+		));
248
+		if (!strlen($this->path)) {
249
+			if ($this->_SERVER["REQUEST_METHOD"] == "GET") {
250
+				// redirect clients that try to GET a collection
251
+				// WebDAV clients should never try this while
252
+				// regular HTTP clients might ...
253
+				header("Location: ".$this->base_uri."/");
254
+				return;
255
+			} else {
256
+				// if a WebDAV client didn't give a path we just assume '/'
257
+				$this->path = "/";
258
+			}
259
+		}
260
+
261
+		if (ini_get("magic_quotes_gpc")) {
262
+			$this->path = stripslashes($this->path);
263
+		}
264
+
265
+
266
+		// identify ourselves
267
+		if (empty($this->dav_powered_by)) {
268
+			header("X-Dav-Powered-By: PHP class: ".get_class($this));
269
+		} else {
270
+			header("X-Dav-Powered-By: ".$this->dav_powered_by);
271
+		}
272
+
273
+		// check authentication
274
+		// for the motivation for not checking OPTIONS requests on / see
275
+		// http://pear.php.net/bugs/bug.php?id=5363
276
+		if ( (   !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/")))
277
+			 && (!$this->_check_auth())) {
278
+			// RFC2518 says we must use Digest instead of Basic
279
+			// but Microsoft Clients do not support Digest
280
+			// and we don't support NTLM and Kerberos
281
+			// so we are stuck with Basic here
282
+			header('WWW-Authenticate: Basic realm="'.($this->http_auth_realm).'"');
283
+
284
+			// Windows seems to require this being the last header sent
285
+			// (changed according to PECL bug #3138)
286
+			$this->http_status('401 Unauthorized');
287
+
288
+			return;
289
+		}
290
+
291
+		// check
292
+		if (! $this->_check_if_header_conditions()) {
293
+			return;
294
+		}
295
+
296
+		// detect requested method names
297
+		$method  = strtolower($this->_SERVER["REQUEST_METHOD"]);
298
+		$wrapper = "http_".$method;
299
+
300
+		// activate HEAD emulation by GET if no HEAD method found
301
+		if ($method == "head" && !method_exists($this, "head")) {
302
+			$method = "get";
303
+		}
304
+
305
+		if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) {
306
+			$this->$wrapper();  // call method by name
307
+		} else { // method not found/implemented
308
+			if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") {
309
+				$error = '412 Precondition failed';
310
+			} else {
311
+				$error = '405 Method not allowed';
312
+				header("Allow: ".join(", ", $this->_allow()));  // tell client what's allowed
313
+			}
314
+			$this->http_status($error);
315
+			echo "<html><head><title>Error $error</title></head>\n";
316
+			echo "<body><h1>$error</h1>\n";
317
+			echo "The requested could not by handled by this server.\n";
318
+			echo '(URI ' . $this->_SERVER['REQUEST_URI'] . ")<br>\n<br>\n";
319
+			echo "</body></html>\n";
320
+		}
321
+	}
322
+
323
+	// }}}
324
+
325
+	// {{{ abstract WebDAV methods
326
+
327
+	// {{{ GET()
328
+	/**
329
+	 * GET implementation
330
+	 *
331
+	 * overload this method to retrieve resources from your server
332
+	 * <br>
333
+	 *
334
+	 *
335
+	 * @abstract
336
+	 * @param array &$params Array of input and output parameters
337
+	 * <br><b>input</b><ul>
338
+	 * <li> path -
339
+	 * </ul>
340
+	 * <br><b>output</b><ul>
341
+	 * <li> size -
342
+	 * </ul>
343
+	 * @returns int HTTP-Statuscode
344
+	 */
345
+
346
+	/* abstract
347 347
      function GET(&$params)
348 348
      {
349 349
      // dummy entry for PHPDoc
350 350
      }
351 351
     */
352 352
 
353
-    // }}}
353
+	// }}}
354 354
 
355
-    // {{{ PUT()
356
-    /**
357
-     * PUT implementation
358
-     *
359
-     * PUT implementation
360
-     *
361
-     * @abstract
362
-     * @param array &$params
363
-     * @returns int HTTP-Statuscode
364
-     */
365
-
366
-    /* abstract
355
+	// {{{ PUT()
356
+	/**
357
+	 * PUT implementation
358
+	 *
359
+	 * PUT implementation
360
+	 *
361
+	 * @abstract
362
+	 * @param array &$params
363
+	 * @returns int HTTP-Statuscode
364
+	 */
365
+
366
+	/* abstract
367 367
      function PUT()
368 368
      {
369 369
      // dummy entry for PHPDoc
370 370
      }
371 371
     */
372 372
 
373
-    // }}}
373
+	// }}}
374 374
 
375
-    // {{{ COPY()
375
+	// {{{ COPY()
376 376
 
377
-    /**
378
-     * COPY implementation
379
-     *
380
-     * COPY implementation
381
-     *
382
-     * @abstract
383
-     * @param array &$params
384
-     * @returns int HTTP-Statuscode
385
-     */
386
-
387
-    /* abstract
377
+	/**
378
+	 * COPY implementation
379
+	 *
380
+	 * COPY implementation
381
+	 *
382
+	 * @abstract
383
+	 * @param array &$params
384
+	 * @returns int HTTP-Statuscode
385
+	 */
386
+
387
+	/* abstract
388 388
      function COPY()
389 389
      {
390 390
      // dummy entry for PHPDoc
391 391
      }
392 392
     */
393 393
 
394
-    // }}}
394
+	// }}}
395 395
 
396
-    // {{{ MOVE()
396
+	// {{{ MOVE()
397 397
 
398
-    /**
399
-     * MOVE implementation
400
-     *
401
-     * MOVE implementation
402
-     *
403
-     * @abstract
404
-     * @param array &$params
405
-     * @returns int HTTP-Statuscode
406
-     */
407
-
408
-    /* abstract
398
+	/**
399
+	 * MOVE implementation
400
+	 *
401
+	 * MOVE implementation
402
+	 *
403
+	 * @abstract
404
+	 * @param array &$params
405
+	 * @returns int HTTP-Statuscode
406
+	 */
407
+
408
+	/* abstract
409 409
      function MOVE()
410 410
      {
411 411
      // dummy entry for PHPDoc
412 412
      }
413 413
     */
414 414
 
415
-    // }}}
415
+	// }}}
416 416
 
417
-    // {{{ DELETE()
417
+	// {{{ DELETE()
418 418
 
419
-    /**
420
-     * DELETE implementation
421
-     *
422
-     * DELETE implementation
423
-     *
424
-     * @abstract
425
-     * @param array &$params
426
-     * @returns int HTTP-Statuscode
427
-     */
428
-
429
-    /* abstract
419
+	/**
420
+	 * DELETE implementation
421
+	 *
422
+	 * DELETE implementation
423
+	 *
424
+	 * @abstract
425
+	 * @param array &$params
426
+	 * @returns int HTTP-Statuscode
427
+	 */
428
+
429
+	/* abstract
430 430
      function DELETE()
431 431
      {
432 432
      // dummy entry for PHPDoc
433 433
      }
434 434
     */
435
-    // }}}
435
+	// }}}
436 436
 
437
-    // {{{ PROPFIND()
437
+	// {{{ PROPFIND()
438 438
 
439
-    /**
440
-     * PROPFIND implementation
441
-     *
442
-     * PROPFIND implementation
443
-     *
444
-     * @abstract
445
-     * @param array &$params
446
-     * @returns int HTTP-Statuscode
447
-     */
448
-
449
-    /* abstract
439
+	/**
440
+	 * PROPFIND implementation
441
+	 *
442
+	 * PROPFIND implementation
443
+	 *
444
+	 * @abstract
445
+	 * @param array &$params
446
+	 * @returns int HTTP-Statuscode
447
+	 */
448
+
449
+	/* abstract
450 450
      function PROPFIND()
451 451
      {
452 452
      // dummy entry for PHPDoc
453 453
      }
454 454
     */
455 455
 
456
-    // }}}
456
+	// }}}
457 457
 
458
-    // {{{ PROPPATCH()
458
+	// {{{ PROPPATCH()
459 459
 
460
-    /**
461
-     * PROPPATCH implementation
462
-     *
463
-     * PROPPATCH implementation
464
-     *
465
-     * @abstract
466
-     * @param array &$params
467
-     * @returns int HTTP-Statuscode
468
-     */
469
-
470
-    /* abstract
460
+	/**
461
+	 * PROPPATCH implementation
462
+	 *
463
+	 * PROPPATCH implementation
464
+	 *
465
+	 * @abstract
466
+	 * @param array &$params
467
+	 * @returns int HTTP-Statuscode
468
+	 */
469
+
470
+	/* abstract
471 471
      function PROPPATCH()
472 472
      {
473 473
      // dummy entry for PHPDoc
474 474
      }
475 475
     */
476
-    // }}}
476
+	// }}}
477 477
 
478
-    // {{{ LOCK()
478
+	// {{{ LOCK()
479 479
 
480
-    /**
481
-     * LOCK implementation
482
-     *
483
-     * LOCK implementation
484
-     *
485
-     * @abstract
486
-     * @param array &$params
487
-     * @returns int HTTP-Statuscode
488
-     */
489
-
490
-    /* abstract
480
+	/**
481
+	 * LOCK implementation
482
+	 *
483
+	 * LOCK implementation
484
+	 *
485
+	 * @abstract
486
+	 * @param array &$params
487
+	 * @returns int HTTP-Statuscode
488
+	 */
489
+
490
+	/* abstract
491 491
      function LOCK()
492 492
      {
493 493
      // dummy entry for PHPDoc
494 494
      }
495 495
     */
496
-    // }}}
496
+	// }}}
497 497
 
498
-    // {{{ UNLOCK()
498
+	// {{{ UNLOCK()
499 499
 
500
-    /**
501
-     * UNLOCK implementation
502
-     *
503
-     * UNLOCK implementation
504
-     *
505
-     * @abstract
506
-     * @param array &$params
507
-     * @returns int HTTP-Statuscode
508
-     */
509
-
510
-    /* abstract
500
+	/**
501
+	 * UNLOCK implementation
502
+	 *
503
+	 * UNLOCK implementation
504
+	 *
505
+	 * @abstract
506
+	 * @param array &$params
507
+	 * @returns int HTTP-Statuscode
508
+	 */
509
+
510
+	/* abstract
511 511
      function UNLOCK()
512 512
      {
513 513
      // dummy entry for PHPDoc
514 514
      }
515 515
     */
516
-    // }}}
516
+	// }}}
517 517
 
518
-    // {{{ ACL()
518
+	// {{{ ACL()
519 519
 
520
-    /**
521
-     * ACL implementation
522
-     *
523
-     * ACL implementation
524
-     *
525
-     * @abstract
526
-     * @param array &$params
527
-     * @returns int HTTP-Statuscode
528
-     */
529
-
530
-    /* abstract
520
+	/**
521
+	 * ACL implementation
522
+	 *
523
+	 * ACL implementation
524
+	 *
525
+	 * @abstract
526
+	 * @param array &$params
527
+	 * @returns int HTTP-Statuscode
528
+	 */
529
+
530
+	/* abstract
531 531
      function ACL()
532 532
      {
533 533
      // dummy entry for PHPDoc
534 534
      }
535 535
     */
536
-    // }}}
536
+	// }}}
537 537
 
538
-    // }}}
538
+	// }}}
539 539
 
540
-    // {{{ other abstract methods
540
+	// {{{ other abstract methods
541 541
 
542
-    // {{{ check_auth()
542
+	// {{{ check_auth()
543 543
 
544
-    /**
545
-     * check authentication
546
-     *
547
-     * overload this method to retrieve and confirm authentication information
548
-     *
549
-     * @abstract
550
-     * @param string type Authentication type, e.g. "basic" or "digest"
551
-     * @param string username Transmitted username
552
-     * @param string passwort Transmitted password
553
-     * @returns bool Authentication status
554
-     */
555
-
556
-    /* abstract
544
+	/**
545
+	 * check authentication
546
+	 *
547
+	 * overload this method to retrieve and confirm authentication information
548
+	 *
549
+	 * @abstract
550
+	 * @param string type Authentication type, e.g. "basic" or "digest"
551
+	 * @param string username Transmitted username
552
+	 * @param string passwort Transmitted password
553
+	 * @returns bool Authentication status
554
+	 */
555
+
556
+	/* abstract
557 557
      function checkAuth($type, $username, $password)
558 558
      {
559 559
      // dummy entry for PHPDoc
560 560
      }
561 561
     */
562 562
 
563
-    // }}}
563
+	// }}}
564 564
 
565
-    // {{{ checklock()
565
+	// {{{ checklock()
566 566
 
567
-    /**
568
-     * check lock status for a resource
569
-     *
570
-     * overload this method to return shared and exclusive locks
571
-     * active for this resource
572
-     *
573
-     * @abstract
574
-     * @param string resource Resource path to check
575
-     * @returns array An array of lock entries each consisting
576
-     *                of 'type' ('shared'/'exclusive'), 'token' and 'timeout'
577
-     */
578
-
579
-    /* abstract
567
+	/**
568
+	 * check lock status for a resource
569
+	 *
570
+	 * overload this method to return shared and exclusive locks
571
+	 * active for this resource
572
+	 *
573
+	 * @abstract
574
+	 * @param string resource Resource path to check
575
+	 * @returns array An array of lock entries each consisting
576
+	 *                of 'type' ('shared'/'exclusive'), 'token' and 'timeout'
577
+	 */
578
+
579
+	/* abstract
580 580
      function checklock($resource)
581 581
      {
582 582
      // dummy entry for PHPDoc
583 583
      }
584 584
     */
585 585
 
586
-    // }}}
586
+	// }}}
587 587
 
588
-    // }}}
588
+	// }}}
589 589
 
590
-    // {{{ WebDAV HTTP method wrappers
590
+	// {{{ WebDAV HTTP method wrappers
591 591
 
592
-    // {{{ http_OPTIONS()
592
+	// {{{ http_OPTIONS()
593 593
 
594
-    /**
595
-     * OPTIONS method handler
596
-     *
597
-     * The OPTIONS method handler creates a valid OPTIONS reply
598
-     * including Dav: and Allowed: headers
599
-     * based on the implemented methods found in the actual instance
600
-     *
601
-     * @param  void
602
-     * @return void
603
-     */
604
-    function http_OPTIONS()
605
-    {
606
-        // Microsoft clients default to the Frontpage protocol
607
-        // unless we tell them to use WebDAV
608
-        header("MS-Author-Via: DAV");
609
-
610
-        // get allowed methods
611
-        $allow = $this->_allow();
612
-
613
-        // dav header
614
-        $dav = array(1);        // assume we are always dav class 1 compliant
615
-        if (isset($allow['LOCK'])) {
616
-            $dav[] = 2;         // dav class 2 requires that locking is supported
617
-        }
618
-
619
-        // allow extending class to modify DAV and Allow headers
594
+	/**
595
+	 * OPTIONS method handler
596
+	 *
597
+	 * The OPTIONS method handler creates a valid OPTIONS reply
598
+	 * including Dav: and Allowed: headers
599
+	 * based on the implemented methods found in the actual instance
600
+	 *
601
+	 * @param  void
602
+	 * @return void
603
+	 */
604
+	function http_OPTIONS()
605
+	{
606
+		// Microsoft clients default to the Frontpage protocol
607
+		// unless we tell them to use WebDAV
608
+		header("MS-Author-Via: DAV");
609
+
610
+		// get allowed methods
611
+		$allow = $this->_allow();
612
+
613
+		// dav header
614
+		$dav = array(1);        // assume we are always dav class 1 compliant
615
+		if (isset($allow['LOCK'])) {
616
+			$dav[] = 2;         // dav class 2 requires that locking is supported
617
+		}
618
+
619
+		// allow extending class to modify DAV and Allow headers
620 620
 		if (method_exists($this,'OPTIONS')) {
621 621
 			$this->OPTIONS($this->path,$dav,$allow);
622 622
 		}
623 623
 
624
-        // tell clients what we found
625
-        $this->http_status("200 OK");
626
-        header("DAV: "  .join(", ", $dav));
627
-        header("Allow: ".join(", ", $allow));
624
+		// tell clients what we found
625
+		$this->http_status("200 OK");
626
+		header("DAV: "  .join(", ", $dav));
627
+		header("Allow: ".join(", ", $allow));
628 628
 
629
-        header("Content-length: 0");
630
-    }
629
+		header("Content-length: 0");
630
+	}
631 631
 
632
-    // }}}
632
+	// }}}
633 633
 
634 634
 
635
-    // {{{ http_PROPFIND()
635
+	// {{{ http_PROPFIND()
636 636
 
637
-    /**
638
-     * Should the whole PROPFIND request (xml) be stored
639
-     *
640
-     * @var boolean
641
-     */
642
-    var $store_request = false;
643
-    /**
644
-     * Content of (last) PROPFIND request
645
-     *
646
-     * @var string
647
-     */
648
-    var $request;
637
+	/**
638
+	 * Should the whole PROPFIND request (xml) be stored
639
+	 *
640
+	 * @var boolean
641
+	 */
642
+	var $store_request = false;
643
+	/**
644
+	 * Content of (last) PROPFIND request
645
+	 *
646
+	 * @var string
647
+	 */
648
+	var $request;
649 649
 
650
-    /**
651
-     * PROPFIND method handler
652
-     *
653
-     * @param  string $handler ='PROPFIND' allows to use method eg. for CalDAV REPORT
654
-     * @return void
655
-     */
656
-    function http_PROPFIND($handler='PROPFIND')
657
-    {
658
-        $options = Array();
659
-        $files   = Array();
660
-
661
-        $options["path"] = $this->path;
662
-
663
-        // search depth from header (default is "infinity)
664
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
665
-            $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
666
-        } else {
667
-            $options["depth"] = "infinity";
668
-        }
669
-
670
-        // analyze request payload
671
-        $propinfo = new _parse_propfind("php://input", $this->store_request, $handler);
672
-        if ($this->store_request) $this->request = $propinfo->request;
673
-        if ($propinfo->error) {
674
-            $this->http_status("400 Bad Request");
650
+	/**
651
+	 * PROPFIND method handler
652
+	 *
653
+	 * @param  string $handler ='PROPFIND' allows to use method eg. for CalDAV REPORT
654
+	 * @return void
655
+	 */
656
+	function http_PROPFIND($handler='PROPFIND')
657
+	{
658
+		$options = Array();
659
+		$files   = Array();
660
+
661
+		$options["path"] = $this->path;
662
+
663
+		// search depth from header (default is "infinity)
664
+		if (isset($this->_SERVER['HTTP_DEPTH'])) {
665
+			$options["depth"] = $this->_SERVER["HTTP_DEPTH"];
666
+		} else {
667
+			$options["depth"] = "infinity";
668
+		}
669
+
670
+		// analyze request payload
671
+		$propinfo = new _parse_propfind("php://input", $this->store_request, $handler);
672
+		if ($this->store_request) $this->request = $propinfo->request;
673
+		if ($propinfo->error) {
674
+			$this->http_status("400 Bad Request");
675 675
 			if (method_exists($this, 'log')) $this->log('Error parsing propfind: '.$propinfo->error);
676
-            return;
677
-        }
676
+			return;
677
+		}
678 678
 		$options['root'] = $propinfo->root;
679 679
 		$options['props'] = $propinfo->props;
680 680
 		if ($propinfo->filters)
@@ -682,34 +682,34 @@  discard block
 block discarded – undo
682 682
 		if ($propinfo->other)
683 683
 			$options['other'] = $propinfo->other;
684 684
 
685
-        // call user handler
686
-        if (!($retval =$this->$handler($options, $files))) {
687
-            $files = array("files" => array());
688
-            if (method_exists($this, "checkLock")) {
689
-                // is locked?
690
-                $lock = $this->checkLock($this->path);
691
-
692
-                if (is_array($lock) && count($lock)) {
693
-                    $created          = isset($lock['created'])  ? $lock['created']  : time();
694
-                    $modified         = isset($lock['modified']) ? $lock['modified'] : time();
695
-                    $files['files'][] = array("path"  => self::_slashify($this->path),
696
-                                              "props" => array($this->mkprop("displayname",      $this->path),
697
-                                                               $this->mkprop("creationdate",     $created),
698
-                                                               $this->mkprop("getlastmodified",  $modified),
699
-                                                               $this->mkprop("resourcetype",     ""),
700
-                                                               $this->mkprop("getcontenttype",   ""),
701
-                                                               $this->mkprop("getcontentlength", 0))
702
-                                              );
703
-                }
704
-            }
705
-
706
-            if (empty($files['files'])) {
707
-                $this->http_status("404 Not Found");
708
-                return;
709
-            }
710
-        }
711
-
712
-        // now we generate the reply header ...
685
+		// call user handler
686
+		if (!($retval =$this->$handler($options, $files))) {
687
+			$files = array("files" => array());
688
+			if (method_exists($this, "checkLock")) {
689
+				// is locked?
690
+				$lock = $this->checkLock($this->path);
691
+
692
+				if (is_array($lock) && count($lock)) {
693
+					$created          = isset($lock['created'])  ? $lock['created']  : time();
694
+					$modified         = isset($lock['modified']) ? $lock['modified'] : time();
695
+					$files['files'][] = array("path"  => self::_slashify($this->path),
696
+											  "props" => array($this->mkprop("displayname",      $this->path),
697
+															   $this->mkprop("creationdate",     $created),
698
+															   $this->mkprop("getlastmodified",  $modified),
699
+															   $this->mkprop("resourcetype",     ""),
700
+															   $this->mkprop("getcontenttype",   ""),
701
+															   $this->mkprop("getcontentlength", 0))
702
+											  );
703
+				}
704
+			}
705
+
706
+			if (empty($files['files'])) {
707
+				$this->http_status("404 Not Found");
708
+				return;
709
+			}
710
+		}
711
+
712
+		// now we generate the reply header ...
713 713
 		if ($retval === true)
714 714
 		{
715 715
 			$this->http_status('207 Multi-Status');
@@ -733,506 +733,506 @@  discard block
 block discarded – undo
733 733
 			return;
734 734
 		}
735 735
 		// dav header
736
-        $dav = array(1);        // assume we are always dav class 1 compliant
737
-        $allow = false;
736
+		$dav = array(1);        // assume we are always dav class 1 compliant
737
+		$allow = false;
738 738
 
739
-        // allow extending class to modify DAV
739
+		// allow extending class to modify DAV
740 740
 		if (method_exists($this,'OPTIONS')) {
741 741
 			$this->OPTIONS($this->path,$dav,$allow);
742 742
 		}
743
-        header("DAV: "  .join(", ", $dav));
744
-        header('Content-Type: text/xml; charset="utf-8"');
743
+		header("DAV: "  .join(", ", $dav));
744
+		header('Content-Type: text/xml; charset="utf-8"');
745 745
 
746
-        // add Vary and Preference-Applied header for Prefer: return=minimal
747
-        if (isset($this->_SERVER['HTTP_PREFER']) && in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER'])))
748
-        {
749
-        	header("Preference-Applied: return=minimal");
750
-        	header("Vary: Prefer");
751
-        }
752
-
753
-        // ... and payload
754
-        echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
755
-        echo $this->crrnd ? "<multistatus xmlns=\"DAV:\">\n" : "<D:multistatus xmlns:D=\"DAV:\">\n";
756
-
757
-        $this->multistatus_responses($files['files'], $options['props']);
758
-
759
-        // WebDAV sync report sync-token, can be either the sync-token or a callback (called with params in $files['sync-token-params'])
760
-        if (isset($files['sync-token']))
761
-        {
762
-            echo ($this->crrnd ? " <" : " <D:")."sync-token>".
763
-            	htmlspecialchars(!is_callable($files['sync-token']) ? $files['sync-token'] :
764
-            		call_user_func_array($files['sync-token'], (array)$files['sync-token-params'])).
765
-            	($this->crrnd ? "</" : "</D:")."sync-token>\n";
766
-        }
767
-
768
-        echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
769
-    }
770
-
771
-    /**
772
-     * Render (echo) XML for given multistatus responses
773
-     *
774
-     * @param array|Iterator $files
775
-     * @param array|string $props
776
-     */
777
-    function multistatus_responses(&$files, $props, $initial_ns_hash=null, $initial_ns_defs=null)
778
-    {
779
-    	if (!isset($initial_ns_hash)) $initial_ns_hash = array('DAV:' => 'D');
780
-    	if (!isset($initial_ns_defs)) $initial_ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"';
781
-
782
-    	// using an ArrayIterator to prevent foreach from copying the array,
783
-        // as we cant loop by reference, when an iterator is given in $files
784
-        if (is_array($files))
785
-        {
786
-        	$files = new ArrayIterator($files);
787
-        }
788
-        // support for "Prefer: depth-noroot" header on PROPFIND
789
-        $skip_root = $this->_SERVER['REQUEST_METHOD'] == 'PROPFIND' &&
790
-        	!isset($initial_ns_hash) &&	// multistatus_response calls itself, do NOT apply skip in that case
791
-        	isset($this->_SERVER['HTTP_PREFER']) && in_array('depth-noroot', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER']));
792
-
793
-        // now we loop over all returned file entries
794
-        foreach ($files as $file) {
795
-
796
-        	// skip first element (root), if requested by Prefer: depth-noroot
797
-        	if ($skip_root) {
798
-        		$skip_root = false;
799
-        		continue;
800
-        	}
801
-
802
-	        // collect namespaces here
803
-	        $ns_hash = $initial_ns_hash;
804
-
805
-	        // Microsoft Clients need this special namespace for date and time values
806
-	        $ns_defs = $initial_ns_defs;
807
-
808
-            // nothing to do if no properties were returend for a file
809
-			if (isset($file["props"]) && is_array($file["props"])) {
810
-
811
-	            // now loop over all returned properties
812
-	            foreach ($file["props"] as &$prop) {
813
-	                // as a convenience feature we do not require that user handlers
814
-	                // restrict returned properties to the requested ones
815
-	                // here we strip all unrequested entries out of the response
816
-
817
-	            	// this can happen if we have allprop and prop in one propfind:
818
-	            	// <allprop /><prop><blah /></prop>, eg. blah is not automatic returned by allprop
819
-	                switch(is_array($props) ? $props[0] : $props) {
820
-	                case "all":
821
-	                    // nothing to remove
822
-	                    break;
823
-
824
-	                case "names":
825
-	                    // only the names of all existing properties were requested
826
-	                    // so we remove all values
827
-	                    unset($prop["val"]);
828
-	                    break;
829
-
830
-	                default:
831
-	                    $found = false;
832
-
833
-	                    // search property name in requested properties
834
-	                    foreach ((array)$props as $reqprop) {
835
-	                        if (   $reqprop["name"]  == $prop["name"]
836
-	                               && @$reqprop["xmlns"] == $prop["ns"]) {
837
-	                            $found = true;
838
-	                            break;
839
-	                        }
840
-	                    }
841
-
842
-	                    // unset property and continue with next one if not found/requested
843
-	                    if (!$found) {
844
-	                        $prop="";
845
-	                        continue(2);
846
-	                    }
847
-	                    break;
848
-	                }
849
-
850
-	                // namespace handling
851
-	                if (empty($prop["ns"])) continue; // no namespace
852
-	                $ns = $prop["ns"];
853
-	                //if ($ns == "DAV:") continue; // default namespace
854
-	                if (isset($ns_hash[$ns])) continue; // already known
855
-
856
-	                // register namespace
857
-	                $ns_name = "ns".(count($ns_hash) + 1);
858
-	                $ns_hash[$ns] = $ns_name;
859
-	                $ns_defs .= " xmlns:$ns_name=\"$ns\"";
860
-	            }
861
-
862
-	            // we also need to add empty entries for properties that were requested
863
-	            // but for which no values where returned by the user handler
864
-	            if (is_array($props)) {
865
-	                foreach ($props as $reqprop) {
866
-	                    if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if <allprop /> used together with <prop>
867
-
868
-	                    $found = false;
869
-
870
-	                    // check if property exists in result
871
-	                    foreach ($file["props"] as &$prop) {
872
-	                        if (is_array($prop) && $reqprop["name"] == $prop["name"]
873
-	                               && @$reqprop["xmlns"] == $prop["ns"]) {
874
-	                            $found = true;
875
-	                            break;
876
-	                        }
877
-	                    }
878
-
879
-	                    if (!$found) {
880
-	                        if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") {
881
-	                            // lockdiscovery is handled by the base class
882
-	                            $file["props"][]
883
-	                                = $this->mkprop("DAV:",
884
-	                                                "lockdiscovery",
885
-	                                                $this->lockdiscovery($file['path']));
886
-	                        // only collect $file['noprops'] if we have NO Brief: t and NO Prefer: return=minimal HTTP Header
887
-	                        } elseif ((!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') &&
888
-	                        	(!isset($this->_SERVER['HTTP_PREFER']) || !in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER'])))) {
889
-	                            // add empty value for this property
890
-	                            $file["noprops"][] =
891
-	                                $this->mkprop($reqprop["xmlns"], $reqprop["name"], "");
892
-
893
-	                            // register property namespace if not known yet
894
-	                            if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) {
895
-	                                $ns_name = "ns".(count($ns_hash) + 1);
896
-	                                $ns_hash[$reqprop["xmlns"]] = $ns_name;
897
-	                                $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\"";
898
-	                            }
899
-	                        }
900
-	                    }
901
-	                }
902
-	            }
903
-	        }
904
-            // ignore empty or incomplete entries
905
-            if (!is_array($file) || empty($file) || !isset($file["path"])) continue;
906
-            $path = $file['path'];
907
-            if (!is_string($path) || $path==="") continue;
908
-
909
-            if ($this->crrnd)
910
-            {
911
-            	echo " <response $ns_defs>\n";
912
-            }
913
-            else
914
-            {
915
-            	echo " <D:response $ns_defs>\n";
916
-            }
917
-
918
-            /* TODO right now the user implementation has to make sure
919
-             collections end in a slash, this should be done in here
920
-             by checking the resource attribute */
921
-            $href_raw = $this->_mergePaths($this->base_uri, $path);
922
-
923
-            /* minimal urlencoding is needed for the resource path */
924
-            $href = $this->_urlencode($href_raw);
925
-
926
-            if ($this->crrnd)
927
-            {
928
-            	echo "  <href>$href</href>\n";
929
-            }
930
-            else
931
-            {
932
-            	echo "  <D:href>$href</D:href>\n";
933
-            }
934
-
935
-            // report all found properties and their values (if any)
936
-            if (isset($file["props"]) && is_array($file["props"])) {
937
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
938
-                echo '    <'.($this->crrnd?'':'D:')."prop>\n";
939
-
940
-                foreach ($file["props"] as &$prop) {
941
-
942
-                    if (!is_array($prop)) continue;
943
-                    if (!isset($prop["name"])) continue;
944
-
945
-                    if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) {
946
-                        // empty properties (cannot use empty() for check as "0" is a legal value here)
947
-                        if ($prop["ns"]=="DAV:") {
948
-                            echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
949
-                        } else if (!empty($prop["ns"])) {
950
-                            echo "     <".$ns_hash[$prop["ns"]].":$prop[name]/>\n";
951
-                        } else {
952
-                            echo "     <$prop[name] xmlns=\"\"/>";
953
-                        }
954
-                    }
955
-                    // multiple level of responses required for expand-property reports
956
-                    elseif(isset($prop['props']) && is_array($prop['val']))
957
-                    {
958
-                        if ($prop['ns'] && !isset($ns_hash[$prop['ns']])) {
959
-                            $ns_name = "ns".(count($ns_hash) + 1);
960
-                            $ns_hash[$prop['ns']] = $ns_name;
961
-                        }
962
-                    	echo '     <'.$ns_hash[$prop['ns']].":$prop[name]>\n";
963
-                        $this->multistatus_responses($prop['val'], $prop['props'], $ns_hash, '');
964
-                    	echo '     </'.$ns_hash[$prop['ns']].":$prop[name]>\n";
965
-                    } else if ($prop["ns"] == "DAV:") {
966
-                        // some WebDAV properties need special treatment
967
-                        switch ($prop["name"]) {
968
-                        case "creationdate":
969
-                            echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
970
-                                . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
971
-                                . '</'.($this->crrnd?'':'D:')."creationdate>\n";
972
-                            break;
973
-                        case "getlastmodified":
974
-                            echo '     <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
975
-                                . gmdate("D, d M Y H:i:s ", $prop['val'])
976
-                                . "GMT</".($this->crrnd?'':'D:')."getlastmodified>\n";
977
-                            break;
978
-                        case "supportedlock":
979
-                            echo '     <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]</".($this->crrnd?'':'D:')."supportedlock>\n";
980
-                            break;
981
-                        case "lockdiscovery":
982
-                            echo '     <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
983
-                            echo $prop["val"];
984
-                            echo '     </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
985
-                            break;
986
-                        // the following are non-standard Microsoft extensions to the DAV namespace
987
-                        case "lastaccessed":
988
-                            echo '     <'.($this->crrnd?'':'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
989
-                                . gmdate("D, d M Y H:i:s ", $prop['val'])
990
-                                . 'GMT</'.($this->crrnd?'':'D:')."lastaccessed>\n";
991
-                            break;
992
-                        case "ishidden":
993
-                            echo '     <'.($this->crrnd?'':'D:')."ishidden>"
994
-                                . is_string($prop['val']) ? $prop['val'] : ($prop['val'] ? 'true' : 'false')
995
-                                . '</'.($this->crrnd?'':'D:')."</D:ishidden>\n";
996
-                            break;
997
-                        default:
998
-                        	$ns_defs = '';
999
-                            if (is_array($prop['val']))
1000
-                            {
1001
-                            	$hns_hash = $ns_hash;
1002
-                            	$val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash);
1003
-                            } elseif (isset($prop['raw'])) {
1004
-                            	$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
1005
-                            } else {
1006
-	                    		$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1007
-                            }
1008
-	                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1009
-	                        	'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1010
-                            break;
1011
-                        }
1012
-                    } else {
1013
-                        // allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set
1014
-                        if ($prop['ns'] && is_array($prop['val'])) {
1015
-                    		if (!isset($ns_hash[$prop['ns']])) {
1016
-                                $ns_name = "ns".(count($ns_hash) + 1);
1017
-                                $ns_hash[$prop['ns']] = $ns_name;
1018
-                    		}
1019
-                  			$vals = $extra_ns = '';
1020
-                    		foreach($prop['val'] as $subprop)
1021
-                    		{
1022
-                    			if ($subprop['ns'] && $subprop['ns'] != 'DAV:') {
1023
-		                    		// register property namespace if not known yet
1024
-		                    		if (!isset($ns_hash[$subprop['ns']])) {
1025
-			                    		$ns_name = "ns".(count($ns_hash) + 1);
1026
-			                    		$ns_hash[$subprop['ns']] = $ns_name;
1027
-		                    		} else {
1028
-			                    		$ns_name = $ns_hash[$subprop['ns']];
1029
-		                    		}
1030
-		                    		if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) {
1031
-			                    		$extra_ns .= $extra;
1032
-		                    		}
1033
-		                    		$ns_name .= ':';
1034
-	                    		} elseif ($subprop['ns'] == 'DAV:') {
1035
-		                    		$ns_name = 'D:';
1036
-	                    		} else {
1037
-		                    		$ns_name = '';
1038
-	                    		}
1039
-	                    		$vals .= "<$ns_name$subprop[name]";
1040
-	                    		if (is_array($subprop['val']))
1041
-	                    		{
1042
-	                    			if (isset($subprop['val'][0]))
1043
-	                    			{
1044
-		                    			$vals .= '>';
1045
-		                    			$vals .= $this->_hierarchical_prop_encode($subprop['val'], $subprop['ns'], $ns_defs, $ns_hash);
1046
-			                    		$vals .= "</$ns_name$subprop[name]>";
1047
-	                    			}
1048
-	                    			else	// val contains only attributes, no value
1049
-	                    			{
1050
-			                    		foreach($subprop['val'] as $attr => $val)
1051
-										{
1052
-				                    		$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
1053
-										}
1054
-			                    		$vals .= '/>';
1055
-	                    			}
1056
-	                    		}
1057
-	                    		else
1058
-	                    		{
1059
-	                    			$vals .= '>';
1060
-	                    			if (isset($subprop['raw'])) {
1061
-	                    				$vals .= '<![CDATA['.$subprop['val'].']]>';
1062
-	                    			} else {
1063
-	                    				if($subprop['name'] == 'href') $subprop['val'] = $this->_urlencode($subprop['val']);
1064
-		                    			$vals .= htmlspecialchars($subprop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1065
-	                    			}
1066
-	                    			$vals .= "</$ns_name$subprop[name]>";
1067
-	                    		}
1068
-                    		}
1069
-                    		echo '     <'.$ns_hash[$prop['ns']].":$prop[name]$extra_ns>$vals</".$ns_hash[$prop['ns']].":$prop[name]>\n";
1070
-                        } else {
1071
-                        	if ($prop['raw'])
1072
-                        	{
1073
-                        		$val = '<![CDATA['.$prop['val'].']]>';
1074
-                        	} else {
1075
-                        		$val = htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1076
-                        	}
1077
-                        	$val = $this->_prop_encode($val);
1078
-	                        // properties from namespaces != "DAV:" or without any namespace
1079
-	                        if ($prop['ns']) {
1080
-		                        if ($this->crrnd) {
1081
-			                        echo "     <$prop[name] xmlns=".'"'.$prop["ns"].'">'
1082
-									. $val . "</$prop[name]>\n";
1083
-		                        } else {
1084
-			                        echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]>"
1085
-									. $val . '</'.$ns_hash[$prop['ns']].":$prop[name]>\n";
1086
-		                        }
1087
-	                        } else {
1088
-		                        echo "     <$prop[name] xmlns=\"\">$val</$prop[name]>\n";
1089
-	                        }
1090
-                        }
1091
-                    }
1092
-                }
1093
-
1094
-                if ($this->crrnd)
1095
-                {
1096
-	                echo "    </prop>\n";
1097
-	                echo "   <status>HTTP/1.1 200 OK</status>\n";
1098
-	                echo "  </propstat>\n";
1099
-                }
1100
-                else
1101
-                {
1102
-	                echo "    </D:prop>\n";
1103
-	                echo "   <D:status>HTTP/1.1 200 OK</D:status>\n";
1104
-	                echo "  </D:propstat>\n";
1105
-                }
1106
-            }
1107
-
1108
-            // now report all properties requested but not found
1109
-            if (isset($file["noprops"])) {
1110
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1111
-                echo '    <'.($this->crrnd?'':'D:')."prop>\n";
1112
-
1113
-                foreach ($file["noprops"] as &$prop) {
1114
-                    if ($prop["ns"] == "DAV:") {
1115
-                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
1116
-                    } else if ($prop["ns"] == "") {
1117
-                        echo "     <$prop[name] xmlns=\"\"/>\n";
1118
-                    } else {
1119
-                        echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n";
1120
-                    }
1121
-                }
1122
-
1123
-                if ($this->crrnd)
1124
-                {
1125
-	                echo "   </prop>\n";
1126
-	                echo "   <status>HTTP/1.1 404 Not Found</status>\n";
1127
-	                echo "  </propstat>\n";
1128
-                }
1129
-                else
1130
-                {
1131
-	                echo "   </D:prop>\n";
1132
-	                echo "   <D:status>HTTP/1.1 404 Not Found</D:status>\n";
1133
-	                echo "  </D:propstat>\n";
1134
-                }
1135
-            }
1136
-
1137
-            // 404 Not Found status element for WebDAV sync report
1138
-            if (!isset($file['props']) && !isset($file['noprops']))
1139
-            {
1140
-                if ($this->crrnd)
1141
-                {
1142
-	                echo "  <status>HTTP/1.1 404 Not Found</status>\n";
1143
-                }
1144
-                else
1145
-                {
1146
-	                echo "  <D:status>HTTP/1.1 404 Not Found</D:status>\n";
1147
-                }
1148
-            }
1149
-
1150
-            echo ' </'.($this->crrnd?'':'D:')."response>\n";
1151
-        }
1152
-    }
1153
-
1154
-
1155
-    // }}}
1156
-
1157
-    // {{{ http_PROPPATCH()
746
+		// add Vary and Preference-Applied header for Prefer: return=minimal
747
+		if (isset($this->_SERVER['HTTP_PREFER']) && in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER'])))
748
+		{
749
+			header("Preference-Applied: return=minimal");
750
+			header("Vary: Prefer");
751
+		}
1158 752
 
1159
-    /**
1160
-     * PROPPATCH method handler
1161
-     *
1162
-     * @param  void
1163
-     * @return void
1164
-     */
1165
-    function http_PROPPATCH()
1166
-    {
1167
-        if ($this->_check_lock_status($this->path)) {
1168
-            $options = Array();
753
+		// ... and payload
754
+		echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
755
+		echo $this->crrnd ? "<multistatus xmlns=\"DAV:\">\n" : "<D:multistatus xmlns:D=\"DAV:\">\n";
1169 756
 
1170
-            $options["path"] = $this->path;
757
+		$this->multistatus_responses($files['files'], $options['props']);
1171 758
 
1172
-            $propinfo = new _parse_proppatch("php://input", $this->store_request);
1173
-            if ($this->store_request) $this->request = $propinfo->request;
759
+		// WebDAV sync report sync-token, can be either the sync-token or a callback (called with params in $files['sync-token-params'])
760
+		if (isset($files['sync-token']))
761
+		{
762
+			echo ($this->crrnd ? " <" : " <D:")."sync-token>".
763
+				htmlspecialchars(!is_callable($files['sync-token']) ? $files['sync-token'] :
764
+					call_user_func_array($files['sync-token'], (array)$files['sync-token-params'])).
765
+				($this->crrnd ? "</" : "</D:")."sync-token>\n";
766
+		}
1174 767
 
1175
-            if (!$propinfo->success) {
1176
-                $this->http_status("400 Error");
1177
-                return;
1178
-            }
768
+		echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
769
+	}
1179 770
 
1180
-            $options['props'] = $propinfo->props;
771
+	/**
772
+	 * Render (echo) XML for given multistatus responses
773
+	 *
774
+	 * @param array|Iterator $files
775
+	 * @param array|string $props
776
+	 */
777
+	function multistatus_responses(&$files, $props, $initial_ns_hash=null, $initial_ns_defs=null)
778
+	{
779
+		if (!isset($initial_ns_hash)) $initial_ns_hash = array('DAV:' => 'D');
780
+		if (!isset($initial_ns_defs)) $initial_ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"';
1181 781
 
1182
-            $responsedescr = $this->PROPPATCH($options);
782
+		// using an ArrayIterator to prevent foreach from copying the array,
783
+		// as we cant loop by reference, when an iterator is given in $files
784
+		if (is_array($files))
785
+		{
786
+			$files = new ArrayIterator($files);
787
+		}
788
+		// support for "Prefer: depth-noroot" header on PROPFIND
789
+		$skip_root = $this->_SERVER['REQUEST_METHOD'] == 'PROPFIND' &&
790
+			!isset($initial_ns_hash) &&	// multistatus_response calls itself, do NOT apply skip in that case
791
+			isset($this->_SERVER['HTTP_PREFER']) && in_array('depth-noroot', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER']));
792
+
793
+		// now we loop over all returned file entries
794
+		foreach ($files as $file) {
795
+
796
+			// skip first element (root), if requested by Prefer: depth-noroot
797
+			if ($skip_root) {
798
+				$skip_root = false;
799
+				continue;
800
+			}
1183 801
 
1184
-            $this->http_status("207 Multi-Status");
1185
-            header('Content-Type: text/xml; charset="utf-8"');
802
+			// collect namespaces here
803
+			$ns_hash = $initial_ns_hash;
1186 804
 
1187
-            echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
805
+			// Microsoft Clients need this special namespace for date and time values
806
+			$ns_defs = $initial_ns_defs;
1188 807
 
1189
-            echo "<D:multistatus xmlns:D=\"DAV:\">\n";
1190
-            echo ' <'.($this->crrnd?'':'D:')."response>\n";
1191
-            echo '  <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)).'</'.($this->crrnd?'':'D:')."href>\n";
808
+			// nothing to do if no properties were returend for a file
809
+			if (isset($file["props"]) && is_array($file["props"])) {
1192 810
 
1193
-            foreach ($options["props"] as $prop) {
1194
-                echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1195
-                echo '    <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/></".($this->crrnd?'':'D:')."prop>\n";
1196
-                echo '    <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]</".($this->crrnd?'':'D:')."status>\n";
1197
-                echo '   </'.($this->crrnd?'':'D:')."propstat>\n";
1198
-            }
811
+				// now loop over all returned properties
812
+				foreach ($file["props"] as &$prop) {
813
+					// as a convenience feature we do not require that user handlers
814
+					// restrict returned properties to the requested ones
815
+					// here we strip all unrequested entries out of the response
816
+
817
+					// this can happen if we have allprop and prop in one propfind:
818
+					// <allprop /><prop><blah /></prop>, eg. blah is not automatic returned by allprop
819
+					switch(is_array($props) ? $props[0] : $props) {
820
+					case "all":
821
+						// nothing to remove
822
+						break;
823
+
824
+					case "names":
825
+						// only the names of all existing properties were requested
826
+						// so we remove all values
827
+						unset($prop["val"]);
828
+						break;
829
+
830
+					default:
831
+						$found = false;
832
+
833
+						// search property name in requested properties
834
+						foreach ((array)$props as $reqprop) {
835
+							if (   $reqprop["name"]  == $prop["name"]
836
+								   && @$reqprop["xmlns"] == $prop["ns"]) {
837
+								$found = true;
838
+								break;
839
+							}
840
+						}
1199 841
 
1200
-            if ($responsedescr) {
1201
-                echo '  <'.($this->crrnd?'':'D:')."responsedescription>".
1202
-                    $this->_prop_encode(htmlspecialchars($responsedescr, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8')).
1203
-                    '</'.($this->crrnd?'':'D:')."responsedescription>\n";
1204
-            }
842
+						// unset property and continue with next one if not found/requested
843
+						if (!$found) {
844
+							$prop="";
845
+							continue(2);
846
+						}
847
+						break;
848
+					}
1205 849
 
1206
-            echo ' </'.($this->crrnd?'':'D:')."response>\n";
1207
-            echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
1208
-        } else {
1209
-            $this->http_status("423 Locked");
1210
-        }
1211
-    }
850
+					// namespace handling
851
+					if (empty($prop["ns"])) continue; // no namespace
852
+					$ns = $prop["ns"];
853
+					//if ($ns == "DAV:") continue; // default namespace
854
+					if (isset($ns_hash[$ns])) continue; // already known
1212 855
 
1213
-    // }}}
856
+					// register namespace
857
+					$ns_name = "ns".(count($ns_hash) + 1);
858
+					$ns_hash[$ns] = $ns_name;
859
+					$ns_defs .= " xmlns:$ns_name=\"$ns\"";
860
+				}
1214 861
 
862
+				// we also need to add empty entries for properties that were requested
863
+				// but for which no values where returned by the user handler
864
+				if (is_array($props)) {
865
+					foreach ($props as $reqprop) {
866
+						if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if <allprop /> used together with <prop>
867
+
868
+						$found = false;
869
+
870
+						// check if property exists in result
871
+						foreach ($file["props"] as &$prop) {
872
+							if (is_array($prop) && $reqprop["name"] == $prop["name"]
873
+								   && @$reqprop["xmlns"] == $prop["ns"]) {
874
+								$found = true;
875
+								break;
876
+							}
877
+						}
1215 878
 
1216
-    // {{{ http_MKCOL()
879
+						if (!$found) {
880
+							if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") {
881
+								// lockdiscovery is handled by the base class
882
+								$file["props"][]
883
+									= $this->mkprop("DAV:",
884
+													"lockdiscovery",
885
+													$this->lockdiscovery($file['path']));
886
+							// only collect $file['noprops'] if we have NO Brief: t and NO Prefer: return=minimal HTTP Header
887
+							} elseif ((!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') &&
888
+								(!isset($this->_SERVER['HTTP_PREFER']) || !in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER'])))) {
889
+								// add empty value for this property
890
+								$file["noprops"][] =
891
+									$this->mkprop($reqprop["xmlns"], $reqprop["name"], "");
892
+
893
+								// register property namespace if not known yet
894
+								if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) {
895
+									$ns_name = "ns".(count($ns_hash) + 1);
896
+									$ns_hash[$reqprop["xmlns"]] = $ns_name;
897
+									$ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\"";
898
+								}
899
+							}
900
+						}
901
+					}
902
+				}
903
+			}
904
+			// ignore empty or incomplete entries
905
+			if (!is_array($file) || empty($file) || !isset($file["path"])) continue;
906
+			$path = $file['path'];
907
+			if (!is_string($path) || $path==="") continue;
1217 908
 
1218
-    /**
1219
-     * MKCOL method handler
1220
-     *
1221
-     * @param  void
1222
-     * @return void
1223
-     */
1224
-    function http_MKCOL()
1225
-    {
1226
-        $options = Array();
909
+			if ($this->crrnd)
910
+			{
911
+				echo " <response $ns_defs>\n";
912
+			}
913
+			else
914
+			{
915
+				echo " <D:response $ns_defs>\n";
916
+			}
1227 917
 
1228
-        $options["path"] = $this->path;
918
+			/* TODO right now the user implementation has to make sure
919
+             collections end in a slash, this should be done in here
920
+             by checking the resource attribute */
921
+			$href_raw = $this->_mergePaths($this->base_uri, $path);
1229 922
 
1230
-        $stat = $this->MKCOL($options);
923
+			/* minimal urlencoding is needed for the resource path */
924
+			$href = $this->_urlencode($href_raw);
1231 925
 
1232
-        $this->http_status($stat);
1233
-    }
926
+			if ($this->crrnd)
927
+			{
928
+				echo "  <href>$href</href>\n";
929
+			}
930
+			else
931
+			{
932
+				echo "  <D:href>$href</D:href>\n";
933
+			}
1234 934
 
1235
-    // }}}
935
+			// report all found properties and their values (if any)
936
+			if (isset($file["props"]) && is_array($file["props"])) {
937
+				echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
938
+				echo '    <'.($this->crrnd?'':'D:')."prop>\n";
939
+
940
+				foreach ($file["props"] as &$prop) {
941
+
942
+					if (!is_array($prop)) continue;
943
+					if (!isset($prop["name"])) continue;
944
+
945
+					if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) {
946
+						// empty properties (cannot use empty() for check as "0" is a legal value here)
947
+						if ($prop["ns"]=="DAV:") {
948
+							echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
949
+						} else if (!empty($prop["ns"])) {
950
+							echo "     <".$ns_hash[$prop["ns"]].":$prop[name]/>\n";
951
+						} else {
952
+							echo "     <$prop[name] xmlns=\"\"/>";
953
+						}
954
+					}
955
+					// multiple level of responses required for expand-property reports
956
+					elseif(isset($prop['props']) && is_array($prop['val']))
957
+					{
958
+						if ($prop['ns'] && !isset($ns_hash[$prop['ns']])) {
959
+							$ns_name = "ns".(count($ns_hash) + 1);
960
+							$ns_hash[$prop['ns']] = $ns_name;
961
+						}
962
+						echo '     <'.$ns_hash[$prop['ns']].":$prop[name]>\n";
963
+						$this->multistatus_responses($prop['val'], $prop['props'], $ns_hash, '');
964
+						echo '     </'.$ns_hash[$prop['ns']].":$prop[name]>\n";
965
+					} else if ($prop["ns"] == "DAV:") {
966
+						// some WebDAV properties need special treatment
967
+						switch ($prop["name"]) {
968
+						case "creationdate":
969
+							echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
970
+								. gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
971
+								. '</'.($this->crrnd?'':'D:')."creationdate>\n";
972
+							break;
973
+						case "getlastmodified":
974
+							echo '     <'.($this->crrnd?'':'D:')."getlastmodified ns0:dt=\"dateTime.rfc1123\">"
975
+								. gmdate("D, d M Y H:i:s ", $prop['val'])
976
+								. "GMT</".($this->crrnd?'':'D:')."getlastmodified>\n";
977
+							break;
978
+						case "supportedlock":
979
+							echo '     <'.($this->crrnd?'':'D:')."supportedlock>$prop[val]</".($this->crrnd?'':'D:')."supportedlock>\n";
980
+							break;
981
+						case "lockdiscovery":
982
+							echo '     <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
983
+							echo $prop["val"];
984
+							echo '     </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
985
+							break;
986
+						// the following are non-standard Microsoft extensions to the DAV namespace
987
+						case "lastaccessed":
988
+							echo '     <'.($this->crrnd?'':'D:')."lastaccessed ns0:dt=\"dateTime.rfc1123\">"
989
+								. gmdate("D, d M Y H:i:s ", $prop['val'])
990
+								. 'GMT</'.($this->crrnd?'':'D:')."lastaccessed>\n";
991
+							break;
992
+						case "ishidden":
993
+							echo '     <'.($this->crrnd?'':'D:')."ishidden>"
994
+								. is_string($prop['val']) ? $prop['val'] : ($prop['val'] ? 'true' : 'false')
995
+								. '</'.($this->crrnd?'':'D:')."</D:ishidden>\n";
996
+							break;
997
+						default:
998
+							$ns_defs = '';
999
+							if (is_array($prop['val']))
1000
+							{
1001
+								$hns_hash = $ns_hash;
1002
+								$val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash);
1003
+							} elseif (isset($prop['raw'])) {
1004
+								$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
1005
+							} else {
1006
+								$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1007
+							}
1008
+							echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1009
+								'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1010
+							break;
1011
+						}
1012
+					} else {
1013
+						// allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set
1014
+						if ($prop['ns'] && is_array($prop['val'])) {
1015
+							if (!isset($ns_hash[$prop['ns']])) {
1016
+								$ns_name = "ns".(count($ns_hash) + 1);
1017
+								$ns_hash[$prop['ns']] = $ns_name;
1018
+							}
1019
+				  			$vals = $extra_ns = '';
1020
+							foreach($prop['val'] as $subprop)
1021
+							{
1022
+								if ($subprop['ns'] && $subprop['ns'] != 'DAV:') {
1023
+									// register property namespace if not known yet
1024
+									if (!isset($ns_hash[$subprop['ns']])) {
1025
+										$ns_name = "ns".(count($ns_hash) + 1);
1026
+										$ns_hash[$subprop['ns']] = $ns_name;
1027
+									} else {
1028
+										$ns_name = $ns_hash[$subprop['ns']];
1029
+									}
1030
+									if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) {
1031
+										$extra_ns .= $extra;
1032
+									}
1033
+									$ns_name .= ':';
1034
+								} elseif ($subprop['ns'] == 'DAV:') {
1035
+									$ns_name = 'D:';
1036
+								} else {
1037
+									$ns_name = '';
1038
+								}
1039
+								$vals .= "<$ns_name$subprop[name]";
1040
+								if (is_array($subprop['val']))
1041
+								{
1042
+									if (isset($subprop['val'][0]))
1043
+									{
1044
+										$vals .= '>';
1045
+										$vals .= $this->_hierarchical_prop_encode($subprop['val'], $subprop['ns'], $ns_defs, $ns_hash);
1046
+										$vals .= "</$ns_name$subprop[name]>";
1047
+									}
1048
+									else	// val contains only attributes, no value
1049
+									{
1050
+										foreach($subprop['val'] as $attr => $val)
1051
+										{
1052
+											$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
1053
+										}
1054
+										$vals .= '/>';
1055
+									}
1056
+								}
1057
+								else
1058
+								{
1059
+									$vals .= '>';
1060
+									if (isset($subprop['raw'])) {
1061
+										$vals .= '<![CDATA['.$subprop['val'].']]>';
1062
+									} else {
1063
+										if($subprop['name'] == 'href') $subprop['val'] = $this->_urlencode($subprop['val']);
1064
+										$vals .= htmlspecialchars($subprop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1065
+									}
1066
+									$vals .= "</$ns_name$subprop[name]>";
1067
+								}
1068
+							}
1069
+							echo '     <'.$ns_hash[$prop['ns']].":$prop[name]$extra_ns>$vals</".$ns_hash[$prop['ns']].":$prop[name]>\n";
1070
+						} else {
1071
+							if ($prop['raw'])
1072
+							{
1073
+								$val = '<![CDATA['.$prop['val'].']]>';
1074
+							} else {
1075
+								$val = htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1076
+							}
1077
+							$val = $this->_prop_encode($val);
1078
+							// properties from namespaces != "DAV:" or without any namespace
1079
+							if ($prop['ns']) {
1080
+								if ($this->crrnd) {
1081
+									echo "     <$prop[name] xmlns=".'"'.$prop["ns"].'">'
1082
+									. $val . "</$prop[name]>\n";
1083
+								} else {
1084
+									echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]>"
1085
+									. $val . '</'.$ns_hash[$prop['ns']].":$prop[name]>\n";
1086
+								}
1087
+							} else {
1088
+								echo "     <$prop[name] xmlns=\"\">$val</$prop[name]>\n";
1089
+							}
1090
+						}
1091
+					}
1092
+				}
1093
+
1094
+				if ($this->crrnd)
1095
+				{
1096
+					echo "    </prop>\n";
1097
+					echo "   <status>HTTP/1.1 200 OK</status>\n";
1098
+					echo "  </propstat>\n";
1099
+				}
1100
+				else
1101
+				{
1102
+					echo "    </D:prop>\n";
1103
+					echo "   <D:status>HTTP/1.1 200 OK</D:status>\n";
1104
+					echo "  </D:propstat>\n";
1105
+				}
1106
+			}
1107
+
1108
+			// now report all properties requested but not found
1109
+			if (isset($file["noprops"])) {
1110
+				echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1111
+				echo '    <'.($this->crrnd?'':'D:')."prop>\n";
1112
+
1113
+				foreach ($file["noprops"] as &$prop) {
1114
+					if ($prop["ns"] == "DAV:") {
1115
+						echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
1116
+					} else if ($prop["ns"] == "") {
1117
+						echo "     <$prop[name] xmlns=\"\"/>\n";
1118
+					} else {
1119
+						echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n";
1120
+					}
1121
+				}
1122
+
1123
+				if ($this->crrnd)
1124
+				{
1125
+					echo "   </prop>\n";
1126
+					echo "   <status>HTTP/1.1 404 Not Found</status>\n";
1127
+					echo "  </propstat>\n";
1128
+				}
1129
+				else
1130
+				{
1131
+					echo "   </D:prop>\n";
1132
+					echo "   <D:status>HTTP/1.1 404 Not Found</D:status>\n";
1133
+					echo "  </D:propstat>\n";
1134
+				}
1135
+			}
1136
+
1137
+			// 404 Not Found status element for WebDAV sync report
1138
+			if (!isset($file['props']) && !isset($file['noprops']))
1139
+			{
1140
+				if ($this->crrnd)
1141
+				{
1142
+					echo "  <status>HTTP/1.1 404 Not Found</status>\n";
1143
+				}
1144
+				else
1145
+				{
1146
+					echo "  <D:status>HTTP/1.1 404 Not Found</D:status>\n";
1147
+				}
1148
+			}
1149
+
1150
+			echo ' </'.($this->crrnd?'':'D:')."response>\n";
1151
+		}
1152
+	}
1153
+
1154
+
1155
+	// }}}
1156
+
1157
+	// {{{ http_PROPPATCH()
1158
+
1159
+	/**
1160
+	 * PROPPATCH method handler
1161
+	 *
1162
+	 * @param  void
1163
+	 * @return void
1164
+	 */
1165
+	function http_PROPPATCH()
1166
+	{
1167
+		if ($this->_check_lock_status($this->path)) {
1168
+			$options = Array();
1169
+
1170
+			$options["path"] = $this->path;
1171
+
1172
+			$propinfo = new _parse_proppatch("php://input", $this->store_request);
1173
+			if ($this->store_request) $this->request = $propinfo->request;
1174
+
1175
+			if (!$propinfo->success) {
1176
+				$this->http_status("400 Error");
1177
+				return;
1178
+			}
1179
+
1180
+			$options['props'] = $propinfo->props;
1181
+
1182
+			$responsedescr = $this->PROPPATCH($options);
1183
+
1184
+			$this->http_status("207 Multi-Status");
1185
+			header('Content-Type: text/xml; charset="utf-8"');
1186
+
1187
+			echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
1188
+
1189
+			echo "<D:multistatus xmlns:D=\"DAV:\">\n";
1190
+			echo ' <'.($this->crrnd?'':'D:')."response>\n";
1191
+			echo '  <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)).'</'.($this->crrnd?'':'D:')."href>\n";
1192
+
1193
+			foreach ($options["props"] as $prop) {
1194
+				echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1195
+				echo '    <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/></".($this->crrnd?'':'D:')."prop>\n";
1196
+				echo '    <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]</".($this->crrnd?'':'D:')."status>\n";
1197
+				echo '   </'.($this->crrnd?'':'D:')."propstat>\n";
1198
+			}
1199
+
1200
+			if ($responsedescr) {
1201
+				echo '  <'.($this->crrnd?'':'D:')."responsedescription>".
1202
+					$this->_prop_encode(htmlspecialchars($responsedescr, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8')).
1203
+					'</'.($this->crrnd?'':'D:')."responsedescription>\n";
1204
+			}
1205
+
1206
+			echo ' </'.($this->crrnd?'':'D:')."response>\n";
1207
+			echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
1208
+		} else {
1209
+			$this->http_status("423 Locked");
1210
+		}
1211
+	}
1212
+
1213
+	// }}}
1214
+
1215
+
1216
+	// {{{ http_MKCOL()
1217
+
1218
+	/**
1219
+	 * MKCOL method handler
1220
+	 *
1221
+	 * @param  void
1222
+	 * @return void
1223
+	 */
1224
+	function http_MKCOL()
1225
+	{
1226
+		$options = Array();
1227
+
1228
+		$options["path"] = $this->path;
1229
+
1230
+		$stat = $this->MKCOL($options);
1231
+
1232
+		$this->http_status($stat);
1233
+	}
1234
+
1235
+	// }}}
1236 1236
 
1237 1237
 	/**
1238 1238
 	 * Check or set if we want ot use compression as transfer encoding
@@ -1259,1387 +1259,1387 @@  discard block
 block discarded – undo
1259 1259
 		return $compression;
1260 1260
 	}
1261 1261
 
1262
-    // {{{ http_GET()
1262
+	// {{{ http_GET()
1263 1263
 
1264
-    /**
1265
-     * GET method handler
1266
-     *
1267
-     * @param void
1268
-     * @return void
1269
-     */
1270
-    function http_GET()
1271
-    {
1272
-        // TODO check for invalid stream
1273
-        $options         = Array();
1274
-        $options["path"] = $this->path;
1275
-
1276
-        $this->_get_ranges($options);
1277
-
1278
-        if (true === ($status = $this->GET($options))) {
1279
-            if (!headers_sent()) {
1280
-                $status = "200 OK";
1281
-
1282
-                if (!isset($options['mimetype'])) {
1283
-                    $options['mimetype'] = "application/octet-stream";
1284
-                }
1285
-                // switching off zlib.output_compression for everything but text files,
1286
-                // as the double compression of zip files makes problems eg. with lighttpd
1287
-                // and anyway little sense with with other content like pictures
1288
-                if (substr($options['mimetype'],0,5) != 'text/')
1289
-                {
1264
+	/**
1265
+	 * GET method handler
1266
+	 *
1267
+	 * @param void
1268
+	 * @return void
1269
+	 */
1270
+	function http_GET()
1271
+	{
1272
+		// TODO check for invalid stream
1273
+		$options         = Array();
1274
+		$options["path"] = $this->path;
1275
+
1276
+		$this->_get_ranges($options);
1277
+
1278
+		if (true === ($status = $this->GET($options))) {
1279
+			if (!headers_sent()) {
1280
+				$status = "200 OK";
1281
+
1282
+				if (!isset($options['mimetype'])) {
1283
+					$options['mimetype'] = "application/octet-stream";
1284
+				}
1285
+				// switching off zlib.output_compression for everything but text files,
1286
+				// as the double compression of zip files makes problems eg. with lighttpd
1287
+				// and anyway little sense with with other content like pictures
1288
+				if (substr($options['mimetype'],0,5) != 'text/')
1289
+				{
1290 1290
 					self::use_compression(false);
1291
-                }
1292
-                header("Content-type: $options[mimetype]");
1293
-
1294
-                if (isset($options['mtime'])) {
1295
-                    header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1296
-                }
1297
-                // fix for IE and https, thanks to [email protected]
1298
-                // see http://us3.php.net/manual/en/function.header.php#83219
1299
-                // and http://support.microsoft.com/kb/812935
1291
+				}
1292
+				header("Content-type: $options[mimetype]");
1293
+
1294
+				if (isset($options['mtime'])) {
1295
+					header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1296
+				}
1297
+				// fix for IE and https, thanks to [email protected]
1298
+				// see http://us3.php.net/manual/en/function.header.php#83219
1299
+				// and http://support.microsoft.com/kb/812935
1300 1300
 				header("Cache-Control: maxage=1"); //In seconds
1301 1301
 				header("Pragma: public");
1302 1302
 
1303
-                if (isset($options['stream'])) {
1304
-                    // GET handler returned a stream
1305
-                    if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) {
1306
-                        // partial request and stream is seekable
1307
-
1308
-                        if (count($options['ranges']) === 1) {
1309
-                            $range = $options['ranges'][0];
1310
-
1311
-                            if (isset($range['start'])) {
1312
-                                fseek($options['stream'], $range['start'], SEEK_SET);
1313
-                                if (feof($options['stream'])) {
1314
-                                    $this->http_status($status = "416 Requested range not satisfiable");
1315
-                                    return;
1316
-                                }
1317
-
1318
-                                if (!empty($range['end'])) {
1319
-                                    $size = $range['end']-$range['start']+1;
1320
-                                    $this->http_status($status = "206 Partial content");
1321
-                                    if (!self::use_compression()) header("Content-Length: $size");
1322
-                                    header("Content-Range: bytes $range[start]-$range[end]/"
1323
-                                           . (isset($options['size']) ? $options['size'] : "*"));
1324
-                                    while ($size > 0 && !feof($options['stream'])) {
1325
-                                        $buffer = fread($options['stream'], $size < 8192 ? $size : 8192);
1326
-                                        $size  -= self::bytes($buffer);
1327
-                                        echo $buffer;
1328
-                                    }
1329
-                                } else {
1330
-                                    $this->http_status($status = "206 Partial content");
1331
-                                    if (isset($options['size'])) {
1332
-                                        if (!self::use_compression()) header("Content-Length: ".($options['size'] - $range['start']));
1333
-                                        header("Content-Range: bytes ".$range['start']."-".
1303
+				if (isset($options['stream'])) {
1304
+					// GET handler returned a stream
1305
+					if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) {
1306
+						// partial request and stream is seekable
1307
+
1308
+						if (count($options['ranges']) === 1) {
1309
+							$range = $options['ranges'][0];
1310
+
1311
+							if (isset($range['start'])) {
1312
+								fseek($options['stream'], $range['start'], SEEK_SET);
1313
+								if (feof($options['stream'])) {
1314
+									$this->http_status($status = "416 Requested range not satisfiable");
1315
+									return;
1316
+								}
1317
+
1318
+								if (!empty($range['end'])) {
1319
+									$size = $range['end']-$range['start']+1;
1320
+									$this->http_status($status = "206 Partial content");
1321
+									if (!self::use_compression()) header("Content-Length: $size");
1322
+									header("Content-Range: bytes $range[start]-$range[end]/"
1323
+										   . (isset($options['size']) ? $options['size'] : "*"));
1324
+									while ($size > 0 && !feof($options['stream'])) {
1325
+										$buffer = fread($options['stream'], $size < 8192 ? $size : 8192);
1326
+										$size  -= self::bytes($buffer);
1327
+										echo $buffer;
1328
+									}
1329
+								} else {
1330
+									$this->http_status($status = "206 Partial content");
1331
+									if (isset($options['size'])) {
1332
+										if (!self::use_compression()) header("Content-Length: ".($options['size'] - $range['start']));
1333
+										header("Content-Range: bytes ".$range['start']."-".
1334 1334
 											(isset($options['size']) ? $options['size']-1 : "")."/"
1335 1335
 										   . (isset($options['size']) ? $options['size'] : "*"));
1336
-                                    }
1337
-                                    fpassthru($options['stream']);
1338
-                                }
1339
-                            } else {
1340
-                                if (!self::use_compression()) header("Content-length: ".$range['last']);
1341
-                                fseek($options['stream'], -$range['last'], SEEK_END);
1342
-                                fpassthru($options['stream']);
1343
-                            }
1344
-                        } else {
1345
-                            $this->_multipart_byterange_header(); // init multipart
1346
-                            foreach ($options['ranges'] as $range) {
1347
-                                // TODO what if size unknown? 500?
1348
-                                if (isset($range['start'])) {
1349
-                                    $from = $range['start'];
1350
-                                    $to   = !empty($range['end']) ? $range['end'] : $options['size']-1;
1351
-                                } else {
1352
-                                    $from = $options['size'] - $range['last']-1;
1353
-                                    $to   = $options['size'] -1;
1354
-                                }
1355
-                                $total = isset($options['size']) ? $options['size'] : "*";
1356
-                                $size  = $to - $from + 1;
1357
-                                $this->_multipart_byterange_header($options['mimetype'], $from, $to, $total);
1358
-
1359
-
1360
-                                fseek($options['stream'], $from, SEEK_SET);
1361
-                                while ($size && !feof($options['stream'])) {
1362
-                                    $buffer = fread($options['stream'], 4096);
1363
-                                    $size  -= self::bytes($buffer);
1364
-                                    echo $buffer;
1365
-                                }
1366
-                            }
1367
-                            $this->_multipart_byterange_header(); // end multipart
1368
-                        }
1369
-                    } else {
1370
-                        // normal request or stream isn't seekable, return full content
1371
-                        if (isset($options['size']) && !self::use_compression()) {
1372
-                            header("Content-Length: ".$options['size']);
1373
-                        }
1374
-                        fpassthru($options['stream']);
1375
-                        return; // no more headers
1376
-                    }
1377
-                } elseif (isset($options['data'])) {
1378
-                    if (is_array($options['data'])) {
1379
-                        // reply to partial request
1380
-                    } else {
1381
-                        if (!self::use_compression()) header("Content-Length: ".self::bytes($options['data']));
1382
-                        echo $options['data'];
1383
-                    }
1384
-                }
1385
-            }
1386
-        }
1387
-
1388
-        if (!headers_sent()) {
1389
-            if (false === $status) {
1390
-                $this->http_status("404 not found");
1391
-            } else {
1392
-                // TODO: check setting of headers in various code paths above
1393
-                $this->http_status("$status");
1394
-            }
1395
-        }
1396
-    }
1336
+									}
1337
+									fpassthru($options['stream']);
1338
+								}
1339
+							} else {
1340
+								if (!self::use_compression()) header("Content-length: ".$range['last']);
1341
+								fseek($options['stream'], -$range['last'], SEEK_END);
1342
+								fpassthru($options['stream']);
1343
+							}
1344
+						} else {
1345
+							$this->_multipart_byterange_header(); // init multipart
1346
+							foreach ($options['ranges'] as $range) {
1347
+								// TODO what if size unknown? 500?
1348
+								if (isset($range['start'])) {
1349
+									$from = $range['start'];
1350
+									$to   = !empty($range['end']) ? $range['end'] : $options['size']-1;
1351
+								} else {
1352
+									$from = $options['size'] - $range['last']-1;
1353
+									$to   = $options['size'] -1;
1354
+								}
1355
+								$total = isset($options['size']) ? $options['size'] : "*";
1356
+								$size  = $to - $from + 1;
1357
+								$this->_multipart_byterange_header($options['mimetype'], $from, $to, $total);
1358
+
1359
+
1360
+								fseek($options['stream'], $from, SEEK_SET);
1361
+								while ($size && !feof($options['stream'])) {
1362
+									$buffer = fread($options['stream'], 4096);
1363
+									$size  -= self::bytes($buffer);
1364
+									echo $buffer;
1365
+								}
1366
+							}
1367
+							$this->_multipart_byterange_header(); // end multipart
1368
+						}
1369
+					} else {
1370
+						// normal request or stream isn't seekable, return full content
1371
+						if (isset($options['size']) && !self::use_compression()) {
1372
+							header("Content-Length: ".$options['size']);
1373
+						}
1374
+						fpassthru($options['stream']);
1375
+						return; // no more headers
1376
+					}
1377
+				} elseif (isset($options['data'])) {
1378
+					if (is_array($options['data'])) {
1379
+						// reply to partial request
1380
+					} else {
1381
+						if (!self::use_compression()) header("Content-Length: ".self::bytes($options['data']));
1382
+						echo $options['data'];
1383
+					}
1384
+				}
1385
+			}
1386
+		}
1387
+
1388
+		if (!headers_sent()) {
1389
+			if (false === $status) {
1390
+				$this->http_status("404 not found");
1391
+			} else {
1392
+				// TODO: check setting of headers in various code paths above
1393
+				$this->http_status("$status");
1394
+			}
1395
+		}
1396
+	}
1397
+
1398
+
1399
+	/**
1400
+	 * parse HTTP Range: header
1401
+	 *
1402
+	 * @param  array options array to store result in
1403
+	 * @return void
1404
+	 */
1405
+	function _get_ranges(&$options)
1406
+	{
1407
+		// process Range: header if present
1408
+		if (isset($this->_SERVER['HTTP_RANGE'])) {
1409
+
1410
+			// we only support standard "bytes" range specifications for now
1411
+			$matches = null;
1412
+			if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) {
1413
+				$options["ranges"] = array();
1414
+
1415
+				// ranges are comma separated
1416
+				foreach (explode(",", $matches[1]) as $range) {
1417
+					// ranges are either from-to pairs or just end positions
1418
+					list($start, $end) = explode("-", $range);
1419
+					$options["ranges"][] = ($start==="")
1420
+						? array("last"=>$end)
1421
+						: array("start"=>$start, "end"=>$end);
1422
+				}
1423
+			}
1424
+		}
1425
+	}
1426
+
1427
+	/**
1428
+	 * generate separator headers for multipart response
1429
+	 *
1430
+	 * first and last call happen without parameters to generate
1431
+	 * the initial header and closing sequence, all calls inbetween
1432
+	 * require content mimetype, start and end byte position and
1433
+	 * optionaly the total byte length of the requested resource
1434
+	 *
1435
+	 * @param  string  mimetype
1436
+	 * @param  int     start byte position
1437
+	 * @param  int     end   byte position
1438
+	 * @param  int     total resource byte size
1439
+	 */
1440
+	function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false)
1441
+	{
1442
+		if ($mimetype === false) {
1443
+			if (!isset($this->multipart_separator)) {
1444
+				// initial
1445
+
1446
+				// a little naive, this sequence *might* be part of the content
1447
+				// but it's really not likely and rather expensive to check
1448
+				$this->multipart_separator = "SEPARATOR_".md5(microtime());
1449
+
1450
+				// generate HTTP header
1451
+				header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator);
1452
+			} else {
1453
+				// final
1454
+
1455
+				// generate closing multipart sequence
1456
+				echo "\n--{$this->multipart_separator}--";
1457
+			}
1458
+		} else {
1459
+			// generate separator and header for next part
1460
+			echo "\n--{$this->multipart_separator}\n";
1461
+			echo "Content-type: $mimetype\n";
1462
+			echo "Content-range: $from-$to/". ($total === false ? "*" : $total);
1463
+			echo "\n\n";
1464
+		}
1465
+	}
1466
+
1467
+
1468
+
1469
+	// }}}
1470
+
1471
+	// {{{ http_HEAD()
1472
+
1473
+	/**
1474
+	 * HEAD method handler
1475
+	 *
1476
+	 * @param  void
1477
+	 * @return void
1478
+	 */
1479
+	function http_HEAD()
1480
+	{
1481
+		$status          = false;
1482
+		$options         = Array();
1483
+		$options["path"] = $this->path;
1484
+
1485
+		if (method_exists($this, "HEAD")) {
1486
+			$status = $this->head($options);
1487
+		} else if (method_exists($this, "GET")) {
1488
+			ob_start();
1489
+			$status = $this->GET($options);
1490
+			if (!isset($options['size'])) {
1491
+				$options['size'] = ob_get_length();
1492
+			}
1493
+			ob_end_clean();
1494
+		}
1495
+
1496
+		if (!isset($options['mimetype'])) {
1497
+			$options['mimetype'] = "application/octet-stream";
1498
+		}
1499
+		header("Content-type: $options[mimetype]");
1500
+
1501
+		if (isset($options['mtime'])) {
1502
+			header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1503
+		}
1504
+
1505
+		if (isset($options['size'])) {
1506
+			header("Content-Length: ".$options['size']);
1507
+		}
1508
+
1509
+		if ($status === true)  $status = "200 OK";
1510
+		if ($status === false) $status = "404 Not found";
1511
+
1512
+		$this->http_status($status);
1513
+	}
1514
+
1515
+	// }}}
1516
+
1517
+	// {{{ http_POST()
1518
+
1519
+	/**
1520
+	 * POST method handler
1521
+	 *
1522
+	 * @param  void
1523
+	 * @return void
1524
+	 */
1525
+	function http_POST()
1526
+	{
1527
+		$status          = '405 Method not allowed';
1528
+		$options         = Array();
1529
+		$options['path'] = $this->path;
1530
+
1531
+		if (isset($this->_SERVER['CONTENT_LENGTH']))
1532
+		{
1533
+			$options['content_length'] = $this->_SERVER['CONTENT_LENGTH'];
1534
+		}
1535
+		elseif (isset($this->_SERVER['X-Expected-Entity-Length']))
1536
+		{
1537
+			// MacOS gives us that hint
1538
+			$options['content_length'] = $this->_SERVER['X-Expected-Entity-Length'];
1539
+		}
1540
+
1541
+		// get the Content-type
1542
+		if (isset($this->_SERVER["CONTENT_TYPE"])) {
1543
+			// for now we do not support any sort of multipart requests
1544
+			if (!strncmp($this->_SERVER["CONTENT_TYPE"], 'multipart/', 10)) {
1545
+				$this->http_status('501 not implemented');
1546
+				echo 'The service does not support mulipart POST requests';
1547
+				return;
1548
+			}
1549
+			$options['content_type'] = $this->_SERVER['CONTENT_TYPE'];
1550
+		} else {
1551
+			// default content type if none given
1552
+			$options['content_type'] = 'application/octet-stream';
1553
+		}
1554
+
1555
+		$options['stream'] = fopen('php://input', 'r');
1556
+		switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1557
+		{
1558
+			case 'gzip':
1559
+			case 'deflate':	//zlib
1560
+				if (extension_loaded('zlib'))
1561
+	 			{
1562
+	  				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1563
+	   			}
1564
+		}
1565
+		// store request in $this->request, if requested via $this->store_request
1566
+		if ($this->store_request)
1567
+		{
1568
+			$options['content'] = '';
1569
+			while(!feof($options['stream']))
1570
+			{
1571
+				$options['content'] .= fread($options['stream'],8192);
1572
+			}
1573
+			$this->request =& $options['content'];
1574
+			unset($options['stream']);
1575
+		}
1576
+
1577
+		/* RFC 2616 2.6 says: "The recipient of the entity MUST NOT
1578
+         ignore any Content-* (e.g. Content-Range) headers that it
1579
+         does not understand or implement and MUST return a 501
1580
+         (Not Implemented) response in such cases."
1581
+         */
1582
+		foreach ($this->_SERVER as $key => $val) {
1583
+			if (strncmp($key, 'HTTP_CONTENT', 11)) continue;
1584
+			switch ($key) {
1585
+				case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1586
+					switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1587
+					{
1588
+						case 'gzip':
1589
+						case 'deflate':	//zlib
1590
+							if (extension_loaded('zlib')) break;
1591
+							// fall through for no zlib support
1592
+						default:
1593
+							$this->http_status('415 Unsupported Media Type');
1594
+							echo "The service does not support '$val' content encoding";
1595
+							return;
1596
+					}
1597
+					break;
1598
+
1599
+				case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1600
+					// we assume it is not critical if this one is ignored
1601
+					// in the actual POST implementation ...
1602
+					$options['content_language'] = $val;
1603
+					break;
1604
+
1605
+				case 'HTTP_CONTENT_LENGTH':
1606
+					// defined on IIS and has the same value as CONTENT_LENGTH
1607
+					break;
1608
+
1609
+				case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1610
+					/* The meaning of the Content-Location header in PUT
1611
+			         or POST requests is undefined; servers are free
1612
+			         to ignore it in those cases. */
1613
+					break;
1614
+
1615
+				case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1616
+					// single byte range requests are supported
1617
+					// the header format is also specified in RFC 2616 14.16
1618
+					// TODO we have to ensure that implementations support this or send 501 instead
1619
+					$matches = null;
1620
+					if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1621
+						$this->http_status('400 bad request');
1622
+						echo 'The service does only support single byte ranges';
1623
+						return;
1624
+					}
1625
+
1626
+					$range = array('start'=>$matches[1], 'end'=>$matches[2]);
1627
+					if (is_numeric($matches[3])) {
1628
+						$range['total_length'] = $matches[3];
1629
+					}
1630
+					$options['ranges'][] = $range;
1631
+
1632
+					// TODO make sure the implementation supports partial POST
1633
+					// this has to be done in advance to avoid data being overwritten
1634
+					// on implementations that do not support this ...
1635
+					break;
1636
+
1637
+				case 'HTTP_CONTENT_TYPE':
1638
+					// defined on IIS and has the same value as CONTENT_TYPE
1639
+					break;
1640
+
1641
+				case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1642
+					// TODO: maybe we can just pretend here?
1643
+					$this->http_status('501 not implemented');
1644
+					echo 'The service does not support content MD5 checksum verification';
1645
+					return;
1646
+
1647
+				case 'HTTP_CONTENT_DISPOSITION':
1648
+					// do NOT care about Content-Disposition in POST requests required by CalDAV managed attachments
1649
+					break;
1650
+
1651
+				default:
1652
+					// any other unknown Content-* headers
1653
+					$this->http_status('501 not implemented');
1654
+				echo "The service does not support '$key'";
1655
+				return;
1656
+			}
1657
+		}
1658
+
1659
+		if (method_exists($this, 'POST')) {
1660
+			$status = $this->POST($options);
1661
+
1662
+			if ($status === false) {
1663
+				$status = '400 Something went wrong';
1664
+			} else if ($status === true) {
1665
+				$status = '200 OK';
1666
+			} else if (is_resource($status) && get_resource_type($status) == 'stream') {
1667
+				$stream = $status;
1668
+
1669
+				$status = empty($options['new']) ? '200 OK' : '201 Created';
1670
+
1671
+				if (!empty($options['ranges'])) {
1672
+					// TODO multipart support is missing (see also above)
1673
+					if (0 == fseek($stream, $range[0]['start'], SEEK_SET)) {
1674
+						$length = $range[0]['end']-$range[0]['start']+1;
1675
+						if (!fwrite($stream, fread($options['stream'], $length))) {
1676
+							$status = '403 Forbidden';
1677
+						}
1678
+					} else {
1679
+						$status = '403 Forbidden';
1680
+					}
1681
+				} else {
1682
+					while (!feof($options['stream'])) {
1683
+						if (false === fwrite($stream, fread($options['stream'], 4096))) {
1684
+							$status = '403 Forbidden';
1685
+							break;
1686
+						}
1687
+					}
1688
+				}
1689
+				fclose($stream);
1690
+			}
1691
+		}
1692
+		$this->http_status($status);
1693
+	}
1694
+
1695
+	// }}}
1696
+
1697
+	// {{{ http_PUT()
1698
+
1699
+	/**
1700
+	 * PUT method handler
1701
+	 *
1702
+	 * @param  void
1703
+	 * @return void
1704
+	 */
1705
+	function http_PUT()
1706
+	{
1707
+		if ($this->_check_lock_status($this->path)) {
1708
+			$options                   = Array();
1709
+			$options["path"]           = $this->path;
1710
+
1711
+			if (isset($this->_SERVER['CONTENT_LENGTH']))
1712
+			{
1713
+				$options['content_length'] = $this->_SERVER['CONTENT_LENGTH'];
1714
+			}
1715
+			elseif (isset($this->_SERVER['X-Expected-Entity-Length']))
1716
+			{
1717
+				// MacOS gives us that hint
1718
+				$options['content_length'] = $this->_SERVER['X-Expected-Entity-Length'];
1719
+			}
1720
+
1721
+			// get the Content-type
1722
+			if (isset($this->_SERVER["CONTENT_TYPE"])) {
1723
+				// for now we do not support any sort of multipart requests
1724
+				if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) {
1725
+					$this->http_status("501 not implemented");
1726
+					echo "The service does not support multipart PUT requests";
1727
+					return;
1728
+				}
1729
+				$options["content_type"] = $this->_SERVER["CONTENT_TYPE"];
1730
+			} else {
1731
+				// default content type if none given
1732
+				$options["content_type"] = "application/octet-stream";
1733
+			}
1734
+
1735
+			$options["stream"] = fopen("php://input", "r");
1736
+			switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1737
+			{
1738
+				case 'gzip':
1739
+				case 'deflate':	//zlib
1740
+					if (extension_loaded('zlib'))
1741
+		 			{
1742
+		  				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1743
+		   			}
1744
+			}
1745
+			// store request in $this->request, if requested via $this->store_request
1746
+			if ($this->store_request)
1747
+			{
1748
+				$options['content'] = '';
1749
+				while(!feof($options['stream']))
1750
+				{
1751
+					$options['content'] .= fread($options['stream'],8192);
1752
+				}
1753
+				$this->request =& $options['content'];
1754
+				unset($options['stream']);
1755
+			}
1756
+
1757
+			/* RFC 2616 2.6 says: "The recipient of the entity MUST NOT
1758
+             ignore any Content-* (e.g. Content-Range) headers that it
1759
+             does not understand or implement and MUST return a 501
1760
+             (Not Implemented) response in such cases."
1761
+            */
1762
+			foreach ($this->_SERVER as $key => $val) {
1763
+				if (strncmp($key, "HTTP_CONTENT", 11)) continue;
1764
+				switch ($key) {
1765
+				case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1766
+					switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1767
+					{
1768
+						case 'gzip':
1769
+						case 'deflate':	//zlib
1770
+							if (extension_loaded('zlib')) break;
1771
+							// fall through for no zlib support
1772
+						default:
1773
+							$this->http_status('415 Unsupported Media Type');
1774
+							echo "The service does not support '$val' content encoding";
1775
+							return;
1776
+					}
1777
+					break;
1778
+
1779
+				case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1780
+					// we assume it is not critical if this one is ignored
1781
+					// in the actual PUT implementation ...
1782
+					$options["content_language"] = $val;
1783
+					break;
1784
+
1785
+				case 'HTTP_CONTENT_LENGTH':
1786
+					// defined on IIS and has the same value as CONTENT_LENGTH
1787
+					break;
1788
+
1789
+				case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1790
+					/* The meaning of the Content-Location header in PUT
1791
+                     or POST requests is undefined; servers are free
1792
+                     to ignore it in those cases. */
1793
+					break;
1794
+
1795
+				case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1796
+					// single byte range requests are supported
1797
+					// the header format is also specified in RFC 2616 14.16
1798
+					// TODO we have to ensure that implementations support this or send 501 instead
1799
+					$matches = null;
1800
+					if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1801
+						$this->http_status("400 bad request");
1802
+						echo "The service does only support single byte ranges";
1803
+						return;
1804
+					}
1805
+
1806
+					$range = array("start" => $matches[1], "end" => $matches[2]);
1807
+					if (is_numeric($matches[3])) {
1808
+						$range["total_length"] = $matches[3];
1809
+					}
1810
+
1811
+					if (!isset($options['ranges'])) {
1812
+						$options['ranges'] = array();
1813
+					}
1814
+
1815
+					$options["ranges"][] = $range;
1816
+
1817
+					// TODO make sure the implementation supports partial PUT
1818
+					// this has to be done in advance to avoid data being overwritten
1819
+					// on implementations that do not support this ...
1820
+					break;
1821
+
1822
+				case 'HTTP_CONTENT_TYPE':
1823
+					// defined on IIS and has the same value as CONTENT_TYPE
1824
+					break;
1825
+
1826
+				case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1827
+					// TODO: maybe we can just pretend here?
1828
+					$this->http_status("501 not implemented");
1829
+					echo "The service does not support content MD5 checksum verification";
1830
+					return;
1831
+
1832
+				default:
1833
+					// any other unknown Content-* headers
1834
+					$this->http_status("501 not implemented");
1835
+					echo "The service does not support '$key'";
1836
+					return;
1837
+				}
1838
+			}
1839
+
1840
+			$stat = $this->PUT($options);
1841
+
1842
+			if ($stat === false) {
1843
+				$stat = "403 Forbidden";
1844
+			} else if (is_resource($stat) && get_resource_type($stat) == "stream") {
1845
+				$stream = $stat;
1846
+
1847
+				$stat = $options["new"] ? "201 Created" : "204 No Content";
1848
+
1849
+				if (!empty($options["ranges"])) {
1850
+					// TODO multipart support is missing (see also above)
1851
+					if (0 == fseek($stream, $options['ranges'][0]["start"], SEEK_SET)) {
1852
+						$length = $options['ranges'][0]["end"] - $options['ranges'][0]["start"]+1;
1853
+
1854
+						while (!feof($options['stream'])) {
1855
+							if ($length <= 0) {
1856
+							   break;
1857
+							}
1858
+
1859
+							if ($length <= 8192) {
1860
+								$data = fread($options['stream'], $length);
1861
+							} else {
1862
+								$data = fread($options['stream'], 8192);
1863
+							}
1864
+
1865
+							if ($data === false) {
1866
+								$stat = "400 Bad request";
1867
+							} elseif (strlen($data)) {
1868
+								if (false === fwrite($stream, $data)) {
1869
+									$stat = "403 Forbidden";
1870
+									break;
1871
+								}
1872
+								$length -= strlen($data);
1873
+							}
1874
+						}
1875
+					} else {
1876
+						$stat = "403 Forbidden";
1877
+					}
1878
+				} else {
1879
+					while (!feof($options["stream"])) {
1880
+						if (false === fwrite($stream, fread($options["stream"], 8192))) {
1881
+							$stat = "403 Forbidden";
1882
+							break;
1883
+						}
1884
+					}
1885
+				}
1886
+
1887
+				fclose($stream);
1888
+			}
1889
+
1890
+			$this->http_status($stat);
1891
+		} else {
1892
+			$this->http_status("423 Locked");
1893
+		}
1894
+	}
1895
+
1896
+	// }}}
1897
+
1898
+
1899
+	// {{{ http_DELETE()
1900
+
1901
+	/**
1902
+	 * DELETE method handler
1903
+	 *
1904
+	 * @param  void
1905
+	 * @return void
1906
+	 */
1907
+	function http_DELETE()
1908
+	{
1909
+		// check RFC 2518 Section 9.2, last paragraph
1910
+		if (isset($this->_SERVER["HTTP_DEPTH"])) {
1911
+			if ($this->_SERVER["HTTP_DEPTH"] != "infinity") {
1912
+				if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false)
1913
+				{
1914
+					// pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections
1915
+				}
1916
+				else
1917
+				{
1918
+					$this->http_status("400 Bad Request");
1919
+					return;
1920
+				}
1921
+			}
1922
+		}
1923
+
1924
+		// check lock status
1925
+		if ($this->_check_lock_status($this->path)) {
1926
+			// ok, proceed
1927
+			$options         = Array();
1928
+			$options["path"] = $this->path;
1929
+
1930
+			$stat = $this->DELETE($options);
1931
+
1932
+			$this->http_status($stat);
1933
+		} else {
1934
+			// sorry, its locked
1935
+			$this->http_status("423 Locked");
1936
+		}
1937
+	}
1938
+
1939
+	// }}}
1940
+
1941
+	// {{{ http_COPY()
1942
+
1943
+	/**
1944
+	 * COPY method handler
1945
+	 *
1946
+	 * @param  void
1947
+	 * @return void
1948
+	 */
1949
+	function http_COPY()
1950
+	{
1951
+		// no need to check source lock status here
1952
+		// destination lock status is always checked by the helper method
1953
+		$this->_copymove("copy");
1954
+	}
1955
+
1956
+	// }}}
1957
+
1958
+	// {{{ http_MOVE()
1959
+
1960
+	/**
1961
+	 * MOVE method handler
1962
+	 *
1963
+	 * @param  void
1964
+	 * @return void
1965
+	 */
1966
+	function http_MOVE()
1967
+	{
1968
+		if ($this->_check_lock_status($this->path)) {
1969
+			// destination lock status is always checked by the helper method
1970
+			$this->_copymove("move");
1971
+		} else {
1972
+			$this->http_status("423 Locked");
1973
+		}
1974
+	}
1975
+
1976
+	// }}}
1977
+
1978
+
1979
+	// {{{ http_LOCK()
1980
+
1981
+	/**
1982
+	 * LOCK method handler
1983
+	 *
1984
+	 * @param  void
1985
+	 * @return void
1986
+	 */
1987
+	function http_LOCK()
1988
+	{
1989
+		$options         = Array();
1990
+		$options["path"] = $this->path;
1991
+
1992
+		if (isset($this->_SERVER['HTTP_DEPTH'])) {
1993
+			$options["depth"] = $this->_SERVER["HTTP_DEPTH"];
1994
+		} else {
1995
+			$options["depth"] = "infinity";
1996
+		}
1997
+
1998
+		if (isset($this->_SERVER["HTTP_TIMEOUT"])) {
1999
+			$options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]);
2000
+		}
2001
+
2002
+		if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) {
2003
+			// check if locking is possible
2004
+			if (!$this->_check_lock_status($this->path)) {
2005
+				$this->http_status("423 Locked");
2006
+				return;
2007
+			}
2008
+
2009
+			// refresh lock
2010
+			$options["locktoken"] = substr($this->_SERVER['HTTP_IF'], 2, -2);
2011
+			$options["update"]    = $options["locktoken"];
2012
+
2013
+			// setting defaults for required fields, LOCK() SHOULD overwrite these
2014
+			$options['owner']     = "unknown";
2015
+			$options['scope']     = "exclusive";
2016
+			$options['type']      = "write";
2017
+
2018
+
2019
+			$stat = $this->LOCK($options);
2020
+		} else {
2021
+			// extract lock request information from request XML payload
2022
+			$lockinfo = new _parse_lockinfo("php://input");
2023
+			if (!$lockinfo->success) {
2024
+				$this->http_status("400 bad request");
2025
+			}
2026
+
2027
+			// check if locking is possible
2028
+			if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) {
2029
+				$this->http_status("423 Locked");
2030
+				return;
2031
+			}
2032
+
2033
+			// new lock
2034
+			$options["scope"]     = $lockinfo->lockscope;
2035
+			$options["type"]      = $lockinfo->locktype;
2036
+			// Todo: lockinfo::owner still contains D:href opening and closing tags, maybe they should be removed here with strip_tags
2037
+			$options["owner"]     = $lockinfo->owner;
2038
+			$options["locktoken"] = $this->_new_locktoken();
2039
+
2040
+			$stat = $this->LOCK($options);
2041
+		}
2042
+
2043
+		if (is_bool($stat)) {
2044
+			$http_stat = $stat ? "200 OK" : "423 Locked";
2045
+		} else {
2046
+			$http_stat = (string)$stat;
2047
+		}
2048
+		$this->http_status($http_stat);
2049
+
2050
+		if ($http_stat{0} == 2) { // 2xx states are ok
2051
+			if ($options["timeout"]) {
2052
+				// if multiple timeout values were given we take the first only
2053
+				if (is_array($options["timeout"])) {
2054
+					reset($options["timeout"]);
2055
+					$options["timeout"] = current($options["timeout"]);
2056
+				}
2057
+				// if the timeout is numeric only we need to reformat it
2058
+				if (is_numeric($options["timeout"])) {
2059
+					// more than a million is considered an absolute timestamp
2060
+					// less is more likely a relative value
2061
+					if ($options["timeout"]>1000000) {
2062
+						$timeout = "Second-".($options['timeout']-time());
2063
+					} else {
2064
+						$timeout = "Second-$options[timeout]";
2065
+					}
2066
+				} else {
2067
+					// non-numeric values are passed on verbatim,
2068
+					// no error checking is performed here in this case
2069
+					// TODO: send "Infinite" on invalid timeout strings?
2070
+					$timeout = $options["timeout"];
2071
+				}
2072
+			} else {
2073
+				$timeout = "Infinite";
2074
+			}
2075
+
2076
+			header('Content-Type: text/xml; charset="utf-8"');
2077
+			header("Lock-Token: <$options[locktoken]>");
2078
+			echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2079
+			echo "<D:prop xmlns:D=\"DAV:\">\n";
2080
+			echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2081
+			echo '  <'.($this->crrnd?'':'D:')."activelock>\n";
2082
+			echo '   <'.($this->crrnd?'':'D:')."lockscope><D:$options[scope]/></".($this->crrnd?'':'D:')."lockscope>\n";
2083
+			echo '   <'.($this->crrnd?'':'D:')."locktype><D:$options[type]/></".($this->crrnd?'':'D:')."locktype>\n";
2084
+			echo '   <'.($this->crrnd?'':'D:')."depth>$options[depth]</".($this->crrnd?'':'D:')."depth>\n";
2085
+			echo '   <'.($this->crrnd?'':'D:')."owner>$options[owner]</".($this->crrnd?'':'D:')."owner>\n";
2086
+			echo '   <'.($this->crrnd?'':'D:')."timeout>$timeout</".($this->crrnd?'':'D:')."timeout>\n";
2087
+			echo '   <'.($this->crrnd?'':'D:')."locktoken><D:href>$options[locktoken]</D:href></".($this->crrnd?'':'D:')."locktoken>\n";
2088
+			echo '  </'.($this->crrnd?'':'D:')."activelock>\n";
2089
+			echo ' </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2090
+			echo '</'.($this->crrnd?'':'D:')."prop>\n\n";
2091
+		}
2092
+	}
2093
+
2094
+
2095
+	// }}}
2096
+
2097
+	// {{{ http_UNLOCK()
2098
+
2099
+	/**
2100
+	 * UNLOCK method handler
2101
+	 *
2102
+	 * @param  void
2103
+	 * @return void
2104
+	 */
2105
+	function http_UNLOCK()
2106
+	{
2107
+		$options         = Array();
2108
+		$options["path"] = $this->path;
2109
+
2110
+		if (isset($this->_SERVER['HTTP_DEPTH'])) {
2111
+			$options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2112
+		} else {
2113
+			$options["depth"] = "infinity";
2114
+		}
2115
+
2116
+		// strip surrounding <>
2117
+		$options["token"] = substr(trim($this->_SERVER["HTTP_LOCK_TOKEN"]), 1, -1);
2118
+
2119
+		// call user method
2120
+		$stat = $this->UNLOCK($options);
2121
+
2122
+		$this->http_status($stat);
2123
+	}
2124
+
2125
+	// }}}
2126
+
2127
+	// {{{ http_ACL()
2128
+
2129
+	/**
2130
+	 * ACL method handler
2131
+	 *
2132
+	 * @param  void
2133
+	 * @return void
2134
+	 */
2135
+	function http_ACL()
2136
+	{
2137
+		$options         = Array();
2138
+		$options['path'] = $this->path;
2139
+		$options['errors'] = array();
2140
+
2141
+		if (isset($this->_SERVER['HTTP_DEPTH'])) {
2142
+			$options['depth'] = $this->_SERVER['HTTP_DEPTH'];
2143
+		} else {
2144
+			$options['depth'] = 'infinity';
2145
+		}
2146
+
2147
+		// call user method
2148
+		$status = $this->ACL($options);
2149
+
2150
+		// now we generate the reply header ...
2151
+		$this->http_status($status);
2152
+		$content = '';
2153
+
2154
+		if (is_array($options['errors']) && count($options['errors'])) {
2155
+			header('Content-Type: text/xml; charset="utf-8"');
2156
+			// ... and payload
2157
+			$content .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2158
+			$content .= "<D:error xmlns:D=\"DAV:\"> \n";
2159
+			foreach ($options['errors'] as $violation) {
2160
+				$content .= '<'.($this->crrnd?'':'D:')."$violation/>\n";
2161
+			}
2162
+			$content .=  '</'.($this->crrnd?'':'D:')."error>\n";
2163
+		}
2164
+		if (!self::use_compression()) header("Content-Length: ".self::bytes($content));
2165
+		if ($content) echo $options['content'];
2166
+	}
2167
+
2168
+	// }}}
2169
+
2170
+	// }}}
2171
+
2172
+	// {{{ _copymove()
2173
+
2174
+	function _copymove($what)
2175
+	{
2176
+		$options         = Array();
2177
+		$options["path"] = $this->path;
2178
+
2179
+		if (isset($this->_SERVER["HTTP_DEPTH"])) {
2180
+			$options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2181
+		} else {
2182
+			$options["depth"] = "infinity";
2183
+		}
2184
+
2185
+		$http_header_host = preg_replace("/:80$/", "", $this->_SERVER["HTTP_HOST"]);
2186
+
2187
+		$url  = parse_url($this->_SERVER["HTTP_DESTINATION"]);
2188
+		$path = urldecode($url["path"]);
2189
+
2190
+		if (isset($url["host"])) {
2191
+			// TODO check url scheme, too
2192
+			$http_host = $url["host"];
2193
+			if (isset($url["port"]) && $url["port"] != 80)
2194
+				$http_host.= ":".$url["port"];
2195
+		} else {
2196
+			// only path given, set host to self
2197
+			$http_host = $http_header_host;
2198
+		}
2199
+
2200
+		if ($http_host == $http_header_host &&
2201
+			!strncmp($this->_SERVER["SCRIPT_NAME"], $path,
2202
+					 strlen($this->_SERVER["SCRIPT_NAME"]))) {
2203
+			$options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"]));
2204
+			if (!$this->_check_lock_status($options["dest"])) {
2205
+				$this->http_status("423 Locked");
2206
+				return;
2207
+			}
2208
+
2209
+		} else {
2210
+			$options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"];
2211
+		}
2212
+
2213
+		// see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3
2214
+		if (isset($this->_SERVER["HTTP_OVERWRITE"])) {
2215
+			$options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T";
2216
+		} else {
2217
+			$options["overwrite"] = true;
2218
+		}
2219
+
2220
+		$stat = $this->$what($options);
2221
+		$this->http_status($stat);
2222
+	}
2223
+
2224
+	// }}}
2225
+
2226
+	// {{{ _allow()
2227
+
2228
+	/**
2229
+	 * check for implemented HTTP methods
2230
+	 *
2231
+	 * @param  void
2232
+	 * @return array something
2233
+	 */
2234
+	function _allow()
2235
+	{
2236
+		// OPTIONS is always there
2237
+		$allow = array("OPTIONS" =>"OPTIONS");
2238
+
2239
+		// all other METHODS need both a http_method() wrapper
2240
+		// and a method() implementation
2241
+		// the base class supplies wrappers only
2242
+		foreach (get_class_methods($this) as $method) {
2243
+			if (!strncmp("http_", $method, 5)) {
2244
+				$method = strtoupper(substr($method, 5));
2245
+				if (method_exists($this, $method)) {
2246
+					$allow[$method] = $method;
2247
+				}
2248
+			}
2249
+		}
1397 2250
 
2251
+		// we can emulate a missing HEAD implemetation using GET
2252
+		if (isset($allow["GET"]))
2253
+			$allow["HEAD"] = "HEAD";
1398 2254
 
1399
-    /**
1400
-     * parse HTTP Range: header
1401
-     *
1402
-     * @param  array options array to store result in
1403
-     * @return void
1404
-     */
1405
-    function _get_ranges(&$options)
1406
-    {
1407
-        // process Range: header if present
1408
-        if (isset($this->_SERVER['HTTP_RANGE'])) {
1409
-
1410
-            // we only support standard "bytes" range specifications for now
1411
-			$matches = null;
1412
-            if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) {
1413
-                $options["ranges"] = array();
1414
-
1415
-                // ranges are comma separated
1416
-                foreach (explode(",", $matches[1]) as $range) {
1417
-                    // ranges are either from-to pairs or just end positions
1418
-                    list($start, $end) = explode("-", $range);
1419
-                    $options["ranges"][] = ($start==="")
1420
-                        ? array("last"=>$end)
1421
-                        : array("start"=>$start, "end"=>$end);
1422
-                }
1423
-            }
1424
-        }
1425
-    }
2255
+		// no LOCK without checklok()
2256
+		if (!method_exists($this, "checklock")) {
2257
+			unset($allow["LOCK"]);
2258
+			unset($allow["UNLOCK"]);
2259
+		}
1426 2260
 
1427
-    /**
1428
-     * generate separator headers for multipart response
1429
-     *
1430
-     * first and last call happen without parameters to generate
1431
-     * the initial header and closing sequence, all calls inbetween
1432
-     * require content mimetype, start and end byte position and
1433
-     * optionaly the total byte length of the requested resource
1434
-     *
1435
-     * @param  string  mimetype
1436
-     * @param  int     start byte position
1437
-     * @param  int     end   byte position
1438
-     * @param  int     total resource byte size
1439
-     */
1440
-    function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false)
1441
-    {
1442
-        if ($mimetype === false) {
1443
-            if (!isset($this->multipart_separator)) {
1444
-                // initial
1445
-
1446
-                // a little naive, this sequence *might* be part of the content
1447
-                // but it's really not likely and rather expensive to check
1448
-                $this->multipart_separator = "SEPARATOR_".md5(microtime());
1449
-
1450
-                // generate HTTP header
1451
-                header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator);
1452
-            } else {
1453
-                // final
1454
-
1455
-                // generate closing multipart sequence
1456
-                echo "\n--{$this->multipart_separator}--";
1457
-            }
1458
-        } else {
1459
-            // generate separator and header for next part
1460
-            echo "\n--{$this->multipart_separator}\n";
1461
-            echo "Content-type: $mimetype\n";
1462
-            echo "Content-range: $from-$to/". ($total === false ? "*" : $total);
1463
-            echo "\n\n";
1464
-        }
1465
-    }
1466
-
1467
-
1468
-
1469
-    // }}}
1470
-
1471
-    // {{{ http_HEAD()
2261
+		return $allow;
2262
+	}
1472 2263
 
1473
-    /**
1474
-     * HEAD method handler
1475
-     *
1476
-     * @param  void
1477
-     * @return void
1478
-     */
1479
-    function http_HEAD()
1480
-    {
1481
-        $status          = false;
1482
-        $options         = Array();
1483
-        $options["path"] = $this->path;
1484
-
1485
-        if (method_exists($this, "HEAD")) {
1486
-            $status = $this->head($options);
1487
-        } else if (method_exists($this, "GET")) {
1488
-            ob_start();
1489
-            $status = $this->GET($options);
1490
-            if (!isset($options['size'])) {
1491
-                $options['size'] = ob_get_length();
1492
-            }
1493
-            ob_end_clean();
1494
-        }
1495
-
1496
-        if (!isset($options['mimetype'])) {
1497
-            $options['mimetype'] = "application/octet-stream";
1498
-        }
1499
-        header("Content-type: $options[mimetype]");
1500
-
1501
-        if (isset($options['mtime'])) {
1502
-            header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1503
-        }
1504
-
1505
-        if (isset($options['size'])) {
1506
-            header("Content-Length: ".$options['size']);
1507
-        }
1508
-
1509
-        if ($status === true)  $status = "200 OK";
1510
-        if ($status === false) $status = "404 Not found";
1511
-
1512
-        $this->http_status($status);
1513
-    }
1514
-
1515
-    // }}}
1516
-
1517
-    // {{{ http_POST()
2264
+	// }}}
1518 2265
 
1519
-    /**
1520
-     * POST method handler
1521
-     *
1522
-     * @param  void
1523
-     * @return void
1524
-     */
1525
-    function http_POST()
1526
-    {
1527
-        $status          = '405 Method not allowed';
1528
-        $options         = Array();
1529
-        $options['path'] = $this->path;
1530
-
1531
-        if (isset($this->_SERVER['CONTENT_LENGTH']))
1532
-        {
1533
-	        $options['content_length'] = $this->_SERVER['CONTENT_LENGTH'];
1534
-        }
1535
-        elseif (isset($this->_SERVER['X-Expected-Entity-Length']))
1536
-		{
1537
-	        // MacOS gives us that hint
1538
-	        $options['content_length'] = $this->_SERVER['X-Expected-Entity-Length'];
1539
-		}
1540
-
1541
-        // get the Content-type
1542
-        if (isset($this->_SERVER["CONTENT_TYPE"])) {
1543
-	        // for now we do not support any sort of multipart requests
1544
-	        if (!strncmp($this->_SERVER["CONTENT_TYPE"], 'multipart/', 10)) {
1545
-		        $this->http_status('501 not implemented');
1546
-		        echo 'The service does not support mulipart POST requests';
1547
-		        return;
1548
-	        }
1549
-	        $options['content_type'] = $this->_SERVER['CONTENT_TYPE'];
1550
-        } else {
1551
-	        // default content type if none given
1552
-	        $options['content_type'] = 'application/octet-stream';
1553
-        }
1554
-
1555
-        $options['stream'] = fopen('php://input', 'r');
1556
-    	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1557
-    	{
1558
-    		case 'gzip':
1559
-    		case 'deflate':	//zlib
1560
-    			if (extension_loaded('zlib'))
1561
-     			{
1562
-      				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1563
-       			}
1564
-    	}
1565
-		// store request in $this->request, if requested via $this->store_request
1566
-		if ($this->store_request)
1567
-		{
1568
-			$options['content'] = '';
1569
-			while(!feof($options['stream']))
1570
-			{
1571
-				$options['content'] .= fread($options['stream'],8192);
1572
-			}
1573
-			$this->request =& $options['content'];
1574
-			unset($options['stream']);
2266
+	/**
2267
+	 * helper for property element creation
2268
+	 *
2269
+	 * @param  string  XML namespace (optional)
2270
+	 * @param  string  property name
2271
+	 * @param  string  property value
2272
+	 * @praram boolen  property raw-flag
2273
+	 * @return array   property array
2274
+	 */
2275
+	public static function mkprop()
2276
+	{
2277
+		$args = func_get_args();
2278
+		switch (count($args)) {
2279
+			case 4:
2280
+				return array('ns'   => $args[0],
2281
+					'name' => $args[1],
2282
+					'val'  => $args[2],
2283
+					'raw'	=> true);
2284
+			case 3:
2285
+				return array('ns'   => $args[0],
2286
+					'name' => $args[1],
2287
+					'val'  => $args[2]);
2288
+			default:
2289
+				return array('ns'   => 'DAV:',
2290
+					'name' => $args[0],
2291
+					'val'  => $args[1]);
1575 2292
 		}
2293
+	}
1576 2294
 
1577
-        /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT
1578
-         ignore any Content-* (e.g. Content-Range) headers that it
1579
-         does not understand or implement and MUST return a 501
1580
-         (Not Implemented) response in such cases."
1581
-         */
1582
-        foreach ($this->_SERVER as $key => $val) {
1583
-	        if (strncmp($key, 'HTTP_CONTENT', 11)) continue;
1584
-	        switch ($key) {
1585
-		        case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1586
-		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1587
-		        	{
1588
-		        		case 'gzip':
1589
-		        		case 'deflate':	//zlib
1590
-		        			if (extension_loaded('zlib')) break;
1591
-		        			// fall through for no zlib support
1592
-		        		default:
1593
-					        $this->http_status('415 Unsupported Media Type');
1594
-					        echo "The service does not support '$val' content encoding";
1595
-					        return;
1596
-		        	}
1597
-		        	break;
1598
-
1599
-		        case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1600
-			        // we assume it is not critical if this one is ignored
1601
-			        // in the actual POST implementation ...
1602
-			        $options['content_language'] = $val;
1603
-			        break;
1604
-
1605
-		        case 'HTTP_CONTENT_LENGTH':
1606
-			        // defined on IIS and has the same value as CONTENT_LENGTH
1607
-			        break;
1608
-
1609
-		        case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1610
-			        /* The meaning of the Content-Location header in PUT
1611
-			         or POST requests is undefined; servers are free
1612
-			         to ignore it in those cases. */
1613
-			        break;
2295
+	// {{{ _check_auth
1614 2296
 
1615
-		        case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1616
-			        // single byte range requests are supported
1617
-			        // the header format is also specified in RFC 2616 14.16
1618
-			        // TODO we have to ensure that implementations support this or send 501 instead
1619
-					$matches = null;
1620
-			        if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1621
-				        $this->http_status('400 bad request');
1622
-				        echo 'The service does only support single byte ranges';
1623
-				        return;
1624
-			        }
1625
-
1626
-			        $range = array('start'=>$matches[1], 'end'=>$matches[2]);
1627
-			        if (is_numeric($matches[3])) {
1628
-				        $range['total_length'] = $matches[3];
1629
-			        }
1630
-			        $options['ranges'][] = $range;
1631
-
1632
-			        // TODO make sure the implementation supports partial POST
1633
-			        // this has to be done in advance to avoid data being overwritten
1634
-			        // on implementations that do not support this ...
1635
-			        break;
1636
-
1637
-		        case 'HTTP_CONTENT_TYPE':
1638
-			        // defined on IIS and has the same value as CONTENT_TYPE
1639
-			        break;
1640
-
1641
-		        case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1642
-			        // TODO: maybe we can just pretend here?
1643
-			        $this->http_status('501 not implemented');
1644
-			        echo 'The service does not support content MD5 checksum verification';
1645
-			        return;
1646
-
1647
-		        case 'HTTP_CONTENT_DISPOSITION':
1648
-		        	// do NOT care about Content-Disposition in POST requests required by CalDAV managed attachments
1649
-		        	break;
1650
-
1651
-		        default:
1652
-			        // any other unknown Content-* headers
1653
-			        $this->http_status('501 not implemented');
1654
-		        echo "The service does not support '$key'";
1655
-		        return;
1656
-	        }
1657
-        }
1658
-
1659
-        if (method_exists($this, 'POST')) {
1660
-	        $status = $this->POST($options);
1661
-
1662
-	        if ($status === false) {
1663
-		        $status = '400 Something went wrong';
1664
-	        } else if ($status === true) {
1665
-	        	$status = '200 OK';
1666
-	        } else if (is_resource($status) && get_resource_type($status) == 'stream') {
1667
-		        $stream = $status;
1668
-
1669
-		        $status = empty($options['new']) ? '200 OK' : '201 Created';
1670
-
1671
-		        if (!empty($options['ranges'])) {
1672
-			        // TODO multipart support is missing (see also above)
1673
-			        if (0 == fseek($stream, $range[0]['start'], SEEK_SET)) {
1674
-				        $length = $range[0]['end']-$range[0]['start']+1;
1675
-				        if (!fwrite($stream, fread($options['stream'], $length))) {
1676
-					        $status = '403 Forbidden';
1677
-				        }
1678
-			        } else {
1679
-				        $status = '403 Forbidden';
1680
-			        }
1681
-		        } else {
1682
-			        while (!feof($options['stream'])) {
1683
-				        if (false === fwrite($stream, fread($options['stream'], 4096))) {
1684
-					        $status = '403 Forbidden';
1685
-					        break;
1686
-				        }
1687
-			        }
1688
-		        }
1689
-		        fclose($stream);
1690
-	        }
1691
-        }
1692
-        $this->http_status($status);
1693
-    }
1694
-
1695
-    // }}}
1696
-
1697
-    // {{{ http_PUT()
2297
+	/**
2298
+	 * check authentication if check is implemented
2299
+	 *
2300
+	 * @param  void
2301
+	 * @return bool  true if authentication succeded or not necessary
2302
+	 */
2303
+	function _check_auth()
2304
+	{
2305
+		if (method_exists($this, "checkAuth")) {
2306
+			// PEAR style method name
2307
+			return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"],
2308
+									@$this->_SERVER["PHP_AUTH_USER"],
2309
+									@$this->_SERVER["PHP_AUTH_PW"]);
2310
+		} else if (method_exists($this, "check_auth")) {
2311
+			// old (pre 1.0) method name
2312
+			return $this->check_auth(@$this->_SERVER["AUTH_TYPE"],
2313
+									 @$this->_SERVER["PHP_AUTH_USER"],
2314
+									 @$this->_SERVER["PHP_AUTH_PW"]);
2315
+		} else {
2316
+			// no method found -> no authentication required
2317
+			return true;
2318
+		}
2319
+	}
1698 2320
 
1699
-    /**
1700
-     * PUT method handler
1701
-     *
1702
-     * @param  void
1703
-     * @return void
1704
-     */
1705
-    function http_PUT()
1706
-    {
1707
-        if ($this->_check_lock_status($this->path)) {
1708
-            $options                   = Array();
1709
-            $options["path"]           = $this->path;
1710
-
1711
-            if (isset($this->_SERVER['CONTENT_LENGTH']))
1712
-            {
1713
-            	$options['content_length'] = $this->_SERVER['CONTENT_LENGTH'];
1714
-            }
1715
-            elseif (isset($this->_SERVER['X-Expected-Entity-Length']))
1716
-            {
1717
-            	// MacOS gives us that hint
1718
-            	$options['content_length'] = $this->_SERVER['X-Expected-Entity-Length'];
1719
-            }
1720
-
1721
-            // get the Content-type
1722
-            if (isset($this->_SERVER["CONTENT_TYPE"])) {
1723
-                // for now we do not support any sort of multipart requests
1724
-                if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) {
1725
-                    $this->http_status("501 not implemented");
1726
-                    echo "The service does not support multipart PUT requests";
1727
-                    return;
1728
-                }
1729
-                $options["content_type"] = $this->_SERVER["CONTENT_TYPE"];
1730
-            } else {
1731
-                // default content type if none given
1732
-                $options["content_type"] = "application/octet-stream";
1733
-            }
1734
-
1735
-            $options["stream"] = fopen("php://input", "r");
1736
-	    	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1737
-	    	{
1738
-	    		case 'gzip':
1739
-	    		case 'deflate':	//zlib
1740
-	    			if (extension_loaded('zlib'))
1741
-	     			{
1742
-	      				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1743
-	       			}
1744
-	    	}
1745
-			// store request in $this->request, if requested via $this->store_request
1746
-			if ($this->store_request)
1747
-			{
1748
-				$options['content'] = '';
1749
-				while(!feof($options['stream']))
1750
-				{
1751
-					$options['content'] .= fread($options['stream'],8192);
1752
-				}
1753
-				$this->request =& $options['content'];
1754
-				unset($options['stream']);
1755
-			}
2321
+	// }}}
1756 2322
 
1757
-            /* RFC 2616 2.6 says: "The recipient of the entity MUST NOT
1758
-             ignore any Content-* (e.g. Content-Range) headers that it
1759
-             does not understand or implement and MUST return a 501
1760
-             (Not Implemented) response in such cases."
1761
-            */
1762
-            foreach ($this->_SERVER as $key => $val) {
1763
-                if (strncmp($key, "HTTP_CONTENT", 11)) continue;
1764
-                switch ($key) {
1765
-                case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1766
-		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1767
-		        	{
1768
-		        		case 'gzip':
1769
-		        		case 'deflate':	//zlib
1770
-		        			if (extension_loaded('zlib')) break;
1771
-		        			// fall through for no zlib support
1772
-		        		default:
1773
-					        $this->http_status('415 Unsupported Media Type');
1774
-					        echo "The service does not support '$val' content encoding";
1775
-					        return;
1776
-		        	}
1777
-		        	break;
1778
-
1779
-                case 'HTTP_CONTENT_LANGUAGE': // RFC 2616 14.12
1780
-                    // we assume it is not critical if this one is ignored
1781
-                    // in the actual PUT implementation ...
1782
-                    $options["content_language"] = $val;
1783
-                    break;
1784
-
1785
-                case 'HTTP_CONTENT_LENGTH':
1786
-                    // defined on IIS and has the same value as CONTENT_LENGTH
1787
-                    break;
1788
-
1789
-                case 'HTTP_CONTENT_LOCATION': // RFC 2616 14.14
1790
-                    /* The meaning of the Content-Location header in PUT
1791
-                     or POST requests is undefined; servers are free
1792
-                     to ignore it in those cases. */
1793
-                    break;
2323
+	// {{{ UUID stuff
1794 2324
 
1795
-                case 'HTTP_CONTENT_RANGE':    // RFC 2616 14.16
1796
-                    // single byte range requests are supported
1797
-                    // the header format is also specified in RFC 2616 14.16
1798
-                    // TODO we have to ensure that implementations support this or send 501 instead
1799
-					$matches = null;
1800
-                    if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1801
-                        $this->http_status("400 bad request");
1802
-                        echo "The service does only support single byte ranges";
1803
-                        return;
1804
-                    }
1805
-
1806
-                    $range = array("start" => $matches[1], "end" => $matches[2]);
1807
-                    if (is_numeric($matches[3])) {
1808
-                        $range["total_length"] = $matches[3];
1809
-                    }
1810
-
1811
-                    if (!isset($options['ranges'])) {
1812
-                        $options['ranges'] = array();
1813
-                    }
1814
-
1815
-                    $options["ranges"][] = $range;
1816
-
1817
-                    // TODO make sure the implementation supports partial PUT
1818
-                    // this has to be done in advance to avoid data being overwritten
1819
-                    // on implementations that do not support this ...
1820
-                    break;
1821
-
1822
-                case 'HTTP_CONTENT_TYPE':
1823
-                    // defined on IIS and has the same value as CONTENT_TYPE
1824
-                    break;
1825
-
1826
-                case 'HTTP_CONTENT_MD5':      // RFC 2616 14.15
1827
-                    // TODO: maybe we can just pretend here?
1828
-                    $this->http_status("501 not implemented");
1829
-                    echo "The service does not support content MD5 checksum verification";
1830
-                    return;
1831
-
1832
-                default:
1833
-                    // any other unknown Content-* headers
1834
-                    $this->http_status("501 not implemented");
1835
-                    echo "The service does not support '$key'";
1836
-                    return;
1837
-                }
1838
-            }
1839
-
1840
-            $stat = $this->PUT($options);
1841
-
1842
-            if ($stat === false) {
1843
-                $stat = "403 Forbidden";
1844
-            } else if (is_resource($stat) && get_resource_type($stat) == "stream") {
1845
-                $stream = $stat;
1846
-
1847
-                $stat = $options["new"] ? "201 Created" : "204 No Content";
1848
-
1849
-                if (!empty($options["ranges"])) {
1850
-                    // TODO multipart support is missing (see also above)
1851
-                    if (0 == fseek($stream, $options['ranges'][0]["start"], SEEK_SET)) {
1852
-                        $length = $options['ranges'][0]["end"] - $options['ranges'][0]["start"]+1;
1853
-
1854
-                        while (!feof($options['stream'])) {
1855
-                            if ($length <= 0) {
1856
-                               break;
1857
-                            }
1858
-
1859
-                            if ($length <= 8192) {
1860
-                                $data = fread($options['stream'], $length);
1861
-                            } else {
1862
-                                $data = fread($options['stream'], 8192);
1863
-                            }
1864
-
1865
-                            if ($data === false) {
1866
-                                $stat = "400 Bad request";
1867
-                            } elseif (strlen($data)) {
1868
-                                if (false === fwrite($stream, $data)) {
1869
-                                    $stat = "403 Forbidden";
1870
-                                    break;
1871
-                                }
1872
-                                $length -= strlen($data);
1873
-                            }
1874
-                        }
1875
-                    } else {
1876
-                        $stat = "403 Forbidden";
1877
-                    }
1878
-                } else {
1879
-                    while (!feof($options["stream"])) {
1880
-                        if (false === fwrite($stream, fread($options["stream"], 8192))) {
1881
-                            $stat = "403 Forbidden";
1882
-                            break;
1883
-                        }
1884
-                    }
1885
-                }
1886
-
1887
-                fclose($stream);
1888
-            }
1889
-
1890
-            $this->http_status($stat);
1891
-        } else {
1892
-            $this->http_status("423 Locked");
1893
-        }
1894
-    }
1895
-
1896
-    // }}}
1897
-
1898
-
1899
-    // {{{ http_DELETE()
2325
+	/**
2326
+	 * generate Unique Universal IDentifier for lock token
2327
+	 *
2328
+	 * @param  void
2329
+	 * @return string  a new UUID
2330
+	 */
2331
+	public static function _new_uuid()
2332
+	{
2333
+		// use uuid extension from PECL if available
2334
+		if (function_exists("uuid_create")) {
2335
+			return uuid_create();
2336
+		}
1900 2337
 
1901
-    /**
1902
-     * DELETE method handler
1903
-     *
1904
-     * @param  void
1905
-     * @return void
1906
-     */
1907
-    function http_DELETE()
1908
-    {
1909
-        // check RFC 2518 Section 9.2, last paragraph
1910
-        if (isset($this->_SERVER["HTTP_DEPTH"])) {
1911
-            if ($this->_SERVER["HTTP_DEPTH"] != "infinity") {
1912
-				if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false)
1913
-				{
1914
-					// pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections
1915
-				}
1916
-				else
1917
-				{
1918
-                	$this->http_status("400 Bad Request");
1919
-                	return;
1920
-				}
1921
-            }
1922
-        }
2338
+		// fallback
2339
+		$uuid = md5(microtime().getmypid());    // this should be random enough for now
2340
+
2341
+		// set variant and version fields for 'true' random uuid
2342
+		$uuid{12} = "4";
2343
+		$n = 8 + (ord($uuid{16}) & 3);
2344
+		$hex = "0123456789abcdef";
2345
+		$uuid{16} = $hex{$n};
2346
+
2347
+		// return formated uuid
2348
+		return substr($uuid,  0, 8)."-"
2349
+			.  substr($uuid,  8, 4)."-"
2350
+			.  substr($uuid, 12, 4)."-"
2351
+			.  substr($uuid, 16, 4)."-"
2352
+			.  substr($uuid, 20);
2353
+	}
1923 2354
 
1924
-        // check lock status
1925
-        if ($this->_check_lock_status($this->path)) {
1926
-            // ok, proceed
1927
-            $options         = Array();
1928
-            $options["path"] = $this->path;
2355
+	/**
2356
+	 * create a new opaque lock token as defined in RFC2518
2357
+	 *
2358
+	 * @param  void
2359
+	 * @return string  new RFC2518 opaque lock token
2360
+	 */
2361
+	public static function _new_locktoken()
2362
+	{
2363
+		return "opaquelocktoken:".self::_new_uuid();
2364
+	}
1929 2365
 
1930
-            $stat = $this->DELETE($options);
2366
+	// }}}
1931 2367
 
1932
-            $this->http_status($stat);
1933
-        } else {
1934
-            // sorry, its locked
1935
-            $this->http_status("423 Locked");
1936
-        }
1937
-    }
2368
+	// {{{ WebDAV If: header parsing
1938 2369
 
1939
-    // }}}
2370
+	/**
2371
+	 *
2372
+	 *
2373
+	 * @param  string  header string to parse
2374
+	 * @param  int     current parsing position
2375
+	 * @return array   next token (type and value)
2376
+	 */
2377
+	function _if_header_lexer($string, &$pos)
2378
+	{
2379
+		// skip whitespace
2380
+		while (ctype_space($string{$pos})) {
2381
+			++$pos;
2382
+		}
1940 2383
 
1941
-    // {{{ http_COPY()
2384
+		// already at end of string?
2385
+		if (strlen($string) <= $pos) {
2386
+			return false;
2387
+		}
1942 2388
 
1943
-    /**
1944
-     * COPY method handler
1945
-     *
1946
-     * @param  void
1947
-     * @return void
1948
-     */
1949
-    function http_COPY()
1950
-    {
1951
-        // no need to check source lock status here
1952
-        // destination lock status is always checked by the helper method
1953
-        $this->_copymove("copy");
1954
-    }
1955
-
1956
-    // }}}
1957
-
1958
-    // {{{ http_MOVE()
2389
+		// get next character
2390
+		$c = $string{$pos++};
2391
+
2392
+		// now it depends on what we found
2393
+		switch ($c) {
2394
+		case "<":
2395
+			// URIs are enclosed in <...>
2396
+			$pos2 = strpos($string, ">", $pos);
2397
+			$uri  = substr($string, $pos, $pos2 - $pos);
2398
+			$pos  = $pos2 + 1;
2399
+			return array("URI", $uri);
2400
+
2401
+		case "[":
2402
+			//Etags are enclosed in [...]
2403
+			if ($string{$pos} == "W") {
2404
+				$type = "ETAG_WEAK";
2405
+				$pos += 2;
2406
+			} else {
2407
+				$type = "ETAG_STRONG";
2408
+			}
2409
+			$pos2 = strpos($string, "]", $pos);
2410
+			$etag = substr($string, $pos + 1, $pos2 - $pos - 2);
2411
+			$pos  = $pos2 + 1;
2412
+			return array($type, $etag);
2413
+
2414
+		case "N":
2415
+			// "N" indicates negation
2416
+			$pos += 2;
2417
+			return array("NOT", "Not");
2418
+
2419
+		default:
2420
+			// anything else is passed verbatim char by char
2421
+			return array("CHAR", $c);
2422
+		}
2423
+	}
1959 2424
 
1960
-    /**
1961
-     * MOVE method handler
1962
-     *
1963
-     * @param  void
1964
-     * @return void
1965
-     */
1966
-    function http_MOVE()
1967
-    {
1968
-        if ($this->_check_lock_status($this->path)) {
1969
-            // destination lock status is always checked by the helper method
1970
-            $this->_copymove("move");
1971
-        } else {
1972
-            $this->http_status("423 Locked");
1973
-        }
1974
-    }
1975
-
1976
-    // }}}
1977
-
1978
-
1979
-    // {{{ http_LOCK()
2425
+	/**
2426
+	 * parse If: header
2427
+	 *
2428
+	 * @param  string  header string
2429
+	 * @return array   URIs and their conditions
2430
+	 */
2431
+	function _if_header_parser($str)
2432
+	{
2433
+		$pos  = 0;
2434
+		$len  = strlen($str);
2435
+		$uris = array();
2436
+
2437
+		// parser loop
2438
+		while ($pos < $len) {
2439
+			// get next token
2440
+			$token = $this->_if_header_lexer($str, $pos);
2441
+
2442
+			// check for URI
2443
+			if ($token[0] == "URI") {
2444
+				$uri   = $token[1]; // remember URI
2445
+				$token = $this->_if_header_lexer($str, $pos); // get next token
2446
+			} else {
2447
+				$uri = "";
2448
+			}
1980 2449
 
1981
-    /**
1982
-     * LOCK method handler
1983
-     *
1984
-     * @param  void
1985
-     * @return void
1986
-     */
1987
-    function http_LOCK()
1988
-    {
1989
-        $options         = Array();
1990
-        $options["path"] = $this->path;
1991
-
1992
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
1993
-            $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
1994
-        } else {
1995
-            $options["depth"] = "infinity";
1996
-        }
1997
-
1998
-        if (isset($this->_SERVER["HTTP_TIMEOUT"])) {
1999
-            $options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]);
2000
-        }
2001
-
2002
-        if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) {
2003
-            // check if locking is possible
2004
-            if (!$this->_check_lock_status($this->path)) {
2005
-                $this->http_status("423 Locked");
2006
-                return;
2007
-            }
2008
-
2009
-            // refresh lock
2010
-            $options["locktoken"] = substr($this->_SERVER['HTTP_IF'], 2, -2);
2011
-            $options["update"]    = $options["locktoken"];
2012
-
2013
-            // setting defaults for required fields, LOCK() SHOULD overwrite these
2014
-            $options['owner']     = "unknown";
2015
-            $options['scope']     = "exclusive";
2016
-            $options['type']      = "write";
2017
-
2018
-
2019
-            $stat = $this->LOCK($options);
2020
-        } else {
2021
-            // extract lock request information from request XML payload
2022
-            $lockinfo = new _parse_lockinfo("php://input");
2023
-            if (!$lockinfo->success) {
2024
-                $this->http_status("400 bad request");
2025
-            }
2026
-
2027
-            // check if locking is possible
2028
-            if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) {
2029
-                $this->http_status("423 Locked");
2030
-                return;
2031
-            }
2032
-
2033
-            // new lock
2034
-            $options["scope"]     = $lockinfo->lockscope;
2035
-            $options["type"]      = $lockinfo->locktype;
2036
-            // Todo: lockinfo::owner still contains D:href opening and closing tags, maybe they should be removed here with strip_tags
2037
-            $options["owner"]     = $lockinfo->owner;
2038
-            $options["locktoken"] = $this->_new_locktoken();
2039
-
2040
-            $stat = $this->LOCK($options);
2041
-        }
2042
-
2043
-        if (is_bool($stat)) {
2044
-            $http_stat = $stat ? "200 OK" : "423 Locked";
2045
-        } else {
2046
-            $http_stat = (string)$stat;
2047
-        }
2048
-        $this->http_status($http_stat);
2049
-
2050
-        if ($http_stat{0} == 2) { // 2xx states are ok
2051
-            if ($options["timeout"]) {
2052
-                // if multiple timeout values were given we take the first only
2053
-                if (is_array($options["timeout"])) {
2054
-                    reset($options["timeout"]);
2055
-                    $options["timeout"] = current($options["timeout"]);
2056
-                }
2057
-                // if the timeout is numeric only we need to reformat it
2058
-                if (is_numeric($options["timeout"])) {
2059
-                    // more than a million is considered an absolute timestamp
2060
-                    // less is more likely a relative value
2061
-                    if ($options["timeout"]>1000000) {
2062
-                        $timeout = "Second-".($options['timeout']-time());
2063
-                    } else {
2064
-                        $timeout = "Second-$options[timeout]";
2065
-                    }
2066
-                } else {
2067
-                    // non-numeric values are passed on verbatim,
2068
-                    // no error checking is performed here in this case
2069
-                    // TODO: send "Infinite" on invalid timeout strings?
2070
-                    $timeout = $options["timeout"];
2071
-                }
2072
-            } else {
2073
-                $timeout = "Infinite";
2074
-            }
2075
-
2076
-            header('Content-Type: text/xml; charset="utf-8"');
2077
-            header("Lock-Token: <$options[locktoken]>");
2078
-            echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2079
-            echo "<D:prop xmlns:D=\"DAV:\">\n";
2080
-            echo ' <'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2081
-            echo '  <'.($this->crrnd?'':'D:')."activelock>\n";
2082
-            echo '   <'.($this->crrnd?'':'D:')."lockscope><D:$options[scope]/></".($this->crrnd?'':'D:')."lockscope>\n";
2083
-            echo '   <'.($this->crrnd?'':'D:')."locktype><D:$options[type]/></".($this->crrnd?'':'D:')."locktype>\n";
2084
-            echo '   <'.($this->crrnd?'':'D:')."depth>$options[depth]</".($this->crrnd?'':'D:')."depth>\n";
2085
-            echo '   <'.($this->crrnd?'':'D:')."owner>$options[owner]</".($this->crrnd?'':'D:')."owner>\n";
2086
-            echo '   <'.($this->crrnd?'':'D:')."timeout>$timeout</".($this->crrnd?'':'D:')."timeout>\n";
2087
-            echo '   <'.($this->crrnd?'':'D:')."locktoken><D:href>$options[locktoken]</D:href></".($this->crrnd?'':'D:')."locktoken>\n";
2088
-            echo '  </'.($this->crrnd?'':'D:')."activelock>\n";
2089
-            echo ' </'.($this->crrnd?'':'D:')."lockdiscovery>\n";
2090
-            echo '</'.($this->crrnd?'':'D:')."prop>\n\n";
2091
-        }
2092
-    }
2093
-
2094
-
2095
-    // }}}
2096
-
2097
-    // {{{ http_UNLOCK()
2450
+			// sanity check
2451
+			if ($token[0] != "CHAR" || $token[1] != "(") {
2452
+				return false;
2453
+			}
2098 2454
 
2099
-    /**
2100
-     * UNLOCK method handler
2101
-     *
2102
-     * @param  void
2103
-     * @return void
2104
-     */
2105
-    function http_UNLOCK()
2106
-    {
2107
-        $options         = Array();
2108
-        $options["path"] = $this->path;
2109
-
2110
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
2111
-            $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2112
-        } else {
2113
-            $options["depth"] = "infinity";
2114
-        }
2115
-
2116
-        // strip surrounding <>
2117
-        $options["token"] = substr(trim($this->_SERVER["HTTP_LOCK_TOKEN"]), 1, -1);
2118
-
2119
-        // call user method
2120
-        $stat = $this->UNLOCK($options);
2121
-
2122
-        $this->http_status($stat);
2123
-    }
2124
-
2125
-    // }}}
2126
-
2127
-    // {{{ http_ACL()
2128
-
2129
-	/**
2130
-     * ACL method handler
2131
-     *
2132
-     * @param  void
2133
-     * @return void
2134
-     */
2135
-    function http_ACL()
2136
-    {
2137
-        $options         = Array();
2138
-        $options['path'] = $this->path;
2139
-        $options['errors'] = array();
2140
-
2141
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
2142
-            $options['depth'] = $this->_SERVER['HTTP_DEPTH'];
2143
-        } else {
2144
-            $options['depth'] = 'infinity';
2145
-        }
2146
-
2147
-        // call user method
2148
-        $status = $this->ACL($options);
2455
+			$list  = array();
2456
+			$level = 1;
2457
+			$not   = "";
2458
+			while ($level) {
2459
+				$token = $this->_if_header_lexer($str, $pos);
2460
+				if ($token[0] == "NOT") {
2461
+					$not = "!";
2462
+					continue;
2463
+				}
2464
+				switch ($token[0]) {
2465
+				case "CHAR":
2466
+					switch ($token[1]) {
2467
+					case "(":
2468
+						$level++;
2469
+						break;
2470
+					case ")":
2471
+						$level--;
2472
+						break;
2473
+					default:
2474
+						return false;
2475
+					}
2476
+					break;
2149 2477
 
2150
-		// now we generate the reply header ...
2151
-		$this->http_status($status);
2152
-		$content = '';
2478
+				case "URI":
2479
+					$list[] = $not."<$token[1]>";
2480
+					break;
2153 2481
 
2154
-        if (is_array($options['errors']) && count($options['errors'])) {
2155
-	        header('Content-Type: text/xml; charset="utf-8"');
2156
-	        // ... and payload
2157
-	        $content .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2158
-	        $content .= "<D:error xmlns:D=\"DAV:\"> \n";
2159
-	        foreach ($options['errors'] as $violation) {
2160
-	        	$content .= '<'.($this->crrnd?'':'D:')."$violation/>\n";
2161
-	        }
2162
-	        $content .=  '</'.($this->crrnd?'':'D:')."error>\n";
2163
-        }
2164
-        if (!self::use_compression()) header("Content-Length: ".self::bytes($content));
2165
-        if ($content) echo $options['content'];
2166
-    }
2167
-
2168
-    // }}}
2169
-
2170
-    // }}}
2171
-
2172
-    // {{{ _copymove()
2173
-
2174
-    function _copymove($what)
2175
-    {
2176
-        $options         = Array();
2177
-        $options["path"] = $this->path;
2178
-
2179
-        if (isset($this->_SERVER["HTTP_DEPTH"])) {
2180
-            $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2181
-        } else {
2182
-            $options["depth"] = "infinity";
2183
-        }
2184
-
2185
-        $http_header_host = preg_replace("/:80$/", "", $this->_SERVER["HTTP_HOST"]);
2186
-
2187
-        $url  = parse_url($this->_SERVER["HTTP_DESTINATION"]);
2188
-        $path = urldecode($url["path"]);
2189
-
2190
-        if (isset($url["host"])) {
2191
-            // TODO check url scheme, too
2192
-            $http_host = $url["host"];
2193
-            if (isset($url["port"]) && $url["port"] != 80)
2194
-                $http_host.= ":".$url["port"];
2195
-        } else {
2196
-            // only path given, set host to self
2197
-            $http_host = $http_header_host;
2198
-        }
2199
-
2200
-        if ($http_host == $http_header_host &&
2201
-            !strncmp($this->_SERVER["SCRIPT_NAME"], $path,
2202
-                     strlen($this->_SERVER["SCRIPT_NAME"]))) {
2203
-            $options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"]));
2204
-            if (!$this->_check_lock_status($options["dest"])) {
2205
-                $this->http_status("423 Locked");
2206
-                return;
2207
-            }
2208
-
2209
-        } else {
2210
-            $options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"];
2211
-        }
2212
-
2213
-        // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3
2214
-        if (isset($this->_SERVER["HTTP_OVERWRITE"])) {
2215
-            $options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T";
2216
-        } else {
2217
-            $options["overwrite"] = true;
2218
-        }
2219
-
2220
-        $stat = $this->$what($options);
2221
-        $this->http_status($stat);
2222
-    }
2223
-
2224
-    // }}}
2225
-
2226
-    // {{{ _allow()
2482
+				case "ETAG_WEAK":
2483
+					$list[] = $not."[W/'$token[1]']>";
2484
+					break;
2227 2485
 
2228
-    /**
2229
-     * check for implemented HTTP methods
2230
-     *
2231
-     * @param  void
2232
-     * @return array something
2233
-     */
2234
-    function _allow()
2235
-    {
2236
-        // OPTIONS is always there
2237
-        $allow = array("OPTIONS" =>"OPTIONS");
2238
-
2239
-        // all other METHODS need both a http_method() wrapper
2240
-        // and a method() implementation
2241
-        // the base class supplies wrappers only
2242
-        foreach (get_class_methods($this) as $method) {
2243
-            if (!strncmp("http_", $method, 5)) {
2244
-                $method = strtoupper(substr($method, 5));
2245
-                if (method_exists($this, $method)) {
2246
-                    $allow[$method] = $method;
2247
-                }
2248
-            }
2249
-        }
2250
-
2251
-        // we can emulate a missing HEAD implemetation using GET
2252
-        if (isset($allow["GET"]))
2253
-            $allow["HEAD"] = "HEAD";
2254
-
2255
-        // no LOCK without checklok()
2256
-        if (!method_exists($this, "checklock")) {
2257
-            unset($allow["LOCK"]);
2258
-            unset($allow["UNLOCK"]);
2259
-        }
2260
-
2261
-        return $allow;
2262
-    }
2263
-
2264
-    // }}}
2486
+				case "ETAG_STRONG":
2487
+					$list[] = $not."['$token[1]']>";
2488
+					break;
2265 2489
 
2266
-    /**
2267
-     * helper for property element creation
2268
-     *
2269
-     * @param  string  XML namespace (optional)
2270
-     * @param  string  property name
2271
-     * @param  string  property value
2272
-     * @praram boolen  property raw-flag
2273
-     * @return array   property array
2274
-     */
2275
-    public static function mkprop()
2276
-    {
2277
-	    $args = func_get_args();
2278
-	    switch (count($args)) {
2279
-		    case 4:
2280
-			    return array('ns'   => $args[0],
2281
-				    'name' => $args[1],
2282
-					'val'  => $args[2],
2283
-					'raw'	=> true);
2284
-		    case 3:
2285
-			    return array('ns'   => $args[0],
2286
-				    'name' => $args[1],
2287
-					'val'  => $args[2]);
2288
-		    default:
2289
-			    return array('ns'   => 'DAV:',
2290
-				    'name' => $args[0],
2291
-					'val'  => $args[1]);
2292
-	    }
2293
-    }
2490
+				default:
2491
+					return false;
2492
+				}
2493
+				$not = "";
2494
+			}
2294 2495
 
2295
-    // {{{ _check_auth
2496
+			if (@is_array($uris[$uri])) {
2497
+				$uris[$uri] = array_merge($uris[$uri], $list);
2498
+			} else {
2499
+				$uris[$uri] = $list;
2500
+			}
2501
+		}
2296 2502
 
2297
-    /**
2298
-     * check authentication if check is implemented
2299
-     *
2300
-     * @param  void
2301
-     * @return bool  true if authentication succeded or not necessary
2302
-     */
2303
-    function _check_auth()
2304
-    {
2305
-        if (method_exists($this, "checkAuth")) {
2306
-            // PEAR style method name
2307
-            return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"],
2308
-                                    @$this->_SERVER["PHP_AUTH_USER"],
2309
-                                    @$this->_SERVER["PHP_AUTH_PW"]);
2310
-        } else if (method_exists($this, "check_auth")) {
2311
-            // old (pre 1.0) method name
2312
-            return $this->check_auth(@$this->_SERVER["AUTH_TYPE"],
2313
-                                     @$this->_SERVER["PHP_AUTH_USER"],
2314
-                                     @$this->_SERVER["PHP_AUTH_PW"]);
2315
-        } else {
2316
-            // no method found -> no authentication required
2317
-            return true;
2318
-        }
2319
-    }
2320
-
2321
-    // }}}
2322
-
2323
-    // {{{ UUID stuff
2503
+		return $uris;
2504
+	}
2324 2505
 
2325
-    /**
2326
-     * generate Unique Universal IDentifier for lock token
2327
-     *
2328
-     * @param  void
2329
-     * @return string  a new UUID
2330
-     */
2331
-    public static function _new_uuid()
2332
-    {
2333
-        // use uuid extension from PECL if available
2334
-        if (function_exists("uuid_create")) {
2335
-            return uuid_create();
2336
-        }
2337
-
2338
-        // fallback
2339
-        $uuid = md5(microtime().getmypid());    // this should be random enough for now
2340
-
2341
-        // set variant and version fields for 'true' random uuid
2342
-        $uuid{12} = "4";
2343
-        $n = 8 + (ord($uuid{16}) & 3);
2344
-        $hex = "0123456789abcdef";
2345
-        $uuid{16} = $hex{$n};
2346
-
2347
-        // return formated uuid
2348
-        return substr($uuid,  0, 8)."-"
2349
-            .  substr($uuid,  8, 4)."-"
2350
-            .  substr($uuid, 12, 4)."-"
2351
-            .  substr($uuid, 16, 4)."-"
2352
-            .  substr($uuid, 20);
2353
-    }
2506
+	/**
2507
+	 * check if conditions from "If:" headers are meat
2508
+	 *
2509
+	 * the "If:" header is an extension to HTTP/1.1
2510
+	 * defined in RFC 2518 section 9.4
2511
+	 *
2512
+	 * @param  void
2513
+	 * @return void
2514
+	 */
2515
+	function _check_if_header_conditions()
2516
+	{
2517
+		if (isset($this->_SERVER["HTTP_IF"])) {
2518
+			$this->_if_header_uris =
2519
+				$this->_if_header_parser($this->_SERVER["HTTP_IF"]);
2354 2520
 
2355
-    /**
2356
-     * create a new opaque lock token as defined in RFC2518
2357
-     *
2358
-     * @param  void
2359
-     * @return string  new RFC2518 opaque lock token
2360
-     */
2361
-    public static function _new_locktoken()
2362
-    {
2363
-        return "opaquelocktoken:".self::_new_uuid();
2364
-    }
2521
+			foreach ($this->_if_header_uris as $uri => $conditions) {
2522
+				if ($uri == "") {
2523
+					$uri = $this->uri;
2524
+				}
2525
+				// all must match
2526
+				$state = true;
2527
+				foreach ($conditions as $condition) {
2528
+					// lock tokens may be free form (RFC2518 6.3)
2529
+					// but if opaquelocktokens are used (RFC2518 6.4)
2530
+					// we have to check the format (litmus tests this)
2531
+					if (!strncmp($condition, "<opaquelocktoken:", strlen("<opaquelocktoken"))) {
2532
+						if (!preg_match('/^<opaquelocktoken:[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}>$/', $condition)) {
2533
+							$this->http_status("423 Locked");
2534
+							return false;
2535
+						}
2536
+					}
2537
+					if (!$this->_check_uri_condition($uri, $condition)) {
2538
+						$this->http_status("412 Precondition failed");
2539
+						$state = false;
2540
+						break;
2541
+					}
2542
+				}
2365 2543
 
2366
-    // }}}
2544
+				// any match is ok
2545
+				if ($state == true) {
2546
+					return true;
2547
+				}
2548
+			}
2549
+			return false;
2550
+		}
2551
+		return true;
2552
+	}
2367 2553
 
2368
-    // {{{ WebDAV If: header parsing
2554
+	/**
2555
+	 * Check a single URI condition parsed from an if-header
2556
+	 *
2557
+	 * Check a single URI condition parsed from an if-header
2558
+	 *
2559
+	 * @abstract
2560
+	 * @param string $uri URI to check
2561
+	 * @param string $condition Condition to check for this URI
2562
+	 * @returns bool Condition check result
2563
+	 */
2564
+	function _check_uri_condition($uri, $condition)
2565
+	{
2566
+		unset($uri);	// not used, but required by function signature
2567
+		// not really implemented here,
2568
+		// implementations must override
2369 2569
 
2370
-    /**
2371
-     *
2372
-     *
2373
-     * @param  string  header string to parse
2374
-     * @param  int     current parsing position
2375
-     * @return array   next token (type and value)
2376
-     */
2377
-    function _if_header_lexer($string, &$pos)
2378
-    {
2379
-        // skip whitespace
2380
-        while (ctype_space($string{$pos})) {
2381
-            ++$pos;
2382
-        }
2383
-
2384
-        // already at end of string?
2385
-        if (strlen($string) <= $pos) {
2386
-            return false;
2387
-        }
2388
-
2389
-        // get next character
2390
-        $c = $string{$pos++};
2391
-
2392
-        // now it depends on what we found
2393
-        switch ($c) {
2394
-        case "<":
2395
-            // URIs are enclosed in <...>
2396
-            $pos2 = strpos($string, ">", $pos);
2397
-            $uri  = substr($string, $pos, $pos2 - $pos);
2398
-            $pos  = $pos2 + 1;
2399
-            return array("URI", $uri);
2400
-
2401
-        case "[":
2402
-            //Etags are enclosed in [...]
2403
-            if ($string{$pos} == "W") {
2404
-                $type = "ETAG_WEAK";
2405
-                $pos += 2;
2406
-            } else {
2407
-                $type = "ETAG_STRONG";
2408
-            }
2409
-            $pos2 = strpos($string, "]", $pos);
2410
-            $etag = substr($string, $pos + 1, $pos2 - $pos - 2);
2411
-            $pos  = $pos2 + 1;
2412
-            return array($type, $etag);
2413
-
2414
-        case "N":
2415
-            // "N" indicates negation
2416
-            $pos += 2;
2417
-            return array("NOT", "Not");
2418
-
2419
-        default:
2420
-            // anything else is passed verbatim char by char
2421
-            return array("CHAR", $c);
2422
-        }
2423
-    }
2570
+		// a lock token can never be from the DAV: scheme
2571
+		// litmus uses DAV:no-lock in some tests
2572
+		if (!strncmp("<DAV:", $condition, 5)) {
2573
+			return false;
2574
+		}
2424 2575
 
2425
-    /**
2426
-     * parse If: header
2427
-     *
2428
-     * @param  string  header string
2429
-     * @return array   URIs and their conditions
2430
-     */
2431
-    function _if_header_parser($str)
2432
-    {
2433
-        $pos  = 0;
2434
-        $len  = strlen($str);
2435
-        $uris = array();
2436
-
2437
-        // parser loop
2438
-        while ($pos < $len) {
2439
-            // get next token
2440
-            $token = $this->_if_header_lexer($str, $pos);
2441
-
2442
-            // check for URI
2443
-            if ($token[0] == "URI") {
2444
-                $uri   = $token[1]; // remember URI
2445
-                $token = $this->_if_header_lexer($str, $pos); // get next token
2446
-            } else {
2447
-                $uri = "";
2448
-            }
2449
-
2450
-            // sanity check
2451
-            if ($token[0] != "CHAR" || $token[1] != "(") {
2452
-                return false;
2453
-            }
2454
-
2455
-            $list  = array();
2456
-            $level = 1;
2457
-            $not   = "";
2458
-            while ($level) {
2459
-                $token = $this->_if_header_lexer($str, $pos);
2460
-                if ($token[0] == "NOT") {
2461
-                    $not = "!";
2462
-                    continue;
2463
-                }
2464
-                switch ($token[0]) {
2465
-                case "CHAR":
2466
-                    switch ($token[1]) {
2467
-                    case "(":
2468
-                        $level++;
2469
-                        break;
2470
-                    case ")":
2471
-                        $level--;
2472
-                        break;
2473
-                    default:
2474
-                        return false;
2475
-                    }
2476
-                    break;
2477
-
2478
-                case "URI":
2479
-                    $list[] = $not."<$token[1]>";
2480
-                    break;
2481
-
2482
-                case "ETAG_WEAK":
2483
-                    $list[] = $not."[W/'$token[1]']>";
2484
-                    break;
2485
-
2486
-                case "ETAG_STRONG":
2487
-                    $list[] = $not."['$token[1]']>";
2488
-                    break;
2489
-
2490
-                default:
2491
-                    return false;
2492
-                }
2493
-                $not = "";
2494
-            }
2495
-
2496
-            if (@is_array($uris[$uri])) {
2497
-                $uris[$uri] = array_merge($uris[$uri], $list);
2498
-            } else {
2499
-                $uris[$uri] = $list;
2500
-            }
2501
-        }
2502
-
2503
-        return $uris;
2504
-    }
2576
+		return true;
2577
+	}
2505 2578
 
2506
-    /**
2507
-     * check if conditions from "If:" headers are meat
2508
-     *
2509
-     * the "If:" header is an extension to HTTP/1.1
2510
-     * defined in RFC 2518 section 9.4
2511
-     *
2512
-     * @param  void
2513
-     * @return void
2514
-     */
2515
-    function _check_if_header_conditions()
2516
-    {
2517
-        if (isset($this->_SERVER["HTTP_IF"])) {
2518
-            $this->_if_header_uris =
2519
-                $this->_if_header_parser($this->_SERVER["HTTP_IF"]);
2520
-
2521
-            foreach ($this->_if_header_uris as $uri => $conditions) {
2522
-                if ($uri == "") {
2523
-                    $uri = $this->uri;
2524
-                }
2525
-                // all must match
2526
-                $state = true;
2527
-                foreach ($conditions as $condition) {
2528
-                    // lock tokens may be free form (RFC2518 6.3)
2529
-                    // but if opaquelocktokens are used (RFC2518 6.4)
2530
-                    // we have to check the format (litmus tests this)
2531
-                    if (!strncmp($condition, "<opaquelocktoken:", strlen("<opaquelocktoken"))) {
2532
-                        if (!preg_match('/^<opaquelocktoken:[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}>$/', $condition)) {
2533
-                            $this->http_status("423 Locked");
2534
-                            return false;
2535
-                        }
2536
-                    }
2537
-                    if (!$this->_check_uri_condition($uri, $condition)) {
2538
-                        $this->http_status("412 Precondition failed");
2539
-                        $state = false;
2540
-                        break;
2541
-                    }
2542
-                }
2543
-
2544
-                // any match is ok
2545
-                if ($state == true) {
2546
-                    return true;
2547
-                }
2548
-            }
2549
-            return false;
2550
-        }
2551
-        return true;
2552
-    }
2553 2579
 
2554
-    /**
2555
-     * Check a single URI condition parsed from an if-header
2556
-     *
2557
-     * Check a single URI condition parsed from an if-header
2558
-     *
2559
-     * @abstract
2560
-     * @param string $uri URI to check
2561
-     * @param string $condition Condition to check for this URI
2562
-     * @returns bool Condition check result
2563
-     */
2564
-    function _check_uri_condition($uri, $condition)
2565
-    {
2566
-		unset($uri);	// not used, but required by function signature
2567
-        // not really implemented here,
2568
-        // implementations must override
2580
+	/**
2581
+	 *
2582
+	 *
2583
+	 * @param  string  path of resource to check
2584
+	 * @param  bool    exclusive lock?
2585
+	 */
2586
+	function _check_lock_status($path, $exclusive_only = false)
2587
+	{
2588
+		// FIXME depth -> ignored for now
2589
+		if (method_exists($this, "checkLock")) {
2590
+			// is locked?
2591
+			$lock = $this->checkLock($path);
2592
+
2593
+			// ... and lock is not owned?
2594
+			if (is_array($lock) && count($lock)) {
2595
+				// FIXME doesn't check uri restrictions yet
2596
+				if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) {
2597
+					if (!$exclusive_only || ($lock["scope"] !== "shared"))
2598
+						return false;
2599
+				}
2600
+			}
2601
+		}
2602
+		return true;
2603
+	}
2569 2604
 
2570
-        // a lock token can never be from the DAV: scheme
2571
-        // litmus uses DAV:no-lock in some tests
2572
-        if (!strncmp("<DAV:", $condition, 5)) {
2573
-            return false;
2574
-        }
2575 2605
 
2576
-        return true;
2577
-    }
2606
+	// }}}
2578 2607
 
2579 2608
 
2580
-    /**
2581
-     *
2582
-     *
2583
-     * @param  string  path of resource to check
2584
-     * @param  bool    exclusive lock?
2585
-     */
2586
-    function _check_lock_status($path, $exclusive_only = false)
2587
-    {
2588
-        // FIXME depth -> ignored for now
2589
-        if (method_exists($this, "checkLock")) {
2590
-            // is locked?
2591
-            $lock = $this->checkLock($path);
2592
-
2593
-            // ... and lock is not owned?
2594
-            if (is_array($lock) && count($lock)) {
2595
-                // FIXME doesn't check uri restrictions yet
2596
-                if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) {
2597
-                    if (!$exclusive_only || ($lock["scope"] !== "shared"))
2598
-                        return false;
2599
-                }
2600
-            }
2601
-        }
2602
-        return true;
2603
-    }
2604
-
2605
-
2606
-    // }}}
2609
+	/**
2610
+	 * Generate lockdiscovery reply from checklock() result
2611
+	 *
2612
+	 * @param   string  resource path to check
2613
+	 * @return  string  lockdiscovery response
2614
+	 */
2615
+	function lockdiscovery($path)
2616
+	{
2617
+		// no lock support without checklock() method
2618
+		if (!method_exists($this, "checklock")) {
2619
+			return "";
2620
+		}
2607 2621
 
2622
+		// collect response here
2623
+		$activelocks = "";
2624
+
2625
+		// get checklock() reply
2626
+		$lock = $this->checklock($path);
2627
+
2628
+		// generate <activelock> block for returned data
2629
+		if (is_array($lock) && count($lock)) {
2630
+			// check for 'timeout' or 'expires'
2631
+			if (!empty($lock["expires"])) {
2632
+				$timeout = "Second-".($lock["expires"] - time());
2633
+			} else if (!empty($lock["timeout"])) {
2634
+				$timeout = "Second-$lock[timeout]";
2635
+			} else {
2636
+				$timeout = "Infinite";
2637
+			}
2608 2638
 
2609
-    /**
2610
-     * Generate lockdiscovery reply from checklock() result
2611
-     *
2612
-     * @param   string  resource path to check
2613
-     * @return  string  lockdiscovery response
2614
-     */
2615
-    function lockdiscovery($path)
2616
-    {
2617
-        // no lock support without checklock() method
2618
-        if (!method_exists($this, "checklock")) {
2619
-            return "";
2620
-        }
2621
-
2622
-        // collect response here
2623
-        $activelocks = "";
2624
-
2625
-        // get checklock() reply
2626
-        $lock = $this->checklock($path);
2627
-
2628
-        // generate <activelock> block for returned data
2629
-        if (is_array($lock) && count($lock)) {
2630
-            // check for 'timeout' or 'expires'
2631
-            if (!empty($lock["expires"])) {
2632
-                $timeout = "Second-".($lock["expires"] - time());
2633
-            } else if (!empty($lock["timeout"])) {
2634
-                $timeout = "Second-$lock[timeout]";
2635
-            } else {
2636
-                $timeout = "Infinite";
2637
-            }
2638
-
2639
-            // genreate response block
2640
-            if ($this->crrnd)
2641
-            {
2642
-	            $activelocks.= "
2639
+			// genreate response block
2640
+			if ($this->crrnd)
2641
+			{
2642
+				$activelocks.= "
2643 2643
 		            <activelock>
2644 2644
 		            <lockscope><$lock[scope]/></lockscope>
2645 2645
 		            <locktype><$lock[type]/></locktype>
@@ -2649,10 +2649,10 @@  discard block
 block discarded – undo
2649 2649
 		            <locktoken><href>$lock[token]</href></locktoken>
2650 2650
 		            </activelock>
2651 2651
 		            ";
2652
-            }
2653
-            else
2654
-            {
2655
-	            $activelocks.= "
2652
+			}
2653
+			else
2654
+			{
2655
+				$activelocks.= "
2656 2656
 		            <D:activelock>
2657 2657
 		            <D:lockscope><D:$lock[scope]/></D:lockscope>
2658 2658
 		            <D:locktype><D:$lock[type]/></D:locktype>
@@ -2662,47 +2662,47 @@  discard block
 block discarded – undo
2662 2662
 		            <D:locktoken><D:href>$lock[token]</D:href></D:locktoken>
2663 2663
 		            </D:activelock>
2664 2664
 		            ";
2665
-            }
2666
-        }
2665
+			}
2666
+		}
2667 2667
 
2668
-        // return generated response
2669
-        //error_log(__METHOD__."\n".print_r($activelocks,true));
2668
+		// return generated response
2669
+		//error_log(__METHOD__."\n".print_r($activelocks,true));
2670 2670
 		return $activelocks;
2671
-    }
2671
+	}
2672 2672
 
2673
-    /**
2674
-     * set HTTP return status and mirror it in a private header
2675
-     *
2676
-     * @param  string  status code and message
2677
-     * @return void
2678
-     */
2679
-    function http_status($status)
2680
-    {
2681
-        // simplified success case
2682
-        if ($status === true) {
2683
-            $status = "200 OK";
2684
-        }
2685
-
2686
-        // remember status
2687
-        $this->_http_status = $status;
2688
-
2689
-        // generate HTTP status response
2690
-        header("HTTP/1.1 $status");
2691
-        header("X-WebDAV-Status: $status", true);
2692
-    }
2673
+	/**
2674
+	 * set HTTP return status and mirror it in a private header
2675
+	 *
2676
+	 * @param  string  status code and message
2677
+	 * @return void
2678
+	 */
2679
+	function http_status($status)
2680
+	{
2681
+		// simplified success case
2682
+		if ($status === true) {
2683
+			$status = "200 OK";
2684
+		}
2693 2685
 
2694
-    /**
2695
-     * private minimalistic version of PHP urlencode()
2696
-     *
2697
-     * only blanks, percent and XML special chars must be encoded here
2698
-     * full urlencode() encoding confuses some clients ...
2699
-     *
2700
-     * @param  string  URL to encode
2701
-     * @return string  encoded URL
2702
-     * @todo check if other not explicitly named user-agents are happy with full url-encoding too and we can make it the default
2703
-     */
2704
-    public static function _urlencode($url)
2705
-    {
2686
+		// remember status
2687
+		$this->_http_status = $status;
2688
+
2689
+		// generate HTTP status response
2690
+		header("HTTP/1.1 $status");
2691
+		header("X-WebDAV-Status: $status", true);
2692
+	}
2693
+
2694
+	/**
2695
+	 * private minimalistic version of PHP urlencode()
2696
+	 *
2697
+	 * only blanks, percent and XML special chars must be encoded here
2698
+	 * full urlencode() encoding confuses some clients ...
2699
+	 *
2700
+	 * @param  string  URL to encode
2701
+	 * @return string  encoded URL
2702
+	 * @todo check if other not explicitly named user-agents are happy with full url-encoding too and we can make it the default
2703
+	 */
2704
+	public static function _urlencode($url)
2705
+	{
2706 2706
 		// cadaver (and probably all neon using agents) need a more complete url encoding
2707 2707
 		// otherwise special chars like "$,()'" in filenames do NOT work
2708 2708
 		if (strpos($_SERVER['HTTP_USER_AGENT'],'neon') !== false ||
@@ -2720,31 +2720,31 @@  discard block
 block discarded – undo
2720 2720
 		}
2721 2721
 		//error_log( __METHOD__."\n" .print_r($url,true));
2722 2722
 		return strtr($url, array(' '	=>	'%20',
2723
-                                 '%'	=>	'%25',
2724
-                                 '&'	=>	'%26',
2725
-                                 '<'	=>	'%3C',
2726
-                                 '>'	=>	'%3E',
2727
-                                 '+'	=>	'%2B',
2728
-                                 ));
2729
-    }
2723
+								 '%'	=>	'%25',
2724
+								 '&'	=>	'%26',
2725
+								 '<'	=>	'%3C',
2726
+								 '>'	=>	'%3E',
2727
+								 '+'	=>	'%2B',
2728
+								 ));
2729
+	}
2730 2730
 
2731
-    /**
2732
-     * private version of PHP urldecode
2733
-     *
2734
-     * not really needed but added for completenes
2735
-     *
2736
-     * @param  string  URL to decode
2737
-     * @return string  decoded URL
2738
-     */
2739
-    public static function _urldecode($path)
2740
-    {
2741
-        return rawurldecode($path);
2742
-    }
2731
+	/**
2732
+	 * private version of PHP urldecode
2733
+	 *
2734
+	 * not really needed but added for completenes
2735
+	 *
2736
+	 * @param  string  URL to decode
2737
+	 * @return string  decoded URL
2738
+	 */
2739
+	public static function _urldecode($path)
2740
+	{
2741
+		return rawurldecode($path);
2742
+	}
2743 2743
 
2744
-    /**
2745
-     * Encode a hierarchical properties like:
2746
-     *
2747
- 	 * <D:supported-report-set>
2744
+	/**
2745
+	 * Encode a hierarchical properties like:
2746
+	 *
2747
+	 * <D:supported-report-set>
2748 2748
 	 *    <supported-report>
2749 2749
 	 *       <report>
2750 2750
 	 *          <addressbook-query xmlns='urn:ietf:params:xml:ns:carddav'/>
@@ -2756,60 +2756,60 @@  discard block
 block discarded – undo
2756 2756
 	 *       </report>
2757 2757
 	 *    </supported-report>
2758 2758
 	 * </D:supported-report-set>
2759
-     *
2760
-     * @param array $props
2761
-     * @param string $ns
2762
-     * @param strin $ns_defs
2763
-     * @param array $ns_hash
2764
-     * @return string
2765
-     */
2759
+	 *
2760
+	 * @param array $props
2761
+	 * @param string $ns
2762
+	 * @param strin $ns_defs
2763
+	 * @param array $ns_hash
2764
+	 * @return string
2765
+	 */
2766 2766
 	function _hierarchical_prop_encode(array $props, $ns, &$ns_defs, array &$ns_hash)
2767
-    {
2768
-    	$ret = '';
2767
+	{
2768
+		$ret = '';
2769 2769
 
2770
-    	//error_log(__METHOD__.'('.array2string($props).')');
2771
-    	if (isset($props['name'])) $props = array($props);
2770
+		//error_log(__METHOD__.'('.array2string($props).')');
2771
+		if (isset($props['name'])) $props = array($props);
2772 2772
 
2773
-    	foreach($props as $prop)
2773
+		foreach($props as $prop)
2774 2774
 		{
2775
-	    	if (!isset($ns_hash[$prop['ns']])) // unknown namespace
2776
-	    	{
2777
-		    	// register namespace
2778
-		    	$ns_name = 'ns'.(count($ns_hash) + 1);
2779
-		    	$ns_hash[$prop['ns']] = $ns_name;
2780
-		    	$ns_defs .= ' xmlns:'.$ns_name.'="'.$prop['ns'].'"';
2781
-	    	}
2782
-	    	if (is_array($prop['val']))
2783
-	    	{
2784
-	    		$subprop = $prop['val'];
2785
-		    	if (isset($subprop['ns']) || isset($subprop[0]['ns']))
2786
-		    	{
2787
-			    	$ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2775
+			if (!isset($ns_hash[$prop['ns']])) // unknown namespace
2776
+			{
2777
+				// register namespace
2778
+				$ns_name = 'ns'.(count($ns_hash) + 1);
2779
+				$ns_hash[$prop['ns']] = $ns_name;
2780
+				$ns_defs .= ' xmlns:'.$ns_name.'="'.$prop['ns'].'"';
2781
+			}
2782
+			if (is_array($prop['val']))
2783
+			{
2784
+				$subprop = $prop['val'];
2785
+				if (isset($subprop['ns']) || isset($subprop[0]['ns']))
2786
+				{
2787
+					$ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2788 2788
 						(empty($prop['val']) ? '/>' : '>'.$this->_hierarchical_prop_encode($prop['val'], $prop['ns'], $ns_defs, $ns_hash).
2789 2789
 						'</'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>');
2790
-		    	}
2791
-		    	else // val contains only attributes, no value
2792
-		    	{
2793
-			    	$vals = '';
2790
+				}
2791
+				else // val contains only attributes, no value
2792
+				{
2793
+					$vals = '';
2794 2794
 
2795
-			    	foreach($subprop as $attr => $val)
2795
+					foreach($subprop as $attr => $val)
2796 2796
 					{
2797
-				    	$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
2797
+						$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
2798 2798
 					}
2799 2799
 
2800
-		             $ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2801
-				    	$vals .'/>';
2802
-		    	}
2803
-	    	}
2804
-	    	else
2805
-	    	{
2806
-		    	if (empty($prop['val']))
2807
-		    	{
2808
-			    	$val = '';
2809
-		    	}
2810
-		    	else
2811
-		    	{
2812
-			    	if(isset($prop['raw']))
2800
+					 $ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2801
+						$vals .'/>';
2802
+				}
2803
+			}
2804
+			else
2805
+			{
2806
+				if (empty($prop['val']))
2807
+				{
2808
+					$val = '';
2809
+				}
2810
+				else
2811
+				{
2812
+					if(isset($prop['raw']))
2813 2813
 					{
2814 2814
 						$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
2815 2815
 					} else {
@@ -2820,32 +2820,32 @@  discard block
 block discarded – undo
2820 2820
 							$val = $this->_urlencode($val);
2821 2821
 						}
2822 2822
 					}
2823
-		    	}
2823
+				}
2824 2824
 
2825
-		    	$ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2826
-			    	(empty($prop['val']) ? ' />' : '>'.$val.'</'.
2827
-			    	($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>');
2828
-	    	}
2825
+				$ret .= '<'.($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : $ns_hash[$prop['ns']].':').$prop['name'].
2826
+					(empty($prop['val']) ? ' />' : '>'.$val.'</'.
2827
+					($prop['ns'] == $ns ? ($this->crrnd ? '' : $ns_hash[$ns].':') : ($this->crrnd ? '' : $ns_hash[$prop['ns']].':')).$prop['name'].'>');
2828
+			}
2829 2829
 		}
2830 2830
 
2831
-    	//error_log(__METHOD__.'('.array2string($props).") crrnd=$this->crrnd returning ".array2string($ret));
2832
-    	return $ret;
2833
-    }
2831
+		//error_log(__METHOD__.'('.array2string($props).") crrnd=$this->crrnd returning ".array2string($ret));
2832
+		return $ret;
2833
+	}
2834 2834
 
2835
-    /**
2836
-     * UTF-8 encode property values if not already done so
2837
-     *
2838
-     * @param  string  text to encode
2839
-     * @return string  utf-8 encoded text
2840
-     */
2841
-    function _prop_encode($text)
2842
-    {
2835
+	/**
2836
+	 * UTF-8 encode property values if not already done so
2837
+	 *
2838
+	 * @param  string  text to encode
2839
+	 * @return string  utf-8 encoded text
2840
+	 */
2841
+	function _prop_encode($text)
2842
+	{
2843 2843
 		//error_log( __METHOD__."\n" .print_r($text,true));
2844 2844
 		//error_log("prop-encode:" . print_r($this->_prop_encoding,true));
2845 2845
 
2846 2846
 		switch (strtolower($this->_prop_encoding)) {
2847 2847
 			case "utf-8":
2848
-       			//error_log( __METHOD__."allready encoded\n" .print_r($text,true));
2848
+	   			//error_log( __METHOD__."allready encoded\n" .print_r($text,true));
2849 2849
 				return $text;
2850 2850
 			case "iso-8859-1":
2851 2851
 			case "iso-8859-15":
@@ -2853,75 +2853,75 @@  discard block
 block discarded – undo
2853 2853
 			default:
2854 2854
 				error_log( __METHOD__."utf8 encode\n" .print_r(utf8_encode($text),true));
2855 2855
 				return utf8_encode($text);
2856
-        }
2857
-    }
2856
+		}
2857
+	}
2858 2858
 
2859
-    /**
2860
-     * Slashify - make sure path ends in a slash
2861
-     *
2862
-     * @param   string directory path
2863
-     * @returns string directory path wiht trailing slash
2864
-     */
2865
-    public static function _slashify($path)
2866
-    {
2859
+	/**
2860
+	 * Slashify - make sure path ends in a slash
2861
+	 *
2862
+	 * @param   string directory path
2863
+	 * @returns string directory path wiht trailing slash
2864
+	 */
2865
+	public static function _slashify($path)
2866
+	{
2867 2867
 		//error_log(__METHOD__." called with $path");
2868 2868
 		if ($path[self::bytes($path)-1] != '/') {
2869 2869
 			//error_log(__METHOD__." added slash at the end of path");
2870 2870
 			$path = $path."/";
2871 2871
 		}
2872 2872
 		return $path;
2873
-    }
2873
+	}
2874 2874
 
2875
-    /**
2876
-     * Unslashify - make sure path doesn't in a slash
2877
-     *
2878
-     * @param   string directory path
2879
-     * @returns string directory path wihtout trailing slash
2880
-     */
2881
-    public static function _unslashify($path)
2882
-    {
2883
-        //error_log(__METHOD__." called with $path");
2884
-        if ($path[self::bytes($path)-1] == '/') {
2885
-            $path = substr($path, 0, -1);
2875
+	/**
2876
+	 * Unslashify - make sure path doesn't in a slash
2877
+	 *
2878
+	 * @param   string directory path
2879
+	 * @returns string directory path wihtout trailing slash
2880
+	 */
2881
+	public static function _unslashify($path)
2882
+	{
2883
+		//error_log(__METHOD__." called with $path");
2884
+		if ($path[self::bytes($path)-1] == '/') {
2885
+			$path = substr($path, 0, -1);
2886 2886
 			//error_log(__METHOD__." removed slash at the end of path");
2887
-        }
2888
-        return $path;
2889
-    }
2887
+		}
2888
+		return $path;
2889
+	}
2890 2890
 
2891
-    /**
2892
-     * Merge two paths, make sure there is exactly one slash between them
2893
-     *
2894
-     * @param  string  parent path
2895
-     * @param  string  child path
2896
-     * @return string  merged path
2897
-     */
2898
-    public static function _mergePaths($parent, $child)
2899
-    {
2900
-        //error_log("merge called :\n$parent \n$child\n" . function_backtrace());
2901
-        //error_log("merge :\n".print_r($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)true));
2902
-        if ($child{0} == '/') {
2903
-            return self::_unslashify($parent).$child;
2904
-        } else {
2905
-            return self::_slashify($parent).$child;
2906
-        }
2907
-    }
2891
+	/**
2892
+	 * Merge two paths, make sure there is exactly one slash between them
2893
+	 *
2894
+	 * @param  string  parent path
2895
+	 * @param  string  child path
2896
+	 * @return string  merged path
2897
+	 */
2898
+	public static function _mergePaths($parent, $child)
2899
+	{
2900
+		//error_log("merge called :\n$parent \n$child\n" . function_backtrace());
2901
+		//error_log("merge :\n".print_r($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)true));
2902
+		if ($child{0} == '/') {
2903
+			return self::_unslashify($parent).$child;
2904
+		} else {
2905
+			return self::_slashify($parent).$child;
2906
+		}
2907
+	}
2908 2908
 
2909
-    /**
2910
-     * mbstring.func_overload save strlen version: counting the bytes not the chars
2911
-     *
2912
-     * @param string $str
2913
-     * @return int
2914
-     */
2915
-    public static function bytes($str)
2916
-    {
2917
-    	static $func_overload=null;
2918
-
2919
-    	if (is_null($func_overload))
2920
-    	{
2921
-    		$func_overload = @extension_loaded('mbstring') ? ini_get('mbstring.func_overload') : 0;
2922
-    	}
2923
-    	return $func_overload & 2 ? mb_strlen($str,'ascii') : strlen($str);
2924
-    }
2909
+	/**
2910
+	 * mbstring.func_overload save strlen version: counting the bytes not the chars
2911
+	 *
2912
+	 * @param string $str
2913
+	 * @return int
2914
+	 */
2915
+	public static function bytes($str)
2916
+	{
2917
+		static $func_overload=null;
2918
+
2919
+		if (is_null($func_overload))
2920
+		{
2921
+			$func_overload = @extension_loaded('mbstring') ? ini_get('mbstring.func_overload') : 0;
2922
+		}
2923
+		return $func_overload & 2 ? mb_strlen($str,'ascii') : strlen($str);
2924
+	}
2925 2925
 }
2926 2926
 
2927 2927
 /*
Please login to merge, or discard this patch.
Braces   +704 added lines, -290 removed lines patch added patch discarded remove patch
@@ -196,7 +196,8 @@  discard block
 block discarded – undo
196 196
     function ServeRequest($prefix=null)
197 197
     {
198 198
         // prevent warning in litmus check 'delete_fragment'
199
-        if (strstr($this->_SERVER["REQUEST_URI"], '#')) {
199
+        if (strstr($this->_SERVER["REQUEST_URI"], '#'))
200
+        {
200 201
             $this->http_status("400 Bad Request");
201 202
             return;
202 203
         }
@@ -221,7 +222,8 @@  discard block
 block discarded – undo
221 222
         $path_info_raw = substr($path_info, strlen($this->_SERVER["SCRIPT_NAME"]));
222 223
 
223 224
         // just in case the path came in empty ...
224
-        if (empty($path_info_raw)) {
225
+        if (empty($path_info_raw))
226
+        {
225 227
             $path_info_raw = "/";
226 228
         }
227 229
 
@@ -245,28 +247,36 @@  discard block
 block discarded – undo
245 247
         	'#' => '%23',
246 248
         	'?' => '%3F',
247 249
         ));
248
-        if (!strlen($this->path)) {
249
-            if ($this->_SERVER["REQUEST_METHOD"] == "GET") {
250
+        if (!strlen($this->path))
251
+        {
252
+            if ($this->_SERVER["REQUEST_METHOD"] == "GET")
253
+            {
250 254
                 // redirect clients that try to GET a collection
251 255
                 // WebDAV clients should never try this while
252 256
                 // regular HTTP clients might ...
253 257
                 header("Location: ".$this->base_uri."/");
254 258
                 return;
255
-            } else {
259
+            }
260
+            else
261
+            {
256 262
                 // if a WebDAV client didn't give a path we just assume '/'
257 263
                 $this->path = "/";
258 264
             }
259 265
         }
260 266
 
261
-        if (ini_get("magic_quotes_gpc")) {
267
+        if (ini_get("magic_quotes_gpc"))
268
+        {
262 269
             $this->path = stripslashes($this->path);
263 270
         }
264 271
 
265 272
 
266 273
         // identify ourselves
267
-        if (empty($this->dav_powered_by)) {
274
+        if (empty($this->dav_powered_by))
275
+        {
268 276
             header("X-Dav-Powered-By: PHP class: ".get_class($this));
269
-        } else {
277
+        }
278
+        else
279
+        {
270 280
             header("X-Dav-Powered-By: ".$this->dav_powered_by);
271 281
         }
272 282
 
@@ -274,7 +284,8 @@  discard block
 block discarded – undo
274 284
         // for the motivation for not checking OPTIONS requests on / see
275 285
         // http://pear.php.net/bugs/bug.php?id=5363
276 286
         if ( (   !(($this->_SERVER['REQUEST_METHOD'] == 'OPTIONS') && ($this->path == "/")))
277
-             && (!$this->_check_auth())) {
287
+             && (!$this->_check_auth()))
288
+        {
278 289
             // RFC2518 says we must use Digest instead of Basic
279 290
             // but Microsoft Clients do not support Digest
280 291
             // and we don't support NTLM and Kerberos
@@ -289,7 +300,8 @@  discard block
 block discarded – undo
289 300
         }
290 301
 
291 302
         // check
292
-        if (! $this->_check_if_header_conditions()) {
303
+        if (! $this->_check_if_header_conditions())
304
+        {
293 305
             return;
294 306
         }
295 307
 
@@ -298,16 +310,24 @@  discard block
 block discarded – undo
298 310
         $wrapper = "http_".$method;
299 311
 
300 312
         // activate HEAD emulation by GET if no HEAD method found
301
-        if ($method == "head" && !method_exists($this, "head")) {
313
+        if ($method == "head" && !method_exists($this, "head"))
314
+        {
302 315
             $method = "get";
303 316
         }
304 317
 
305
-        if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method))) {
318
+        if (method_exists($this, $wrapper) && ($method == "options" || method_exists($this, $method)))
319
+        {
306 320
             $this->$wrapper();  // call method by name
307
-        } else { // method not found/implemented
308
-            if ($this->_SERVER["REQUEST_METHOD"] == "LOCK") {
321
+        }
322
+        else
323
+        {
324
+// method not found/implemented
325
+            if ($this->_SERVER["REQUEST_METHOD"] == "LOCK")
326
+            {
309 327
             	$error = '412 Precondition failed';
310
-            } else {
328
+            }
329
+            else
330
+            {
311 331
                 $error = '405 Method not allowed';
312 332
                 header("Allow: ".join(", ", $this->_allow()));  // tell client what's allowed
313 333
             }
@@ -612,12 +632,14 @@  discard block
 block discarded – undo
612 632
 
613 633
         // dav header
614 634
         $dav = array(1);        // assume we are always dav class 1 compliant
615
-        if (isset($allow['LOCK'])) {
635
+        if (isset($allow['LOCK']))
636
+        {
616 637
             $dav[] = 2;         // dav class 2 requires that locking is supported
617 638
         }
618 639
 
619 640
         // allow extending class to modify DAV and Allow headers
620
-		if (method_exists($this,'OPTIONS')) {
641
+		if (method_exists($this,'OPTIONS'))
642
+		{
621 643
 			$this->OPTIONS($this->path,$dav,$allow);
622 644
 		}
623 645
 
@@ -661,35 +683,52 @@  discard block
 block discarded – undo
661 683
         $options["path"] = $this->path;
662 684
 
663 685
         // search depth from header (default is "infinity)
664
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
686
+        if (isset($this->_SERVER['HTTP_DEPTH']))
687
+        {
665 688
             $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
666
-        } else {
689
+        }
690
+        else
691
+        {
667 692
             $options["depth"] = "infinity";
668 693
         }
669 694
 
670 695
         // analyze request payload
671 696
         $propinfo = new _parse_propfind("php://input", $this->store_request, $handler);
672
-        if ($this->store_request) $this->request = $propinfo->request;
673
-        if ($propinfo->error) {
697
+        if ($this->store_request)
698
+        {
699
+        	$this->request = $propinfo->request;
700
+        }
701
+        if ($propinfo->error)
702
+        {
674 703
             $this->http_status("400 Bad Request");
675
-			if (method_exists($this, 'log')) $this->log('Error parsing propfind: '.$propinfo->error);
704
+			if (method_exists($this, 'log'))
705
+			{
706
+				$this->log('Error parsing propfind: '.$propinfo->error);
707
+			}
676 708
             return;
677 709
         }
678 710
 		$options['root'] = $propinfo->root;
679 711
 		$options['props'] = $propinfo->props;
680 712
 		if ($propinfo->filters)
681
-			$options['filters'] = $propinfo->filters;
713
+		{
714
+					$options['filters'] = $propinfo->filters;
715
+		}
682 716
 		if ($propinfo->other)
683
-			$options['other'] = $propinfo->other;
717
+		{
718
+					$options['other'] = $propinfo->other;
719
+		}
684 720
 
685 721
         // call user handler
686
-        if (!($retval =$this->$handler($options, $files))) {
722
+        if (!($retval =$this->$handler($options, $files)))
723
+        {
687 724
             $files = array("files" => array());
688
-            if (method_exists($this, "checkLock")) {
725
+            if (method_exists($this, "checkLock"))
726
+            {
689 727
                 // is locked?
690 728
                 $lock = $this->checkLock($this->path);
691 729
 
692
-                if (is_array($lock) && count($lock)) {
730
+                if (is_array($lock) && count($lock))
731
+                {
693 732
                     $created          = isset($lock['created'])  ? $lock['created']  : time();
694 733
                     $modified         = isset($lock['modified']) ? $lock['modified'] : time();
695 734
                     $files['files'][] = array("path"  => self::_slashify($this->path),
@@ -703,7 +742,8 @@  discard block
 block discarded – undo
703 742
                 }
704 743
             }
705 744
 
706
-            if (empty($files['files'])) {
745
+            if (empty($files['files']))
746
+            {
707 747
                 $this->http_status("404 Not Found");
708 748
                 return;
709 749
             }
@@ -737,7 +777,8 @@  discard block
 block discarded – undo
737 777
         $allow = false;
738 778
 
739 779
         // allow extending class to modify DAV
740
-		if (method_exists($this,'OPTIONS')) {
780
+		if (method_exists($this,'OPTIONS'))
781
+		{
741 782
 			$this->OPTIONS($this->path,$dav,$allow);
742 783
 		}
743 784
         header("DAV: "  .join(", ", $dav));
@@ -776,8 +817,14 @@  discard block
 block discarded – undo
776 817
      */
777 818
     function multistatus_responses(&$files, $props, $initial_ns_hash=null, $initial_ns_defs=null)
778 819
     {
779
-    	if (!isset($initial_ns_hash)) $initial_ns_hash = array('DAV:' => 'D');
780
-    	if (!isset($initial_ns_defs)) $initial_ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"';
820
+    	if (!isset($initial_ns_hash))
821
+    	{
822
+    		$initial_ns_hash = array('DAV:' => 'D');
823
+    	}
824
+    	if (!isset($initial_ns_defs))
825
+    	{
826
+    		$initial_ns_defs = 'xmlns:ns0="urn:uuid:c2f41010-65b3-11d1-a29f-00aa00c14882/"';
827
+    	}
781 828
 
782 829
     	// using an ArrayIterator to prevent foreach from copying the array,
783 830
         // as we cant loop by reference, when an iterator is given in $files
@@ -791,10 +838,12 @@  discard block
 block discarded – undo
791 838
         	isset($this->_SERVER['HTTP_PREFER']) && in_array('depth-noroot', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER']));
792 839
 
793 840
         // now we loop over all returned file entries
794
-        foreach ($files as $file) {
841
+        foreach ($files as $file)
842
+        {
795 843
 
796 844
         	// skip first element (root), if requested by Prefer: depth-noroot
797
-        	if ($skip_root) {
845
+        	if ($skip_root)
846
+        	{
798 847
         		$skip_root = false;
799 848
         		continue;
800 849
         	}
@@ -806,17 +855,20 @@  discard block
 block discarded – undo
806 855
 	        $ns_defs = $initial_ns_defs;
807 856
 
808 857
             // nothing to do if no properties were returend for a file
809
-			if (isset($file["props"]) && is_array($file["props"])) {
858
+			if (isset($file["props"]) && is_array($file["props"]))
859
+			{
810 860
 
811 861
 	            // now loop over all returned properties
812
-	            foreach ($file["props"] as &$prop) {
862
+	            foreach ($file["props"] as &$prop)
863
+	            {
813 864
 	                // as a convenience feature we do not require that user handlers
814 865
 	                // restrict returned properties to the requested ones
815 866
 	                // here we strip all unrequested entries out of the response
816 867
 
817 868
 	            	// this can happen if we have allprop and prop in one propfind:
818 869
 	            	// <allprop /><prop><blah /></prop>, eg. blah is not automatic returned by allprop
819
-	                switch(is_array($props) ? $props[0] : $props) {
870
+	                switch(is_array($props) ? $props[0] : $props)
871
+	                {
820 872
 	                case "all":
821 873
 	                    // nothing to remove
822 874
 	                    break;
@@ -831,16 +883,19 @@  discard block
 block discarded – undo
831 883
 	                    $found = false;
832 884
 
833 885
 	                    // search property name in requested properties
834
-	                    foreach ((array)$props as $reqprop) {
886
+	                    foreach ((array)$props as $reqprop)
887
+	                    {
835 888
 	                        if (   $reqprop["name"]  == $prop["name"]
836
-	                               && @$reqprop["xmlns"] == $prop["ns"]) {
889
+	                               && @$reqprop["xmlns"] == $prop["ns"])
890
+	                        {
837 891
 	                            $found = true;
838 892
 	                            break;
839 893
 	                        }
840 894
 	                    }
841 895
 
842 896
 	                    // unset property and continue with next one if not found/requested
843
-	                    if (!$found) {
897
+	                    if (!$found)
898
+	                    {
844 899
 	                        $prop="";
845 900
 	                        continue(2);
846 901
 	                    }
@@ -848,10 +903,18 @@  discard block
 block discarded – undo
848 903
 	                }
849 904
 
850 905
 	                // namespace handling
851
-	                if (empty($prop["ns"])) continue; // no namespace
906
+	                if (empty($prop["ns"]))
907
+	                {
908
+	                	continue;
909
+	                }
910
+	                // no namespace
852 911
 	                $ns = $prop["ns"];
853 912
 	                //if ($ns == "DAV:") continue; // default namespace
854
-	                if (isset($ns_hash[$ns])) continue; // already known
913
+	                if (isset($ns_hash[$ns]))
914
+	                {
915
+	                	continue;
916
+	                }
917
+	                // already known
855 918
 
856 919
 	                // register namespace
857 920
 	                $ns_name = "ns".(count($ns_hash) + 1);
@@ -861,37 +924,50 @@  discard block
 block discarded – undo
861 924
 
862 925
 	            // we also need to add empty entries for properties that were requested
863 926
 	            // but for which no values where returned by the user handler
864
-	            if (is_array($props)) {
865
-	                foreach ($props as $reqprop) {
866
-	                    if (!is_array($reqprop) || $reqprop['name']=="") continue; // skip empty entries, or 'all' if <allprop /> used together with <prop>
927
+	            if (is_array($props))
928
+	            {
929
+	                foreach ($props as $reqprop)
930
+	                {
931
+	                    if (!is_array($reqprop) || $reqprop['name']=="")
932
+	                    {
933
+	                    	continue;
934
+	                    }
935
+	                    // skip empty entries, or 'all' if <allprop /> used together with <prop>
867 936
 
868 937
 	                    $found = false;
869 938
 
870 939
 	                    // check if property exists in result
871
-	                    foreach ($file["props"] as &$prop) {
940
+	                    foreach ($file["props"] as &$prop)
941
+	                    {
872 942
 	                        if (is_array($prop) && $reqprop["name"] == $prop["name"]
873
-	                               && @$reqprop["xmlns"] == $prop["ns"]) {
943
+	                               && @$reqprop["xmlns"] == $prop["ns"])
944
+	                        {
874 945
 	                            $found = true;
875 946
 	                            break;
876 947
 	                        }
877 948
 	                    }
878 949
 
879
-	                    if (!$found) {
880
-	                        if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery") {
950
+	                    if (!$found)
951
+	                    {
952
+	                        if ($reqprop["xmlns"]==="DAV:" && $reqprop["name"]==="lockdiscovery")
953
+	                        {
881 954
 	                            // lockdiscovery is handled by the base class
882 955
 	                            $file["props"][]
883 956
 	                                = $this->mkprop("DAV:",
884 957
 	                                                "lockdiscovery",
885 958
 	                                                $this->lockdiscovery($file['path']));
886 959
 	                        // only collect $file['noprops'] if we have NO Brief: t and NO Prefer: return=minimal HTTP Header
887
-	                        } elseif ((!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') &&
888
-	                        	(!isset($this->_SERVER['HTTP_PREFER']) || !in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER'])))) {
960
+	                        }
961
+	                        elseif ((!isset($this->_SERVER['HTTP_BRIEF']) || $this->_SERVER['HTTP_BRIEF'] != 't') &&
962
+	                        	(!isset($this->_SERVER['HTTP_PREFER']) || !in_array('return=minimal', preg_split('/, ?/', $this->_SERVER['HTTP_PREFER']))))
963
+	                        {
889 964
 	                            // add empty value for this property
890 965
 	                            $file["noprops"][] =
891 966
 	                                $this->mkprop($reqprop["xmlns"], $reqprop["name"], "");
892 967
 
893 968
 	                            // register property namespace if not known yet
894
-	                            if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]])) {
969
+	                            if ($reqprop["xmlns"] != "DAV:" && !isset($ns_hash[$reqprop["xmlns"]]))
970
+	                            {
895 971
 	                                $ns_name = "ns".(count($ns_hash) + 1);
896 972
 	                                $ns_hash[$reqprop["xmlns"]] = $ns_name;
897 973
 	                                $ns_defs .= " xmlns:$ns_name=\"$reqprop[xmlns]\"";
@@ -902,9 +978,15 @@  discard block
 block discarded – undo
902 978
 	            }
903 979
 	        }
904 980
             // ignore empty or incomplete entries
905
-            if (!is_array($file) || empty($file) || !isset($file["path"])) continue;
981
+            if (!is_array($file) || empty($file) || !isset($file["path"]))
982
+            {
983
+            	continue;
984
+            }
906 985
             $path = $file['path'];
907
-            if (!is_string($path) || $path==="") continue;
986
+            if (!is_string($path) || $path==="")
987
+            {
988
+            	continue;
989
+            }
908 990
 
909 991
             if ($this->crrnd)
910 992
             {
@@ -933,38 +1015,56 @@  discard block
 block discarded – undo
933 1015
             }
934 1016
 
935 1017
             // report all found properties and their values (if any)
936
-            if (isset($file["props"]) && is_array($file["props"])) {
1018
+            if (isset($file["props"]) && is_array($file["props"]))
1019
+            {
937 1020
                 echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
938 1021
                 echo '    <'.($this->crrnd?'':'D:')."prop>\n";
939 1022
 
940
-                foreach ($file["props"] as &$prop) {
1023
+                foreach ($file["props"] as &$prop)
1024
+                {
941 1025
 
942
-                    if (!is_array($prop)) continue;
943
-                    if (!isset($prop["name"])) continue;
1026
+                    if (!is_array($prop))
1027
+                    {
1028
+                    	continue;
1029
+                    }
1030
+                    if (!isset($prop["name"]))
1031
+                    {
1032
+                    	continue;
1033
+                    }
944 1034
 
945
-                    if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false) {
1035
+                    if (!isset($prop["val"]) || $prop["val"] === "" || $prop["val"] === false)
1036
+                    {
946 1037
                         // empty properties (cannot use empty() for check as "0" is a legal value here)
947
-                        if ($prop["ns"]=="DAV:") {
1038
+                        if ($prop["ns"]=="DAV:")
1039
+                        {
948 1040
                             echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
949
-                        } else if (!empty($prop["ns"])) {
1041
+                        }
1042
+                        else if (!empty($prop["ns"]))
1043
+                        {
950 1044
                             echo "     <".$ns_hash[$prop["ns"]].":$prop[name]/>\n";
951
-                        } else {
1045
+                        }
1046
+                        else
1047
+                        {
952 1048
                             echo "     <$prop[name] xmlns=\"\"/>";
953 1049
                         }
954 1050
                     }
955 1051
                     // multiple level of responses required for expand-property reports
956 1052
                     elseif(isset($prop['props']) && is_array($prop['val']))
957 1053
                     {
958
-                        if ($prop['ns'] && !isset($ns_hash[$prop['ns']])) {
1054
+                        if ($prop['ns'] && !isset($ns_hash[$prop['ns']]))
1055
+                        {
959 1056
                             $ns_name = "ns".(count($ns_hash) + 1);
960 1057
                             $ns_hash[$prop['ns']] = $ns_name;
961 1058
                         }
962 1059
                     	echo '     <'.$ns_hash[$prop['ns']].":$prop[name]>\n";
963 1060
                         $this->multistatus_responses($prop['val'], $prop['props'], $ns_hash, '');
964 1061
                     	echo '     </'.$ns_hash[$prop['ns']].":$prop[name]>\n";
965
-                    } else if ($prop["ns"] == "DAV:") {
1062
+                    }
1063
+                    else if ($prop["ns"] == "DAV:")
1064
+                    {
966 1065
                         // some WebDAV properties need special treatment
967
-                        switch ($prop["name"]) {
1066
+                        switch ($prop["name"])
1067
+                        {
968 1068
                         case "creationdate":
969 1069
                             echo '     <'.($this->crrnd?'':'D:')."creationdate ns0:dt=\"dateTime.tz\">"
970 1070
                                 . gmdate("Y-m-d\\TH:i:s\\Z", $prop['val'])
@@ -1000,40 +1100,57 @@  discard block
 block discarded – undo
1000 1100
                             {
1001 1101
                             	$hns_hash = $ns_hash;
1002 1102
                             	$val = $this->_hierarchical_prop_encode($prop['val'], 'DAV:', $ns_defs, $hns_hash);
1003
-                            } elseif (isset($prop['raw'])) {
1103
+                            }
1104
+                            elseif (isset($prop['raw']))
1105
+                            {
1004 1106
                             	$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
1005
-                            } else {
1107
+                            }
1108
+                            else
1109
+                            {
1006 1110
 	                    		$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8'));
1007 1111
                             }
1008 1112
 	                        echo '     <'.($this->crrnd?'':'D:')."$prop[name]$ns_defs>$val".
1009 1113
 	                        	'</'.($this->crrnd?'':'D:')."$prop[name]>\n";
1010 1114
                             break;
1011 1115
                         }
1012
-                    } else {
1116
+                    }
1117
+                    else
1118
+                    {
1013 1119
                         // allow multiple values and attributes, required eg. for caldav:supported-calendar-component-set
1014
-                        if ($prop['ns'] && is_array($prop['val'])) {
1015
-                    		if (!isset($ns_hash[$prop['ns']])) {
1120
+                        if ($prop['ns'] && is_array($prop['val']))
1121
+                        {
1122
+                    		if (!isset($ns_hash[$prop['ns']]))
1123
+                    		{
1016 1124
                                 $ns_name = "ns".(count($ns_hash) + 1);
1017 1125
                                 $ns_hash[$prop['ns']] = $ns_name;
1018 1126
                     		}
1019 1127
                   			$vals = $extra_ns = '';
1020 1128
                     		foreach($prop['val'] as $subprop)
1021 1129
                     		{
1022
-                    			if ($subprop['ns'] && $subprop['ns'] != 'DAV:') {
1130
+                    			if ($subprop['ns'] && $subprop['ns'] != 'DAV:')
1131
+                    			{
1023 1132
 		                    		// register property namespace if not known yet
1024
-		                    		if (!isset($ns_hash[$subprop['ns']])) {
1133
+		                    		if (!isset($ns_hash[$subprop['ns']]))
1134
+		                    		{
1025 1135
 			                    		$ns_name = "ns".(count($ns_hash) + 1);
1026 1136
 			                    		$ns_hash[$subprop['ns']] = $ns_name;
1027
-		                    		} else {
1137
+		                    		}
1138
+		                    		else
1139
+		                    		{
1028 1140
 			                    		$ns_name = $ns_hash[$subprop['ns']];
1029 1141
 		                    		}
1030
-		                    		if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false) {
1142
+		                    		if (strchr($extra_ns,$extra=' xmlns:'.$ns_name.'="'.$subprop['ns'].'"') === false)
1143
+		                    		{
1031 1144
 			                    		$extra_ns .= $extra;
1032 1145
 		                    		}
1033 1146
 		                    		$ns_name .= ':';
1034
-	                    		} elseif ($subprop['ns'] == 'DAV:') {
1147
+	                    		}
1148
+	                    		elseif ($subprop['ns'] == 'DAV:')
1149
+	                    		{
1035 1150
 		                    		$ns_name = 'D:';
1036
-	                    		} else {
1151
+	                    		}
1152
+	                    		else
1153
+	                    		{
1037 1154
 		                    		$ns_name = '';
1038 1155
 	                    		}
1039 1156
 	                    		$vals .= "<$ns_name$subprop[name]";
@@ -1048,7 +1165,7 @@  discard block
 block discarded – undo
1048 1165
 	                    			else	// val contains only attributes, no value
1049 1166
 	                    			{
1050 1167
 			                    		foreach($subprop['val'] as $attr => $val)
1051
-										{
1168
+			                    		{
1052 1169
 				                    		$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
1053 1170
 										}
1054 1171
 			                    		$vals .= '/>';
@@ -1057,34 +1174,50 @@  discard block
 block discarded – undo
1057 1174
 	                    		else
1058 1175
 	                    		{
1059 1176
 	                    			$vals .= '>';
1060
-	                    			if (isset($subprop['raw'])) {
1177
+	                    			if (isset($subprop['raw']))
1178
+	                    			{
1061 1179
 	                    				$vals .= '<![CDATA['.$subprop['val'].']]>';
1062
-	                    			} else {
1063
-	                    				if($subprop['name'] == 'href') $subprop['val'] = $this->_urlencode($subprop['val']);
1180
+	                    			}
1181
+	                    			else
1182
+	                    			{
1183
+	                    				if($subprop['name'] == 'href')
1184
+	                    				{
1185
+	                    					$subprop['val'] = $this->_urlencode($subprop['val']);
1186
+	                    				}
1064 1187
 		                    			$vals .= htmlspecialchars($subprop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1065 1188
 	                    			}
1066 1189
 	                    			$vals .= "</$ns_name$subprop[name]>";
1067 1190
 	                    		}
1068 1191
                     		}
1069 1192
                     		echo '     <'.$ns_hash[$prop['ns']].":$prop[name]$extra_ns>$vals</".$ns_hash[$prop['ns']].":$prop[name]>\n";
1070
-                        } else {
1193
+                        }
1194
+                        else
1195
+                        {
1071 1196
                         	if ($prop['raw'])
1072 1197
                         	{
1073 1198
                         		$val = '<![CDATA['.$prop['val'].']]>';
1074
-                        	} else {
1199
+                        	}
1200
+                        	else
1201
+                        	{
1075 1202
                         		$val = htmlspecialchars($prop['val'], ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8');
1076 1203
                         	}
1077 1204
                         	$val = $this->_prop_encode($val);
1078 1205
 	                        // properties from namespaces != "DAV:" or without any namespace
1079
-	                        if ($prop['ns']) {
1080
-		                        if ($this->crrnd) {
1206
+	                        if ($prop['ns'])
1207
+	                        {
1208
+		                        if ($this->crrnd)
1209
+		                        {
1081 1210
 			                        echo "     <$prop[name] xmlns=".'"'.$prop["ns"].'">'
1082 1211
 									. $val . "</$prop[name]>\n";
1083
-		                        } else {
1212
+		                        }
1213
+		                        else
1214
+		                        {
1084 1215
 			                        echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]>"
1085 1216
 									. $val . '</'.$ns_hash[$prop['ns']].":$prop[name]>\n";
1086 1217
 		                        }
1087
-	                        } else {
1218
+	                        }
1219
+	                        else
1220
+	                        {
1088 1221
 		                        echo "     <$prop[name] xmlns=\"\">$val</$prop[name]>\n";
1089 1222
 	                        }
1090 1223
                         }
@@ -1106,16 +1239,23 @@  discard block
 block discarded – undo
1106 1239
             }
1107 1240
 
1108 1241
             // now report all properties requested but not found
1109
-            if (isset($file["noprops"])) {
1242
+            if (isset($file["noprops"]))
1243
+            {
1110 1244
                 echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1111 1245
                 echo '    <'.($this->crrnd?'':'D:')."prop>\n";
1112 1246
 
1113
-                foreach ($file["noprops"] as &$prop) {
1114
-                    if ($prop["ns"] == "DAV:") {
1247
+                foreach ($file["noprops"] as &$prop)
1248
+                {
1249
+                    if ($prop["ns"] == "DAV:")
1250
+                    {
1115 1251
                         echo '     <'.($this->crrnd?'':'D:')."$prop[name]/>\n";
1116
-                    } else if ($prop["ns"] == "") {
1252
+                    }
1253
+                    else if ($prop["ns"] == "")
1254
+                    {
1117 1255
                         echo "     <$prop[name] xmlns=\"\"/>\n";
1118
-                    } else {
1256
+                    }
1257
+                    else
1258
+                    {
1119 1259
                         echo "     <" . $ns_hash[$prop["ns"]] . ":$prop[name]/>\n";
1120 1260
                     }
1121 1261
                 }
@@ -1164,15 +1304,20 @@  discard block
 block discarded – undo
1164 1304
      */
1165 1305
     function http_PROPPATCH()
1166 1306
     {
1167
-        if ($this->_check_lock_status($this->path)) {
1307
+        if ($this->_check_lock_status($this->path))
1308
+        {
1168 1309
             $options = Array();
1169 1310
 
1170 1311
             $options["path"] = $this->path;
1171 1312
 
1172 1313
             $propinfo = new _parse_proppatch("php://input", $this->store_request);
1173
-            if ($this->store_request) $this->request = $propinfo->request;
1314
+            if ($this->store_request)
1315
+            {
1316
+            	$this->request = $propinfo->request;
1317
+            }
1174 1318
 
1175
-            if (!$propinfo->success) {
1319
+            if (!$propinfo->success)
1320
+            {
1176 1321
                 $this->http_status("400 Error");
1177 1322
                 return;
1178 1323
             }
@@ -1190,14 +1335,16 @@  discard block
 block discarded – undo
1190 1335
             echo ' <'.($this->crrnd?'':'D:')."response>\n";
1191 1336
             echo '  <'.($this->crrnd?'':'D:')."href>".$this->_urlencode($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)).'</'.($this->crrnd?'':'D:')."href>\n";
1192 1337
 
1193
-            foreach ($options["props"] as $prop) {
1338
+            foreach ($options["props"] as $prop)
1339
+            {
1194 1340
                 echo '   <'.($this->crrnd?'':'D:')."propstat>\n";
1195 1341
                 echo '    <'.($this->crrnd?'':'D:')."prop><$prop[name] xmlns=\"$prop[ns]\"/></".($this->crrnd?'':'D:')."prop>\n";
1196 1342
                 echo '    <'.($this->crrnd?'':'D:')."status>HTTP/1.1 $prop[status]</".($this->crrnd?'':'D:')."status>\n";
1197 1343
                 echo '   </'.($this->crrnd?'':'D:')."propstat>\n";
1198 1344
             }
1199 1345
 
1200
-            if ($responsedescr) {
1346
+            if ($responsedescr)
1347
+            {
1201 1348
                 echo '  <'.($this->crrnd?'':'D:')."responsedescription>".
1202 1349
                     $this->_prop_encode(htmlspecialchars($responsedescr, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8')).
1203 1350
                     '</'.($this->crrnd?'':'D:')."responsedescription>\n";
@@ -1205,7 +1352,9 @@  discard block
 block discarded – undo
1205 1352
 
1206 1353
             echo ' </'.($this->crrnd?'':'D:')."response>\n";
1207 1354
             echo '</'.($this->crrnd?'':'D:')."multistatus>\n";
1208
-        } else {
1355
+        }
1356
+        else
1357
+        {
1209 1358
             $this->http_status("423 Locked");
1210 1359
         }
1211 1360
     }
@@ -1275,11 +1424,14 @@  discard block
 block discarded – undo
1275 1424
 
1276 1425
         $this->_get_ranges($options);
1277 1426
 
1278
-        if (true === ($status = $this->GET($options))) {
1279
-            if (!headers_sent()) {
1427
+        if (true === ($status = $this->GET($options)))
1428
+        {
1429
+            if (!headers_sent())
1430
+            {
1280 1431
                 $status = "200 OK";
1281 1432
 
1282
-                if (!isset($options['mimetype'])) {
1433
+                if (!isset($options['mimetype']))
1434
+                {
1283 1435
                     $options['mimetype'] = "application/octet-stream";
1284 1436
                 }
1285 1437
                 // switching off zlib.output_compression for everything but text files,
@@ -1291,7 +1443,8 @@  discard block
 block discarded – undo
1291 1443
                 }
1292 1444
                 header("Content-type: $options[mimetype]");
1293 1445
 
1294
-                if (isset($options['mtime'])) {
1446
+                if (isset($options['mtime']))
1447
+                {
1295 1448
                     header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1296 1449
                 }
1297 1450
                 // fix for IE and https, thanks to [email protected]
@@ -1300,55 +1453,82 @@  discard block
 block discarded – undo
1300 1453
 				header("Cache-Control: maxage=1"); //In seconds
1301 1454
 				header("Pragma: public");
1302 1455
 
1303
-                if (isset($options['stream'])) {
1456
+                if (isset($options['stream']))
1457
+                {
1304 1458
                     // GET handler returned a stream
1305
-                    if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET))) {
1459
+                    if (!empty($options['ranges']) && (0===fseek($options['stream'], 0, SEEK_SET)))
1460
+                    {
1306 1461
                         // partial request and stream is seekable
1307 1462
 
1308
-                        if (count($options['ranges']) === 1) {
1463
+                        if (count($options['ranges']) === 1)
1464
+                        {
1309 1465
                             $range = $options['ranges'][0];
1310 1466
 
1311
-                            if (isset($range['start'])) {
1467
+                            if (isset($range['start']))
1468
+                            {
1312 1469
                                 fseek($options['stream'], $range['start'], SEEK_SET);
1313
-                                if (feof($options['stream'])) {
1470
+                                if (feof($options['stream']))
1471
+                                {
1314 1472
                                     $this->http_status($status = "416 Requested range not satisfiable");
1315 1473
                                     return;
1316 1474
                                 }
1317 1475
 
1318
-                                if (!empty($range['end'])) {
1476
+                                if (!empty($range['end']))
1477
+                                {
1319 1478
                                     $size = $range['end']-$range['start']+1;
1320 1479
                                     $this->http_status($status = "206 Partial content");
1321
-                                    if (!self::use_compression()) header("Content-Length: $size");
1480
+                                    if (!self::use_compression())
1481
+                                    {
1482
+                                    	header("Content-Length: $size");
1483
+                                    }
1322 1484
                                     header("Content-Range: bytes $range[start]-$range[end]/"
1323 1485
                                            . (isset($options['size']) ? $options['size'] : "*"));
1324
-                                    while ($size > 0 && !feof($options['stream'])) {
1486
+                                    while ($size > 0 && !feof($options['stream']))
1487
+                                    {
1325 1488
                                         $buffer = fread($options['stream'], $size < 8192 ? $size : 8192);
1326 1489
                                         $size  -= self::bytes($buffer);
1327 1490
                                         echo $buffer;
1328 1491
                                     }
1329
-                                } else {
1492
+                                }
1493
+                                else
1494
+                                {
1330 1495
                                     $this->http_status($status = "206 Partial content");
1331
-                                    if (isset($options['size'])) {
1332
-                                        if (!self::use_compression()) header("Content-Length: ".($options['size'] - $range['start']));
1496
+                                    if (isset($options['size']))
1497
+                                    {
1498
+                                        if (!self::use_compression())
1499
+                                        {
1500
+                                        	header("Content-Length: ".($options['size'] - $range['start']));
1501
+                                        }
1333 1502
                                         header("Content-Range: bytes ".$range['start']."-".
1334 1503
 											(isset($options['size']) ? $options['size']-1 : "")."/"
1335 1504
 										   . (isset($options['size']) ? $options['size'] : "*"));
1336 1505
                                     }
1337 1506
                                     fpassthru($options['stream']);
1338 1507
                                 }
1339
-                            } else {
1340
-                                if (!self::use_compression()) header("Content-length: ".$range['last']);
1508
+                            }
1509
+                            else
1510
+                            {
1511
+                                if (!self::use_compression())
1512
+                                {
1513
+                                	header("Content-length: ".$range['last']);
1514
+                                }
1341 1515
                                 fseek($options['stream'], -$range['last'], SEEK_END);
1342 1516
                                 fpassthru($options['stream']);
1343 1517
                             }
1344
-                        } else {
1518
+                        }
1519
+                        else
1520
+                        {
1345 1521
                             $this->_multipart_byterange_header(); // init multipart
1346
-                            foreach ($options['ranges'] as $range) {
1522
+                            foreach ($options['ranges'] as $range)
1523
+                            {
1347 1524
                                 // TODO what if size unknown? 500?
1348
-                                if (isset($range['start'])) {
1525
+                                if (isset($range['start']))
1526
+                                {
1349 1527
                                     $from = $range['start'];
1350 1528
                                     $to   = !empty($range['end']) ? $range['end'] : $options['size']-1;
1351
-                                } else {
1529
+                                }
1530
+                                else
1531
+                                {
1352 1532
                                     $from = $options['size'] - $range['last']-1;
1353 1533
                                     $to   = $options['size'] -1;
1354 1534
                                 }
@@ -1358,7 +1538,8 @@  discard block
 block discarded – undo
1358 1538
 
1359 1539
 
1360 1540
                                 fseek($options['stream'], $from, SEEK_SET);
1361
-                                while ($size && !feof($options['stream'])) {
1541
+                                while ($size && !feof($options['stream']))
1542
+                                {
1362 1543
                                     $buffer = fread($options['stream'], 4096);
1363 1544
                                     $size  -= self::bytes($buffer);
1364 1545
                                     echo $buffer;
@@ -1366,29 +1547,44 @@  discard block
 block discarded – undo
1366 1547
                             }
1367 1548
                             $this->_multipart_byterange_header(); // end multipart
1368 1549
                         }
1369
-                    } else {
1550
+                    }
1551
+                    else
1552
+                    {
1370 1553
                         // normal request or stream isn't seekable, return full content
1371
-                        if (isset($options['size']) && !self::use_compression()) {
1554
+                        if (isset($options['size']) && !self::use_compression())
1555
+                        {
1372 1556
                             header("Content-Length: ".$options['size']);
1373 1557
                         }
1374 1558
                         fpassthru($options['stream']);
1375 1559
                         return; // no more headers
1376 1560
                     }
1377
-                } elseif (isset($options['data'])) {
1378
-                    if (is_array($options['data'])) {
1561
+                }
1562
+                elseif (isset($options['data']))
1563
+                {
1564
+                    if (is_array($options['data']))
1565
+                    {
1379 1566
                         // reply to partial request
1380
-                    } else {
1381
-                        if (!self::use_compression()) header("Content-Length: ".self::bytes($options['data']));
1567
+                    }
1568
+                    else
1569
+                    {
1570
+                        if (!self::use_compression())
1571
+                        {
1572
+                        	header("Content-Length: ".self::bytes($options['data']));
1573
+                        }
1382 1574
                         echo $options['data'];
1383 1575
                     }
1384 1576
                 }
1385 1577
             }
1386 1578
         }
1387 1579
 
1388
-        if (!headers_sent()) {
1389
-            if (false === $status) {
1580
+        if (!headers_sent())
1581
+        {
1582
+            if (false === $status)
1583
+            {
1390 1584
                 $this->http_status("404 not found");
1391
-            } else {
1585
+            }
1586
+            else
1587
+            {
1392 1588
                 // TODO: check setting of headers in various code paths above
1393 1589
                 $this->http_status("$status");
1394 1590
             }
@@ -1405,15 +1601,18 @@  discard block
 block discarded – undo
1405 1601
     function _get_ranges(&$options)
1406 1602
     {
1407 1603
         // process Range: header if present
1408
-        if (isset($this->_SERVER['HTTP_RANGE'])) {
1604
+        if (isset($this->_SERVER['HTTP_RANGE']))
1605
+        {
1409 1606
 
1410 1607
             // we only support standard "bytes" range specifications for now
1411 1608
 			$matches = null;
1412
-            if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches)) {
1609
+            if (preg_match('/bytes\s*=\s*(.+)/', $this->_SERVER['HTTP_RANGE'], $matches))
1610
+            {
1413 1611
                 $options["ranges"] = array();
1414 1612
 
1415 1613
                 // ranges are comma separated
1416
-                foreach (explode(",", $matches[1]) as $range) {
1614
+                foreach (explode(",", $matches[1]) as $range)
1615
+                {
1417 1616
                     // ranges are either from-to pairs or just end positions
1418 1617
                     list($start, $end) = explode("-", $range);
1419 1618
                     $options["ranges"][] = ($start==="")
@@ -1439,8 +1638,10 @@  discard block
 block discarded – undo
1439 1638
      */
1440 1639
     function _multipart_byterange_header($mimetype = false, $from = false, $to=false, $total=false)
1441 1640
     {
1442
-        if ($mimetype === false) {
1443
-            if (!isset($this->multipart_separator)) {
1641
+        if ($mimetype === false)
1642
+        {
1643
+            if (!isset($this->multipart_separator))
1644
+            {
1444 1645
                 // initial
1445 1646
 
1446 1647
                 // a little naive, this sequence *might* be part of the content
@@ -1449,13 +1650,17 @@  discard block
 block discarded – undo
1449 1650
 
1450 1651
                 // generate HTTP header
1451 1652
                 header("Content-type: multipart/byteranges; boundary=".$this->multipart_separator);
1452
-            } else {
1653
+            }
1654
+            else
1655
+            {
1453 1656
                 // final
1454 1657
 
1455 1658
                 // generate closing multipart sequence
1456 1659
                 echo "\n--{$this->multipart_separator}--";
1457 1660
             }
1458
-        } else {
1661
+        }
1662
+        else
1663
+        {
1459 1664
             // generate separator and header for next part
1460 1665
             echo "\n--{$this->multipart_separator}\n";
1461 1666
             echo "Content-type: $mimetype\n";
@@ -1482,32 +1687,45 @@  discard block
 block discarded – undo
1482 1687
         $options         = Array();
1483 1688
         $options["path"] = $this->path;
1484 1689
 
1485
-        if (method_exists($this, "HEAD")) {
1690
+        if (method_exists($this, "HEAD"))
1691
+        {
1486 1692
             $status = $this->head($options);
1487
-        } else if (method_exists($this, "GET")) {
1693
+        }
1694
+        else if (method_exists($this, "GET"))
1695
+        {
1488 1696
             ob_start();
1489 1697
             $status = $this->GET($options);
1490
-            if (!isset($options['size'])) {
1698
+            if (!isset($options['size']))
1699
+            {
1491 1700
                 $options['size'] = ob_get_length();
1492 1701
             }
1493 1702
             ob_end_clean();
1494 1703
         }
1495 1704
 
1496
-        if (!isset($options['mimetype'])) {
1705
+        if (!isset($options['mimetype']))
1706
+        {
1497 1707
             $options['mimetype'] = "application/octet-stream";
1498 1708
         }
1499 1709
         header("Content-type: $options[mimetype]");
1500 1710
 
1501
-        if (isset($options['mtime'])) {
1711
+        if (isset($options['mtime']))
1712
+        {
1502 1713
             header("Last-modified:".gmdate("D, d M Y H:i:s ", $options['mtime'])."GMT");
1503 1714
         }
1504 1715
 
1505
-        if (isset($options['size'])) {
1716
+        if (isset($options['size']))
1717
+        {
1506 1718
             header("Content-Length: ".$options['size']);
1507 1719
         }
1508 1720
 
1509
-        if ($status === true)  $status = "200 OK";
1510
-        if ($status === false) $status = "404 Not found";
1721
+        if ($status === true)
1722
+        {
1723
+        	$status = "200 OK";
1724
+        }
1725
+        if ($status === false)
1726
+        {
1727
+        	$status = "404 Not found";
1728
+        }
1511 1729
 
1512 1730
         $this->http_status($status);
1513 1731
     }
@@ -1533,21 +1751,25 @@  discard block
 block discarded – undo
1533 1751
 	        $options['content_length'] = $this->_SERVER['CONTENT_LENGTH'];
1534 1752
         }
1535 1753
         elseif (isset($this->_SERVER['X-Expected-Entity-Length']))
1536
-		{
1754
+        {
1537 1755
 	        // MacOS gives us that hint
1538 1756
 	        $options['content_length'] = $this->_SERVER['X-Expected-Entity-Length'];
1539 1757
 		}
1540 1758
 
1541 1759
         // get the Content-type
1542
-        if (isset($this->_SERVER["CONTENT_TYPE"])) {
1760
+        if (isset($this->_SERVER["CONTENT_TYPE"]))
1761
+        {
1543 1762
 	        // for now we do not support any sort of multipart requests
1544
-	        if (!strncmp($this->_SERVER["CONTENT_TYPE"], 'multipart/', 10)) {
1763
+	        if (!strncmp($this->_SERVER["CONTENT_TYPE"], 'multipart/', 10))
1764
+	        {
1545 1765
 		        $this->http_status('501 not implemented');
1546 1766
 		        echo 'The service does not support mulipart POST requests';
1547 1767
 		        return;
1548 1768
 	        }
1549 1769
 	        $options['content_type'] = $this->_SERVER['CONTENT_TYPE'];
1550
-        } else {
1770
+        }
1771
+        else
1772
+        {
1551 1773
 	        // default content type if none given
1552 1774
 	        $options['content_type'] = 'application/octet-stream';
1553 1775
         }
@@ -1558,7 +1780,7 @@  discard block
 block discarded – undo
1558 1780
     		case 'gzip':
1559 1781
     		case 'deflate':	//zlib
1560 1782
     			if (extension_loaded('zlib'))
1561
-     			{
1783
+    			{
1562 1784
       				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1563 1785
        			}
1564 1786
     	}
@@ -1579,15 +1801,23 @@  discard block
 block discarded – undo
1579 1801
          does not understand or implement and MUST return a 501
1580 1802
          (Not Implemented) response in such cases."
1581 1803
          */
1582
-        foreach ($this->_SERVER as $key => $val) {
1583
-	        if (strncmp($key, 'HTTP_CONTENT', 11)) continue;
1584
-	        switch ($key) {
1804
+        foreach ($this->_SERVER as $key => $val)
1805
+        {
1806
+	        if (strncmp($key, 'HTTP_CONTENT', 11))
1807
+	        {
1808
+	        	continue;
1809
+	        }
1810
+	        switch ($key)
1811
+	        {
1585 1812
 		        case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1586 1813
 		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1587 1814
 		        	{
1588 1815
 		        		case 'gzip':
1589 1816
 		        		case 'deflate':	//zlib
1590
-		        			if (extension_loaded('zlib')) break;
1817
+		        			if (extension_loaded('zlib'))
1818
+		        			{
1819
+		        				break;
1820
+		        			}
1591 1821
 		        			// fall through for no zlib support
1592 1822
 		        		default:
1593 1823
 					        $this->http_status('415 Unsupported Media Type');
@@ -1617,14 +1847,16 @@  discard block
 block discarded – undo
1617 1847
 			        // the header format is also specified in RFC 2616 14.16
1618 1848
 			        // TODO we have to ensure that implementations support this or send 501 instead
1619 1849
 					$matches = null;
1620
-			        if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
1850
+			        if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches))
1851
+			        {
1621 1852
 				        $this->http_status('400 bad request');
1622 1853
 				        echo 'The service does only support single byte ranges';
1623 1854
 				        return;
1624 1855
 			        }
1625 1856
 
1626 1857
 			        $range = array('start'=>$matches[1], 'end'=>$matches[2]);
1627
-			        if (is_numeric($matches[3])) {
1858
+			        if (is_numeric($matches[3]))
1859
+			        {
1628 1860
 				        $range['total_length'] = $matches[3];
1629 1861
 			        }
1630 1862
 			        $options['ranges'][] = $range;
@@ -1656,31 +1888,46 @@  discard block
 block discarded – undo
1656 1888
 	        }
1657 1889
         }
1658 1890
 
1659
-        if (method_exists($this, 'POST')) {
1891
+        if (method_exists($this, 'POST'))
1892
+        {
1660 1893
 	        $status = $this->POST($options);
1661 1894
 
1662
-	        if ($status === false) {
1895
+	        if ($status === false)
1896
+	        {
1663 1897
 		        $status = '400 Something went wrong';
1664
-	        } else if ($status === true) {
1898
+	        }
1899
+	        else if ($status === true)
1900
+	        {
1665 1901
 	        	$status = '200 OK';
1666
-	        } else if (is_resource($status) && get_resource_type($status) == 'stream') {
1902
+	        }
1903
+	        else if (is_resource($status) && get_resource_type($status) == 'stream')
1904
+	        {
1667 1905
 		        $stream = $status;
1668 1906
 
1669 1907
 		        $status = empty($options['new']) ? '200 OK' : '201 Created';
1670 1908
 
1671
-		        if (!empty($options['ranges'])) {
1909
+		        if (!empty($options['ranges']))
1910
+		        {
1672 1911
 			        // TODO multipart support is missing (see also above)
1673
-			        if (0 == fseek($stream, $range[0]['start'], SEEK_SET)) {
1912
+			        if (0 == fseek($stream, $range[0]['start'], SEEK_SET))
1913
+			        {
1674 1914
 				        $length = $range[0]['end']-$range[0]['start']+1;
1675
-				        if (!fwrite($stream, fread($options['stream'], $length))) {
1915
+				        if (!fwrite($stream, fread($options['stream'], $length)))
1916
+				        {
1676 1917
 					        $status = '403 Forbidden';
1677 1918
 				        }
1678
-			        } else {
1919
+			        }
1920
+			        else
1921
+			        {
1679 1922
 				        $status = '403 Forbidden';
1680 1923
 			        }
1681
-		        } else {
1682
-			        while (!feof($options['stream'])) {
1683
-				        if (false === fwrite($stream, fread($options['stream'], 4096))) {
1924
+		        }
1925
+		        else
1926
+		        {
1927
+			        while (!feof($options['stream']))
1928
+			        {
1929
+				        if (false === fwrite($stream, fread($options['stream'], 4096)))
1930
+				        {
1684 1931
 					        $status = '403 Forbidden';
1685 1932
 					        break;
1686 1933
 				        }
@@ -1704,7 +1951,8 @@  discard block
 block discarded – undo
1704 1951
      */
1705 1952
     function http_PUT()
1706 1953
     {
1707
-        if ($this->_check_lock_status($this->path)) {
1954
+        if ($this->_check_lock_status($this->path))
1955
+        {
1708 1956
             $options                   = Array();
1709 1957
             $options["path"]           = $this->path;
1710 1958
 
@@ -1719,15 +1967,19 @@  discard block
 block discarded – undo
1719 1967
             }
1720 1968
 
1721 1969
             // get the Content-type
1722
-            if (isset($this->_SERVER["CONTENT_TYPE"])) {
1970
+            if (isset($this->_SERVER["CONTENT_TYPE"]))
1971
+            {
1723 1972
                 // for now we do not support any sort of multipart requests
1724
-                if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10)) {
1973
+                if (!strncmp($this->_SERVER["CONTENT_TYPE"], "multipart/", 10))
1974
+                {
1725 1975
                     $this->http_status("501 not implemented");
1726 1976
                     echo "The service does not support multipart PUT requests";
1727 1977
                     return;
1728 1978
                 }
1729 1979
                 $options["content_type"] = $this->_SERVER["CONTENT_TYPE"];
1730
-            } else {
1980
+            }
1981
+            else
1982
+            {
1731 1983
                 // default content type if none given
1732 1984
                 $options["content_type"] = "application/octet-stream";
1733 1985
             }
@@ -1738,7 +1990,7 @@  discard block
 block discarded – undo
1738 1990
 	    		case 'gzip':
1739 1991
 	    		case 'deflate':	//zlib
1740 1992
 	    			if (extension_loaded('zlib'))
1741
-	     			{
1993
+	    			{
1742 1994
 	      				stream_filter_append($options['stream'], 'zlib.inflate', STREAM_FILTER_READ);
1743 1995
 	       			}
1744 1996
 	    	}
@@ -1759,15 +2011,23 @@  discard block
 block discarded – undo
1759 2011
              does not understand or implement and MUST return a 501
1760 2012
              (Not Implemented) response in such cases."
1761 2013
             */
1762
-            foreach ($this->_SERVER as $key => $val) {
1763
-                if (strncmp($key, "HTTP_CONTENT", 11)) continue;
1764
-                switch ($key) {
2014
+            foreach ($this->_SERVER as $key => $val)
2015
+            {
2016
+                if (strncmp($key, "HTTP_CONTENT", 11))
2017
+                {
2018
+                	continue;
2019
+                }
2020
+                switch ($key)
2021
+                {
1765 2022
                 case 'HTTP_CONTENT_ENCODING': // RFC 2616 14.11
1766 2023
 		        	switch($this->_SERVER['HTTP_CONTENT_ENCODING'])
1767 2024
 		        	{
1768 2025
 		        		case 'gzip':
1769 2026
 		        		case 'deflate':	//zlib
1770
-		        			if (extension_loaded('zlib')) break;
2027
+		        			if (extension_loaded('zlib'))
2028
+		        			{
2029
+		        				break;
2030
+		        			}
1771 2031
 		        			// fall through for no zlib support
1772 2032
 		        		default:
1773 2033
 					        $this->http_status('415 Unsupported Media Type');
@@ -1797,18 +2057,21 @@  discard block
 block discarded – undo
1797 2057
                     // the header format is also specified in RFC 2616 14.16
1798 2058
                     // TODO we have to ensure that implementations support this or send 501 instead
1799 2059
 					$matches = null;
1800
-                    if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches)) {
2060
+                    if (!preg_match('@bytes\s+(\d+)-(\d+)/((\d+)|\*)@', $val, $matches))
2061
+                    {
1801 2062
                         $this->http_status("400 bad request");
1802 2063
                         echo "The service does only support single byte ranges";
1803 2064
                         return;
1804 2065
                     }
1805 2066
 
1806 2067
                     $range = array("start" => $matches[1], "end" => $matches[2]);
1807
-                    if (is_numeric($matches[3])) {
2068
+                    if (is_numeric($matches[3]))
2069
+                    {
1808 2070
                         $range["total_length"] = $matches[3];
1809 2071
                     }
1810 2072
 
1811
-                    if (!isset($options['ranges'])) {
2073
+                    if (!isset($options['ranges']))
2074
+                    {
1812 2075
                         $options['ranges'] = array();
1813 2076
                     }
1814 2077
 
@@ -1839,45 +2102,65 @@  discard block
 block discarded – undo
1839 2102
 
1840 2103
             $stat = $this->PUT($options);
1841 2104
 
1842
-            if ($stat === false) {
2105
+            if ($stat === false)
2106
+            {
1843 2107
                 $stat = "403 Forbidden";
1844
-            } else if (is_resource($stat) && get_resource_type($stat) == "stream") {
2108
+            }
2109
+            else if (is_resource($stat) && get_resource_type($stat) == "stream")
2110
+            {
1845 2111
                 $stream = $stat;
1846 2112
 
1847 2113
                 $stat = $options["new"] ? "201 Created" : "204 No Content";
1848 2114
 
1849
-                if (!empty($options["ranges"])) {
2115
+                if (!empty($options["ranges"]))
2116
+                {
1850 2117
                     // TODO multipart support is missing (see also above)
1851
-                    if (0 == fseek($stream, $options['ranges'][0]["start"], SEEK_SET)) {
2118
+                    if (0 == fseek($stream, $options['ranges'][0]["start"], SEEK_SET))
2119
+                    {
1852 2120
                         $length = $options['ranges'][0]["end"] - $options['ranges'][0]["start"]+1;
1853 2121
 
1854
-                        while (!feof($options['stream'])) {
1855
-                            if ($length <= 0) {
2122
+                        while (!feof($options['stream']))
2123
+                        {
2124
+                            if ($length <= 0)
2125
+                            {
1856 2126
                                break;
1857 2127
                             }
1858 2128
 
1859
-                            if ($length <= 8192) {
2129
+                            if ($length <= 8192)
2130
+                            {
1860 2131
                                 $data = fread($options['stream'], $length);
1861
-                            } else {
2132
+                            }
2133
+                            else
2134
+                            {
1862 2135
                                 $data = fread($options['stream'], 8192);
1863 2136
                             }
1864 2137
 
1865
-                            if ($data === false) {
2138
+                            if ($data === false)
2139
+                            {
1866 2140
                                 $stat = "400 Bad request";
1867
-                            } elseif (strlen($data)) {
1868
-                                if (false === fwrite($stream, $data)) {
2141
+                            }
2142
+                            elseif (strlen($data))
2143
+                            {
2144
+                                if (false === fwrite($stream, $data))
2145
+                                {
1869 2146
                                     $stat = "403 Forbidden";
1870 2147
                                     break;
1871 2148
                                 }
1872 2149
                                 $length -= strlen($data);
1873 2150
                             }
1874 2151
                         }
1875
-                    } else {
2152
+                    }
2153
+                    else
2154
+                    {
1876 2155
                         $stat = "403 Forbidden";
1877 2156
                     }
1878
-                } else {
1879
-                    while (!feof($options["stream"])) {
1880
-                        if (false === fwrite($stream, fread($options["stream"], 8192))) {
2157
+                }
2158
+                else
2159
+                {
2160
+                    while (!feof($options["stream"]))
2161
+                    {
2162
+                        if (false === fwrite($stream, fread($options["stream"], 8192)))
2163
+                        {
1881 2164
                             $stat = "403 Forbidden";
1882 2165
                             break;
1883 2166
                         }
@@ -1888,7 +2171,9 @@  discard block
 block discarded – undo
1888 2171
             }
1889 2172
 
1890 2173
             $this->http_status($stat);
1891
-        } else {
2174
+        }
2175
+        else
2176
+        {
1892 2177
             $this->http_status("423 Locked");
1893 2178
         }
1894 2179
     }
@@ -1907,8 +2192,10 @@  discard block
 block discarded – undo
1907 2192
     function http_DELETE()
1908 2193
     {
1909 2194
         // check RFC 2518 Section 9.2, last paragraph
1910
-        if (isset($this->_SERVER["HTTP_DEPTH"])) {
1911
-            if ($this->_SERVER["HTTP_DEPTH"] != "infinity") {
2195
+        if (isset($this->_SERVER["HTTP_DEPTH"]))
2196
+        {
2197
+            if ($this->_SERVER["HTTP_DEPTH"] != "infinity")
2198
+            {
1912 2199
 				if (stripos($_SERVER['HTTP_USER_AGENT'],'webdrive') !== false)
1913 2200
 				{
1914 2201
 					// pretend we didnt see it, as webdrive does not handle the depth parameter correctly while deleting collections
@@ -1922,7 +2209,8 @@  discard block
 block discarded – undo
1922 2209
         }
1923 2210
 
1924 2211
         // check lock status
1925
-        if ($this->_check_lock_status($this->path)) {
2212
+        if ($this->_check_lock_status($this->path))
2213
+        {
1926 2214
             // ok, proceed
1927 2215
             $options         = Array();
1928 2216
             $options["path"] = $this->path;
@@ -1930,7 +2218,9 @@  discard block
 block discarded – undo
1930 2218
             $stat = $this->DELETE($options);
1931 2219
 
1932 2220
             $this->http_status($stat);
1933
-        } else {
2221
+        }
2222
+        else
2223
+        {
1934 2224
             // sorry, its locked
1935 2225
             $this->http_status("423 Locked");
1936 2226
         }
@@ -1965,10 +2255,13 @@  discard block
 block discarded – undo
1965 2255
      */
1966 2256
     function http_MOVE()
1967 2257
     {
1968
-        if ($this->_check_lock_status($this->path)) {
2258
+        if ($this->_check_lock_status($this->path))
2259
+        {
1969 2260
             // destination lock status is always checked by the helper method
1970 2261
             $this->_copymove("move");
1971
-        } else {
2262
+        }
2263
+        else
2264
+        {
1972 2265
             $this->http_status("423 Locked");
1973 2266
         }
1974 2267
     }
@@ -1989,19 +2282,25 @@  discard block
 block discarded – undo
1989 2282
         $options         = Array();
1990 2283
         $options["path"] = $this->path;
1991 2284
 
1992
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
2285
+        if (isset($this->_SERVER['HTTP_DEPTH']))
2286
+        {
1993 2287
             $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
1994
-        } else {
2288
+        }
2289
+        else
2290
+        {
1995 2291
             $options["depth"] = "infinity";
1996 2292
         }
1997 2293
 
1998
-        if (isset($this->_SERVER["HTTP_TIMEOUT"])) {
2294
+        if (isset($this->_SERVER["HTTP_TIMEOUT"]))
2295
+        {
1999 2296
             $options["timeout"] = explode(",", $this->_SERVER["HTTP_TIMEOUT"]);
2000 2297
         }
2001 2298
 
2002
-        if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF'])) {
2299
+        if (empty($this->_SERVER['CONTENT_LENGTH']) && !empty($this->_SERVER['HTTP_IF']))
2300
+        {
2003 2301
             // check if locking is possible
2004
-            if (!$this->_check_lock_status($this->path)) {
2302
+            if (!$this->_check_lock_status($this->path))
2303
+            {
2005 2304
                 $this->http_status("423 Locked");
2006 2305
                 return;
2007 2306
             }
@@ -2017,15 +2316,19 @@  discard block
 block discarded – undo
2017 2316
 
2018 2317
 
2019 2318
             $stat = $this->LOCK($options);
2020
-        } else {
2319
+        }
2320
+        else
2321
+        {
2021 2322
             // extract lock request information from request XML payload
2022 2323
             $lockinfo = new _parse_lockinfo("php://input");
2023
-            if (!$lockinfo->success) {
2324
+            if (!$lockinfo->success)
2325
+            {
2024 2326
                 $this->http_status("400 bad request");
2025 2327
             }
2026 2328
 
2027 2329
             // check if locking is possible
2028
-            if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared")) {
2330
+            if (!$this->_check_lock_status($this->path, $lockinfo->lockscope === "shared"))
2331
+            {
2029 2332
                 $this->http_status("423 Locked");
2030 2333
                 return;
2031 2334
             }
@@ -2040,36 +2343,51 @@  discard block
 block discarded – undo
2040 2343
             $stat = $this->LOCK($options);
2041 2344
         }
2042 2345
 
2043
-        if (is_bool($stat)) {
2346
+        if (is_bool($stat))
2347
+        {
2044 2348
             $http_stat = $stat ? "200 OK" : "423 Locked";
2045
-        } else {
2349
+        }
2350
+        else
2351
+        {
2046 2352
             $http_stat = (string)$stat;
2047 2353
         }
2048 2354
         $this->http_status($http_stat);
2049 2355
 
2050
-        if ($http_stat{0} == 2) { // 2xx states are ok
2051
-            if ($options["timeout"]) {
2356
+        if ($http_stat{0} == 2)
2357
+        {
2358
+// 2xx states are ok
2359
+            if ($options["timeout"])
2360
+            {
2052 2361
                 // if multiple timeout values were given we take the first only
2053
-                if (is_array($options["timeout"])) {
2362
+                if (is_array($options["timeout"]))
2363
+                {
2054 2364
                     reset($options["timeout"]);
2055 2365
                     $options["timeout"] = current($options["timeout"]);
2056 2366
                 }
2057 2367
                 // if the timeout is numeric only we need to reformat it
2058
-                if (is_numeric($options["timeout"])) {
2368
+                if (is_numeric($options["timeout"]))
2369
+                {
2059 2370
                     // more than a million is considered an absolute timestamp
2060 2371
                     // less is more likely a relative value
2061
-                    if ($options["timeout"]>1000000) {
2372
+                    if ($options["timeout"]>1000000)
2373
+                    {
2062 2374
                         $timeout = "Second-".($options['timeout']-time());
2063
-                    } else {
2375
+                    }
2376
+                    else
2377
+                    {
2064 2378
                         $timeout = "Second-$options[timeout]";
2065 2379
                     }
2066
-                } else {
2380
+                }
2381
+                else
2382
+                {
2067 2383
                     // non-numeric values are passed on verbatim,
2068 2384
                     // no error checking is performed here in this case
2069 2385
                     // TODO: send "Infinite" on invalid timeout strings?
2070 2386
                     $timeout = $options["timeout"];
2071 2387
                 }
2072
-            } else {
2388
+            }
2389
+            else
2390
+            {
2073 2391
                 $timeout = "Infinite";
2074 2392
             }
2075 2393
 
@@ -2107,9 +2425,12 @@  discard block
 block discarded – undo
2107 2425
         $options         = Array();
2108 2426
         $options["path"] = $this->path;
2109 2427
 
2110
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
2428
+        if (isset($this->_SERVER['HTTP_DEPTH']))
2429
+        {
2111 2430
             $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2112
-        } else {
2431
+        }
2432
+        else
2433
+        {
2113 2434
             $options["depth"] = "infinity";
2114 2435
         }
2115 2436
 
@@ -2138,9 +2459,12 @@  discard block
 block discarded – undo
2138 2459
         $options['path'] = $this->path;
2139 2460
         $options['errors'] = array();
2140 2461
 
2141
-        if (isset($this->_SERVER['HTTP_DEPTH'])) {
2462
+        if (isset($this->_SERVER['HTTP_DEPTH']))
2463
+        {
2142 2464
             $options['depth'] = $this->_SERVER['HTTP_DEPTH'];
2143
-        } else {
2465
+        }
2466
+        else
2467
+        {
2144 2468
             $options['depth'] = 'infinity';
2145 2469
         }
2146 2470
 
@@ -2151,18 +2475,26 @@  discard block
 block discarded – undo
2151 2475
 		$this->http_status($status);
2152 2476
 		$content = '';
2153 2477
 
2154
-        if (is_array($options['errors']) && count($options['errors'])) {
2478
+        if (is_array($options['errors']) && count($options['errors']))
2479
+        {
2155 2480
 	        header('Content-Type: text/xml; charset="utf-8"');
2156 2481
 	        // ... and payload
2157 2482
 	        $content .= "<?xml version=\"1.0\" encoding=\"utf-8\"?>\n";
2158 2483
 	        $content .= "<D:error xmlns:D=\"DAV:\"> \n";
2159
-	        foreach ($options['errors'] as $violation) {
2484
+	        foreach ($options['errors'] as $violation)
2485
+	        {
2160 2486
 	        	$content .= '<'.($this->crrnd?'':'D:')."$violation/>\n";
2161 2487
 	        }
2162 2488
 	        $content .=  '</'.($this->crrnd?'':'D:')."error>\n";
2163 2489
         }
2164
-        if (!self::use_compression()) header("Content-Length: ".self::bytes($content));
2165
-        if ($content) echo $options['content'];
2490
+        if (!self::use_compression())
2491
+        {
2492
+        	header("Content-Length: ".self::bytes($content));
2493
+        }
2494
+        if ($content)
2495
+        {
2496
+        	echo $options['content'];
2497
+        }
2166 2498
     }
2167 2499
 
2168 2500
     // }}}
@@ -2176,9 +2508,12 @@  discard block
 block discarded – undo
2176 2508
         $options         = Array();
2177 2509
         $options["path"] = $this->path;
2178 2510
 
2179
-        if (isset($this->_SERVER["HTTP_DEPTH"])) {
2511
+        if (isset($this->_SERVER["HTTP_DEPTH"]))
2512
+        {
2180 2513
             $options["depth"] = $this->_SERVER["HTTP_DEPTH"];
2181
-        } else {
2514
+        }
2515
+        else
2516
+        {
2182 2517
             $options["depth"] = "infinity";
2183 2518
         }
2184 2519
 
@@ -2187,33 +2522,45 @@  discard block
 block discarded – undo
2187 2522
         $url  = parse_url($this->_SERVER["HTTP_DESTINATION"]);
2188 2523
         $path = urldecode($url["path"]);
2189 2524
 
2190
-        if (isset($url["host"])) {
2525
+        if (isset($url["host"]))
2526
+        {
2191 2527
             // TODO check url scheme, too
2192 2528
             $http_host = $url["host"];
2193 2529
             if (isset($url["port"]) && $url["port"] != 80)
2194
-                $http_host.= ":".$url["port"];
2195
-        } else {
2530
+            {
2531
+                            $http_host.= ":".$url["port"];
2532
+            }
2533
+        }
2534
+        else
2535
+        {
2196 2536
             // only path given, set host to self
2197 2537
             $http_host = $http_header_host;
2198 2538
         }
2199 2539
 
2200 2540
         if ($http_host == $http_header_host &&
2201 2541
             !strncmp($this->_SERVER["SCRIPT_NAME"], $path,
2202
-                     strlen($this->_SERVER["SCRIPT_NAME"]))) {
2542
+                     strlen($this->_SERVER["SCRIPT_NAME"])))
2543
+        {
2203 2544
             $options["dest"] = substr($path, strlen($this->_SERVER["SCRIPT_NAME"]));
2204
-            if (!$this->_check_lock_status($options["dest"])) {
2545
+            if (!$this->_check_lock_status($options["dest"]))
2546
+            {
2205 2547
                 $this->http_status("423 Locked");
2206 2548
                 return;
2207 2549
             }
2208 2550
 
2209
-        } else {
2551
+        }
2552
+        else
2553
+        {
2210 2554
             $options["dest_url"] = $this->_SERVER["HTTP_DESTINATION"];
2211 2555
         }
2212 2556
 
2213 2557
         // see RFC 2518 Sections 9.6, 8.8.4 and 8.9.3
2214
-        if (isset($this->_SERVER["HTTP_OVERWRITE"])) {
2558
+        if (isset($this->_SERVER["HTTP_OVERWRITE"]))
2559
+        {
2215 2560
             $options["overwrite"] = $this->_SERVER["HTTP_OVERWRITE"] == "T";
2216
-        } else {
2561
+        }
2562
+        else
2563
+        {
2217 2564
             $options["overwrite"] = true;
2218 2565
         }
2219 2566
 
@@ -2239,10 +2586,13 @@  discard block
 block discarded – undo
2239 2586
         // all other METHODS need both a http_method() wrapper
2240 2587
         // and a method() implementation
2241 2588
         // the base class supplies wrappers only
2242
-        foreach (get_class_methods($this) as $method) {
2243
-            if (!strncmp("http_", $method, 5)) {
2589
+        foreach (get_class_methods($this) as $method)
2590
+        {
2591
+            if (!strncmp("http_", $method, 5))
2592
+            {
2244 2593
                 $method = strtoupper(substr($method, 5));
2245
-                if (method_exists($this, $method)) {
2594
+                if (method_exists($this, $method))
2595
+                {
2246 2596
                     $allow[$method] = $method;
2247 2597
                 }
2248 2598
             }
@@ -2250,10 +2600,13 @@  discard block
 block discarded – undo
2250 2600
 
2251 2601
         // we can emulate a missing HEAD implemetation using GET
2252 2602
         if (isset($allow["GET"]))
2253
-            $allow["HEAD"] = "HEAD";
2603
+        {
2604
+                    $allow["HEAD"] = "HEAD";
2605
+        }
2254 2606
 
2255 2607
         // no LOCK without checklok()
2256
-        if (!method_exists($this, "checklock")) {
2608
+        if (!method_exists($this, "checklock"))
2609
+        {
2257 2610
             unset($allow["LOCK"]);
2258 2611
             unset($allow["UNLOCK"]);
2259 2612
         }
@@ -2275,7 +2628,8 @@  discard block
 block discarded – undo
2275 2628
     public static function mkprop()
2276 2629
     {
2277 2630
 	    $args = func_get_args();
2278
-	    switch (count($args)) {
2631
+	    switch (count($args))
2632
+	    {
2279 2633
 		    case 4:
2280 2634
 			    return array('ns'   => $args[0],
2281 2635
 				    'name' => $args[1],
@@ -2302,17 +2656,22 @@  discard block
 block discarded – undo
2302 2656
      */
2303 2657
     function _check_auth()
2304 2658
     {
2305
-        if (method_exists($this, "checkAuth")) {
2659
+        if (method_exists($this, "checkAuth"))
2660
+        {
2306 2661
             // PEAR style method name
2307 2662
             return $this->checkAuth(@$this->_SERVER["AUTH_TYPE"],
2308 2663
                                     @$this->_SERVER["PHP_AUTH_USER"],
2309 2664
                                     @$this->_SERVER["PHP_AUTH_PW"]);
2310
-        } else if (method_exists($this, "check_auth")) {
2665
+        }
2666
+        else if (method_exists($this, "check_auth"))
2667
+        {
2311 2668
             // old (pre 1.0) method name
2312 2669
             return $this->check_auth(@$this->_SERVER["AUTH_TYPE"],
2313 2670
                                      @$this->_SERVER["PHP_AUTH_USER"],
2314 2671
                                      @$this->_SERVER["PHP_AUTH_PW"]);
2315
-        } else {
2672
+        }
2673
+        else
2674
+        {
2316 2675
             // no method found -> no authentication required
2317 2676
             return true;
2318 2677
         }
@@ -2331,7 +2690,8 @@  discard block
 block discarded – undo
2331 2690
     public static function _new_uuid()
2332 2691
     {
2333 2692
         // use uuid extension from PECL if available
2334
-        if (function_exists("uuid_create")) {
2693
+        if (function_exists("uuid_create"))
2694
+        {
2335 2695
             return uuid_create();
2336 2696
         }
2337 2697
 
@@ -2377,12 +2737,14 @@  discard block
 block discarded – undo
2377 2737
     function _if_header_lexer($string, &$pos)
2378 2738
     {
2379 2739
         // skip whitespace
2380
-        while (ctype_space($string{$pos})) {
2740
+        while (ctype_space($string{$pos}))
2741
+        {
2381 2742
             ++$pos;
2382 2743
         }
2383 2744
 
2384 2745
         // already at end of string?
2385
-        if (strlen($string) <= $pos) {
2746
+        if (strlen($string) <= $pos)
2747
+        {
2386 2748
             return false;
2387 2749
         }
2388 2750
 
@@ -2390,7 +2752,8 @@  discard block
 block discarded – undo
2390 2752
         $c = $string{$pos++};
2391 2753
 
2392 2754
         // now it depends on what we found
2393
-        switch ($c) {
2755
+        switch ($c)
2756
+        {
2394 2757
         case "<":
2395 2758
             // URIs are enclosed in <...>
2396 2759
             $pos2 = strpos($string, ">", $pos);
@@ -2400,10 +2763,13 @@  discard block
 block discarded – undo
2400 2763
 
2401 2764
         case "[":
2402 2765
             //Etags are enclosed in [...]
2403
-            if ($string{$pos} == "W") {
2766
+            if ($string{$pos} == "W")
2767
+            {
2404 2768
                 $type = "ETAG_WEAK";
2405 2769
                 $pos += 2;
2406
-            } else {
2770
+            }
2771
+            else
2772
+            {
2407 2773
                 $type = "ETAG_STRONG";
2408 2774
             }
2409 2775
             $pos2 = strpos($string, "]", $pos);
@@ -2435,35 +2801,44 @@  discard block
 block discarded – undo
2435 2801
         $uris = array();
2436 2802
 
2437 2803
         // parser loop
2438
-        while ($pos < $len) {
2804
+        while ($pos < $len)
2805
+        {
2439 2806
             // get next token
2440 2807
             $token = $this->_if_header_lexer($str, $pos);
2441 2808
 
2442 2809
             // check for URI
2443
-            if ($token[0] == "URI") {
2810
+            if ($token[0] == "URI")
2811
+            {
2444 2812
                 $uri   = $token[1]; // remember URI
2445 2813
                 $token = $this->_if_header_lexer($str, $pos); // get next token
2446
-            } else {
2814
+            }
2815
+            else
2816
+            {
2447 2817
                 $uri = "";
2448 2818
             }
2449 2819
 
2450 2820
             // sanity check
2451
-            if ($token[0] != "CHAR" || $token[1] != "(") {
2821
+            if ($token[0] != "CHAR" || $token[1] != "(")
2822
+            {
2452 2823
                 return false;
2453 2824
             }
2454 2825
 
2455 2826
             $list  = array();
2456 2827
             $level = 1;
2457 2828
             $not   = "";
2458
-            while ($level) {
2829
+            while ($level)
2830
+            {
2459 2831
                 $token = $this->_if_header_lexer($str, $pos);
2460
-                if ($token[0] == "NOT") {
2832
+                if ($token[0] == "NOT")
2833
+                {
2461 2834
                     $not = "!";
2462 2835
                     continue;
2463 2836
                 }
2464
-                switch ($token[0]) {
2837
+                switch ($token[0])
2838
+                {
2465 2839
                 case "CHAR":
2466
-                    switch ($token[1]) {
2840
+                    switch ($token[1])
2841
+                    {
2467 2842
                     case "(":
2468 2843
                         $level++;
2469 2844
                         break;
@@ -2493,9 +2868,12 @@  discard block
 block discarded – undo
2493 2868
                 $not = "";
2494 2869
             }
2495 2870
 
2496
-            if (@is_array($uris[$uri])) {
2871
+            if (@is_array($uris[$uri]))
2872
+            {
2497 2873
                 $uris[$uri] = array_merge($uris[$uri], $list);
2498
-            } else {
2874
+            }
2875
+            else
2876
+            {
2499 2877
                 $uris[$uri] = $list;
2500 2878
             }
2501 2879
         }
@@ -2514,27 +2892,34 @@  discard block
 block discarded – undo
2514 2892
      */
2515 2893
     function _check_if_header_conditions()
2516 2894
     {
2517
-        if (isset($this->_SERVER["HTTP_IF"])) {
2895
+        if (isset($this->_SERVER["HTTP_IF"]))
2896
+        {
2518 2897
             $this->_if_header_uris =
2519 2898
                 $this->_if_header_parser($this->_SERVER["HTTP_IF"]);
2520 2899
 
2521
-            foreach ($this->_if_header_uris as $uri => $conditions) {
2522
-                if ($uri == "") {
2900
+            foreach ($this->_if_header_uris as $uri => $conditions)
2901
+            {
2902
+                if ($uri == "")
2903
+                {
2523 2904
                     $uri = $this->uri;
2524 2905
                 }
2525 2906
                 // all must match
2526 2907
                 $state = true;
2527
-                foreach ($conditions as $condition) {
2908
+                foreach ($conditions as $condition)
2909
+                {
2528 2910
                     // lock tokens may be free form (RFC2518 6.3)
2529 2911
                     // but if opaquelocktokens are used (RFC2518 6.4)
2530 2912
                     // we have to check the format (litmus tests this)
2531
-                    if (!strncmp($condition, "<opaquelocktoken:", strlen("<opaquelocktoken"))) {
2532
-                        if (!preg_match('/^<opaquelocktoken:[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}>$/', $condition)) {
2913
+                    if (!strncmp($condition, "<opaquelocktoken:", strlen("<opaquelocktoken")))
2914
+                    {
2915
+                        if (!preg_match('/^<opaquelocktoken:[[:xdigit:]]{8}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{4}-[[:xdigit:]]{12}>$/', $condition))
2916
+                        {
2533 2917
                             $this->http_status("423 Locked");
2534 2918
                             return false;
2535 2919
                         }
2536 2920
                     }
2537
-                    if (!$this->_check_uri_condition($uri, $condition)) {
2921
+                    if (!$this->_check_uri_condition($uri, $condition))
2922
+                    {
2538 2923
                         $this->http_status("412 Precondition failed");
2539 2924
                         $state = false;
2540 2925
                         break;
@@ -2542,7 +2927,8 @@  discard block
 block discarded – undo
2542 2927
                 }
2543 2928
 
2544 2929
                 // any match is ok
2545
-                if ($state == true) {
2930
+                if ($state == true)
2931
+                {
2546 2932
                     return true;
2547 2933
                 }
2548 2934
             }
@@ -2569,7 +2955,8 @@  discard block
 block discarded – undo
2569 2955
 
2570 2956
         // a lock token can never be from the DAV: scheme
2571 2957
         // litmus uses DAV:no-lock in some tests
2572
-        if (!strncmp("<DAV:", $condition, 5)) {
2958
+        if (!strncmp("<DAV:", $condition, 5))
2959
+        {
2573 2960
             return false;
2574 2961
         }
2575 2962
 
@@ -2586,16 +2973,21 @@  discard block
 block discarded – undo
2586 2973
     function _check_lock_status($path, $exclusive_only = false)
2587 2974
     {
2588 2975
         // FIXME depth -> ignored for now
2589
-        if (method_exists($this, "checkLock")) {
2976
+        if (method_exists($this, "checkLock"))
2977
+        {
2590 2978
             // is locked?
2591 2979
             $lock = $this->checkLock($path);
2592 2980
 
2593 2981
             // ... and lock is not owned?
2594
-            if (is_array($lock) && count($lock)) {
2982
+            if (is_array($lock) && count($lock))
2983
+            {
2595 2984
                 // FIXME doesn't check uri restrictions yet
2596
-                if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"])) {
2985
+                if (!isset($this->_SERVER["HTTP_IF"]) || !strstr($this->_SERVER["HTTP_IF"], $lock["token"]))
2986
+                {
2597 2987
                     if (!$exclusive_only || ($lock["scope"] !== "shared"))
2598
-                        return false;
2988
+                    {
2989
+                                            return false;
2990
+                    }
2599 2991
                 }
2600 2992
             }
2601 2993
         }
@@ -2615,7 +3007,8 @@  discard block
 block discarded – undo
2615 3007
     function lockdiscovery($path)
2616 3008
     {
2617 3009
         // no lock support without checklock() method
2618
-        if (!method_exists($this, "checklock")) {
3010
+        if (!method_exists($this, "checklock"))
3011
+        {
2619 3012
             return "";
2620 3013
         }
2621 3014
 
@@ -2626,13 +3019,19 @@  discard block
 block discarded – undo
2626 3019
         $lock = $this->checklock($path);
2627 3020
 
2628 3021
         // generate <activelock> block for returned data
2629
-        if (is_array($lock) && count($lock)) {
3022
+        if (is_array($lock) && count($lock))
3023
+        {
2630 3024
             // check for 'timeout' or 'expires'
2631
-            if (!empty($lock["expires"])) {
3025
+            if (!empty($lock["expires"]))
3026
+            {
2632 3027
                 $timeout = "Second-".($lock["expires"] - time());
2633
-            } else if (!empty($lock["timeout"])) {
3028
+            }
3029
+            else if (!empty($lock["timeout"]))
3030
+            {
2634 3031
                 $timeout = "Second-$lock[timeout]";
2635
-            } else {
3032
+            }
3033
+            else
3034
+            {
2636 3035
                 $timeout = "Infinite";
2637 3036
             }
2638 3037
 
@@ -2679,7 +3078,8 @@  discard block
 block discarded – undo
2679 3078
     function http_status($status)
2680 3079
     {
2681 3080
         // simplified success case
2682
-        if ($status === true) {
3081
+        if ($status === true)
3082
+        {
2683 3083
             $status = "200 OK";
2684 3084
         }
2685 3085
 
@@ -2764,18 +3164,24 @@  discard block
 block discarded – undo
2764 3164
      * @return string
2765 3165
      */
2766 3166
 	function _hierarchical_prop_encode(array $props, $ns, &$ns_defs, array &$ns_hash)
2767
-    {
3167
+	{
2768 3168
     	$ret = '';
2769 3169
 
2770 3170
     	//error_log(__METHOD__.'('.array2string($props).')');
2771
-    	if (isset($props['name'])) $props = array($props);
3171
+    	if (isset($props['name']))
3172
+    	{
3173
+    		$props = array($props);
3174
+    	}
2772 3175
 
2773 3176
     	foreach($props as $prop)
2774
-		{
2775
-	    	if (!isset($ns_hash[$prop['ns']])) // unknown namespace
3177
+    	{
3178
+	    	if (!isset($ns_hash[$prop['ns']]))
3179
+	    	{
3180
+	    		// unknown namespace
2776 3181
 	    	{
2777 3182
 		    	// register namespace
2778 3183
 		    	$ns_name = 'ns'.(count($ns_hash) + 1);
3184
+	    	}
2779 3185
 		    	$ns_hash[$prop['ns']] = $ns_name;
2780 3186
 		    	$ns_defs .= ' xmlns:'.$ns_name.'="'.$prop['ns'].'"';
2781 3187
 	    	}
@@ -2793,7 +3199,7 @@  discard block
 block discarded – undo
2793 3199
 			    	$vals = '';
2794 3200
 
2795 3201
 			    	foreach($subprop as $attr => $val)
2796
-					{
3202
+			    	{
2797 3203
 				    	$vals .= ' '.$attr.'="'.htmlspecialchars($val, ENT_NOQUOTES|ENT_XML1|ENT_DISALLOWED, 'utf-8').'"';
2798 3204
 					}
2799 3205
 
@@ -2810,9 +3216,11 @@  discard block
 block discarded – undo
2810 3216
 		    	else
2811 3217
 		    	{
2812 3218
 			    	if(isset($prop['raw']))
2813
-					{
3219
+			    	{
2814 3220
 						$val = $this->_prop_encode('<![CDATA['.$prop['val'].']]>');
2815
-					} else {
3221
+					}
3222
+					else
3223
+					{
2816 3224
 						$val = $this->_prop_encode(htmlspecialchars($prop['val'], ENT_NOQUOTES, 'utf-8'));
2817 3225
 						// for href properties we need (minimalistic) urlencoding, eg. space
2818 3226
 						if ($prop['name'] == 'href')
@@ -2843,7 +3251,8 @@  discard block
 block discarded – undo
2843 3251
 		//error_log( __METHOD__."\n" .print_r($text,true));
2844 3252
 		//error_log("prop-encode:" . print_r($this->_prop_encoding,true));
2845 3253
 
2846
-		switch (strtolower($this->_prop_encoding)) {
3254
+		switch (strtolower($this->_prop_encoding))
3255
+		{
2847 3256
 			case "utf-8":
2848 3257
        			//error_log( __METHOD__."allready encoded\n" .print_r($text,true));
2849 3258
 				return $text;
@@ -2865,7 +3274,8 @@  discard block
 block discarded – undo
2865 3274
     public static function _slashify($path)
2866 3275
     {
2867 3276
 		//error_log(__METHOD__." called with $path");
2868
-		if ($path[self::bytes($path)-1] != '/') {
3277
+		if ($path[self::bytes($path)-1] != '/')
3278
+		{
2869 3279
 			//error_log(__METHOD__." added slash at the end of path");
2870 3280
 			$path = $path."/";
2871 3281
 		}
@@ -2881,7 +3291,8 @@  discard block
 block discarded – undo
2881 3291
     public static function _unslashify($path)
2882 3292
     {
2883 3293
         //error_log(__METHOD__." called with $path");
2884
-        if ($path[self::bytes($path)-1] == '/') {
3294
+        if ($path[self::bytes($path)-1] == '/')
3295
+        {
2885 3296
             $path = substr($path, 0, -1);
2886 3297
 			//error_log(__METHOD__." removed slash at the end of path");
2887 3298
         }
@@ -2899,9 +3310,12 @@  discard block
 block discarded – undo
2899 3310
     {
2900 3311
         //error_log("merge called :\n$parent \n$child\n" . function_backtrace());
2901 3312
         //error_log("merge :\n".print_r($this->_mergePaths($this->_SERVER["SCRIPT_NAME"], $this->path)true));
2902
-        if ($child{0} == '/') {
3313
+        if ($child{0} == '/')
3314
+        {
2903 3315
             return self::_unslashify($parent).$child;
2904
-        } else {
3316
+        }
3317
+        else
3318
+        {
2905 3319
             return self::_slashify($parent).$child;
2906 3320
         }
2907 3321
     }
Please login to merge, or discard this patch.