Completed
Push — stable13 ( d565fb...7bcf5b )
by
unknown
19:30 queued 09:28
created
apps/dav/lib/Connector/Sabre/Exception/Forbidden.php 2 patches
Indentation   +32 added lines, -32 removed lines patch added patch discarded remove patch
@@ -24,42 +24,42 @@
 block discarded – undo
24 24
 
25 25
 class Forbidden extends \Sabre\DAV\Exception\Forbidden {
26 26
 
27
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
27
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
28 28
 
29
-	/**
30
-	 * @var bool
31
-	 */
32
-	private $retry;
29
+    /**
30
+     * @var bool
31
+     */
32
+    private $retry;
33 33
 
34
-	/**
35
-	 * @param string $message
36
-	 * @param bool $retry
37
-	 * @param \Exception $previous
38
-	 */
39
-	public function __construct($message, $retry = false, \Exception $previous = null) {
40
-		parent::__construct($message, 0, $previous);
41
-		$this->retry = $retry;
42
-	}
34
+    /**
35
+     * @param string $message
36
+     * @param bool $retry
37
+     * @param \Exception $previous
38
+     */
39
+    public function __construct($message, $retry = false, \Exception $previous = null) {
40
+        parent::__construct($message, 0, $previous);
41
+        $this->retry = $retry;
42
+    }
43 43
 
44
-	/**
45
-	 * This method allows the exception to include additional information
46
-	 * into the WebDAV error response
47
-	 *
48
-	 * @param \Sabre\DAV\Server $server
49
-	 * @param \DOMElement $errorNode
50
-	 * @return void
51
-	 */
52
-	public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
44
+    /**
45
+     * This method allows the exception to include additional information
46
+     * into the WebDAV error response
47
+     *
48
+     * @param \Sabre\DAV\Server $server
49
+     * @param \DOMElement $errorNode
50
+     * @return void
51
+     */
52
+    public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
53 53
 
54
-		// set ownCloud namespace
55
-		$errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
54
+        // set ownCloud namespace
55
+        $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
56 56
 
57
-		// adding the retry node
58
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
59
-		$errorNode->appendChild($error);
57
+        // adding the retry node
58
+        $error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
59
+        $errorNode->appendChild($error);
60 60
 
61
-		// adding the message node
62
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
63
-		$errorNode->appendChild($error);
64
-	}
61
+        // adding the message node
62
+        $error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
63
+        $errorNode->appendChild($error);
64
+    }
65 65
 }
Please login to merge, or discard this patch.
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -49,17 +49,17 @@
 block discarded – undo
49 49
 	 * @param \DOMElement $errorNode
50 50
 	 * @return void
51 51
 	 */
52
-	public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
52
+	public function serialize(\Sabre\DAV\Server $server, \DOMElement $errorNode) {
53 53
 
54 54
 		// set ownCloud namespace
55 55
 		$errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
56 56
 
57 57
 		// adding the retry node
58
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
58
+		$error = $errorNode->ownerDocument->createElementNS('o:', 'o:retry', var_export($this->retry, true));
59 59
 		$errorNode->appendChild($error);
60 60
 
61 61
 		// adding the message node
62
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
62
+		$error = $errorNode->ownerDocument->createElementNS('o:', 'o:reason', $this->getMessage());
63 63
 		$errorNode->appendChild($error);
64 64
 	}
65 65
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Exception/InvalidPath.php 2 patches
Spacing   +3 added lines, -3 removed lines patch added patch discarded remove patch
@@ -61,17 +61,17 @@
 block discarded – undo
61 61
 	 * @param \DOMElement $errorNode
62 62
 	 * @return void
63 63
 	 */
64
-	public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
64
+	public function serialize(\Sabre\DAV\Server $server, \DOMElement $errorNode) {
65 65
 
66 66
 		// set ownCloud namespace
67 67
 		$errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
68 68
 
69 69
 		// adding the retry node
70
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
70
+		$error = $errorNode->ownerDocument->createElementNS('o:', 'o:retry', var_export($this->retry, true));
71 71
 		$errorNode->appendChild($error);
72 72
 
73 73
 		// adding the message node
74
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
74
+		$error = $errorNode->ownerDocument->createElementNS('o:', 'o:reason', $this->getMessage());
75 75
 		$errorNode->appendChild($error);
76 76
 	}
77 77
 
Please login to merge, or discard this patch.
Indentation   +40 added lines, -40 removed lines patch added patch discarded remove patch
@@ -26,54 +26,54 @@
 block discarded – undo
26 26
 
27 27
 class InvalidPath extends Exception {
28 28
 
29
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
29
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
30 30
 
31
-	/**
32
-	 * @var bool
33
-	 */
34
-	private $retry;
31
+    /**
32
+     * @var bool
33
+     */
34
+    private $retry;
35 35
 
36
-	/**
37
-	 * @param string $message
38
-	 * @param bool $retry
39
-	 * @param \Exception|null $previous
40
-	 */
41
-	public function __construct($message, $retry = false, \Exception $previous = null) {
42
-		parent::__construct($message, 0, $previous);
43
-		$this->retry = $retry;
44
-	}
36
+    /**
37
+     * @param string $message
38
+     * @param bool $retry
39
+     * @param \Exception|null $previous
40
+     */
41
+    public function __construct($message, $retry = false, \Exception $previous = null) {
42
+        parent::__construct($message, 0, $previous);
43
+        $this->retry = $retry;
44
+    }
45 45
 
46
-	/**
47
-	 * Returns the HTTP status code for this exception
48
-	 *
49
-	 * @return int
50
-	 */
51
-	public function getHTTPCode() {
46
+    /**
47
+     * Returns the HTTP status code for this exception
48
+     *
49
+     * @return int
50
+     */
51
+    public function getHTTPCode() {
52 52
 
53
-		return 400;
53
+        return 400;
54 54
 
55
-	}
55
+    }
56 56
 
57
-	/**
58
-	 * This method allows the exception to include additional information
59
-	 * into the WebDAV error response
60
-	 *
61
-	 * @param \Sabre\DAV\Server $server
62
-	 * @param \DOMElement $errorNode
63
-	 * @return void
64
-	 */
65
-	public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
57
+    /**
58
+     * This method allows the exception to include additional information
59
+     * into the WebDAV error response
60
+     *
61
+     * @param \Sabre\DAV\Server $server
62
+     * @param \DOMElement $errorNode
63
+     * @return void
64
+     */
65
+    public function serialize(\Sabre\DAV\Server $server,\DOMElement $errorNode) {
66 66
 
67
-		// set ownCloud namespace
68
-		$errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
67
+        // set ownCloud namespace
68
+        $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
69 69
 
70
-		// adding the retry node
71
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
72
-		$errorNode->appendChild($error);
70
+        // adding the retry node
71
+        $error = $errorNode->ownerDocument->createElementNS('o:','o:retry', var_export($this->retry, true));
72
+        $errorNode->appendChild($error);
73 73
 
74
-		// adding the message node
75
-		$error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
76
-		$errorNode->appendChild($error);
77
-	}
74
+        // adding the message node
75
+        $error = $errorNode->ownerDocument->createElementNS('o:','o:reason', $this->getMessage());
76
+        $errorNode->appendChild($error);
77
+    }
78 78
 
79 79
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Exception/PasswordLoginForbidden.php 1 patch
Indentation   +22 added lines, -22 removed lines patch added patch discarded remove patch
@@ -29,27 +29,27 @@
 block discarded – undo
29 29
 
30 30
 class PasswordLoginForbidden extends NotAuthenticated {
31 31
 
32
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
33
-
34
-	public function getHTTPCode() {
35
-		return 401;
36
-	}
37
-
38
-	/**
39
-	 * This method allows the exception to include additional information
40
-	 * into the WebDAV error response
41
-	 *
42
-	 * @param Server $server
43
-	 * @param DOMElement $errorNode
44
-	 * @return void
45
-	 */
46
-	public function serialize(Server $server, DOMElement $errorNode) {
47
-
48
-		// set ownCloud namespace
49
-		$errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
50
-
51
-		$error = $errorNode->ownerDocument->createElementNS('o:', 'o:hint', 'password login forbidden');
52
-		$errorNode->appendChild($error);
53
-	}
32
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
33
+
34
+    public function getHTTPCode() {
35
+        return 401;
36
+    }
37
+
38
+    /**
39
+     * This method allows the exception to include additional information
40
+     * into the WebDAV error response
41
+     *
42
+     * @param Server $server
43
+     * @param DOMElement $errorNode
44
+     * @return void
45
+     */
46
+    public function serialize(Server $server, DOMElement $errorNode) {
47
+
48
+        // set ownCloud namespace
49
+        $errorNode->setAttribute('xmlns:o', self::NS_OWNCLOUD);
50
+
51
+        $error = $errorNode->ownerDocument->createElementNS('o:', 'o:hint', 'password login forbidden');
52
+        $errorNode->appendChild($error);
53
+    }
54 54
 
55 55
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Exception/FileLocked.php 2 patches
Indentation   +14 added lines, -14 removed lines patch added patch discarded remove patch
@@ -30,20 +30,20 @@
 block discarded – undo
30 30
 
31 31
 class FileLocked extends \Sabre\DAV\Exception {
32 32
 
33
-	public function __construct($message = "", $code = 0, Exception $previous = null) {
34
-		if($previous instanceof \OCP\Files\LockNotAcquiredException) {
35
-			$message = sprintf('Target file %s is locked by another process.', $previous->path);
36
-		}
37
-		parent::__construct($message, $code, $previous);
38
-	}
33
+    public function __construct($message = "", $code = 0, Exception $previous = null) {
34
+        if($previous instanceof \OCP\Files\LockNotAcquiredException) {
35
+            $message = sprintf('Target file %s is locked by another process.', $previous->path);
36
+        }
37
+        parent::__construct($message, $code, $previous);
38
+    }
39 39
 
40
-	/**
41
-	 * Returns the HTTP status code for this exception
42
-	 *
43
-	 * @return int
44
-	 */
45
-	public function getHTTPCode() {
40
+    /**
41
+     * Returns the HTTP status code for this exception
42
+     *
43
+     * @return int
44
+     */
45
+    public function getHTTPCode() {
46 46
 
47
-		return 423;
48
-	}
47
+        return 423;
48
+    }
49 49
 }
Please login to merge, or discard this patch.
Spacing   +1 added lines, -1 removed lines patch added patch discarded remove patch
@@ -31,7 +31,7 @@
 block discarded – undo
31 31
 class FileLocked extends \Sabre\DAV\Exception {
32 32
 
33 33
 	public function __construct($message = "", $code = 0, Exception $previous = null) {
34
-		if($previous instanceof \OCP\Files\LockNotAcquiredException) {
34
+		if ($previous instanceof \OCP\Files\LockNotAcquiredException) {
35 35
 			$message = sprintf('Target file %s is locked by another process.', $previous->path);
36 36
 		}
37 37
 		parent::__construct($message, $code, $previous);
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Exception/UnsupportedMediaType.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -31,15 +31,15 @@
 block discarded – undo
31 31
  */
32 32
 class UnsupportedMediaType extends \Sabre\DAV\Exception {
33 33
 
34
-	/**
35
-	 * Returns the HTTP status code for this exception
36
-	 *
37
-	 * @return int
38
-	 */
39
-	public function getHTTPCode() {
34
+    /**
35
+     * Returns the HTTP status code for this exception
36
+     *
37
+     * @return int
38
+     */
39
+    public function getHTTPCode() {
40 40
 
41
-		return 415;
41
+        return 415;
42 42
 
43
-	}
43
+    }
44 44
 
45 45
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Exception/EntityTooLarge.php 1 patch
Indentation   +8 added lines, -8 removed lines patch added patch discarded remove patch
@@ -31,15 +31,15 @@
 block discarded – undo
31 31
  */
32 32
 class EntityTooLarge extends \Sabre\DAV\Exception {
33 33
 
34
-	/**
35
-	 * Returns the HTTP status code for this exception
36
-	 *
37
-	 * @return int
38
-	 */
39
-	public function getHTTPCode() {
34
+    /**
35
+     * Returns the HTTP status code for this exception
36
+     *
37
+     * @return int
38
+     */
39
+    public function getHTTPCode() {
40 40
 
41
-		return 413;
41
+        return 413;
42 42
 
43
-	}
43
+    }
44 44
 
45 45
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/Node.php 2 patches
Spacing   +5 added lines, -5 removed lines patch added patch discarded remove patch
@@ -130,7 +130,7 @@  discard block
 block discarded – undo
130 130
 		// verify path of the target
131 131
 		$this->verifyPath();
132 132
 
133
-		$newPath = $parentPath . '/' . $newName;
133
+		$newPath = $parentPath.'/'.$newName;
134 134
 
135 135
 		$this->fileView->rename($this->path, $newPath);
136 136
 
@@ -151,7 +151,7 @@  discard block
 block discarded – undo
151 151
 	public function getLastModified() {
152 152
 		$timestamp = $this->info->getMtime();
153 153
 		if (!empty($timestamp)) {
154
-			return (int)$timestamp;
154
+			return (int) $timestamp;
155 155
 		}
156 156
 		return $timestamp;
157 157
 	}
@@ -178,7 +178,7 @@  discard block
 block discarded – undo
178 178
 	 * @return string
179 179
 	 */
180 180
 	public function getETag() {
181
-		return '"' . $this->info->getEtag() . '"';
181
+		return '"'.$this->info->getEtag().'"';
182 182
 	}
183 183
 
184 184
 	/**
@@ -217,7 +217,7 @@  discard block
 block discarded – undo
217 217
 		if ($this->info->getId()) {
218 218
 			$instanceId = \OC_Util::getInstanceId();
219 219
 			$id = sprintf('%08d', $this->info->getId());
220
-			return $id . $instanceId;
220
+			return $id.$instanceId;
221 221
 		}
222 222
 
223 223
 		return null;
@@ -252,7 +252,7 @@  discard block
 block discarded – undo
252 252
 
253 253
 		if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
254 254
 			/** @var \OCA\Files_Sharing\SharedStorage $storage */
255
-			$permissions = (int)$storage->getShare()->getPermissions();
255
+			$permissions = (int) $storage->getShare()->getPermissions();
256 256
 		} else {
257 257
 			$permissions = $storage->getPermissions($path);
258 258
 		}
Please login to merge, or discard this patch.
Indentation   +322 added lines, -322 removed lines patch added patch discarded remove patch
@@ -44,332 +44,332 @@
 block discarded – undo
44 44
 
45 45
 abstract class Node implements \Sabre\DAV\INode {
46 46
 
47
-	/**
48
-	 * @var \OC\Files\View
49
-	 */
50
-	protected $fileView;
51
-
52
-	/**
53
-	 * The path to the current node
54
-	 *
55
-	 * @var string
56
-	 */
57
-	protected $path;
58
-
59
-	/**
60
-	 * node properties cache
61
-	 *
62
-	 * @var array
63
-	 */
64
-	protected $property_cache = null;
65
-
66
-	/**
67
-	 * @var \OCP\Files\FileInfo
68
-	 */
69
-	protected $info;
70
-
71
-	/**
72
-	 * @var IManager
73
-	 */
74
-	protected $shareManager;
75
-
76
-	/**
77
-	 * Sets up the node, expects a full path name
78
-	 *
79
-	 * @param \OC\Files\View $view
80
-	 * @param \OCP\Files\FileInfo $info
81
-	 * @param IManager $shareManager
82
-	 */
83
-	public function __construct(View $view, FileInfo $info, IManager $shareManager = null) {
84
-		$this->fileView = $view;
85
-		$this->path = $this->fileView->getRelativePath($info->getPath());
86
-		$this->info = $info;
87
-		if ($shareManager) {
88
-			$this->shareManager = $shareManager;
89
-		} else {
90
-			$this->shareManager = \OC::$server->getShareManager();
91
-		}
92
-	}
93
-
94
-	protected function refreshInfo() {
95
-		$this->info = $this->fileView->getFileInfo($this->path);
96
-	}
97
-
98
-	/**
99
-	 *  Returns the name of the node
100
-	 *
101
-	 * @return string
102
-	 */
103
-	public function getName() {
104
-		return $this->info->getName();
105
-	}
106
-
107
-	/**
108
-	 * Returns the full path
109
-	 *
110
-	 * @return string
111
-	 */
112
-	public function getPath() {
113
-		return $this->path;
114
-	}
115
-
116
-	/**
117
-	 * Renames the node
118
-	 *
119
-	 * @param string $name The new name
120
-	 * @throws \Sabre\DAV\Exception\BadRequest
121
-	 * @throws \Sabre\DAV\Exception\Forbidden
122
-	 */
123
-	public function setName($name) {
124
-
125
-		// rename is only allowed if the update privilege is granted
126
-		if (!$this->info->isUpdateable()) {
127
-			throw new \Sabre\DAV\Exception\Forbidden();
128
-		}
129
-
130
-		list($parentPath,) = \Sabre\Uri\split($this->path);
131
-		list(, $newName) = \Sabre\Uri\split($name);
132
-
133
-		// verify path of the target
134
-		$this->verifyPath();
135
-
136
-		$newPath = $parentPath . '/' . $newName;
137
-
138
-		$this->fileView->rename($this->path, $newPath);
139
-
140
-		$this->path = $newPath;
141
-
142
-		$this->refreshInfo();
143
-	}
144
-
145
-	public function setPropertyCache($property_cache) {
146
-		$this->property_cache = $property_cache;
147
-	}
148
-
149
-	/**
150
-	 * Returns the last modification time, as a unix timestamp
151
-	 *
152
-	 * @return int timestamp as integer
153
-	 */
154
-	public function getLastModified() {
155
-		$timestamp = $this->info->getMtime();
156
-		if (!empty($timestamp)) {
157
-			return (int)$timestamp;
158
-		}
159
-		return $timestamp;
160
-	}
161
-
162
-	/**
163
-	 *  sets the last modification time of the file (mtime) to the value given
164
-	 *  in the second parameter or to now if the second param is empty.
165
-	 *  Even if the modification time is set to a custom value the access time is set to now.
166
-	 */
167
-	public function touch($mtime) {
168
-		$mtime = $this->sanitizeMtime($mtime);
169
-		$this->fileView->touch($this->path, $mtime);
170
-		$this->refreshInfo();
171
-	}
172
-
173
-	/**
174
-	 * Returns the ETag for a file
175
-	 *
176
-	 * An ETag is a unique identifier representing the current version of the
177
-	 * file. If the file changes, the ETag MUST change.  The ETag is an
178
-	 * arbitrary string, but MUST be surrounded by double-quotes.
179
-	 *
180
-	 * Return null if the ETag can not effectively be determined
181
-	 *
182
-	 * @return string
183
-	 */
184
-	public function getETag() {
185
-		return '"' . $this->info->getEtag() . '"';
186
-	}
187
-
188
-	/**
189
-	 * Sets the ETag
190
-	 *
191
-	 * @param string $etag
192
-	 *
193
-	 * @return int file id of updated file or -1 on failure
194
-	 */
195
-	public function setETag($etag) {
196
-		return $this->fileView->putFileInfo($this->path, array('etag' => $etag));
197
-	}
198
-
199
-	/**
200
-	 * Returns the size of the node, in bytes
201
-	 *
202
-	 * @return integer
203
-	 */
204
-	public function getSize() {
205
-		return $this->info->getSize();
206
-	}
207
-
208
-	/**
209
-	 * Returns the cache's file id
210
-	 *
211
-	 * @return int
212
-	 */
213
-	public function getId() {
214
-		return $this->info->getId();
215
-	}
216
-
217
-	/**
218
-	 * @return string|null
219
-	 */
220
-	public function getFileId() {
221
-		if ($this->info->getId()) {
222
-			$instanceId = \OC_Util::getInstanceId();
223
-			$id = sprintf('%08d', $this->info->getId());
224
-			return $id . $instanceId;
225
-		}
226
-
227
-		return null;
228
-	}
229
-
230
-	/**
231
-	 * @return integer
232
-	 */
233
-	public function getInternalFileId() {
234
-		return $this->info->getId();
235
-	}
236
-
237
-	/**
238
-	 * @param string $user
239
-	 * @return int
240
-	 */
241
-	public function getSharePermissions($user) {
242
-
243
-		// check of we access a federated share
244
-		if ($user !== null) {
245
-			try {
246
-				$share = $this->shareManager->getShareByToken($user);
247
-				return $share->getPermissions();
248
-			} catch (ShareNotFound $e) {
249
-				// ignore
250
-			}
251
-		}
252
-
253
-		$storage = $this->info->getStorage();
254
-
255
-		$path = $this->info->getInternalPath();
256
-
257
-		if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
258
-			/** @var \OCA\Files_Sharing\SharedStorage $storage */
259
-			$permissions = (int)$storage->getShare()->getPermissions();
260
-		} else {
261
-			$permissions = $storage->getPermissions($path);
262
-		}
263
-
264
-		/*
47
+    /**
48
+     * @var \OC\Files\View
49
+     */
50
+    protected $fileView;
51
+
52
+    /**
53
+     * The path to the current node
54
+     *
55
+     * @var string
56
+     */
57
+    protected $path;
58
+
59
+    /**
60
+     * node properties cache
61
+     *
62
+     * @var array
63
+     */
64
+    protected $property_cache = null;
65
+
66
+    /**
67
+     * @var \OCP\Files\FileInfo
68
+     */
69
+    protected $info;
70
+
71
+    /**
72
+     * @var IManager
73
+     */
74
+    protected $shareManager;
75
+
76
+    /**
77
+     * Sets up the node, expects a full path name
78
+     *
79
+     * @param \OC\Files\View $view
80
+     * @param \OCP\Files\FileInfo $info
81
+     * @param IManager $shareManager
82
+     */
83
+    public function __construct(View $view, FileInfo $info, IManager $shareManager = null) {
84
+        $this->fileView = $view;
85
+        $this->path = $this->fileView->getRelativePath($info->getPath());
86
+        $this->info = $info;
87
+        if ($shareManager) {
88
+            $this->shareManager = $shareManager;
89
+        } else {
90
+            $this->shareManager = \OC::$server->getShareManager();
91
+        }
92
+    }
93
+
94
+    protected function refreshInfo() {
95
+        $this->info = $this->fileView->getFileInfo($this->path);
96
+    }
97
+
98
+    /**
99
+     *  Returns the name of the node
100
+     *
101
+     * @return string
102
+     */
103
+    public function getName() {
104
+        return $this->info->getName();
105
+    }
106
+
107
+    /**
108
+     * Returns the full path
109
+     *
110
+     * @return string
111
+     */
112
+    public function getPath() {
113
+        return $this->path;
114
+    }
115
+
116
+    /**
117
+     * Renames the node
118
+     *
119
+     * @param string $name The new name
120
+     * @throws \Sabre\DAV\Exception\BadRequest
121
+     * @throws \Sabre\DAV\Exception\Forbidden
122
+     */
123
+    public function setName($name) {
124
+
125
+        // rename is only allowed if the update privilege is granted
126
+        if (!$this->info->isUpdateable()) {
127
+            throw new \Sabre\DAV\Exception\Forbidden();
128
+        }
129
+
130
+        list($parentPath,) = \Sabre\Uri\split($this->path);
131
+        list(, $newName) = \Sabre\Uri\split($name);
132
+
133
+        // verify path of the target
134
+        $this->verifyPath();
135
+
136
+        $newPath = $parentPath . '/' . $newName;
137
+
138
+        $this->fileView->rename($this->path, $newPath);
139
+
140
+        $this->path = $newPath;
141
+
142
+        $this->refreshInfo();
143
+    }
144
+
145
+    public function setPropertyCache($property_cache) {
146
+        $this->property_cache = $property_cache;
147
+    }
148
+
149
+    /**
150
+     * Returns the last modification time, as a unix timestamp
151
+     *
152
+     * @return int timestamp as integer
153
+     */
154
+    public function getLastModified() {
155
+        $timestamp = $this->info->getMtime();
156
+        if (!empty($timestamp)) {
157
+            return (int)$timestamp;
158
+        }
159
+        return $timestamp;
160
+    }
161
+
162
+    /**
163
+     *  sets the last modification time of the file (mtime) to the value given
164
+     *  in the second parameter or to now if the second param is empty.
165
+     *  Even if the modification time is set to a custom value the access time is set to now.
166
+     */
167
+    public function touch($mtime) {
168
+        $mtime = $this->sanitizeMtime($mtime);
169
+        $this->fileView->touch($this->path, $mtime);
170
+        $this->refreshInfo();
171
+    }
172
+
173
+    /**
174
+     * Returns the ETag for a file
175
+     *
176
+     * An ETag is a unique identifier representing the current version of the
177
+     * file. If the file changes, the ETag MUST change.  The ETag is an
178
+     * arbitrary string, but MUST be surrounded by double-quotes.
179
+     *
180
+     * Return null if the ETag can not effectively be determined
181
+     *
182
+     * @return string
183
+     */
184
+    public function getETag() {
185
+        return '"' . $this->info->getEtag() . '"';
186
+    }
187
+
188
+    /**
189
+     * Sets the ETag
190
+     *
191
+     * @param string $etag
192
+     *
193
+     * @return int file id of updated file or -1 on failure
194
+     */
195
+    public function setETag($etag) {
196
+        return $this->fileView->putFileInfo($this->path, array('etag' => $etag));
197
+    }
198
+
199
+    /**
200
+     * Returns the size of the node, in bytes
201
+     *
202
+     * @return integer
203
+     */
204
+    public function getSize() {
205
+        return $this->info->getSize();
206
+    }
207
+
208
+    /**
209
+     * Returns the cache's file id
210
+     *
211
+     * @return int
212
+     */
213
+    public function getId() {
214
+        return $this->info->getId();
215
+    }
216
+
217
+    /**
218
+     * @return string|null
219
+     */
220
+    public function getFileId() {
221
+        if ($this->info->getId()) {
222
+            $instanceId = \OC_Util::getInstanceId();
223
+            $id = sprintf('%08d', $this->info->getId());
224
+            return $id . $instanceId;
225
+        }
226
+
227
+        return null;
228
+    }
229
+
230
+    /**
231
+     * @return integer
232
+     */
233
+    public function getInternalFileId() {
234
+        return $this->info->getId();
235
+    }
236
+
237
+    /**
238
+     * @param string $user
239
+     * @return int
240
+     */
241
+    public function getSharePermissions($user) {
242
+
243
+        // check of we access a federated share
244
+        if ($user !== null) {
245
+            try {
246
+                $share = $this->shareManager->getShareByToken($user);
247
+                return $share->getPermissions();
248
+            } catch (ShareNotFound $e) {
249
+                // ignore
250
+            }
251
+        }
252
+
253
+        $storage = $this->info->getStorage();
254
+
255
+        $path = $this->info->getInternalPath();
256
+
257
+        if ($storage->instanceOfStorage('\OCA\Files_Sharing\SharedStorage')) {
258
+            /** @var \OCA\Files_Sharing\SharedStorage $storage */
259
+            $permissions = (int)$storage->getShare()->getPermissions();
260
+        } else {
261
+            $permissions = $storage->getPermissions($path);
262
+        }
263
+
264
+        /*
265 265
 		 * We can always share non moveable mount points with DELETE and UPDATE
266 266
 		 * Eventually we need to do this properly
267 267
 		 */
268
-		$mountpoint = $this->info->getMountPoint();
269
-		if (!($mountpoint instanceof MoveableMount)) {
270
-			$mountpointpath = $mountpoint->getMountPoint();
271
-			if (substr($mountpointpath, -1) === '/') {
272
-				$mountpointpath = substr($mountpointpath, 0, -1);
273
-			}
274
-
275
-			if ($mountpointpath === $this->info->getPath()) {
276
-				$permissions |= \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_UPDATE;
277
-			}
278
-		}
279
-
280
-		/*
268
+        $mountpoint = $this->info->getMountPoint();
269
+        if (!($mountpoint instanceof MoveableMount)) {
270
+            $mountpointpath = $mountpoint->getMountPoint();
271
+            if (substr($mountpointpath, -1) === '/') {
272
+                $mountpointpath = substr($mountpointpath, 0, -1);
273
+            }
274
+
275
+            if ($mountpointpath === $this->info->getPath()) {
276
+                $permissions |= \OCP\Constants::PERMISSION_DELETE | \OCP\Constants::PERMISSION_UPDATE;
277
+            }
278
+        }
279
+
280
+        /*
281 281
 		 * Files can't have create or delete permissions
282 282
 		 */
283
-		if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) {
284
-			$permissions &= ~(\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_DELETE);
285
-		}
286
-
287
-		return $permissions;
288
-	}
289
-
290
-	/**
291
-	 * @return string
292
-	 */
293
-	public function getDavPermissions() {
294
-		$p = '';
295
-		if ($this->info->isShared()) {
296
-			$p .= 'S';
297
-		}
298
-		if ($this->info->isShareable()) {
299
-			$p .= 'R';
300
-		}
301
-		if ($this->info->isMounted()) {
302
-			$p .= 'M';
303
-		}
304
-		if ($this->info->isReadable()) {
305
-			$p .= 'G';
306
-		}
307
-		if ($this->info->isDeletable()) {
308
-			$p .= 'D';
309
-		}
310
-		if ($this->info->isUpdateable()) {
311
-			$p .= 'NV'; // Renameable, Moveable
312
-		}
313
-		if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) {
314
-			if ($this->info->isUpdateable()) {
315
-				$p .= 'W';
316
-			}
317
-		} else {
318
-			if ($this->info->isCreatable()) {
319
-				$p .= 'CK';
320
-			}
321
-		}
322
-		return $p;
323
-	}
324
-
325
-	public function getOwner() {
326
-		return $this->info->getOwner();
327
-	}
328
-
329
-	protected function verifyPath() {
330
-		try {
331
-			$fileName = basename($this->info->getPath());
332
-			$this->fileView->verifyPath($this->path, $fileName);
333
-		} catch (\OCP\Files\InvalidPathException $ex) {
334
-			throw new InvalidPath($ex->getMessage());
335
-		}
336
-	}
337
-
338
-	/**
339
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
340
-	 */
341
-	public function acquireLock($type) {
342
-		$this->fileView->lockFile($this->path, $type);
343
-	}
344
-
345
-	/**
346
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
347
-	 */
348
-	public function releaseLock($type) {
349
-		$this->fileView->unlockFile($this->path, $type);
350
-	}
351
-
352
-	/**
353
-	 * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
354
-	 */
355
-	public function changeLock($type) {
356
-		$this->fileView->changeLock($this->path, $type);
357
-	}
358
-
359
-	public function getFileInfo() {
360
-		return $this->info;
361
-	}
362
-
363
-	protected function sanitizeMtime($mtimeFromRequest) {
364
-		// In PHP 5.X "is_numeric" returns true for strings in hexadecimal
365
-		// notation. This is no longer the case in PHP 7.X, so this check
366
-		// ensures that strings with hexadecimal notations fail too in PHP 5.X.
367
-		$isHexadecimal = is_string($mtimeFromRequest) && preg_match('/^\s*0[xX]/', $mtimeFromRequest);
368
-		if ($isHexadecimal || !is_numeric($mtimeFromRequest)) {
369
-			throw new \InvalidArgumentException('X-OC-MTime header must be an integer (unix timestamp).');
370
-		}
371
-
372
-		return intval($mtimeFromRequest);
373
-	}
283
+        if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) {
284
+            $permissions &= ~(\OCP\Constants::PERMISSION_CREATE | \OCP\Constants::PERMISSION_DELETE);
285
+        }
286
+
287
+        return $permissions;
288
+    }
289
+
290
+    /**
291
+     * @return string
292
+     */
293
+    public function getDavPermissions() {
294
+        $p = '';
295
+        if ($this->info->isShared()) {
296
+            $p .= 'S';
297
+        }
298
+        if ($this->info->isShareable()) {
299
+            $p .= 'R';
300
+        }
301
+        if ($this->info->isMounted()) {
302
+            $p .= 'M';
303
+        }
304
+        if ($this->info->isReadable()) {
305
+            $p .= 'G';
306
+        }
307
+        if ($this->info->isDeletable()) {
308
+            $p .= 'D';
309
+        }
310
+        if ($this->info->isUpdateable()) {
311
+            $p .= 'NV'; // Renameable, Moveable
312
+        }
313
+        if ($this->info->getType() === \OCP\Files\FileInfo::TYPE_FILE) {
314
+            if ($this->info->isUpdateable()) {
315
+                $p .= 'W';
316
+            }
317
+        } else {
318
+            if ($this->info->isCreatable()) {
319
+                $p .= 'CK';
320
+            }
321
+        }
322
+        return $p;
323
+    }
324
+
325
+    public function getOwner() {
326
+        return $this->info->getOwner();
327
+    }
328
+
329
+    protected function verifyPath() {
330
+        try {
331
+            $fileName = basename($this->info->getPath());
332
+            $this->fileView->verifyPath($this->path, $fileName);
333
+        } catch (\OCP\Files\InvalidPathException $ex) {
334
+            throw new InvalidPath($ex->getMessage());
335
+        }
336
+    }
337
+
338
+    /**
339
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
340
+     */
341
+    public function acquireLock($type) {
342
+        $this->fileView->lockFile($this->path, $type);
343
+    }
344
+
345
+    /**
346
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
347
+     */
348
+    public function releaseLock($type) {
349
+        $this->fileView->unlockFile($this->path, $type);
350
+    }
351
+
352
+    /**
353
+     * @param int $type \OCP\Lock\ILockingProvider::LOCK_SHARED or \OCP\Lock\ILockingProvider::LOCK_EXCLUSIVE
354
+     */
355
+    public function changeLock($type) {
356
+        $this->fileView->changeLock($this->path, $type);
357
+    }
358
+
359
+    public function getFileInfo() {
360
+        return $this->info;
361
+    }
362
+
363
+    protected function sanitizeMtime($mtimeFromRequest) {
364
+        // In PHP 5.X "is_numeric" returns true for strings in hexadecimal
365
+        // notation. This is no longer the case in PHP 7.X, so this check
366
+        // ensures that strings with hexadecimal notations fail too in PHP 5.X.
367
+        $isHexadecimal = is_string($mtimeFromRequest) && preg_match('/^\s*0[xX]/', $mtimeFromRequest);
368
+        if ($isHexadecimal || !is_numeric($mtimeFromRequest)) {
369
+            throw new \InvalidArgumentException('X-OC-MTime header must be an integer (unix timestamp).');
370
+        }
371
+
372
+        return intval($mtimeFromRequest);
373
+    }
374 374
 
375 375
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/SharesPlugin.php 2 patches
Spacing   +2 added lines, -2 removed lines patch added patch discarded remove patch
@@ -148,7 +148,7 @@  discard block
 block discarded – undo
148 148
 
149 149
 		$shareTypesByFileId = [];
150 150
 
151
-		foreach($shares as $fileId => $sharesForFile) {
151
+		foreach ($shares as $fileId => $sharesForFile) {
152 152
 			$types = array_map(function(IShare $share) {
153 153
 				return $share->getShareType();
154 154
 			}, $sharesForFile);
@@ -189,7 +189,7 @@  discard block
 block discarded – undo
189 189
 			}
190 190
 		}
191 191
 
192
-		$propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode) {
192
+		$propFind->handle(self::SHARETYPES_PROPERTYNAME, function() use ($sabreNode) {
193 193
 			if (isset($this->cachedShareTypes[$sabreNode->getId()])) {
194 194
 				$shareTypes = $this->cachedShareTypes[$sabreNode->getId()];
195 195
 			} else {
Please login to merge, or discard this patch.
Indentation   +177 added lines, -177 removed lines patch added patch discarded remove patch
@@ -32,181 +32,181 @@
 block discarded – undo
32 32
  */
33 33
 class SharesPlugin extends \Sabre\DAV\ServerPlugin {
34 34
 
35
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
36
-	const SHARETYPES_PROPERTYNAME = '{http://owncloud.org/ns}share-types';
37
-
38
-	/**
39
-	 * Reference to main server object
40
-	 *
41
-	 * @var \Sabre\DAV\Server
42
-	 */
43
-	private $server;
44
-
45
-	/**
46
-	 * @var \OCP\Share\IManager
47
-	 */
48
-	private $shareManager;
49
-
50
-	/**
51
-	 * @var \Sabre\DAV\Tree
52
-	 */
53
-	private $tree;
54
-
55
-	/**
56
-	 * @var string
57
-	 */
58
-	private $userId;
59
-
60
-	/**
61
-	 * @var \OCP\Files\Folder
62
-	 */
63
-	private $userFolder;
64
-
65
-	/**
66
-	 * @var IShare[]
67
-	 */
68
-	private $cachedShareTypes;
69
-
70
-	private $cachedFolders = [];
71
-
72
-	/**
73
-	 * @param \Sabre\DAV\Tree $tree tree
74
-	 * @param IUserSession $userSession user session
75
-	 * @param \OCP\Files\Folder $userFolder user home folder
76
-	 * @param \OCP\Share\IManager $shareManager share manager
77
-	 */
78
-	public function __construct(
79
-		\Sabre\DAV\Tree $tree,
80
-		IUserSession $userSession,
81
-		\OCP\Files\Folder $userFolder,
82
-		\OCP\Share\IManager $shareManager
83
-	) {
84
-		$this->tree = $tree;
85
-		$this->shareManager = $shareManager;
86
-		$this->userFolder = $userFolder;
87
-		$this->userId = $userSession->getUser()->getUID();
88
-		$this->cachedShareTypes = [];
89
-	}
90
-
91
-	/**
92
-	 * This initializes the plugin.
93
-	 *
94
-	 * This function is called by \Sabre\DAV\Server, after
95
-	 * addPlugin is called.
96
-	 *
97
-	 * This method should set up the required event subscriptions.
98
-	 *
99
-	 * @param \Sabre\DAV\Server $server
100
-	 */
101
-	public function initialize(\Sabre\DAV\Server $server) {
102
-		$server->xml->namespacesMap[self::NS_OWNCLOUD] = 'oc';
103
-		$server->xml->elementMap[self::SHARETYPES_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\ShareTypeList';
104
-		$server->protectedProperties[] = self::SHARETYPES_PROPERTYNAME;
105
-
106
-		$this->server = $server;
107
-		$this->server->on('propFind', array($this, 'handleGetProperties'));
108
-	}
109
-
110
-	/**
111
-	 * Return a list of share types for outgoing shares
112
-	 *
113
-	 * @param \OCP\Files\Node $node file node
114
-	 *
115
-	 * @return int[] array of share types
116
-	 */
117
-	private function getShareTypes(\OCP\Files\Node $node) {
118
-		$shareTypes = [];
119
-		$requestedShareTypes = [
120
-			\OCP\Share::SHARE_TYPE_USER,
121
-			\OCP\Share::SHARE_TYPE_GROUP,
122
-			\OCP\Share::SHARE_TYPE_LINK,
123
-			\OCP\Share::SHARE_TYPE_REMOTE,
124
-			\OCP\Share::SHARE_TYPE_EMAIL,
125
-		];
126
-		foreach ($requestedShareTypes as $requestedShareType) {
127
-			// one of each type is enough to find out about the types
128
-			$shares = $this->shareManager->getSharesBy(
129
-				$this->userId,
130
-				$requestedShareType,
131
-				$node,
132
-				false,
133
-				1
134
-			);
135
-			if (!empty($shares)) {
136
-				$shareTypes[] = $requestedShareType;
137
-			}
138
-		}
139
-		return $shareTypes;
140
-	}
141
-
142
-	private function getSharesTypesInFolder(\OCP\Files\Folder $node) {
143
-		$shares = $this->shareManager->getSharesInFolder(
144
-			$this->userId,
145
-			$node,
146
-			true
147
-		);
148
-
149
-		$shareTypesByFileId = [];
150
-
151
-		foreach($shares as $fileId => $sharesForFile) {
152
-			$types = array_map(function(IShare $share) {
153
-				return $share->getShareType();
154
-			}, $sharesForFile);
155
-			$types = array_unique($types);
156
-			sort($types);
157
-			$shareTypesByFileId[$fileId] = $types;
158
-		}
159
-
160
-		return $shareTypesByFileId;
161
-	}
162
-
163
-	/**
164
-	 * Adds shares to propfind response
165
-	 *
166
-	 * @param PropFind $propFind propfind object
167
-	 * @param \Sabre\DAV\INode $sabreNode sabre node
168
-	 */
169
-	public function handleGetProperties(
170
-		PropFind $propFind,
171
-		\Sabre\DAV\INode $sabreNode
172
-	) {
173
-		if (!($sabreNode instanceof \OCA\DAV\Connector\Sabre\Node)) {
174
-			return;
175
-		}
176
-
177
-		// need prefetch ?
178
-		if ($sabreNode instanceof \OCA\DAV\Connector\Sabre\Directory
179
-			&& $propFind->getDepth() !== 0
180
-			&& !is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME))
181
-		) {
182
-			$folderNode = $this->userFolder->get($sabreNode->getPath());
183
-
184
-			$childShares = $this->getSharesTypesInFolder($folderNode);
185
-			$this->cachedFolders[] = $sabreNode->getPath();
186
-			$this->cachedShareTypes[$folderNode->getId()] = $this->getShareTypes($folderNode);
187
-			foreach ($childShares as $id => $shares) {
188
-				$this->cachedShareTypes[$id] = $shares;
189
-			}
190
-		}
191
-
192
-		$propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode) {
193
-			if (isset($this->cachedShareTypes[$sabreNode->getId()])) {
194
-				$shareTypes = $this->cachedShareTypes[$sabreNode->getId()];
195
-			} else {
196
-				list($parentPath,) = \Sabre\Uri\split($sabreNode->getPath());
197
-				if ($parentPath === '') {
198
-					$parentPath = '/';
199
-				}
200
-				// if we already cached the folder this file is in we know there are no shares for this file
201
-				if (array_search($parentPath, $this->cachedFolders) === false) {
202
-					$node = $this->userFolder->get($sabreNode->getPath());
203
-					$shareTypes = $this->getShareTypes($node);
204
-				} else {
205
-					return [];
206
-				}
207
-			}
208
-
209
-			return new ShareTypeList($shareTypes);
210
-		});
211
-	}
35
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
36
+    const SHARETYPES_PROPERTYNAME = '{http://owncloud.org/ns}share-types';
37
+
38
+    /**
39
+     * Reference to main server object
40
+     *
41
+     * @var \Sabre\DAV\Server
42
+     */
43
+    private $server;
44
+
45
+    /**
46
+     * @var \OCP\Share\IManager
47
+     */
48
+    private $shareManager;
49
+
50
+    /**
51
+     * @var \Sabre\DAV\Tree
52
+     */
53
+    private $tree;
54
+
55
+    /**
56
+     * @var string
57
+     */
58
+    private $userId;
59
+
60
+    /**
61
+     * @var \OCP\Files\Folder
62
+     */
63
+    private $userFolder;
64
+
65
+    /**
66
+     * @var IShare[]
67
+     */
68
+    private $cachedShareTypes;
69
+
70
+    private $cachedFolders = [];
71
+
72
+    /**
73
+     * @param \Sabre\DAV\Tree $tree tree
74
+     * @param IUserSession $userSession user session
75
+     * @param \OCP\Files\Folder $userFolder user home folder
76
+     * @param \OCP\Share\IManager $shareManager share manager
77
+     */
78
+    public function __construct(
79
+        \Sabre\DAV\Tree $tree,
80
+        IUserSession $userSession,
81
+        \OCP\Files\Folder $userFolder,
82
+        \OCP\Share\IManager $shareManager
83
+    ) {
84
+        $this->tree = $tree;
85
+        $this->shareManager = $shareManager;
86
+        $this->userFolder = $userFolder;
87
+        $this->userId = $userSession->getUser()->getUID();
88
+        $this->cachedShareTypes = [];
89
+    }
90
+
91
+    /**
92
+     * This initializes the plugin.
93
+     *
94
+     * This function is called by \Sabre\DAV\Server, after
95
+     * addPlugin is called.
96
+     *
97
+     * This method should set up the required event subscriptions.
98
+     *
99
+     * @param \Sabre\DAV\Server $server
100
+     */
101
+    public function initialize(\Sabre\DAV\Server $server) {
102
+        $server->xml->namespacesMap[self::NS_OWNCLOUD] = 'oc';
103
+        $server->xml->elementMap[self::SHARETYPES_PROPERTYNAME] = 'OCA\\DAV\\Connector\\Sabre\\ShareTypeList';
104
+        $server->protectedProperties[] = self::SHARETYPES_PROPERTYNAME;
105
+
106
+        $this->server = $server;
107
+        $this->server->on('propFind', array($this, 'handleGetProperties'));
108
+    }
109
+
110
+    /**
111
+     * Return a list of share types for outgoing shares
112
+     *
113
+     * @param \OCP\Files\Node $node file node
114
+     *
115
+     * @return int[] array of share types
116
+     */
117
+    private function getShareTypes(\OCP\Files\Node $node) {
118
+        $shareTypes = [];
119
+        $requestedShareTypes = [
120
+            \OCP\Share::SHARE_TYPE_USER,
121
+            \OCP\Share::SHARE_TYPE_GROUP,
122
+            \OCP\Share::SHARE_TYPE_LINK,
123
+            \OCP\Share::SHARE_TYPE_REMOTE,
124
+            \OCP\Share::SHARE_TYPE_EMAIL,
125
+        ];
126
+        foreach ($requestedShareTypes as $requestedShareType) {
127
+            // one of each type is enough to find out about the types
128
+            $shares = $this->shareManager->getSharesBy(
129
+                $this->userId,
130
+                $requestedShareType,
131
+                $node,
132
+                false,
133
+                1
134
+            );
135
+            if (!empty($shares)) {
136
+                $shareTypes[] = $requestedShareType;
137
+            }
138
+        }
139
+        return $shareTypes;
140
+    }
141
+
142
+    private function getSharesTypesInFolder(\OCP\Files\Folder $node) {
143
+        $shares = $this->shareManager->getSharesInFolder(
144
+            $this->userId,
145
+            $node,
146
+            true
147
+        );
148
+
149
+        $shareTypesByFileId = [];
150
+
151
+        foreach($shares as $fileId => $sharesForFile) {
152
+            $types = array_map(function(IShare $share) {
153
+                return $share->getShareType();
154
+            }, $sharesForFile);
155
+            $types = array_unique($types);
156
+            sort($types);
157
+            $shareTypesByFileId[$fileId] = $types;
158
+        }
159
+
160
+        return $shareTypesByFileId;
161
+    }
162
+
163
+    /**
164
+     * Adds shares to propfind response
165
+     *
166
+     * @param PropFind $propFind propfind object
167
+     * @param \Sabre\DAV\INode $sabreNode sabre node
168
+     */
169
+    public function handleGetProperties(
170
+        PropFind $propFind,
171
+        \Sabre\DAV\INode $sabreNode
172
+    ) {
173
+        if (!($sabreNode instanceof \OCA\DAV\Connector\Sabre\Node)) {
174
+            return;
175
+        }
176
+
177
+        // need prefetch ?
178
+        if ($sabreNode instanceof \OCA\DAV\Connector\Sabre\Directory
179
+            && $propFind->getDepth() !== 0
180
+            && !is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME))
181
+        ) {
182
+            $folderNode = $this->userFolder->get($sabreNode->getPath());
183
+
184
+            $childShares = $this->getSharesTypesInFolder($folderNode);
185
+            $this->cachedFolders[] = $sabreNode->getPath();
186
+            $this->cachedShareTypes[$folderNode->getId()] = $this->getShareTypes($folderNode);
187
+            foreach ($childShares as $id => $shares) {
188
+                $this->cachedShareTypes[$id] = $shares;
189
+            }
190
+        }
191
+
192
+        $propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode) {
193
+            if (isset($this->cachedShareTypes[$sabreNode->getId()])) {
194
+                $shareTypes = $this->cachedShareTypes[$sabreNode->getId()];
195
+            } else {
196
+                list($parentPath,) = \Sabre\Uri\split($sabreNode->getPath());
197
+                if ($parentPath === '') {
198
+                    $parentPath = '/';
199
+                }
200
+                // if we already cached the folder this file is in we know there are no shares for this file
201
+                if (array_search($parentPath, $this->cachedFolders) === false) {
202
+                    $node = $this->userFolder->get($sabreNode->getPath());
203
+                    $shareTypes = $this->getShareTypes($node);
204
+                } else {
205
+                    return [];
206
+                }
207
+            }
208
+
209
+            return new ShareTypeList($shareTypes);
210
+        });
211
+    }
212 212
 }
Please login to merge, or discard this patch.
apps/dav/lib/Connector/Sabre/FilesPlugin.php 3 patches
Braces   +3 added lines, -1 removed lines patch added patch discarded remove patch
@@ -245,7 +245,9 @@
 block discarded – undo
245 245
 	function httpGet(RequestInterface $request, ResponseInterface $response) {
246 246
 		// Only handle valid files
247 247
 		$node = $this->tree->getNodeForPath($request->getPath());
248
-		if (!($node instanceof IFile)) return;
248
+		if (!($node instanceof IFile)) {
249
+		    return;
250
+		}
249 251
 
250 252
 		// adds a 'Content-Disposition: attachment' header in case no disposition
251 253
 		// header has been set before
Please login to merge, or discard this patch.
Indentation   +399 added lines, -399 removed lines patch added patch discarded remove patch
@@ -50,407 +50,407 @@
 block discarded – undo
50 50
 
51 51
 class FilesPlugin extends ServerPlugin {
52 52
 
53
-	// namespace
54
-	const NS_OWNCLOUD = 'http://owncloud.org/ns';
55
-	const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
56
-	const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
57
-	const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
58
-	const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
59
-	const SHARE_PERMISSIONS_PROPERTYNAME = '{http://open-collaboration-services.org/ns}share-permissions';
60
-	const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL';
61
-	const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
62
-	const GETETAG_PROPERTYNAME = '{DAV:}getetag';
63
-	const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
64
-	const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
65
-	const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
66
-	const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
67
-	const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
68
-	const HAS_PREVIEW_PROPERTYNAME = '{http://nextcloud.org/ns}has-preview';
69
-	const MOUNT_TYPE_PROPERTYNAME = '{http://nextcloud.org/ns}mount-type';
70
-	const IS_ENCRYPTED_PROPERTYNAME = '{http://nextcloud.org/ns}is-encrypted';
71
-
72
-	/**
73
-	 * Reference to main server object
74
-	 *
75
-	 * @var \Sabre\DAV\Server
76
-	 */
77
-	private $server;
78
-
79
-	/**
80
-	 * @var Tree
81
-	 */
82
-	private $tree;
83
-
84
-	/**
85
-	 * Whether this is public webdav.
86
-	 * If true, some returned information will be stripped off.
87
-	 *
88
-	 * @var bool
89
-	 */
90
-	private $isPublic;
91
-
92
-	/**
93
-	 * @var bool
94
-	 */
95
-	private $downloadAttachment;
96
-
97
-	/**
98
-	 * @var IConfig
99
-	 */
100
-	private $config;
101
-
102
-	/**
103
-	 * @var IRequest
104
-	 */
105
-	private $request;
106
-
107
-	/**
108
-	 * @var IPreview
109
-	 */
110
-	private $previewManager;
111
-
112
-	/**
113
-	 * @param Tree $tree
114
-	 * @param IConfig $config
115
-	 * @param IRequest $request
116
-	 * @param IPreview $previewManager
117
-	 * @param bool $isPublic
118
-	 * @param bool $downloadAttachment
119
-	 */
120
-	public function __construct(Tree $tree,
121
-								IConfig $config,
122
-								IRequest $request,
123
-								IPreview $previewManager,
124
-								$isPublic = false,
125
-								$downloadAttachment = true) {
126
-		$this->tree = $tree;
127
-		$this->config = $config;
128
-		$this->request = $request;
129
-		$this->isPublic = $isPublic;
130
-		$this->downloadAttachment = $downloadAttachment;
131
-		$this->previewManager = $previewManager;
132
-	}
133
-
134
-	/**
135
-	 * This initializes the plugin.
136
-	 *
137
-	 * This function is called by \Sabre\DAV\Server, after
138
-	 * addPlugin is called.
139
-	 *
140
-	 * This method should set up the required event subscriptions.
141
-	 *
142
-	 * @param \Sabre\DAV\Server $server
143
-	 * @return void
144
-	 */
145
-	public function initialize(\Sabre\DAV\Server $server) {
146
-		$server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
147
-		$server->xml->namespaceMap[self::NS_NEXTCLOUD] = 'nc';
148
-		$server->protectedProperties[] = self::FILEID_PROPERTYNAME;
149
-		$server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
150
-		$server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
151
-		$server->protectedProperties[] = self::SHARE_PERMISSIONS_PROPERTYNAME;
152
-		$server->protectedProperties[] = self::SIZE_PROPERTYNAME;
153
-		$server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
154
-		$server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
155
-		$server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
156
-		$server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
157
-		$server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
158
-		$server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME;
159
-		$server->protectedProperties[] = self::MOUNT_TYPE_PROPERTYNAME;
160
-		$server->protectedProperties[] = self::IS_ENCRYPTED_PROPERTYNAME;
161
-
162
-		// normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
163
-		$allowedProperties = ['{DAV:}getetag'];
164
-		$server->protectedProperties = array_diff($server->protectedProperties, $allowedProperties);
165
-
166
-		$this->server = $server;
167
-		$this->server->on('propFind', array($this, 'handleGetProperties'));
168
-		$this->server->on('propPatch', array($this, 'handleUpdateProperties'));
169
-		$this->server->on('afterBind', array($this, 'sendFileIdHeader'));
170
-		$this->server->on('afterWriteContent', array($this, 'sendFileIdHeader'));
171
-		$this->server->on('afterMethod:GET', [$this,'httpGet']);
172
-		$this->server->on('afterMethod:GET', array($this, 'handleDownloadToken'));
173
-		$this->server->on('afterResponse', function($request, ResponseInterface $response) {
174
-			$body = $response->getBody();
175
-			if (is_resource($body)) {
176
-				fclose($body);
177
-			}
178
-		});
179
-		$this->server->on('beforeMove', [$this, 'checkMove']);
180
-	}
181
-
182
-	/**
183
-	 * Plugin that checks if a move can actually be performed.
184
-	 *
185
-	 * @param string $source source path
186
-	 * @param string $destination destination path
187
-	 * @throws Forbidden
188
-	 * @throws NotFound
189
-	 */
190
-	function checkMove($source, $destination) {
191
-		$sourceNode = $this->tree->getNodeForPath($source);
192
-		if (!$sourceNode instanceof Node) {
193
-			return;
194
-		}
195
-		list($sourceDir,) = \Sabre\Uri\split($source);
196
-		list($destinationDir,) = \Sabre\Uri\split($destination);
197
-
198
-		if ($sourceDir !== $destinationDir) {
199
-			$sourceNodeFileInfo = $sourceNode->getFileInfo();
200
-			if ($sourceNodeFileInfo === null) {
201
-				throw new NotFound($source . ' does not exist');
202
- 			}
203
-
204
-			if (!$sourceNodeFileInfo->isDeletable()) {
205
-				throw new Forbidden($source . " cannot be deleted");
206
-			}
207
-		}
208
-	}
209
-
210
-	/**
211
-	 * This sets a cookie to be able to recognize the start of the download
212
-	 * the content must not be longer than 32 characters and must only contain
213
-	 * alphanumeric characters
214
-	 *
215
-	 * @param RequestInterface $request
216
-	 * @param ResponseInterface $response
217
-	 */
218
-	function handleDownloadToken(RequestInterface $request, ResponseInterface $response) {
219
-		$queryParams = $request->getQueryParameters();
220
-
221
-		/**
222
-		 * this sets a cookie to be able to recognize the start of the download
223
-		 * the content must not be longer than 32 characters and must only contain
224
-		 * alphanumeric characters
225
-		 */
226
-		if (isset($queryParams['downloadStartSecret'])) {
227
-			$token = $queryParams['downloadStartSecret'];
228
-			if (!isset($token[32])
229
-				&& preg_match('!^[a-zA-Z0-9]+$!', $token) === 1) {
230
-				// FIXME: use $response->setHeader() instead
231
-				setcookie('ocDownloadStarted', $token, time() + 20, '/');
232
-			}
233
-		}
234
-	}
235
-
236
-	/**
237
-	 * Add headers to file download
238
-	 *
239
-	 * @param RequestInterface $request
240
-	 * @param ResponseInterface $response
241
-	 */
242
-	function httpGet(RequestInterface $request, ResponseInterface $response) {
243
-		// Only handle valid files
244
-		$node = $this->tree->getNodeForPath($request->getPath());
245
-		if (!($node instanceof IFile)) return;
246
-
247
-		// adds a 'Content-Disposition: attachment' header in case no disposition
248
-		// header has been set before
249
-		if ($this->downloadAttachment &&
250
-			$response->getHeader('Content-Disposition') === null) {
251
-			$filename = $node->getName();
252
-			if ($this->request->isUserAgent(
253
-				[
254
-					Request::USER_AGENT_IE,
255
-					Request::USER_AGENT_ANDROID_MOBILE_CHROME,
256
-					Request::USER_AGENT_FREEBOX,
257
-				])) {
258
-				$response->addHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"');
259
-			} else {
260
-				$response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
261
-													 . '; filename="' . rawurlencode($filename) . '"');
262
-			}
263
-		}
264
-
265
-		if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
266
-			//Add OC-Checksum header
267
-			/** @var $node File */
268
-			$checksum = $node->getChecksum();
269
-			if ($checksum !== null && $checksum !== '') {
270
-				$response->addHeader('OC-Checksum', $checksum);
271
-			}
272
-		}
273
-	}
274
-
275
-	/**
276
-	 * Adds all ownCloud-specific properties
277
-	 *
278
-	 * @param PropFind $propFind
279
-	 * @param \Sabre\DAV\INode $node
280
-	 * @return void
281
-	 */
282
-	public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) {
283
-
284
-		$httpRequest = $this->server->httpRequest;
285
-
286
-		if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
287
-			/**
288
-			 * This was disabled, because it made dir listing throw an exception,
289
-			 * so users were unable to navigate into folders where one subitem
290
-			 * is blocked by the files_accesscontrol app, see:
291
-			 * https://github.com/nextcloud/files_accesscontrol/issues/65
53
+    // namespace
54
+    const NS_OWNCLOUD = 'http://owncloud.org/ns';
55
+    const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
56
+    const FILEID_PROPERTYNAME = '{http://owncloud.org/ns}id';
57
+    const INTERNAL_FILEID_PROPERTYNAME = '{http://owncloud.org/ns}fileid';
58
+    const PERMISSIONS_PROPERTYNAME = '{http://owncloud.org/ns}permissions';
59
+    const SHARE_PERMISSIONS_PROPERTYNAME = '{http://open-collaboration-services.org/ns}share-permissions';
60
+    const DOWNLOADURL_PROPERTYNAME = '{http://owncloud.org/ns}downloadURL';
61
+    const SIZE_PROPERTYNAME = '{http://owncloud.org/ns}size';
62
+    const GETETAG_PROPERTYNAME = '{DAV:}getetag';
63
+    const LASTMODIFIED_PROPERTYNAME = '{DAV:}lastmodified';
64
+    const OWNER_ID_PROPERTYNAME = '{http://owncloud.org/ns}owner-id';
65
+    const OWNER_DISPLAY_NAME_PROPERTYNAME = '{http://owncloud.org/ns}owner-display-name';
66
+    const CHECKSUMS_PROPERTYNAME = '{http://owncloud.org/ns}checksums';
67
+    const DATA_FINGERPRINT_PROPERTYNAME = '{http://owncloud.org/ns}data-fingerprint';
68
+    const HAS_PREVIEW_PROPERTYNAME = '{http://nextcloud.org/ns}has-preview';
69
+    const MOUNT_TYPE_PROPERTYNAME = '{http://nextcloud.org/ns}mount-type';
70
+    const IS_ENCRYPTED_PROPERTYNAME = '{http://nextcloud.org/ns}is-encrypted';
71
+
72
+    /**
73
+     * Reference to main server object
74
+     *
75
+     * @var \Sabre\DAV\Server
76
+     */
77
+    private $server;
78
+
79
+    /**
80
+     * @var Tree
81
+     */
82
+    private $tree;
83
+
84
+    /**
85
+     * Whether this is public webdav.
86
+     * If true, some returned information will be stripped off.
87
+     *
88
+     * @var bool
89
+     */
90
+    private $isPublic;
91
+
92
+    /**
93
+     * @var bool
94
+     */
95
+    private $downloadAttachment;
96
+
97
+    /**
98
+     * @var IConfig
99
+     */
100
+    private $config;
101
+
102
+    /**
103
+     * @var IRequest
104
+     */
105
+    private $request;
106
+
107
+    /**
108
+     * @var IPreview
109
+     */
110
+    private $previewManager;
111
+
112
+    /**
113
+     * @param Tree $tree
114
+     * @param IConfig $config
115
+     * @param IRequest $request
116
+     * @param IPreview $previewManager
117
+     * @param bool $isPublic
118
+     * @param bool $downloadAttachment
119
+     */
120
+    public function __construct(Tree $tree,
121
+                                IConfig $config,
122
+                                IRequest $request,
123
+                                IPreview $previewManager,
124
+                                $isPublic = false,
125
+                                $downloadAttachment = true) {
126
+        $this->tree = $tree;
127
+        $this->config = $config;
128
+        $this->request = $request;
129
+        $this->isPublic = $isPublic;
130
+        $this->downloadAttachment = $downloadAttachment;
131
+        $this->previewManager = $previewManager;
132
+    }
133
+
134
+    /**
135
+     * This initializes the plugin.
136
+     *
137
+     * This function is called by \Sabre\DAV\Server, after
138
+     * addPlugin is called.
139
+     *
140
+     * This method should set up the required event subscriptions.
141
+     *
142
+     * @param \Sabre\DAV\Server $server
143
+     * @return void
144
+     */
145
+    public function initialize(\Sabre\DAV\Server $server) {
146
+        $server->xml->namespaceMap[self::NS_OWNCLOUD] = 'oc';
147
+        $server->xml->namespaceMap[self::NS_NEXTCLOUD] = 'nc';
148
+        $server->protectedProperties[] = self::FILEID_PROPERTYNAME;
149
+        $server->protectedProperties[] = self::INTERNAL_FILEID_PROPERTYNAME;
150
+        $server->protectedProperties[] = self::PERMISSIONS_PROPERTYNAME;
151
+        $server->protectedProperties[] = self::SHARE_PERMISSIONS_PROPERTYNAME;
152
+        $server->protectedProperties[] = self::SIZE_PROPERTYNAME;
153
+        $server->protectedProperties[] = self::DOWNLOADURL_PROPERTYNAME;
154
+        $server->protectedProperties[] = self::OWNER_ID_PROPERTYNAME;
155
+        $server->protectedProperties[] = self::OWNER_DISPLAY_NAME_PROPERTYNAME;
156
+        $server->protectedProperties[] = self::CHECKSUMS_PROPERTYNAME;
157
+        $server->protectedProperties[] = self::DATA_FINGERPRINT_PROPERTYNAME;
158
+        $server->protectedProperties[] = self::HAS_PREVIEW_PROPERTYNAME;
159
+        $server->protectedProperties[] = self::MOUNT_TYPE_PROPERTYNAME;
160
+        $server->protectedProperties[] = self::IS_ENCRYPTED_PROPERTYNAME;
161
+
162
+        // normally these cannot be changed (RFC4918), but we want them modifiable through PROPPATCH
163
+        $allowedProperties = ['{DAV:}getetag'];
164
+        $server->protectedProperties = array_diff($server->protectedProperties, $allowedProperties);
165
+
166
+        $this->server = $server;
167
+        $this->server->on('propFind', array($this, 'handleGetProperties'));
168
+        $this->server->on('propPatch', array($this, 'handleUpdateProperties'));
169
+        $this->server->on('afterBind', array($this, 'sendFileIdHeader'));
170
+        $this->server->on('afterWriteContent', array($this, 'sendFileIdHeader'));
171
+        $this->server->on('afterMethod:GET', [$this,'httpGet']);
172
+        $this->server->on('afterMethod:GET', array($this, 'handleDownloadToken'));
173
+        $this->server->on('afterResponse', function($request, ResponseInterface $response) {
174
+            $body = $response->getBody();
175
+            if (is_resource($body)) {
176
+                fclose($body);
177
+            }
178
+        });
179
+        $this->server->on('beforeMove', [$this, 'checkMove']);
180
+    }
181
+
182
+    /**
183
+     * Plugin that checks if a move can actually be performed.
184
+     *
185
+     * @param string $source source path
186
+     * @param string $destination destination path
187
+     * @throws Forbidden
188
+     * @throws NotFound
189
+     */
190
+    function checkMove($source, $destination) {
191
+        $sourceNode = $this->tree->getNodeForPath($source);
192
+        if (!$sourceNode instanceof Node) {
193
+            return;
194
+        }
195
+        list($sourceDir,) = \Sabre\Uri\split($source);
196
+        list($destinationDir,) = \Sabre\Uri\split($destination);
197
+
198
+        if ($sourceDir !== $destinationDir) {
199
+            $sourceNodeFileInfo = $sourceNode->getFileInfo();
200
+            if ($sourceNodeFileInfo === null) {
201
+                throw new NotFound($source . ' does not exist');
202
+                }
203
+
204
+            if (!$sourceNodeFileInfo->isDeletable()) {
205
+                throw new Forbidden($source . " cannot be deleted");
206
+            }
207
+        }
208
+    }
209
+
210
+    /**
211
+     * This sets a cookie to be able to recognize the start of the download
212
+     * the content must not be longer than 32 characters and must only contain
213
+     * alphanumeric characters
214
+     *
215
+     * @param RequestInterface $request
216
+     * @param ResponseInterface $response
217
+     */
218
+    function handleDownloadToken(RequestInterface $request, ResponseInterface $response) {
219
+        $queryParams = $request->getQueryParameters();
220
+
221
+        /**
222
+         * this sets a cookie to be able to recognize the start of the download
223
+         * the content must not be longer than 32 characters and must only contain
224
+         * alphanumeric characters
225
+         */
226
+        if (isset($queryParams['downloadStartSecret'])) {
227
+            $token = $queryParams['downloadStartSecret'];
228
+            if (!isset($token[32])
229
+                && preg_match('!^[a-zA-Z0-9]+$!', $token) === 1) {
230
+                // FIXME: use $response->setHeader() instead
231
+                setcookie('ocDownloadStarted', $token, time() + 20, '/');
232
+            }
233
+        }
234
+    }
235
+
236
+    /**
237
+     * Add headers to file download
238
+     *
239
+     * @param RequestInterface $request
240
+     * @param ResponseInterface $response
241
+     */
242
+    function httpGet(RequestInterface $request, ResponseInterface $response) {
243
+        // Only handle valid files
244
+        $node = $this->tree->getNodeForPath($request->getPath());
245
+        if (!($node instanceof IFile)) return;
246
+
247
+        // adds a 'Content-Disposition: attachment' header in case no disposition
248
+        // header has been set before
249
+        if ($this->downloadAttachment &&
250
+            $response->getHeader('Content-Disposition') === null) {
251
+            $filename = $node->getName();
252
+            if ($this->request->isUserAgent(
253
+                [
254
+                    Request::USER_AGENT_IE,
255
+                    Request::USER_AGENT_ANDROID_MOBILE_CHROME,
256
+                    Request::USER_AGENT_FREEBOX,
257
+                ])) {
258
+                $response->addHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"');
259
+            } else {
260
+                $response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
261
+                                                        . '; filename="' . rawurlencode($filename) . '"');
262
+            }
263
+        }
264
+
265
+        if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
266
+            //Add OC-Checksum header
267
+            /** @var $node File */
268
+            $checksum = $node->getChecksum();
269
+            if ($checksum !== null && $checksum !== '') {
270
+                $response->addHeader('OC-Checksum', $checksum);
271
+            }
272
+        }
273
+    }
274
+
275
+    /**
276
+     * Adds all ownCloud-specific properties
277
+     *
278
+     * @param PropFind $propFind
279
+     * @param \Sabre\DAV\INode $node
280
+     * @return void
281
+     */
282
+    public function handleGetProperties(PropFind $propFind, \Sabre\DAV\INode $node) {
283
+
284
+        $httpRequest = $this->server->httpRequest;
285
+
286
+        if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
287
+            /**
288
+             * This was disabled, because it made dir listing throw an exception,
289
+             * so users were unable to navigate into folders where one subitem
290
+             * is blocked by the files_accesscontrol app, see:
291
+             * https://github.com/nextcloud/files_accesscontrol/issues/65
292 292
 			if (!$node->getFileInfo()->isReadable()) {
293 293
 				// avoid detecting files through this means
294 294
 				throw new NotFound();
295 295
 			}
296
-			 */
297
-
298
-			$propFind->handle(self::FILEID_PROPERTYNAME, function() use ($node) {
299
-				return $node->getFileId();
300
-			});
301
-
302
-			$propFind->handle(self::INTERNAL_FILEID_PROPERTYNAME, function() use ($node) {
303
-				return $node->getInternalFileId();
304
-			});
305
-
306
-			$propFind->handle(self::PERMISSIONS_PROPERTYNAME, function() use ($node) {
307
-				$perms = $node->getDavPermissions();
308
-				if ($this->isPublic) {
309
-					// remove mount information
310
-					$perms = str_replace(['S', 'M'], '', $perms);
311
-				}
312
-				return $perms;
313
-			});
314
-
315
-			$propFind->handle(self::SHARE_PERMISSIONS_PROPERTYNAME, function() use ($node, $httpRequest) {
316
-				return $node->getSharePermissions(
317
-					$httpRequest->getRawServerValue('PHP_AUTH_USER')
318
-				);
319
-			});
320
-
321
-			$propFind->handle(self::GETETAG_PROPERTYNAME, function() use ($node) {
322
-				return $node->getETag();
323
-			});
324
-
325
-			$propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
326
-				$owner = $node->getOwner();
327
-				if (!$owner) {
328
-					return null;
329
-				} else {
330
-					return $owner->getUID();
331
-				}
332
-			});
333
-			$propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) {
334
-				$owner = $node->getOwner();
335
-				if (!$owner) {
336
-					return null;
337
-				} else {
338
-					return $owner->getDisplayName();
339
-				}
340
-			});
341
-
342
-			$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
343
-				return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
344
-			});
345
-			$propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
346
-				return $node->getSize();
347
-			});
348
-			$propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) {
349
-				return $node->getFileInfo()->getMountPoint()->getMountType();
350
-			});
351
-		}
352
-
353
-		if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
354
-			$propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
355
-				return $this->config->getSystemValue('data-fingerprint', '');
356
-			});
357
-		}
358
-
359
-		if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
360
-			$propFind->handle(self::DOWNLOADURL_PROPERTYNAME, function() use ($node) {
361
-				/** @var $node \OCA\DAV\Connector\Sabre\File */
362
-				try {
363
-					$directDownloadUrl = $node->getDirectDownload();
364
-					if (isset($directDownloadUrl['url'])) {
365
-						return $directDownloadUrl['url'];
366
-					}
367
-				} catch (StorageNotAvailableException $e) {
368
-					return false;
369
-				} catch (ForbiddenException $e) {
370
-					return false;
371
-				}
372
-				return false;
373
-			});
374
-
375
-			$propFind->handle(self::CHECKSUMS_PROPERTYNAME, function() use ($node) {
376
-				$checksum = $node->getChecksum();
377
-				if ($checksum === NULL || $checksum === '') {
378
-					return null;
379
-				}
380
-
381
-				return new ChecksumList($checksum);
382
-			});
383
-
384
-		}
385
-
386
-		if ($node instanceof \OCA\DAV\Connector\Sabre\Directory) {
387
-			$propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
388
-				return $node->getSize();
389
-			});
390
-
391
-			$propFind->handle(self::IS_ENCRYPTED_PROPERTYNAME, function() use ($node) {
392
-				return $node->getFileInfo()->isEncrypted() ? '1' : '0';
393
-			});
394
-		}
395
-	}
396
-
397
-	/**
398
-	 * Update ownCloud-specific properties
399
-	 *
400
-	 * @param string $path
401
-	 * @param PropPatch $propPatch
402
-	 *
403
-	 * @return void
404
-	 */
405
-	public function handleUpdateProperties($path, PropPatch $propPatch) {
406
-		$node = $this->tree->getNodeForPath($path);
407
-		if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) {
408
-			return;
409
-		}
410
-
411
-		$propPatch->handle(self::LASTMODIFIED_PROPERTYNAME, function($time) use ($node) {
412
-			if (empty($time)) {
413
-				return false;
414
-			}
415
-			$node->touch($time);
416
-			return true;
417
-		});
418
-		$propPatch->handle(self::GETETAG_PROPERTYNAME, function($etag) use ($node) {
419
-			if (empty($etag)) {
420
-				return false;
421
-			}
422
-			if ($node->setEtag($etag) !== -1) {
423
-				return true;
424
-			}
425
-			return false;
426
-		});
427
-	}
428
-
429
-	/**
430
-	 * @param string $filePath
431
-	 * @param \Sabre\DAV\INode $node
432
-	 * @throws \Sabre\DAV\Exception\BadRequest
433
-	 */
434
-	public function sendFileIdHeader($filePath, \Sabre\DAV\INode $node = null) {
435
-		// chunked upload handling
436
-		if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
437
-			list($path, $name) = \Sabre\Uri\split($filePath);
438
-			$info = \OC_FileChunking::decodeName($name);
439
-			if (!empty($info)) {
440
-				$filePath = $path . '/' . $info['name'];
441
-			}
442
-		}
443
-
444
-		// we get the node for the given $filePath here because in case of afterCreateFile $node is the parent folder
445
-		if (!$this->server->tree->nodeExists($filePath)) {
446
-			return;
447
-		}
448
-		$node = $this->server->tree->getNodeForPath($filePath);
449
-		if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
450
-			$fileId = $node->getFileId();
451
-			if (!is_null($fileId)) {
452
-				$this->server->httpResponse->setHeader('OC-FileId', $fileId);
453
-			}
454
-		}
455
-	}
296
+             */
297
+
298
+            $propFind->handle(self::FILEID_PROPERTYNAME, function() use ($node) {
299
+                return $node->getFileId();
300
+            });
301
+
302
+            $propFind->handle(self::INTERNAL_FILEID_PROPERTYNAME, function() use ($node) {
303
+                return $node->getInternalFileId();
304
+            });
305
+
306
+            $propFind->handle(self::PERMISSIONS_PROPERTYNAME, function() use ($node) {
307
+                $perms = $node->getDavPermissions();
308
+                if ($this->isPublic) {
309
+                    // remove mount information
310
+                    $perms = str_replace(['S', 'M'], '', $perms);
311
+                }
312
+                return $perms;
313
+            });
314
+
315
+            $propFind->handle(self::SHARE_PERMISSIONS_PROPERTYNAME, function() use ($node, $httpRequest) {
316
+                return $node->getSharePermissions(
317
+                    $httpRequest->getRawServerValue('PHP_AUTH_USER')
318
+                );
319
+            });
320
+
321
+            $propFind->handle(self::GETETAG_PROPERTYNAME, function() use ($node) {
322
+                return $node->getETag();
323
+            });
324
+
325
+            $propFind->handle(self::OWNER_ID_PROPERTYNAME, function() use ($node) {
326
+                $owner = $node->getOwner();
327
+                if (!$owner) {
328
+                    return null;
329
+                } else {
330
+                    return $owner->getUID();
331
+                }
332
+            });
333
+            $propFind->handle(self::OWNER_DISPLAY_NAME_PROPERTYNAME, function() use ($node) {
334
+                $owner = $node->getOwner();
335
+                if (!$owner) {
336
+                    return null;
337
+                } else {
338
+                    return $owner->getDisplayName();
339
+                }
340
+            });
341
+
342
+            $propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
343
+                return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
344
+            });
345
+            $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
346
+                return $node->getSize();
347
+            });
348
+            $propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) {
349
+                return $node->getFileInfo()->getMountPoint()->getMountType();
350
+            });
351
+        }
352
+
353
+        if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
354
+            $propFind->handle(self::DATA_FINGERPRINT_PROPERTYNAME, function() use ($node) {
355
+                return $this->config->getSystemValue('data-fingerprint', '');
356
+            });
357
+        }
358
+
359
+        if ($node instanceof \OCA\DAV\Connector\Sabre\File) {
360
+            $propFind->handle(self::DOWNLOADURL_PROPERTYNAME, function() use ($node) {
361
+                /** @var $node \OCA\DAV\Connector\Sabre\File */
362
+                try {
363
+                    $directDownloadUrl = $node->getDirectDownload();
364
+                    if (isset($directDownloadUrl['url'])) {
365
+                        return $directDownloadUrl['url'];
366
+                    }
367
+                } catch (StorageNotAvailableException $e) {
368
+                    return false;
369
+                } catch (ForbiddenException $e) {
370
+                    return false;
371
+                }
372
+                return false;
373
+            });
374
+
375
+            $propFind->handle(self::CHECKSUMS_PROPERTYNAME, function() use ($node) {
376
+                $checksum = $node->getChecksum();
377
+                if ($checksum === NULL || $checksum === '') {
378
+                    return null;
379
+                }
380
+
381
+                return new ChecksumList($checksum);
382
+            });
383
+
384
+        }
385
+
386
+        if ($node instanceof \OCA\DAV\Connector\Sabre\Directory) {
387
+            $propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
388
+                return $node->getSize();
389
+            });
390
+
391
+            $propFind->handle(self::IS_ENCRYPTED_PROPERTYNAME, function() use ($node) {
392
+                return $node->getFileInfo()->isEncrypted() ? '1' : '0';
393
+            });
394
+        }
395
+    }
396
+
397
+    /**
398
+     * Update ownCloud-specific properties
399
+     *
400
+     * @param string $path
401
+     * @param PropPatch $propPatch
402
+     *
403
+     * @return void
404
+     */
405
+    public function handleUpdateProperties($path, PropPatch $propPatch) {
406
+        $node = $this->tree->getNodeForPath($path);
407
+        if (!($node instanceof \OCA\DAV\Connector\Sabre\Node)) {
408
+            return;
409
+        }
410
+
411
+        $propPatch->handle(self::LASTMODIFIED_PROPERTYNAME, function($time) use ($node) {
412
+            if (empty($time)) {
413
+                return false;
414
+            }
415
+            $node->touch($time);
416
+            return true;
417
+        });
418
+        $propPatch->handle(self::GETETAG_PROPERTYNAME, function($etag) use ($node) {
419
+            if (empty($etag)) {
420
+                return false;
421
+            }
422
+            if ($node->setEtag($etag) !== -1) {
423
+                return true;
424
+            }
425
+            return false;
426
+        });
427
+    }
428
+
429
+    /**
430
+     * @param string $filePath
431
+     * @param \Sabre\DAV\INode $node
432
+     * @throws \Sabre\DAV\Exception\BadRequest
433
+     */
434
+    public function sendFileIdHeader($filePath, \Sabre\DAV\INode $node = null) {
435
+        // chunked upload handling
436
+        if (isset($_SERVER['HTTP_OC_CHUNKED'])) {
437
+            list($path, $name) = \Sabre\Uri\split($filePath);
438
+            $info = \OC_FileChunking::decodeName($name);
439
+            if (!empty($info)) {
440
+                $filePath = $path . '/' . $info['name'];
441
+            }
442
+        }
443
+
444
+        // we get the node for the given $filePath here because in case of afterCreateFile $node is the parent folder
445
+        if (!$this->server->tree->nodeExists($filePath)) {
446
+            return;
447
+        }
448
+        $node = $this->server->tree->getNodeForPath($filePath);
449
+        if ($node instanceof \OCA\DAV\Connector\Sabre\Node) {
450
+            $fileId = $node->getFileId();
451
+            if (!is_null($fileId)) {
452
+                $this->server->httpResponse->setHeader('OC-FileId', $fileId);
453
+            }
454
+        }
455
+    }
456 456
 }
Please login to merge, or discard this patch.
Spacing   +9 added lines, -9 removed lines patch added patch discarded remove patch
@@ -168,7 +168,7 @@  discard block
 block discarded – undo
168 168
 		$this->server->on('propPatch', array($this, 'handleUpdateProperties'));
169 169
 		$this->server->on('afterBind', array($this, 'sendFileIdHeader'));
170 170
 		$this->server->on('afterWriteContent', array($this, 'sendFileIdHeader'));
171
-		$this->server->on('afterMethod:GET', [$this,'httpGet']);
171
+		$this->server->on('afterMethod:GET', [$this, 'httpGet']);
172 172
 		$this->server->on('afterMethod:GET', array($this, 'handleDownloadToken'));
173 173
 		$this->server->on('afterResponse', function($request, ResponseInterface $response) {
174 174
 			$body = $response->getBody();
@@ -198,11 +198,11 @@  discard block
 block discarded – undo
198 198
 		if ($sourceDir !== $destinationDir) {
199 199
 			$sourceNodeFileInfo = $sourceNode->getFileInfo();
200 200
 			if ($sourceNodeFileInfo === null) {
201
-				throw new NotFound($source . ' does not exist');
201
+				throw new NotFound($source.' does not exist');
202 202
  			}
203 203
 
204 204
 			if (!$sourceNodeFileInfo->isDeletable()) {
205
-				throw new Forbidden($source . " cannot be deleted");
205
+				throw new Forbidden($source." cannot be deleted");
206 206
 			}
207 207
 		}
208 208
 	}
@@ -255,10 +255,10 @@  discard block
 block discarded – undo
255 255
 					Request::USER_AGENT_ANDROID_MOBILE_CHROME,
256 256
 					Request::USER_AGENT_FREEBOX,
257 257
 				])) {
258
-				$response->addHeader('Content-Disposition', 'attachment; filename="' . rawurlencode($filename) . '"');
258
+				$response->addHeader('Content-Disposition', 'attachment; filename="'.rawurlencode($filename).'"');
259 259
 			} else {
260
-				$response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\'' . rawurlencode($filename)
261
-													 . '; filename="' . rawurlencode($filename) . '"');
260
+				$response->addHeader('Content-Disposition', 'attachment; filename*=UTF-8\'\''.rawurlencode($filename)
261
+													 . '; filename="'.rawurlencode($filename).'"');
262 262
 			}
263 263
 		}
264 264
 
@@ -339,13 +339,13 @@  discard block
 block discarded – undo
339 339
 				}
340 340
 			});
341 341
 
342
-			$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function () use ($node) {
342
+			$propFind->handle(self::HAS_PREVIEW_PROPERTYNAME, function() use ($node) {
343 343
 				return json_encode($this->previewManager->isAvailable($node->getFileInfo()));
344 344
 			});
345 345
 			$propFind->handle(self::SIZE_PROPERTYNAME, function() use ($node) {
346 346
 				return $node->getSize();
347 347
 			});
348
-			$propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function () use ($node) {
348
+			$propFind->handle(self::MOUNT_TYPE_PROPERTYNAME, function() use ($node) {
349 349
 				return $node->getFileInfo()->getMountPoint()->getMountType();
350 350
 			});
351 351
 		}
@@ -437,7 +437,7 @@  discard block
 block discarded – undo
437 437
 			list($path, $name) = \Sabre\Uri\split($filePath);
438 438
 			$info = \OC_FileChunking::decodeName($name);
439 439
 			if (!empty($info)) {
440
-				$filePath = $path . '/' . $info['name'];
440
+				$filePath = $path.'/'.$info['name'];
441 441
 			}
442 442
 		}
443 443
 
Please login to merge, or discard this patch.