Passed
Push — master ( cdc9a1...3bbacb )
by Roeland
23:51 queued 11:24
created
apps/dav/lib/Connector/Sabre/SharesPlugin.php 1 patch
Indentation   +197 added lines, -197 removed lines patch added patch discarded remove patch
@@ -40,201 +40,201 @@
 block discarded – undo
40 40
  * Sabre Plugin to provide share-related properties
41 41
  */
42 42
 class SharesPlugin extends \Sabre\DAV\ServerPlugin {
43
-	public const NS_OWNCLOUD = 'http://owncloud.org/ns';
44
-	public const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
45
-	public const SHARETYPES_PROPERTYNAME = '{http://owncloud.org/ns}share-types';
46
-	public const SHAREES_PROPERTYNAME = '{http://nextcloud.org/ns}sharees';
47
-
48
-	/**
49
-	 * Reference to main server object
50
-	 *
51
-	 * @var \Sabre\DAV\Server
52
-	 */
53
-	private $server;
54
-
55
-	/** @var \OCP\Share\IManager */
56
-	private $shareManager;
57
-
58
-	/** @var \Sabre\DAV\Tree */
59
-	private $tree;
60
-
61
-	/** @var string */
62
-	private $userId;
63
-
64
-	/** @var \OCP\Files\Folder */
65
-	private $userFolder;
66
-
67
-	/** @var IShare[][] */
68
-	private $cachedShares = [];
69
-
70
-	/** @var string[] */
71
-	private $cachedFolders = [];
72
-
73
-	/**
74
-	 * @param \Sabre\DAV\Tree $tree tree
75
-	 * @param IUserSession $userSession user session
76
-	 * @param \OCP\Files\Folder $userFolder user home folder
77
-	 * @param \OCP\Share\IManager $shareManager share manager
78
-	 */
79
-	public function __construct(
80
-		\Sabre\DAV\Tree $tree,
81
-		IUserSession $userSession,
82
-		\OCP\Files\Folder $userFolder,
83
-		\OCP\Share\IManager $shareManager
84
-	) {
85
-		$this->tree = $tree;
86
-		$this->shareManager = $shareManager;
87
-		$this->userFolder = $userFolder;
88
-		$this->userId = $userSession->getUser()->getUID();
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] = ShareTypeList::class;
104
-		$server->protectedProperties[] = self::SHARETYPES_PROPERTYNAME;
105
-		$server->protectedProperties[] = self::SHAREES_PROPERTYNAME;
106
-
107
-		$this->server = $server;
108
-		$this->server->on('propFind', [$this, 'handleGetProperties']);
109
-	}
110
-
111
-	/**
112
-	 * @param \OCP\Files\Node $node
113
-	 * @return IShare[]
114
-	 */
115
-	private function getShare(\OCP\Files\Node $node): array {
116
-		$result = [];
117
-		$requestedShareTypes = [
118
-			IShare::TYPE_USER,
119
-			IShare::TYPE_GROUP,
120
-			IShare::TYPE_LINK,
121
-			IShare::TYPE_REMOTE,
122
-			IShare::TYPE_EMAIL,
123
-			IShare::TYPE_ROOM,
124
-			IShare::TYPE_CIRCLE,
125
-			IShare::TYPE_DECK,
126
-		];
127
-		foreach ($requestedShareTypes as $requestedShareType) {
128
-			$shares = $this->shareManager->getSharesBy(
129
-				$this->userId,
130
-				$requestedShareType,
131
-				$node,
132
-				false,
133
-				-1
134
-			);
135
-			foreach ($shares as $share) {
136
-				$result[] = $share;
137
-			}
138
-		}
139
-		return $result;
140
-	}
141
-
142
-	/**
143
-	 * @param Folder $node
144
-	 * @return IShare[][]
145
-	 */
146
-	private function getSharesFolder(Folder $node): array {
147
-		return $this->shareManager->getSharesInFolder(
148
-			$this->userId,
149
-			$node,
150
-			true
151
-		);
152
-	}
153
-
154
-	/**
155
-	 * @param DavNode $sabreNode
156
-	 * @return IShare[]
157
-	 */
158
-	private function getShares(DavNode $sabreNode): array {
159
-		if (isset($this->cachedShares[$sabreNode->getId()])) {
160
-			$shares = $this->cachedShares[$sabreNode->getId()];
161
-		} else {
162
-			[$parentPath,] = \Sabre\Uri\split($sabreNode->getPath());
163
-			if ($parentPath === '') {
164
-				$parentPath = '/';
165
-			}
166
-			// if we already cached the folder this file is in we know there are no shares for this file
167
-			if (array_search($parentPath, $this->cachedFolders) === false) {
168
-				try {
169
-					$node = $this->userFolder->get($sabreNode->getPath());
170
-				} catch (NotFoundException $e) {
171
-					return [];
172
-				}
173
-				$shares = $this->getShare($node);
174
-				$this->cachedShares[$sabreNode->getId()] = $shares;
175
-			} else {
176
-				return [];
177
-			}
178
-		}
179
-
180
-		return $shares;
181
-	}
182
-
183
-	/**
184
-	 * Adds shares to propfind response
185
-	 *
186
-	 * @param PropFind $propFind propfind object
187
-	 * @param \Sabre\DAV\INode $sabreNode sabre node
188
-	 */
189
-	public function handleGetProperties(
190
-		PropFind $propFind,
191
-		\Sabre\DAV\INode $sabreNode
192
-	) {
193
-		if (!($sabreNode instanceof DavNode)) {
194
-			return;
195
-		}
196
-
197
-		// need prefetch ?
198
-		if ($sabreNode instanceof Directory
199
-			&& $propFind->getDepth() !== 0
200
-			&& (
201
-				!is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME)) ||
202
-				!is_null($propFind->getStatus(self::SHAREES_PROPERTYNAME))
203
-			)
204
-		) {
205
-			try {
206
-				$folderNode = $this->userFolder->get($sabreNode->getPath());
207
-			} catch (NotFoundException $e) {
208
-				// If the folder can't be properly found just return
209
-				return;
210
-			}
211
-
212
-			if (!($folderNode instanceof Folder)) {
213
-				// Safety check
214
-				return;
215
-			}
216
-
217
-			$this->cachedFolders[] = $sabreNode->getPath();
218
-			$childShares = $this->getSharesFolder($folderNode);
219
-			foreach ($childShares as $id => $shares) {
220
-				$this->cachedShares[$id] = $shares;
221
-			}
222
-		}
223
-
224
-		$propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode) {
225
-			$shares = $this->getShares($sabreNode);
226
-
227
-			$shareTypes = array_unique(array_map(function (IShare $share) {
228
-				return $share->getShareType();
229
-			}, $shares));
230
-
231
-			return new ShareTypeList($shareTypes);
232
-		});
233
-
234
-		$propFind->handle(self::SHAREES_PROPERTYNAME, function () use ($sabreNode) {
235
-			$shares = $this->getShares($sabreNode);
236
-
237
-			return new ShareeList($shares);
238
-		});
239
-	}
43
+    public const NS_OWNCLOUD = 'http://owncloud.org/ns';
44
+    public const NS_NEXTCLOUD = 'http://nextcloud.org/ns';
45
+    public const SHARETYPES_PROPERTYNAME = '{http://owncloud.org/ns}share-types';
46
+    public const SHAREES_PROPERTYNAME = '{http://nextcloud.org/ns}sharees';
47
+
48
+    /**
49
+     * Reference to main server object
50
+     *
51
+     * @var \Sabre\DAV\Server
52
+     */
53
+    private $server;
54
+
55
+    /** @var \OCP\Share\IManager */
56
+    private $shareManager;
57
+
58
+    /** @var \Sabre\DAV\Tree */
59
+    private $tree;
60
+
61
+    /** @var string */
62
+    private $userId;
63
+
64
+    /** @var \OCP\Files\Folder */
65
+    private $userFolder;
66
+
67
+    /** @var IShare[][] */
68
+    private $cachedShares = [];
69
+
70
+    /** @var string[] */
71
+    private $cachedFolders = [];
72
+
73
+    /**
74
+     * @param \Sabre\DAV\Tree $tree tree
75
+     * @param IUserSession $userSession user session
76
+     * @param \OCP\Files\Folder $userFolder user home folder
77
+     * @param \OCP\Share\IManager $shareManager share manager
78
+     */
79
+    public function __construct(
80
+        \Sabre\DAV\Tree $tree,
81
+        IUserSession $userSession,
82
+        \OCP\Files\Folder $userFolder,
83
+        \OCP\Share\IManager $shareManager
84
+    ) {
85
+        $this->tree = $tree;
86
+        $this->shareManager = $shareManager;
87
+        $this->userFolder = $userFolder;
88
+        $this->userId = $userSession->getUser()->getUID();
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] = ShareTypeList::class;
104
+        $server->protectedProperties[] = self::SHARETYPES_PROPERTYNAME;
105
+        $server->protectedProperties[] = self::SHAREES_PROPERTYNAME;
106
+
107
+        $this->server = $server;
108
+        $this->server->on('propFind', [$this, 'handleGetProperties']);
109
+    }
110
+
111
+    /**
112
+     * @param \OCP\Files\Node $node
113
+     * @return IShare[]
114
+     */
115
+    private function getShare(\OCP\Files\Node $node): array {
116
+        $result = [];
117
+        $requestedShareTypes = [
118
+            IShare::TYPE_USER,
119
+            IShare::TYPE_GROUP,
120
+            IShare::TYPE_LINK,
121
+            IShare::TYPE_REMOTE,
122
+            IShare::TYPE_EMAIL,
123
+            IShare::TYPE_ROOM,
124
+            IShare::TYPE_CIRCLE,
125
+            IShare::TYPE_DECK,
126
+        ];
127
+        foreach ($requestedShareTypes as $requestedShareType) {
128
+            $shares = $this->shareManager->getSharesBy(
129
+                $this->userId,
130
+                $requestedShareType,
131
+                $node,
132
+                false,
133
+                -1
134
+            );
135
+            foreach ($shares as $share) {
136
+                $result[] = $share;
137
+            }
138
+        }
139
+        return $result;
140
+    }
141
+
142
+    /**
143
+     * @param Folder $node
144
+     * @return IShare[][]
145
+     */
146
+    private function getSharesFolder(Folder $node): array {
147
+        return $this->shareManager->getSharesInFolder(
148
+            $this->userId,
149
+            $node,
150
+            true
151
+        );
152
+    }
153
+
154
+    /**
155
+     * @param DavNode $sabreNode
156
+     * @return IShare[]
157
+     */
158
+    private function getShares(DavNode $sabreNode): array {
159
+        if (isset($this->cachedShares[$sabreNode->getId()])) {
160
+            $shares = $this->cachedShares[$sabreNode->getId()];
161
+        } else {
162
+            [$parentPath,] = \Sabre\Uri\split($sabreNode->getPath());
163
+            if ($parentPath === '') {
164
+                $parentPath = '/';
165
+            }
166
+            // if we already cached the folder this file is in we know there are no shares for this file
167
+            if (array_search($parentPath, $this->cachedFolders) === false) {
168
+                try {
169
+                    $node = $this->userFolder->get($sabreNode->getPath());
170
+                } catch (NotFoundException $e) {
171
+                    return [];
172
+                }
173
+                $shares = $this->getShare($node);
174
+                $this->cachedShares[$sabreNode->getId()] = $shares;
175
+            } else {
176
+                return [];
177
+            }
178
+        }
179
+
180
+        return $shares;
181
+    }
182
+
183
+    /**
184
+     * Adds shares to propfind response
185
+     *
186
+     * @param PropFind $propFind propfind object
187
+     * @param \Sabre\DAV\INode $sabreNode sabre node
188
+     */
189
+    public function handleGetProperties(
190
+        PropFind $propFind,
191
+        \Sabre\DAV\INode $sabreNode
192
+    ) {
193
+        if (!($sabreNode instanceof DavNode)) {
194
+            return;
195
+        }
196
+
197
+        // need prefetch ?
198
+        if ($sabreNode instanceof Directory
199
+            && $propFind->getDepth() !== 0
200
+            && (
201
+                !is_null($propFind->getStatus(self::SHARETYPES_PROPERTYNAME)) ||
202
+                !is_null($propFind->getStatus(self::SHAREES_PROPERTYNAME))
203
+            )
204
+        ) {
205
+            try {
206
+                $folderNode = $this->userFolder->get($sabreNode->getPath());
207
+            } catch (NotFoundException $e) {
208
+                // If the folder can't be properly found just return
209
+                return;
210
+            }
211
+
212
+            if (!($folderNode instanceof Folder)) {
213
+                // Safety check
214
+                return;
215
+            }
216
+
217
+            $this->cachedFolders[] = $sabreNode->getPath();
218
+            $childShares = $this->getSharesFolder($folderNode);
219
+            foreach ($childShares as $id => $shares) {
220
+                $this->cachedShares[$id] = $shares;
221
+            }
222
+        }
223
+
224
+        $propFind->handle(self::SHARETYPES_PROPERTYNAME, function () use ($sabreNode) {
225
+            $shares = $this->getShares($sabreNode);
226
+
227
+            $shareTypes = array_unique(array_map(function (IShare $share) {
228
+                return $share->getShareType();
229
+            }, $shares));
230
+
231
+            return new ShareTypeList($shareTypes);
232
+        });
233
+
234
+        $propFind->handle(self::SHAREES_PROPERTYNAME, function () use ($sabreNode) {
235
+            $shares = $this->getShares($sabreNode);
236
+
237
+            return new ShareeList($shares);
238
+        });
239
+    }
240 240
 }
Please login to merge, or discard this patch.