Passed
Push — master ( a29359...c5c3d0 )
by Blizzz
15:18 queued 10s
created
lib/private/Share20/ProviderFactory.php 1 patch
Indentation   +260 added lines, -260 removed lines patch added patch discarded remove patch
@@ -49,273 +49,273 @@
 block discarded – undo
49 49
  */
50 50
 class ProviderFactory implements IProviderFactory {
51 51
 
52
-	/** @var IServerContainer */
53
-	private $serverContainer;
54
-	/** @var DefaultShareProvider */
55
-	private $defaultProvider = null;
56
-	/** @var FederatedShareProvider */
57
-	private $federatedProvider = null;
58
-	/** @var  ShareByMailProvider */
59
-	private $shareByMailProvider;
60
-	/** @var  \OCA\Circles\ShareByCircleProvider */
61
-	private $shareByCircleProvider = null;
62
-	/** @var bool */
63
-	private $circlesAreNotAvailable = false;
64
-	/** @var \OCA\Talk\Share\RoomShareProvider */
65
-	private $roomShareProvider = null;
66
-
67
-	/**
68
-	 * IProviderFactory constructor.
69
-	 *
70
-	 * @param IServerContainer $serverContainer
71
-	 */
72
-	public function __construct(IServerContainer $serverContainer) {
73
-		$this->serverContainer = $serverContainer;
74
-	}
75
-
76
-	/**
77
-	 * Create the default share provider.
78
-	 *
79
-	 * @return DefaultShareProvider
80
-	 */
81
-	protected function defaultShareProvider() {
82
-		if ($this->defaultProvider === null) {
83
-			$this->defaultProvider = new DefaultShareProvider(
84
-				$this->serverContainer->getDatabaseConnection(),
85
-				$this->serverContainer->getUserManager(),
86
-				$this->serverContainer->getGroupManager(),
87
-				$this->serverContainer->getLazyRootFolder(),
88
-				$this->serverContainer->getMailer(),
89
-				$this->serverContainer->query(Defaults::class),
90
-				$this->serverContainer->getL10NFactory(),
91
-				$this->serverContainer->getURLGenerator(),
92
-				$this->serverContainer->getConfig()
93
-			);
94
-		}
95
-
96
-		return $this->defaultProvider;
97
-	}
98
-
99
-	/**
100
-	 * Create the federated share provider
101
-	 *
102
-	 * @return FederatedShareProvider
103
-	 */
104
-	protected function federatedShareProvider() {
105
-		if ($this->federatedProvider === null) {
106
-			/*
52
+    /** @var IServerContainer */
53
+    private $serverContainer;
54
+    /** @var DefaultShareProvider */
55
+    private $defaultProvider = null;
56
+    /** @var FederatedShareProvider */
57
+    private $federatedProvider = null;
58
+    /** @var  ShareByMailProvider */
59
+    private $shareByMailProvider;
60
+    /** @var  \OCA\Circles\ShareByCircleProvider */
61
+    private $shareByCircleProvider = null;
62
+    /** @var bool */
63
+    private $circlesAreNotAvailable = false;
64
+    /** @var \OCA\Talk\Share\RoomShareProvider */
65
+    private $roomShareProvider = null;
66
+
67
+    /**
68
+     * IProviderFactory constructor.
69
+     *
70
+     * @param IServerContainer $serverContainer
71
+     */
72
+    public function __construct(IServerContainer $serverContainer) {
73
+        $this->serverContainer = $serverContainer;
74
+    }
75
+
76
+    /**
77
+     * Create the default share provider.
78
+     *
79
+     * @return DefaultShareProvider
80
+     */
81
+    protected function defaultShareProvider() {
82
+        if ($this->defaultProvider === null) {
83
+            $this->defaultProvider = new DefaultShareProvider(
84
+                $this->serverContainer->getDatabaseConnection(),
85
+                $this->serverContainer->getUserManager(),
86
+                $this->serverContainer->getGroupManager(),
87
+                $this->serverContainer->getLazyRootFolder(),
88
+                $this->serverContainer->getMailer(),
89
+                $this->serverContainer->query(Defaults::class),
90
+                $this->serverContainer->getL10NFactory(),
91
+                $this->serverContainer->getURLGenerator(),
92
+                $this->serverContainer->getConfig()
93
+            );
94
+        }
95
+
96
+        return $this->defaultProvider;
97
+    }
98
+
99
+    /**
100
+     * Create the federated share provider
101
+     *
102
+     * @return FederatedShareProvider
103
+     */
104
+    protected function federatedShareProvider() {
105
+        if ($this->federatedProvider === null) {
106
+            /*
107 107
 			 * Check if the app is enabled
108 108
 			 */
109
-			$appManager = $this->serverContainer->getAppManager();
110
-			if (!$appManager->isEnabledForUser('federatedfilesharing')) {
111
-				return null;
112
-			}
109
+            $appManager = $this->serverContainer->getAppManager();
110
+            if (!$appManager->isEnabledForUser('federatedfilesharing')) {
111
+                return null;
112
+            }
113 113
 
114
-			/*
114
+            /*
115 115
 			 * TODO: add factory to federated sharing app
116 116
 			 */
117
-			$l = $this->serverContainer->getL10N('federatedfilesharing');
118
-			$addressHandler = new AddressHandler(
119
-				$this->serverContainer->getURLGenerator(),
120
-				$l,
121
-				$this->serverContainer->getCloudIdManager()
122
-			);
123
-			$notifications = new Notifications(
124
-				$addressHandler,
125
-				$this->serverContainer->getHTTPClientService(),
126
-				$this->serverContainer->query(\OCP\OCS\IDiscoveryService::class),
127
-				$this->serverContainer->getJobList(),
128
-				\OC::$server->getCloudFederationProviderManager(),
129
-				\OC::$server->getCloudFederationFactory()
130
-			);
131
-			$tokenHandler = new TokenHandler(
132
-				$this->serverContainer->getSecureRandom()
133
-			);
134
-
135
-			$this->federatedProvider = new FederatedShareProvider(
136
-				$this->serverContainer->getDatabaseConnection(),
137
-				$addressHandler,
138
-				$notifications,
139
-				$tokenHandler,
140
-				$l,
141
-				$this->serverContainer->getLogger(),
142
-				$this->serverContainer->getLazyRootFolder(),
143
-				$this->serverContainer->getConfig(),
144
-				$this->serverContainer->getUserManager(),
145
-				$this->serverContainer->getCloudIdManager(),
146
-				$this->serverContainer->getGlobalScaleConfig(),
147
-				$this->serverContainer->getCloudFederationProviderManager()
148
-			);
149
-		}
150
-
151
-		return $this->federatedProvider;
152
-	}
153
-
154
-	/**
155
-	 * Create the federated share provider
156
-	 *
157
-	 * @return ShareByMailProvider
158
-	 */
159
-	protected function getShareByMailProvider() {
160
-		if ($this->shareByMailProvider === null) {
161
-			/*
117
+            $l = $this->serverContainer->getL10N('federatedfilesharing');
118
+            $addressHandler = new AddressHandler(
119
+                $this->serverContainer->getURLGenerator(),
120
+                $l,
121
+                $this->serverContainer->getCloudIdManager()
122
+            );
123
+            $notifications = new Notifications(
124
+                $addressHandler,
125
+                $this->serverContainer->getHTTPClientService(),
126
+                $this->serverContainer->query(\OCP\OCS\IDiscoveryService::class),
127
+                $this->serverContainer->getJobList(),
128
+                \OC::$server->getCloudFederationProviderManager(),
129
+                \OC::$server->getCloudFederationFactory()
130
+            );
131
+            $tokenHandler = new TokenHandler(
132
+                $this->serverContainer->getSecureRandom()
133
+            );
134
+
135
+            $this->federatedProvider = new FederatedShareProvider(
136
+                $this->serverContainer->getDatabaseConnection(),
137
+                $addressHandler,
138
+                $notifications,
139
+                $tokenHandler,
140
+                $l,
141
+                $this->serverContainer->getLogger(),
142
+                $this->serverContainer->getLazyRootFolder(),
143
+                $this->serverContainer->getConfig(),
144
+                $this->serverContainer->getUserManager(),
145
+                $this->serverContainer->getCloudIdManager(),
146
+                $this->serverContainer->getGlobalScaleConfig(),
147
+                $this->serverContainer->getCloudFederationProviderManager()
148
+            );
149
+        }
150
+
151
+        return $this->federatedProvider;
152
+    }
153
+
154
+    /**
155
+     * Create the federated share provider
156
+     *
157
+     * @return ShareByMailProvider
158
+     */
159
+    protected function getShareByMailProvider() {
160
+        if ($this->shareByMailProvider === null) {
161
+            /*
162 162
 			 * Check if the app is enabled
163 163
 			 */
164
-			$appManager = $this->serverContainer->getAppManager();
165
-			if (!$appManager->isEnabledForUser('sharebymail')) {
166
-				return null;
167
-			}
168
-
169
-			$settingsManager = new SettingsManager($this->serverContainer->getConfig());
170
-
171
-			$this->shareByMailProvider = new ShareByMailProvider(
172
-				$this->serverContainer->getDatabaseConnection(),
173
-				$this->serverContainer->getSecureRandom(),
174
-				$this->serverContainer->getUserManager(),
175
-				$this->serverContainer->getLazyRootFolder(),
176
-				$this->serverContainer->getL10N('sharebymail'),
177
-				$this->serverContainer->getLogger(),
178
-				$this->serverContainer->getMailer(),
179
-				$this->serverContainer->getURLGenerator(),
180
-				$this->serverContainer->getActivityManager(),
181
-				$settingsManager,
182
-				$this->serverContainer->query(Defaults::class),
183
-				$this->serverContainer->getHasher(),
184
-				$this->serverContainer->query(CapabilitiesManager::class)
185
-			);
186
-		}
187
-
188
-		return $this->shareByMailProvider;
189
-	}
190
-
191
-
192
-	/**
193
-	 * Create the circle share provider
194
-	 *
195
-	 * @return FederatedShareProvider
196
-	 *
197
-	 * @suppress PhanUndeclaredClassMethod
198
-	 */
199
-	protected function getShareByCircleProvider() {
200
-		if ($this->circlesAreNotAvailable) {
201
-			return null;
202
-		}
203
-
204
-		if (!$this->serverContainer->getAppManager()->isEnabledForUser('circles') ||
205
-			!class_exists('\OCA\Circles\ShareByCircleProvider')
206
-		) {
207
-			$this->circlesAreNotAvailable = true;
208
-			return null;
209
-		}
210
-
211
-		if ($this->shareByCircleProvider === null) {
212
-			$this->shareByCircleProvider = new \OCA\Circles\ShareByCircleProvider(
213
-				$this->serverContainer->getDatabaseConnection(),
214
-				$this->serverContainer->getSecureRandom(),
215
-				$this->serverContainer->getUserManager(),
216
-				$this->serverContainer->getLazyRootFolder(),
217
-				$this->serverContainer->getL10N('circles'),
218
-				$this->serverContainer->getLogger(),
219
-				$this->serverContainer->getURLGenerator()
220
-			);
221
-		}
222
-
223
-		return $this->shareByCircleProvider;
224
-	}
225
-
226
-	/**
227
-	 * Create the room share provider
228
-	 *
229
-	 * @return RoomShareProvider
230
-	 */
231
-	protected function getRoomShareProvider() {
232
-		if ($this->roomShareProvider === null) {
233
-			/*
164
+            $appManager = $this->serverContainer->getAppManager();
165
+            if (!$appManager->isEnabledForUser('sharebymail')) {
166
+                return null;
167
+            }
168
+
169
+            $settingsManager = new SettingsManager($this->serverContainer->getConfig());
170
+
171
+            $this->shareByMailProvider = new ShareByMailProvider(
172
+                $this->serverContainer->getDatabaseConnection(),
173
+                $this->serverContainer->getSecureRandom(),
174
+                $this->serverContainer->getUserManager(),
175
+                $this->serverContainer->getLazyRootFolder(),
176
+                $this->serverContainer->getL10N('sharebymail'),
177
+                $this->serverContainer->getLogger(),
178
+                $this->serverContainer->getMailer(),
179
+                $this->serverContainer->getURLGenerator(),
180
+                $this->serverContainer->getActivityManager(),
181
+                $settingsManager,
182
+                $this->serverContainer->query(Defaults::class),
183
+                $this->serverContainer->getHasher(),
184
+                $this->serverContainer->query(CapabilitiesManager::class)
185
+            );
186
+        }
187
+
188
+        return $this->shareByMailProvider;
189
+    }
190
+
191
+
192
+    /**
193
+     * Create the circle share provider
194
+     *
195
+     * @return FederatedShareProvider
196
+     *
197
+     * @suppress PhanUndeclaredClassMethod
198
+     */
199
+    protected function getShareByCircleProvider() {
200
+        if ($this->circlesAreNotAvailable) {
201
+            return null;
202
+        }
203
+
204
+        if (!$this->serverContainer->getAppManager()->isEnabledForUser('circles') ||
205
+            !class_exists('\OCA\Circles\ShareByCircleProvider')
206
+        ) {
207
+            $this->circlesAreNotAvailable = true;
208
+            return null;
209
+        }
210
+
211
+        if ($this->shareByCircleProvider === null) {
212
+            $this->shareByCircleProvider = new \OCA\Circles\ShareByCircleProvider(
213
+                $this->serverContainer->getDatabaseConnection(),
214
+                $this->serverContainer->getSecureRandom(),
215
+                $this->serverContainer->getUserManager(),
216
+                $this->serverContainer->getLazyRootFolder(),
217
+                $this->serverContainer->getL10N('circles'),
218
+                $this->serverContainer->getLogger(),
219
+                $this->serverContainer->getURLGenerator()
220
+            );
221
+        }
222
+
223
+        return $this->shareByCircleProvider;
224
+    }
225
+
226
+    /**
227
+     * Create the room share provider
228
+     *
229
+     * @return RoomShareProvider
230
+     */
231
+    protected function getRoomShareProvider() {
232
+        if ($this->roomShareProvider === null) {
233
+            /*
234 234
 			 * Check if the app is enabled
235 235
 			 */
236
-			$appManager = $this->serverContainer->getAppManager();
237
-			if (!$appManager->isEnabledForUser('spreed')) {
238
-				return null;
239
-			}
240
-
241
-			try {
242
-				$this->roomShareProvider = $this->serverContainer->query('\OCA\Talk\Share\RoomShareProvider');
243
-			} catch (\OCP\AppFramework\QueryException $e) {
244
-				return null;
245
-			}
246
-		}
247
-
248
-		return $this->roomShareProvider;
249
-	}
250
-
251
-	/**
252
-	 * @inheritdoc
253
-	 */
254
-	public function getProvider($id) {
255
-		$provider = null;
256
-		if ($id === 'ocinternal') {
257
-			$provider = $this->defaultShareProvider();
258
-		} elseif ($id === 'ocFederatedSharing') {
259
-			$provider = $this->federatedShareProvider();
260
-		} elseif ($id === 'ocMailShare') {
261
-			$provider = $this->getShareByMailProvider();
262
-		} elseif ($id === 'ocCircleShare') {
263
-			$provider = $this->getShareByCircleProvider();
264
-		} elseif ($id === 'ocRoomShare') {
265
-			$provider = $this->getRoomShareProvider();
266
-		}
267
-
268
-		if ($provider === null) {
269
-			throw new ProviderException('No provider with id .' . $id . ' found.');
270
-		}
271
-
272
-		return $provider;
273
-	}
274
-
275
-	/**
276
-	 * @inheritdoc
277
-	 */
278
-	public function getProviderForType($shareType) {
279
-		$provider = null;
280
-
281
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER ||
282
-			$shareType === \OCP\Share::SHARE_TYPE_GROUP ||
283
-			$shareType === \OCP\Share::SHARE_TYPE_LINK
284
-		) {
285
-			$provider = $this->defaultShareProvider();
286
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_REMOTE || $shareType === \OCP\Share::SHARE_TYPE_REMOTE_GROUP) {
287
-			$provider = $this->federatedShareProvider();
288
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_EMAIL) {
289
-			$provider = $this->getShareByMailProvider();
290
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_CIRCLE) {
291
-			$provider = $this->getShareByCircleProvider();
292
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_ROOM) {
293
-			$provider = $this->getRoomShareProvider();
294
-		}
295
-
296
-
297
-		if ($provider === null) {
298
-			throw new ProviderException('No share provider for share type ' . $shareType);
299
-		}
300
-
301
-		return $provider;
302
-	}
303
-
304
-	public function getAllProviders() {
305
-		$shares = [$this->defaultShareProvider(), $this->federatedShareProvider()];
306
-		$shareByMail = $this->getShareByMailProvider();
307
-		if ($shareByMail !== null) {
308
-			$shares[] = $shareByMail;
309
-		}
310
-		$shareByCircle = $this->getShareByCircleProvider();
311
-		if ($shareByCircle !== null) {
312
-			$shares[] = $shareByCircle;
313
-		}
314
-		$roomShare = $this->getRoomShareProvider();
315
-		if ($roomShare !== null) {
316
-			$shares[] = $roomShare;
317
-		}
318
-
319
-		return $shares;
320
-	}
236
+            $appManager = $this->serverContainer->getAppManager();
237
+            if (!$appManager->isEnabledForUser('spreed')) {
238
+                return null;
239
+            }
240
+
241
+            try {
242
+                $this->roomShareProvider = $this->serverContainer->query('\OCA\Talk\Share\RoomShareProvider');
243
+            } catch (\OCP\AppFramework\QueryException $e) {
244
+                return null;
245
+            }
246
+        }
247
+
248
+        return $this->roomShareProvider;
249
+    }
250
+
251
+    /**
252
+     * @inheritdoc
253
+     */
254
+    public function getProvider($id) {
255
+        $provider = null;
256
+        if ($id === 'ocinternal') {
257
+            $provider = $this->defaultShareProvider();
258
+        } elseif ($id === 'ocFederatedSharing') {
259
+            $provider = $this->federatedShareProvider();
260
+        } elseif ($id === 'ocMailShare') {
261
+            $provider = $this->getShareByMailProvider();
262
+        } elseif ($id === 'ocCircleShare') {
263
+            $provider = $this->getShareByCircleProvider();
264
+        } elseif ($id === 'ocRoomShare') {
265
+            $provider = $this->getRoomShareProvider();
266
+        }
267
+
268
+        if ($provider === null) {
269
+            throw new ProviderException('No provider with id .' . $id . ' found.');
270
+        }
271
+
272
+        return $provider;
273
+    }
274
+
275
+    /**
276
+     * @inheritdoc
277
+     */
278
+    public function getProviderForType($shareType) {
279
+        $provider = null;
280
+
281
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER ||
282
+            $shareType === \OCP\Share::SHARE_TYPE_GROUP ||
283
+            $shareType === \OCP\Share::SHARE_TYPE_LINK
284
+        ) {
285
+            $provider = $this->defaultShareProvider();
286
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_REMOTE || $shareType === \OCP\Share::SHARE_TYPE_REMOTE_GROUP) {
287
+            $provider = $this->federatedShareProvider();
288
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_EMAIL) {
289
+            $provider = $this->getShareByMailProvider();
290
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_CIRCLE) {
291
+            $provider = $this->getShareByCircleProvider();
292
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_ROOM) {
293
+            $provider = $this->getRoomShareProvider();
294
+        }
295
+
296
+
297
+        if ($provider === null) {
298
+            throw new ProviderException('No share provider for share type ' . $shareType);
299
+        }
300
+
301
+        return $provider;
302
+    }
303
+
304
+    public function getAllProviders() {
305
+        $shares = [$this->defaultShareProvider(), $this->federatedShareProvider()];
306
+        $shareByMail = $this->getShareByMailProvider();
307
+        if ($shareByMail !== null) {
308
+            $shares[] = $shareByMail;
309
+        }
310
+        $shareByCircle = $this->getShareByCircleProvider();
311
+        if ($shareByCircle !== null) {
312
+            $shares[] = $shareByCircle;
313
+        }
314
+        $roomShare = $this->getRoomShareProvider();
315
+        if ($roomShare !== null) {
316
+            $shares[] = $roomShare;
317
+        }
318
+
319
+        return $shares;
320
+    }
321 321
 }
Please login to merge, or discard this patch.
lib/private/Share20/DefaultShareProvider.php 1 patch
Indentation   +1399 added lines, -1399 removed lines patch added patch discarded remove patch
@@ -62,1439 +62,1439 @@
 block discarded – undo
62 62
  */
63 63
 class DefaultShareProvider implements IShareProvider {
64 64
 
65
-	// Special share type for user modified group shares
66
-	public const SHARE_TYPE_USERGROUP = 2;
67
-
68
-	/** @var IDBConnection */
69
-	private $dbConn;
70
-
71
-	/** @var IUserManager */
72
-	private $userManager;
73
-
74
-	/** @var IGroupManager */
75
-	private $groupManager;
76
-
77
-	/** @var IRootFolder */
78
-	private $rootFolder;
79
-
80
-	/** @var IMailer */
81
-	private $mailer;
82
-
83
-	/** @var Defaults */
84
-	private $defaults;
85
-
86
-	/** @var IFactory */
87
-	private $l10nFactory;
88
-
89
-	/** @var IURLGenerator */
90
-	private $urlGenerator;
91
-
92
-	/** @var IConfig */
93
-	private $config;
94
-
95
-	public function __construct(
96
-			IDBConnection $connection,
97
-			IUserManager $userManager,
98
-			IGroupManager $groupManager,
99
-			IRootFolder $rootFolder,
100
-			IMailer $mailer,
101
-			Defaults $defaults,
102
-			IFactory $l10nFactory,
103
-			IURLGenerator $urlGenerator,
104
-			IConfig $config) {
105
-		$this->dbConn = $connection;
106
-		$this->userManager = $userManager;
107
-		$this->groupManager = $groupManager;
108
-		$this->rootFolder = $rootFolder;
109
-		$this->mailer = $mailer;
110
-		$this->defaults = $defaults;
111
-		$this->l10nFactory = $l10nFactory;
112
-		$this->urlGenerator = $urlGenerator;
113
-		$this->config = $config;
114
-	}
115
-
116
-	/**
117
-	 * Return the identifier of this provider.
118
-	 *
119
-	 * @return string Containing only [a-zA-Z0-9]
120
-	 */
121
-	public function identifier() {
122
-		return 'ocinternal';
123
-	}
124
-
125
-	/**
126
-	 * Share a path
127
-	 *
128
-	 * @param \OCP\Share\IShare $share
129
-	 * @return \OCP\Share\IShare The share object
130
-	 * @throws ShareNotFound
131
-	 * @throws \Exception
132
-	 */
133
-	public function create(\OCP\Share\IShare $share) {
134
-		$qb = $this->dbConn->getQueryBuilder();
135
-
136
-		$qb->insert('share');
137
-		$qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
138
-
139
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
140
-			//Set the UID of the user we share with
141
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
142
-			$qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
143
-
144
-			//If an expiration date is set store it
145
-			if ($share->getExpirationDate() !== null) {
146
-				$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
147
-			}
148
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
149
-			//Set the GID of the group we share with
150
-			$qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
151
-
152
-			//If an expiration date is set store it
153
-			if ($share->getExpirationDate() !== null) {
154
-				$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
155
-			}
156
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
157
-			//set label for public link
158
-			$qb->setValue('label', $qb->createNamedParameter($share->getLabel()));
159
-			//Set the token of the share
160
-			$qb->setValue('token', $qb->createNamedParameter($share->getToken()));
161
-
162
-			//If a password is set store it
163
-			if ($share->getPassword() !== null) {
164
-				$qb->setValue('password', $qb->createNamedParameter($share->getPassword()));
165
-			}
166
-
167
-			$qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
168
-
169
-			//If an expiration date is set store it
170
-			if ($share->getExpirationDate() !== null) {
171
-				$qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
172
-			}
173
-
174
-			if (method_exists($share, 'getParent')) {
175
-				$qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
176
-			}
177
-		} else {
178
-			throw new \Exception('invalid share type!');
179
-		}
180
-
181
-		// Set what is shares
182
-		$qb->setValue('item_type', $qb->createParameter('itemType'));
183
-		if ($share->getNode() instanceof \OCP\Files\File) {
184
-			$qb->setParameter('itemType', 'file');
185
-		} else {
186
-			$qb->setParameter('itemType', 'folder');
187
-		}
188
-
189
-		// Set the file id
190
-		$qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
191
-		$qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
192
-
193
-		// set the permissions
194
-		$qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
195
-
196
-		// Set who created this share
197
-		$qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
198
-
199
-		// Set who is the owner of this file/folder (and this the owner of the share)
200
-		$qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
201
-
202
-		// Set the file target
203
-		$qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
204
-
205
-		// Set the time this share was created
206
-		$qb->setValue('stime', $qb->createNamedParameter(time()));
207
-
208
-		// insert the data and fetch the id of the share
209
-		$this->dbConn->beginTransaction();
210
-		$qb->execute();
211
-		$id = $this->dbConn->lastInsertId('*PREFIX*share');
212
-
213
-		// Now fetch the inserted share and create a complete share object
214
-		$qb = $this->dbConn->getQueryBuilder();
215
-		$qb->select('*')
216
-			->from('share')
217
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
218
-
219
-		$cursor = $qb->execute();
220
-		$data = $cursor->fetch();
221
-		$this->dbConn->commit();
222
-		$cursor->closeCursor();
223
-
224
-		if ($data === false) {
225
-			throw new ShareNotFound();
226
-		}
227
-
228
-		$mailSendValue = $share->getMailSend();
229
-		$data['mail_send'] = ($mailSendValue === null) ? true : $mailSendValue;
230
-
231
-		$share = $this->createShare($data);
232
-		return $share;
233
-	}
234
-
235
-	/**
236
-	 * Update a share
237
-	 *
238
-	 * @param \OCP\Share\IShare $share
239
-	 * @return \OCP\Share\IShare The share object
240
-	 * @throws ShareNotFound
241
-	 * @throws \OCP\Files\InvalidPathException
242
-	 * @throws \OCP\Files\NotFoundException
243
-	 */
244
-	public function update(\OCP\Share\IShare $share) {
245
-		$originalShare = $this->getShareById($share->getId());
246
-
247
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
248
-			/*
65
+    // Special share type for user modified group shares
66
+    public const SHARE_TYPE_USERGROUP = 2;
67
+
68
+    /** @var IDBConnection */
69
+    private $dbConn;
70
+
71
+    /** @var IUserManager */
72
+    private $userManager;
73
+
74
+    /** @var IGroupManager */
75
+    private $groupManager;
76
+
77
+    /** @var IRootFolder */
78
+    private $rootFolder;
79
+
80
+    /** @var IMailer */
81
+    private $mailer;
82
+
83
+    /** @var Defaults */
84
+    private $defaults;
85
+
86
+    /** @var IFactory */
87
+    private $l10nFactory;
88
+
89
+    /** @var IURLGenerator */
90
+    private $urlGenerator;
91
+
92
+    /** @var IConfig */
93
+    private $config;
94
+
95
+    public function __construct(
96
+            IDBConnection $connection,
97
+            IUserManager $userManager,
98
+            IGroupManager $groupManager,
99
+            IRootFolder $rootFolder,
100
+            IMailer $mailer,
101
+            Defaults $defaults,
102
+            IFactory $l10nFactory,
103
+            IURLGenerator $urlGenerator,
104
+            IConfig $config) {
105
+        $this->dbConn = $connection;
106
+        $this->userManager = $userManager;
107
+        $this->groupManager = $groupManager;
108
+        $this->rootFolder = $rootFolder;
109
+        $this->mailer = $mailer;
110
+        $this->defaults = $defaults;
111
+        $this->l10nFactory = $l10nFactory;
112
+        $this->urlGenerator = $urlGenerator;
113
+        $this->config = $config;
114
+    }
115
+
116
+    /**
117
+     * Return the identifier of this provider.
118
+     *
119
+     * @return string Containing only [a-zA-Z0-9]
120
+     */
121
+    public function identifier() {
122
+        return 'ocinternal';
123
+    }
124
+
125
+    /**
126
+     * Share a path
127
+     *
128
+     * @param \OCP\Share\IShare $share
129
+     * @return \OCP\Share\IShare The share object
130
+     * @throws ShareNotFound
131
+     * @throws \Exception
132
+     */
133
+    public function create(\OCP\Share\IShare $share) {
134
+        $qb = $this->dbConn->getQueryBuilder();
135
+
136
+        $qb->insert('share');
137
+        $qb->setValue('share_type', $qb->createNamedParameter($share->getShareType()));
138
+
139
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
140
+            //Set the UID of the user we share with
141
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
142
+            $qb->setValue('accepted', $qb->createNamedParameter(IShare::STATUS_PENDING));
143
+
144
+            //If an expiration date is set store it
145
+            if ($share->getExpirationDate() !== null) {
146
+                $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
147
+            }
148
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
149
+            //Set the GID of the group we share with
150
+            $qb->setValue('share_with', $qb->createNamedParameter($share->getSharedWith()));
151
+
152
+            //If an expiration date is set store it
153
+            if ($share->getExpirationDate() !== null) {
154
+                $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
155
+            }
156
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
157
+            //set label for public link
158
+            $qb->setValue('label', $qb->createNamedParameter($share->getLabel()));
159
+            //Set the token of the share
160
+            $qb->setValue('token', $qb->createNamedParameter($share->getToken()));
161
+
162
+            //If a password is set store it
163
+            if ($share->getPassword() !== null) {
164
+                $qb->setValue('password', $qb->createNamedParameter($share->getPassword()));
165
+            }
166
+
167
+            $qb->setValue('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL));
168
+
169
+            //If an expiration date is set store it
170
+            if ($share->getExpirationDate() !== null) {
171
+                $qb->setValue('expiration', $qb->createNamedParameter($share->getExpirationDate(), 'datetime'));
172
+            }
173
+
174
+            if (method_exists($share, 'getParent')) {
175
+                $qb->setValue('parent', $qb->createNamedParameter($share->getParent()));
176
+            }
177
+        } else {
178
+            throw new \Exception('invalid share type!');
179
+        }
180
+
181
+        // Set what is shares
182
+        $qb->setValue('item_type', $qb->createParameter('itemType'));
183
+        if ($share->getNode() instanceof \OCP\Files\File) {
184
+            $qb->setParameter('itemType', 'file');
185
+        } else {
186
+            $qb->setParameter('itemType', 'folder');
187
+        }
188
+
189
+        // Set the file id
190
+        $qb->setValue('item_source', $qb->createNamedParameter($share->getNode()->getId()));
191
+        $qb->setValue('file_source', $qb->createNamedParameter($share->getNode()->getId()));
192
+
193
+        // set the permissions
194
+        $qb->setValue('permissions', $qb->createNamedParameter($share->getPermissions()));
195
+
196
+        // Set who created this share
197
+        $qb->setValue('uid_initiator', $qb->createNamedParameter($share->getSharedBy()));
198
+
199
+        // Set who is the owner of this file/folder (and this the owner of the share)
200
+        $qb->setValue('uid_owner', $qb->createNamedParameter($share->getShareOwner()));
201
+
202
+        // Set the file target
203
+        $qb->setValue('file_target', $qb->createNamedParameter($share->getTarget()));
204
+
205
+        // Set the time this share was created
206
+        $qb->setValue('stime', $qb->createNamedParameter(time()));
207
+
208
+        // insert the data and fetch the id of the share
209
+        $this->dbConn->beginTransaction();
210
+        $qb->execute();
211
+        $id = $this->dbConn->lastInsertId('*PREFIX*share');
212
+
213
+        // Now fetch the inserted share and create a complete share object
214
+        $qb = $this->dbConn->getQueryBuilder();
215
+        $qb->select('*')
216
+            ->from('share')
217
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)));
218
+
219
+        $cursor = $qb->execute();
220
+        $data = $cursor->fetch();
221
+        $this->dbConn->commit();
222
+        $cursor->closeCursor();
223
+
224
+        if ($data === false) {
225
+            throw new ShareNotFound();
226
+        }
227
+
228
+        $mailSendValue = $share->getMailSend();
229
+        $data['mail_send'] = ($mailSendValue === null) ? true : $mailSendValue;
230
+
231
+        $share = $this->createShare($data);
232
+        return $share;
233
+    }
234
+
235
+    /**
236
+     * Update a share
237
+     *
238
+     * @param \OCP\Share\IShare $share
239
+     * @return \OCP\Share\IShare The share object
240
+     * @throws ShareNotFound
241
+     * @throws \OCP\Files\InvalidPathException
242
+     * @throws \OCP\Files\NotFoundException
243
+     */
244
+    public function update(\OCP\Share\IShare $share) {
245
+        $originalShare = $this->getShareById($share->getId());
246
+
247
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
248
+            /*
249 249
 			 * We allow updating the recipient on user shares.
250 250
 			 */
251
-			$qb = $this->dbConn->getQueryBuilder();
252
-			$qb->update('share')
253
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
254
-				->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
255
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
256
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
257
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
258
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
259
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
260
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
261
-				->set('note', $qb->createNamedParameter($share->getNote()))
262
-				->set('accepted', $qb->createNamedParameter($share->getStatus()))
263
-				->execute();
264
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
265
-			$qb = $this->dbConn->getQueryBuilder();
266
-			$qb->update('share')
267
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
268
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
269
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
270
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
271
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
272
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
273
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
274
-				->set('note', $qb->createNamedParameter($share->getNote()))
275
-				->execute();
276
-
277
-			/*
251
+            $qb = $this->dbConn->getQueryBuilder();
252
+            $qb->update('share')
253
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
254
+                ->set('share_with', $qb->createNamedParameter($share->getSharedWith()))
255
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
256
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
257
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
258
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
259
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
260
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
261
+                ->set('note', $qb->createNamedParameter($share->getNote()))
262
+                ->set('accepted', $qb->createNamedParameter($share->getStatus()))
263
+                ->execute();
264
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
265
+            $qb = $this->dbConn->getQueryBuilder();
266
+            $qb->update('share')
267
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
268
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
269
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
270
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
271
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
272
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
273
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
274
+                ->set('note', $qb->createNamedParameter($share->getNote()))
275
+                ->execute();
276
+
277
+            /*
278 278
 			 * Update all user defined group shares
279 279
 			 */
280
-			$qb = $this->dbConn->getQueryBuilder();
281
-			$qb->update('share')
282
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
283
-				->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
284
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
285
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
286
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
287
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
288
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
289
-				->set('note', $qb->createNamedParameter($share->getNote()))
290
-				->execute();
291
-
292
-			/*
280
+            $qb = $this->dbConn->getQueryBuilder();
281
+            $qb->update('share')
282
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
283
+                ->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
284
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
285
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
286
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
287
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
288
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
289
+                ->set('note', $qb->createNamedParameter($share->getNote()))
290
+                ->execute();
291
+
292
+            /*
293 293
 			 * Now update the permissions for all children that have not set it to 0
294 294
 			 */
295
-			$qb = $this->dbConn->getQueryBuilder();
296
-			$qb->update('share')
297
-				->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
298
-				->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
299
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
300
-				->execute();
301
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
302
-			$qb = $this->dbConn->getQueryBuilder();
303
-			$qb->update('share')
304
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
305
-				->set('password', $qb->createNamedParameter($share->getPassword()))
306
-				->set('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL))
307
-				->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
308
-				->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
309
-				->set('permissions', $qb->createNamedParameter($share->getPermissions()))
310
-				->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
311
-				->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
312
-				->set('token', $qb->createNamedParameter($share->getToken()))
313
-				->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
314
-				->set('note', $qb->createNamedParameter($share->getNote()))
315
-				->set('label', $qb->createNamedParameter($share->getLabel()))
316
-				->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
317
-				->execute();
318
-		}
319
-
320
-		if ($originalShare->getNote() !== $share->getNote() && $share->getNote() !== '') {
321
-			$this->propagateNote($share);
322
-		}
323
-
324
-
325
-		return $share;
326
-	}
327
-
328
-	/**
329
-	 * Accept a share.
330
-	 *
331
-	 * @param IShare $share
332
-	 * @param string $recipient
333
-	 * @return IShare The share object
334
-	 * @since 9.0.0
335
-	 */
336
-	public function acceptShare(IShare $share, string $recipient): IShare {
337
-		if ($share->getShareType() === IShare::TYPE_GROUP) {
338
-			$group = $this->groupManager->get($share->getSharedWith());
339
-			$user = $this->userManager->get($recipient);
340
-
341
-			if (is_null($group)) {
342
-				throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
343
-			}
344
-
345
-			if (!$group->inGroup($user)) {
346
-				throw new ProviderException('Recipient not in receiving group');
347
-			}
348
-
349
-			// Try to fetch user specific share
350
-			$qb = $this->dbConn->getQueryBuilder();
351
-			$stmt = $qb->select('*')
352
-				->from('share')
353
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
354
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
355
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
356
-				->andWhere($qb->expr()->orX(
357
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
358
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
359
-				))
360
-				->execute();
361
-
362
-			$data = $stmt->fetch();
363
-			$stmt->closeCursor();
364
-
365
-			/*
295
+            $qb = $this->dbConn->getQueryBuilder();
296
+            $qb->update('share')
297
+                ->where($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
298
+                ->andWhere($qb->expr()->neq('permissions', $qb->createNamedParameter(0)))
299
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
300
+                ->execute();
301
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
302
+            $qb = $this->dbConn->getQueryBuilder();
303
+            $qb->update('share')
304
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
305
+                ->set('password', $qb->createNamedParameter($share->getPassword()))
306
+                ->set('password_by_talk', $qb->createNamedParameter($share->getSendPasswordByTalk(), IQueryBuilder::PARAM_BOOL))
307
+                ->set('uid_owner', $qb->createNamedParameter($share->getShareOwner()))
308
+                ->set('uid_initiator', $qb->createNamedParameter($share->getSharedBy()))
309
+                ->set('permissions', $qb->createNamedParameter($share->getPermissions()))
310
+                ->set('item_source', $qb->createNamedParameter($share->getNode()->getId()))
311
+                ->set('file_source', $qb->createNamedParameter($share->getNode()->getId()))
312
+                ->set('token', $qb->createNamedParameter($share->getToken()))
313
+                ->set('expiration', $qb->createNamedParameter($share->getExpirationDate(), IQueryBuilder::PARAM_DATE))
314
+                ->set('note', $qb->createNamedParameter($share->getNote()))
315
+                ->set('label', $qb->createNamedParameter($share->getLabel()))
316
+                ->set('hide_download', $qb->createNamedParameter($share->getHideDownload() ? 1 : 0), IQueryBuilder::PARAM_INT)
317
+                ->execute();
318
+        }
319
+
320
+        if ($originalShare->getNote() !== $share->getNote() && $share->getNote() !== '') {
321
+            $this->propagateNote($share);
322
+        }
323
+
324
+
325
+        return $share;
326
+    }
327
+
328
+    /**
329
+     * Accept a share.
330
+     *
331
+     * @param IShare $share
332
+     * @param string $recipient
333
+     * @return IShare The share object
334
+     * @since 9.0.0
335
+     */
336
+    public function acceptShare(IShare $share, string $recipient): IShare {
337
+        if ($share->getShareType() === IShare::TYPE_GROUP) {
338
+            $group = $this->groupManager->get($share->getSharedWith());
339
+            $user = $this->userManager->get($recipient);
340
+
341
+            if (is_null($group)) {
342
+                throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
343
+            }
344
+
345
+            if (!$group->inGroup($user)) {
346
+                throw new ProviderException('Recipient not in receiving group');
347
+            }
348
+
349
+            // Try to fetch user specific share
350
+            $qb = $this->dbConn->getQueryBuilder();
351
+            $stmt = $qb->select('*')
352
+                ->from('share')
353
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
354
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
355
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
356
+                ->andWhere($qb->expr()->orX(
357
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
358
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
359
+                ))
360
+                ->execute();
361
+
362
+            $data = $stmt->fetch();
363
+            $stmt->closeCursor();
364
+
365
+            /*
366 366
 			 * Check if there already is a user specific group share.
367 367
 			 * If there is update it (if required).
368 368
 			 */
369
-			if ($data === false) {
370
-				$id = $this->createUserSpecificGroupShare($share, $recipient);
371
-			} else {
372
-				$id = $data['id'];
373
-			}
374
-		} elseif ($share->getShareType() === IShare::TYPE_USER) {
375
-			if ($share->getSharedWith() !== $recipient) {
376
-				throw new ProviderException('Recipient does not match');
377
-			}
378
-
379
-			$id = $share->getId();
380
-		} else {
381
-			throw new ProviderException('Invalid shareType');
382
-		}
383
-
384
-		$qb = $this->dbConn->getQueryBuilder();
385
-		$qb->update('share')
386
-			->set('accepted', $qb->createNamedParameter(IShare::STATUS_ACCEPTED))
387
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
388
-			->execute();
389
-
390
-		return $share;
391
-	}
392
-
393
-	/**
394
-	 * Get all children of this share
395
-	 * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
396
-	 *
397
-	 * @param \OCP\Share\IShare $parent
398
-	 * @return \OCP\Share\IShare[]
399
-	 */
400
-	public function getChildren(\OCP\Share\IShare $parent) {
401
-		$children = [];
402
-
403
-		$qb = $this->dbConn->getQueryBuilder();
404
-		$qb->select('*')
405
-			->from('share')
406
-			->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
407
-			->andWhere(
408
-				$qb->expr()->in(
409
-					'share_type',
410
-					$qb->createNamedParameter([
411
-						\OCP\Share::SHARE_TYPE_USER,
412
-						\OCP\Share::SHARE_TYPE_GROUP,
413
-						\OCP\Share::SHARE_TYPE_LINK,
414
-					], IQueryBuilder::PARAM_INT_ARRAY)
415
-				)
416
-			)
417
-			->andWhere($qb->expr()->orX(
418
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
419
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
420
-			))
421
-			->orderBy('id');
422
-
423
-		$cursor = $qb->execute();
424
-		while ($data = $cursor->fetch()) {
425
-			$children[] = $this->createShare($data);
426
-		}
427
-		$cursor->closeCursor();
428
-
429
-		return $children;
430
-	}
431
-
432
-	/**
433
-	 * Delete a share
434
-	 *
435
-	 * @param \OCP\Share\IShare $share
436
-	 */
437
-	public function delete(\OCP\Share\IShare $share) {
438
-		$qb = $this->dbConn->getQueryBuilder();
439
-		$qb->delete('share')
440
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
441
-
442
-		/*
369
+            if ($data === false) {
370
+                $id = $this->createUserSpecificGroupShare($share, $recipient);
371
+            } else {
372
+                $id = $data['id'];
373
+            }
374
+        } elseif ($share->getShareType() === IShare::TYPE_USER) {
375
+            if ($share->getSharedWith() !== $recipient) {
376
+                throw new ProviderException('Recipient does not match');
377
+            }
378
+
379
+            $id = $share->getId();
380
+        } else {
381
+            throw new ProviderException('Invalid shareType');
382
+        }
383
+
384
+        $qb = $this->dbConn->getQueryBuilder();
385
+        $qb->update('share')
386
+            ->set('accepted', $qb->createNamedParameter(IShare::STATUS_ACCEPTED))
387
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
388
+            ->execute();
389
+
390
+        return $share;
391
+    }
392
+
393
+    /**
394
+     * Get all children of this share
395
+     * FIXME: remove once https://github.com/owncloud/core/pull/21660 is in
396
+     *
397
+     * @param \OCP\Share\IShare $parent
398
+     * @return \OCP\Share\IShare[]
399
+     */
400
+    public function getChildren(\OCP\Share\IShare $parent) {
401
+        $children = [];
402
+
403
+        $qb = $this->dbConn->getQueryBuilder();
404
+        $qb->select('*')
405
+            ->from('share')
406
+            ->where($qb->expr()->eq('parent', $qb->createNamedParameter($parent->getId())))
407
+            ->andWhere(
408
+                $qb->expr()->in(
409
+                    'share_type',
410
+                    $qb->createNamedParameter([
411
+                        \OCP\Share::SHARE_TYPE_USER,
412
+                        \OCP\Share::SHARE_TYPE_GROUP,
413
+                        \OCP\Share::SHARE_TYPE_LINK,
414
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
415
+                )
416
+            )
417
+            ->andWhere($qb->expr()->orX(
418
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
419
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
420
+            ))
421
+            ->orderBy('id');
422
+
423
+        $cursor = $qb->execute();
424
+        while ($data = $cursor->fetch()) {
425
+            $children[] = $this->createShare($data);
426
+        }
427
+        $cursor->closeCursor();
428
+
429
+        return $children;
430
+    }
431
+
432
+    /**
433
+     * Delete a share
434
+     *
435
+     * @param \OCP\Share\IShare $share
436
+     */
437
+    public function delete(\OCP\Share\IShare $share) {
438
+        $qb = $this->dbConn->getQueryBuilder();
439
+        $qb->delete('share')
440
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())));
441
+
442
+        /*
443 443
 		 * If the share is a group share delete all possible
444 444
 		 * user defined groups shares.
445 445
 		 */
446
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
447
-			$qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
448
-		}
449
-
450
-		$qb->execute();
451
-	}
452
-
453
-	/**
454
-	 * Unshare a share from the recipient. If this is a group share
455
-	 * this means we need a special entry in the share db.
456
-	 *
457
-	 * @param IShare $share
458
-	 * @param string $recipient UserId of recipient
459
-	 * @throws BackendError
460
-	 * @throws ProviderException
461
-	 */
462
-	public function deleteFromSelf(IShare $share, $recipient) {
463
-		if ($share->getShareType() === IShare::TYPE_GROUP) {
464
-			$group = $this->groupManager->get($share->getSharedWith());
465
-			$user = $this->userManager->get($recipient);
466
-
467
-			if (is_null($group)) {
468
-				throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
469
-			}
470
-
471
-			if (!$group->inGroup($user)) {
472
-				throw new ProviderException('Recipient not in receiving group');
473
-			}
474
-
475
-			// Try to fetch user specific share
476
-			$qb = $this->dbConn->getQueryBuilder();
477
-			$stmt = $qb->select('*')
478
-				->from('share')
479
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
480
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
481
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
482
-				->andWhere($qb->expr()->orX(
483
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
484
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
485
-				))
486
-				->execute();
487
-
488
-			$data = $stmt->fetch();
489
-
490
-			/*
446
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
447
+            $qb->orWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())));
448
+        }
449
+
450
+        $qb->execute();
451
+    }
452
+
453
+    /**
454
+     * Unshare a share from the recipient. If this is a group share
455
+     * this means we need a special entry in the share db.
456
+     *
457
+     * @param IShare $share
458
+     * @param string $recipient UserId of recipient
459
+     * @throws BackendError
460
+     * @throws ProviderException
461
+     */
462
+    public function deleteFromSelf(IShare $share, $recipient) {
463
+        if ($share->getShareType() === IShare::TYPE_GROUP) {
464
+            $group = $this->groupManager->get($share->getSharedWith());
465
+            $user = $this->userManager->get($recipient);
466
+
467
+            if (is_null($group)) {
468
+                throw new ProviderException('Group "' . $share->getSharedWith() . '" does not exist');
469
+            }
470
+
471
+            if (!$group->inGroup($user)) {
472
+                throw new ProviderException('Recipient not in receiving group');
473
+            }
474
+
475
+            // Try to fetch user specific share
476
+            $qb = $this->dbConn->getQueryBuilder();
477
+            $stmt = $qb->select('*')
478
+                ->from('share')
479
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
480
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
481
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
482
+                ->andWhere($qb->expr()->orX(
483
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
484
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
485
+                ))
486
+                ->execute();
487
+
488
+            $data = $stmt->fetch();
489
+
490
+            /*
491 491
 			 * Check if there already is a user specific group share.
492 492
 			 * If there is update it (if required).
493 493
 			 */
494
-			if ($data === false) {
495
-				$id = $this->createUserSpecificGroupShare($share, $recipient);
496
-				$permissions = $share->getPermissions();
497
-			} else {
498
-				$permissions = $data['permissions'];
499
-				$id = $data['id'];
500
-			}
501
-
502
-			if ($permissions !== 0) {
503
-				// Update existing usergroup share
504
-				$qb = $this->dbConn->getQueryBuilder();
505
-				$qb->update('share')
506
-					->set('permissions', $qb->createNamedParameter(0))
507
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
508
-					->execute();
509
-			}
510
-		} elseif ($share->getShareType() === IShare::TYPE_USER) {
511
-			if ($share->getSharedWith() !== $recipient) {
512
-				throw new ProviderException('Recipient does not match');
513
-			}
514
-
515
-			// We can just delete user and link shares
516
-			$this->delete($share);
517
-		} else {
518
-			throw new ProviderException('Invalid shareType');
519
-		}
520
-	}
521
-
522
-	protected function createUserSpecificGroupShare(IShare $share, string $recipient): int {
523
-		$type = $share->getNodeType();
524
-
525
-		$qb = $this->dbConn->getQueryBuilder();
526
-		$qb->insert('share')
527
-			->values([
528
-				'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
529
-				'share_with' => $qb->createNamedParameter($recipient),
530
-				'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
531
-				'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
532
-				'parent' => $qb->createNamedParameter($share->getId()),
533
-				'item_type' => $qb->createNamedParameter($type),
534
-				'item_source' => $qb->createNamedParameter($share->getNodeId()),
535
-				'file_source' => $qb->createNamedParameter($share->getNodeId()),
536
-				'file_target' => $qb->createNamedParameter($share->getTarget()),
537
-				'permissions' => $qb->createNamedParameter($share->getPermissions()),
538
-				'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
539
-			])->execute();
540
-
541
-		return $qb->getLastInsertId();
542
-	}
543
-
544
-	/**
545
-	 * @inheritdoc
546
-	 *
547
-	 * For now this only works for group shares
548
-	 * If this gets implemented for normal shares we have to extend it
549
-	 */
550
-	public function restore(IShare $share, string $recipient): IShare {
551
-		$qb = $this->dbConn->getQueryBuilder();
552
-		$qb->select('permissions')
553
-			->from('share')
554
-			->where(
555
-				$qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))
556
-			);
557
-		$cursor = $qb->execute();
558
-		$data = $cursor->fetch();
559
-		$cursor->closeCursor();
560
-
561
-		$originalPermission = $data['permissions'];
562
-
563
-		$qb = $this->dbConn->getQueryBuilder();
564
-		$qb->update('share')
565
-			->set('permissions', $qb->createNamedParameter($originalPermission))
566
-			->where(
567
-				$qb->expr()->eq('parent', $qb->createNamedParameter($share->getParent()))
568
-			)->andWhere(
569
-				$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
570
-			)->andWhere(
571
-				$qb->expr()->eq('share_with', $qb->createNamedParameter($recipient))
572
-			);
573
-
574
-		$qb->execute();
575
-
576
-		return $this->getShareById($share->getId(), $recipient);
577
-	}
578
-
579
-	/**
580
-	 * @inheritdoc
581
-	 */
582
-	public function move(\OCP\Share\IShare $share, $recipient) {
583
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
584
-			// Just update the target
585
-			$qb = $this->dbConn->getQueryBuilder();
586
-			$qb->update('share')
587
-				->set('file_target', $qb->createNamedParameter($share->getTarget()))
588
-				->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
589
-				->execute();
590
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
591
-
592
-			// Check if there is a usergroup share
593
-			$qb = $this->dbConn->getQueryBuilder();
594
-			$stmt = $qb->select('id')
595
-				->from('share')
596
-				->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
597
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
598
-				->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
599
-				->andWhere($qb->expr()->orX(
600
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
601
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
602
-				))
603
-				->setMaxResults(1)
604
-				->execute();
605
-
606
-			$data = $stmt->fetch();
607
-			$stmt->closeCursor();
608
-
609
-			if ($data === false) {
610
-				// No usergroup share yet. Create one.
611
-				$qb = $this->dbConn->getQueryBuilder();
612
-				$qb->insert('share')
613
-					->values([
614
-						'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
615
-						'share_with' => $qb->createNamedParameter($recipient),
616
-						'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
617
-						'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
618
-						'parent' => $qb->createNamedParameter($share->getId()),
619
-						'item_type' => $qb->createNamedParameter($share->getNodeType()),
620
-						'item_source' => $qb->createNamedParameter($share->getNodeId()),
621
-						'file_source' => $qb->createNamedParameter($share->getNodeId()),
622
-						'file_target' => $qb->createNamedParameter($share->getTarget()),
623
-						'permissions' => $qb->createNamedParameter($share->getPermissions()),
624
-						'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
625
-					])->execute();
626
-			} else {
627
-				// Already a usergroup share. Update it.
628
-				$qb = $this->dbConn->getQueryBuilder();
629
-				$qb->update('share')
630
-					->set('file_target', $qb->createNamedParameter($share->getTarget()))
631
-					->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
632
-					->execute();
633
-			}
634
-		}
635
-
636
-		return $share;
637
-	}
638
-
639
-	public function getSharesInFolder($userId, Folder $node, $reshares) {
640
-		$qb = $this->dbConn->getQueryBuilder();
641
-		$qb->select('*')
642
-			->from('share', 's')
643
-			->andWhere($qb->expr()->orX(
644
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
645
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
646
-			));
647
-
648
-		$qb->andWhere($qb->expr()->orX(
649
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
650
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
651
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
652
-		));
653
-
654
-		/**
655
-		 * Reshares for this user are shares where they are the owner.
656
-		 */
657
-		if ($reshares === false) {
658
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
659
-		} else {
660
-			$qb->andWhere(
661
-				$qb->expr()->orX(
662
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
663
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
664
-				)
665
-			);
666
-		}
667
-
668
-		$qb->innerJoin('s', 'filecache' ,'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
669
-		$qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
670
-
671
-		$qb->orderBy('id');
672
-
673
-		$cursor = $qb->execute();
674
-		$shares = [];
675
-		while ($data = $cursor->fetch()) {
676
-			$shares[$data['fileid']][] = $this->createShare($data);
677
-		}
678
-		$cursor->closeCursor();
679
-
680
-		return $shares;
681
-	}
682
-
683
-	/**
684
-	 * @inheritdoc
685
-	 */
686
-	public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
687
-		$qb = $this->dbConn->getQueryBuilder();
688
-		$qb->select('*')
689
-			->from('share')
690
-			->andWhere($qb->expr()->orX(
691
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
692
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
693
-			));
694
-
695
-		$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
696
-
697
-		/**
698
-		 * Reshares for this user are shares where they are the owner.
699
-		 */
700
-		if ($reshares === false) {
701
-			$qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
702
-		} else {
703
-			if ($node === null) {
704
-				$qb->andWhere(
705
-					$qb->expr()->orX(
706
-						$qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
707
-						$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
708
-					)
709
-				);
710
-			}
711
-		}
712
-
713
-		if ($node !== null) {
714
-			$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
715
-		}
716
-
717
-		if ($limit !== -1) {
718
-			$qb->setMaxResults($limit);
719
-		}
720
-
721
-		$qb->setFirstResult($offset);
722
-		$qb->orderBy('id');
723
-
724
-		$cursor = $qb->execute();
725
-		$shares = [];
726
-		while ($data = $cursor->fetch()) {
727
-			$shares[] = $this->createShare($data);
728
-		}
729
-		$cursor->closeCursor();
730
-
731
-		return $shares;
732
-	}
733
-
734
-	/**
735
-	 * @inheritdoc
736
-	 */
737
-	public function getShareById($id, $recipientId = null) {
738
-		$qb = $this->dbConn->getQueryBuilder();
739
-
740
-		$qb->select('*')
741
-			->from('share')
742
-			->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
743
-			->andWhere(
744
-				$qb->expr()->in(
745
-					'share_type',
746
-					$qb->createNamedParameter([
747
-						\OCP\Share::SHARE_TYPE_USER,
748
-						\OCP\Share::SHARE_TYPE_GROUP,
749
-						\OCP\Share::SHARE_TYPE_LINK,
750
-					], IQueryBuilder::PARAM_INT_ARRAY)
751
-				)
752
-			)
753
-			->andWhere($qb->expr()->orX(
754
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
755
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
756
-			));
757
-
758
-		$cursor = $qb->execute();
759
-		$data = $cursor->fetch();
760
-		$cursor->closeCursor();
761
-
762
-		if ($data === false) {
763
-			throw new ShareNotFound();
764
-		}
765
-
766
-		try {
767
-			$share = $this->createShare($data);
768
-		} catch (InvalidShare $e) {
769
-			throw new ShareNotFound();
770
-		}
771
-
772
-		// If the recipient is set for a group share resolve to that user
773
-		if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
774
-			$share = $this->resolveGroupShares([$share], $recipientId)[0];
775
-		}
776
-
777
-		return $share;
778
-	}
779
-
780
-	/**
781
-	 * Get shares for a given path
782
-	 *
783
-	 * @param \OCP\Files\Node $path
784
-	 * @return \OCP\Share\IShare[]
785
-	 */
786
-	public function getSharesByPath(Node $path) {
787
-		$qb = $this->dbConn->getQueryBuilder();
788
-
789
-		$cursor = $qb->select('*')
790
-			->from('share')
791
-			->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
792
-			->andWhere(
793
-				$qb->expr()->orX(
794
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
795
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
796
-				)
797
-			)
798
-			->andWhere($qb->expr()->orX(
799
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
800
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
801
-			))
802
-			->execute();
803
-
804
-		$shares = [];
805
-		while ($data = $cursor->fetch()) {
806
-			$shares[] = $this->createShare($data);
807
-		}
808
-		$cursor->closeCursor();
809
-
810
-		return $shares;
811
-	}
812
-
813
-	/**
814
-	 * Returns whether the given database result can be interpreted as
815
-	 * a share with accessible file (not trashed, not deleted)
816
-	 */
817
-	private function isAccessibleResult($data) {
818
-		// exclude shares leading to deleted file entries
819
-		if ($data['fileid'] === null || $data['path'] === null) {
820
-			return false;
821
-		}
822
-
823
-		// exclude shares leading to trashbin on home storages
824
-		$pathSections = explode('/', $data['path'], 2);
825
-		// FIXME: would not detect rare md5'd home storage case properly
826
-		if ($pathSections[0] !== 'files'
827
-				&& in_array(explode(':', $data['storage_string_id'], 2)[0], ['home', 'object'])) {
828
-			return false;
829
-		}
830
-		return true;
831
-	}
832
-
833
-	/**
834
-	 * @inheritdoc
835
-	 */
836
-	public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
837
-		/** @var Share[] $shares */
838
-		$shares = [];
839
-
840
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
841
-			//Get shares directly with this user
842
-			$qb = $this->dbConn->getQueryBuilder();
843
-			$qb->select('s.*',
844
-				'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
845
-				'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
846
-				'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
847
-			)
848
-				->selectAlias('st.id', 'storage_string_id')
849
-				->from('share', 's')
850
-				->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
851
-				->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
852
-
853
-			// Order by id
854
-			$qb->orderBy('s.id');
855
-
856
-			// Set limit and offset
857
-			if ($limit !== -1) {
858
-				$qb->setMaxResults($limit);
859
-			}
860
-			$qb->setFirstResult($offset);
861
-
862
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
863
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
864
-				->andWhere($qb->expr()->orX(
865
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
866
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
867
-				));
868
-
869
-			// Filter by node if provided
870
-			if ($node !== null) {
871
-				$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
872
-			}
873
-
874
-			$cursor = $qb->execute();
875
-
876
-			while ($data = $cursor->fetch()) {
877
-				if ($this->isAccessibleResult($data)) {
878
-					$shares[] = $this->createShare($data);
879
-				}
880
-			}
881
-			$cursor->closeCursor();
882
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
883
-			$user = $this->userManager->get($userId);
884
-			$allGroups = $this->groupManager->getUserGroupIds($user);
885
-
886
-			/** @var Share[] $shares2 */
887
-			$shares2 = [];
888
-
889
-			$start = 0;
890
-			while (true) {
891
-				$groups = array_slice($allGroups, $start, 100);
892
-				$start += 100;
893
-
894
-				if ($groups === []) {
895
-					break;
896
-				}
897
-
898
-				$qb = $this->dbConn->getQueryBuilder();
899
-				$qb->select('s.*',
900
-					'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
901
-					'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
902
-					'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
903
-				)
904
-					->selectAlias('st.id', 'storage_string_id')
905
-					->from('share', 's')
906
-					->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
907
-					->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
908
-					->orderBy('s.id')
909
-					->setFirstResult(0);
910
-
911
-				if ($limit !== -1) {
912
-					$qb->setMaxResults($limit - count($shares));
913
-				}
914
-
915
-				// Filter by node if provided
916
-				if ($node !== null) {
917
-					$qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
918
-				}
919
-
920
-
921
-				$groups = array_filter($groups);
922
-
923
-				$qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
924
-					->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
925
-						$groups,
926
-						IQueryBuilder::PARAM_STR_ARRAY
927
-					)))
928
-					->andWhere($qb->expr()->orX(
929
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
930
-						$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
931
-					));
932
-
933
-				$cursor = $qb->execute();
934
-				while ($data = $cursor->fetch()) {
935
-					if ($offset > 0) {
936
-						$offset--;
937
-						continue;
938
-					}
939
-
940
-					if ($this->isAccessibleResult($data)) {
941
-						$shares2[] = $this->createShare($data);
942
-					}
943
-				}
944
-				$cursor->closeCursor();
945
-			}
946
-
947
-			/*
494
+            if ($data === false) {
495
+                $id = $this->createUserSpecificGroupShare($share, $recipient);
496
+                $permissions = $share->getPermissions();
497
+            } else {
498
+                $permissions = $data['permissions'];
499
+                $id = $data['id'];
500
+            }
501
+
502
+            if ($permissions !== 0) {
503
+                // Update existing usergroup share
504
+                $qb = $this->dbConn->getQueryBuilder();
505
+                $qb->update('share')
506
+                    ->set('permissions', $qb->createNamedParameter(0))
507
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
508
+                    ->execute();
509
+            }
510
+        } elseif ($share->getShareType() === IShare::TYPE_USER) {
511
+            if ($share->getSharedWith() !== $recipient) {
512
+                throw new ProviderException('Recipient does not match');
513
+            }
514
+
515
+            // We can just delete user and link shares
516
+            $this->delete($share);
517
+        } else {
518
+            throw new ProviderException('Invalid shareType');
519
+        }
520
+    }
521
+
522
+    protected function createUserSpecificGroupShare(IShare $share, string $recipient): int {
523
+        $type = $share->getNodeType();
524
+
525
+        $qb = $this->dbConn->getQueryBuilder();
526
+        $qb->insert('share')
527
+            ->values([
528
+                'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
529
+                'share_with' => $qb->createNamedParameter($recipient),
530
+                'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
531
+                'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
532
+                'parent' => $qb->createNamedParameter($share->getId()),
533
+                'item_type' => $qb->createNamedParameter($type),
534
+                'item_source' => $qb->createNamedParameter($share->getNodeId()),
535
+                'file_source' => $qb->createNamedParameter($share->getNodeId()),
536
+                'file_target' => $qb->createNamedParameter($share->getTarget()),
537
+                'permissions' => $qb->createNamedParameter($share->getPermissions()),
538
+                'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
539
+            ])->execute();
540
+
541
+        return $qb->getLastInsertId();
542
+    }
543
+
544
+    /**
545
+     * @inheritdoc
546
+     *
547
+     * For now this only works for group shares
548
+     * If this gets implemented for normal shares we have to extend it
549
+     */
550
+    public function restore(IShare $share, string $recipient): IShare {
551
+        $qb = $this->dbConn->getQueryBuilder();
552
+        $qb->select('permissions')
553
+            ->from('share')
554
+            ->where(
555
+                $qb->expr()->eq('id', $qb->createNamedParameter($share->getId()))
556
+            );
557
+        $cursor = $qb->execute();
558
+        $data = $cursor->fetch();
559
+        $cursor->closeCursor();
560
+
561
+        $originalPermission = $data['permissions'];
562
+
563
+        $qb = $this->dbConn->getQueryBuilder();
564
+        $qb->update('share')
565
+            ->set('permissions', $qb->createNamedParameter($originalPermission))
566
+            ->where(
567
+                $qb->expr()->eq('parent', $qb->createNamedParameter($share->getParent()))
568
+            )->andWhere(
569
+                $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
570
+            )->andWhere(
571
+                $qb->expr()->eq('share_with', $qb->createNamedParameter($recipient))
572
+            );
573
+
574
+        $qb->execute();
575
+
576
+        return $this->getShareById($share->getId(), $recipient);
577
+    }
578
+
579
+    /**
580
+     * @inheritdoc
581
+     */
582
+    public function move(\OCP\Share\IShare $share, $recipient) {
583
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
584
+            // Just update the target
585
+            $qb = $this->dbConn->getQueryBuilder();
586
+            $qb->update('share')
587
+                ->set('file_target', $qb->createNamedParameter($share->getTarget()))
588
+                ->where($qb->expr()->eq('id', $qb->createNamedParameter($share->getId())))
589
+                ->execute();
590
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
591
+
592
+            // Check if there is a usergroup share
593
+            $qb = $this->dbConn->getQueryBuilder();
594
+            $stmt = $qb->select('id')
595
+                ->from('share')
596
+                ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
597
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($recipient)))
598
+                ->andWhere($qb->expr()->eq('parent', $qb->createNamedParameter($share->getId())))
599
+                ->andWhere($qb->expr()->orX(
600
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
601
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
602
+                ))
603
+                ->setMaxResults(1)
604
+                ->execute();
605
+
606
+            $data = $stmt->fetch();
607
+            $stmt->closeCursor();
608
+
609
+            if ($data === false) {
610
+                // No usergroup share yet. Create one.
611
+                $qb = $this->dbConn->getQueryBuilder();
612
+                $qb->insert('share')
613
+                    ->values([
614
+                        'share_type' => $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP),
615
+                        'share_with' => $qb->createNamedParameter($recipient),
616
+                        'uid_owner' => $qb->createNamedParameter($share->getShareOwner()),
617
+                        'uid_initiator' => $qb->createNamedParameter($share->getSharedBy()),
618
+                        'parent' => $qb->createNamedParameter($share->getId()),
619
+                        'item_type' => $qb->createNamedParameter($share->getNodeType()),
620
+                        'item_source' => $qb->createNamedParameter($share->getNodeId()),
621
+                        'file_source' => $qb->createNamedParameter($share->getNodeId()),
622
+                        'file_target' => $qb->createNamedParameter($share->getTarget()),
623
+                        'permissions' => $qb->createNamedParameter($share->getPermissions()),
624
+                        'stime' => $qb->createNamedParameter($share->getShareTime()->getTimestamp()),
625
+                    ])->execute();
626
+            } else {
627
+                // Already a usergroup share. Update it.
628
+                $qb = $this->dbConn->getQueryBuilder();
629
+                $qb->update('share')
630
+                    ->set('file_target', $qb->createNamedParameter($share->getTarget()))
631
+                    ->where($qb->expr()->eq('id', $qb->createNamedParameter($data['id'])))
632
+                    ->execute();
633
+            }
634
+        }
635
+
636
+        return $share;
637
+    }
638
+
639
+    public function getSharesInFolder($userId, Folder $node, $reshares) {
640
+        $qb = $this->dbConn->getQueryBuilder();
641
+        $qb->select('*')
642
+            ->from('share', 's')
643
+            ->andWhere($qb->expr()->orX(
644
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
645
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
646
+            ));
647
+
648
+        $qb->andWhere($qb->expr()->orX(
649
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
650
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
651
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
652
+        ));
653
+
654
+        /**
655
+         * Reshares for this user are shares where they are the owner.
656
+         */
657
+        if ($reshares === false) {
658
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
659
+        } else {
660
+            $qb->andWhere(
661
+                $qb->expr()->orX(
662
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
663
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
664
+                )
665
+            );
666
+        }
667
+
668
+        $qb->innerJoin('s', 'filecache' ,'f', $qb->expr()->eq('s.file_source', 'f.fileid'));
669
+        $qb->andWhere($qb->expr()->eq('f.parent', $qb->createNamedParameter($node->getId())));
670
+
671
+        $qb->orderBy('id');
672
+
673
+        $cursor = $qb->execute();
674
+        $shares = [];
675
+        while ($data = $cursor->fetch()) {
676
+            $shares[$data['fileid']][] = $this->createShare($data);
677
+        }
678
+        $cursor->closeCursor();
679
+
680
+        return $shares;
681
+    }
682
+
683
+    /**
684
+     * @inheritdoc
685
+     */
686
+    public function getSharesBy($userId, $shareType, $node, $reshares, $limit, $offset) {
687
+        $qb = $this->dbConn->getQueryBuilder();
688
+        $qb->select('*')
689
+            ->from('share')
690
+            ->andWhere($qb->expr()->orX(
691
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
692
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
693
+            ));
694
+
695
+        $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter($shareType)));
696
+
697
+        /**
698
+         * Reshares for this user are shares where they are the owner.
699
+         */
700
+        if ($reshares === false) {
701
+            $qb->andWhere($qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId)));
702
+        } else {
703
+            if ($node === null) {
704
+                $qb->andWhere(
705
+                    $qb->expr()->orX(
706
+                        $qb->expr()->eq('uid_owner', $qb->createNamedParameter($userId)),
707
+                        $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($userId))
708
+                    )
709
+                );
710
+            }
711
+        }
712
+
713
+        if ($node !== null) {
714
+            $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
715
+        }
716
+
717
+        if ($limit !== -1) {
718
+            $qb->setMaxResults($limit);
719
+        }
720
+
721
+        $qb->setFirstResult($offset);
722
+        $qb->orderBy('id');
723
+
724
+        $cursor = $qb->execute();
725
+        $shares = [];
726
+        while ($data = $cursor->fetch()) {
727
+            $shares[] = $this->createShare($data);
728
+        }
729
+        $cursor->closeCursor();
730
+
731
+        return $shares;
732
+    }
733
+
734
+    /**
735
+     * @inheritdoc
736
+     */
737
+    public function getShareById($id, $recipientId = null) {
738
+        $qb = $this->dbConn->getQueryBuilder();
739
+
740
+        $qb->select('*')
741
+            ->from('share')
742
+            ->where($qb->expr()->eq('id', $qb->createNamedParameter($id)))
743
+            ->andWhere(
744
+                $qb->expr()->in(
745
+                    'share_type',
746
+                    $qb->createNamedParameter([
747
+                        \OCP\Share::SHARE_TYPE_USER,
748
+                        \OCP\Share::SHARE_TYPE_GROUP,
749
+                        \OCP\Share::SHARE_TYPE_LINK,
750
+                    ], IQueryBuilder::PARAM_INT_ARRAY)
751
+                )
752
+            )
753
+            ->andWhere($qb->expr()->orX(
754
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
755
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
756
+            ));
757
+
758
+        $cursor = $qb->execute();
759
+        $data = $cursor->fetch();
760
+        $cursor->closeCursor();
761
+
762
+        if ($data === false) {
763
+            throw new ShareNotFound();
764
+        }
765
+
766
+        try {
767
+            $share = $this->createShare($data);
768
+        } catch (InvalidShare $e) {
769
+            throw new ShareNotFound();
770
+        }
771
+
772
+        // If the recipient is set for a group share resolve to that user
773
+        if ($recipientId !== null && $share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
774
+            $share = $this->resolveGroupShares([$share], $recipientId)[0];
775
+        }
776
+
777
+        return $share;
778
+    }
779
+
780
+    /**
781
+     * Get shares for a given path
782
+     *
783
+     * @param \OCP\Files\Node $path
784
+     * @return \OCP\Share\IShare[]
785
+     */
786
+    public function getSharesByPath(Node $path) {
787
+        $qb = $this->dbConn->getQueryBuilder();
788
+
789
+        $cursor = $qb->select('*')
790
+            ->from('share')
791
+            ->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($path->getId())))
792
+            ->andWhere(
793
+                $qb->expr()->orX(
794
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
795
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP))
796
+                )
797
+            )
798
+            ->andWhere($qb->expr()->orX(
799
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
800
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
801
+            ))
802
+            ->execute();
803
+
804
+        $shares = [];
805
+        while ($data = $cursor->fetch()) {
806
+            $shares[] = $this->createShare($data);
807
+        }
808
+        $cursor->closeCursor();
809
+
810
+        return $shares;
811
+    }
812
+
813
+    /**
814
+     * Returns whether the given database result can be interpreted as
815
+     * a share with accessible file (not trashed, not deleted)
816
+     */
817
+    private function isAccessibleResult($data) {
818
+        // exclude shares leading to deleted file entries
819
+        if ($data['fileid'] === null || $data['path'] === null) {
820
+            return false;
821
+        }
822
+
823
+        // exclude shares leading to trashbin on home storages
824
+        $pathSections = explode('/', $data['path'], 2);
825
+        // FIXME: would not detect rare md5'd home storage case properly
826
+        if ($pathSections[0] !== 'files'
827
+                && in_array(explode(':', $data['storage_string_id'], 2)[0], ['home', 'object'])) {
828
+            return false;
829
+        }
830
+        return true;
831
+    }
832
+
833
+    /**
834
+     * @inheritdoc
835
+     */
836
+    public function getSharedWith($userId, $shareType, $node, $limit, $offset) {
837
+        /** @var Share[] $shares */
838
+        $shares = [];
839
+
840
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
841
+            //Get shares directly with this user
842
+            $qb = $this->dbConn->getQueryBuilder();
843
+            $qb->select('s.*',
844
+                'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
845
+                'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
846
+                'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
847
+            )
848
+                ->selectAlias('st.id', 'storage_string_id')
849
+                ->from('share', 's')
850
+                ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
851
+                ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'));
852
+
853
+            // Order by id
854
+            $qb->orderBy('s.id');
855
+
856
+            // Set limit and offset
857
+            if ($limit !== -1) {
858
+                $qb->setMaxResults($limit);
859
+            }
860
+            $qb->setFirstResult($offset);
861
+
862
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)))
863
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
864
+                ->andWhere($qb->expr()->orX(
865
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
866
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
867
+                ));
868
+
869
+            // Filter by node if provided
870
+            if ($node !== null) {
871
+                $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
872
+            }
873
+
874
+            $cursor = $qb->execute();
875
+
876
+            while ($data = $cursor->fetch()) {
877
+                if ($this->isAccessibleResult($data)) {
878
+                    $shares[] = $this->createShare($data);
879
+                }
880
+            }
881
+            $cursor->closeCursor();
882
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
883
+            $user = $this->userManager->get($userId);
884
+            $allGroups = $this->groupManager->getUserGroupIds($user);
885
+
886
+            /** @var Share[] $shares2 */
887
+            $shares2 = [];
888
+
889
+            $start = 0;
890
+            while (true) {
891
+                $groups = array_slice($allGroups, $start, 100);
892
+                $start += 100;
893
+
894
+                if ($groups === []) {
895
+                    break;
896
+                }
897
+
898
+                $qb = $this->dbConn->getQueryBuilder();
899
+                $qb->select('s.*',
900
+                    'f.fileid', 'f.path', 'f.permissions AS f_permissions', 'f.storage', 'f.path_hash',
901
+                    'f.parent AS f_parent', 'f.name', 'f.mimetype', 'f.mimepart', 'f.size', 'f.mtime', 'f.storage_mtime',
902
+                    'f.encrypted', 'f.unencrypted_size', 'f.etag', 'f.checksum'
903
+                )
904
+                    ->selectAlias('st.id', 'storage_string_id')
905
+                    ->from('share', 's')
906
+                    ->leftJoin('s', 'filecache', 'f', $qb->expr()->eq('s.file_source', 'f.fileid'))
907
+                    ->leftJoin('f', 'storages', 'st', $qb->expr()->eq('f.storage', 'st.numeric_id'))
908
+                    ->orderBy('s.id')
909
+                    ->setFirstResult(0);
910
+
911
+                if ($limit !== -1) {
912
+                    $qb->setMaxResults($limit - count($shares));
913
+                }
914
+
915
+                // Filter by node if provided
916
+                if ($node !== null) {
917
+                    $qb->andWhere($qb->expr()->eq('file_source', $qb->createNamedParameter($node->getId())));
918
+                }
919
+
920
+
921
+                $groups = array_filter($groups);
922
+
923
+                $qb->andWhere($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
924
+                    ->andWhere($qb->expr()->in('share_with', $qb->createNamedParameter(
925
+                        $groups,
926
+                        IQueryBuilder::PARAM_STR_ARRAY
927
+                    )))
928
+                    ->andWhere($qb->expr()->orX(
929
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
930
+                        $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
931
+                    ));
932
+
933
+                $cursor = $qb->execute();
934
+                while ($data = $cursor->fetch()) {
935
+                    if ($offset > 0) {
936
+                        $offset--;
937
+                        continue;
938
+                    }
939
+
940
+                    if ($this->isAccessibleResult($data)) {
941
+                        $shares2[] = $this->createShare($data);
942
+                    }
943
+                }
944
+                $cursor->closeCursor();
945
+            }
946
+
947
+            /*
948 948
 			 * Resolve all group shares to user specific shares
949 949
 			 */
950
-			$shares = $this->resolveGroupShares($shares2, $userId);
951
-		} else {
952
-			throw new BackendError('Invalid backend');
953
-		}
954
-
955
-
956
-		return $shares;
957
-	}
958
-
959
-	/**
960
-	 * Get a share by token
961
-	 *
962
-	 * @param string $token
963
-	 * @return \OCP\Share\IShare
964
-	 * @throws ShareNotFound
965
-	 */
966
-	public function getShareByToken($token) {
967
-		$qb = $this->dbConn->getQueryBuilder();
968
-
969
-		$cursor = $qb->select('*')
970
-			->from('share')
971
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
972
-			->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
973
-			->andWhere($qb->expr()->orX(
974
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
975
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
976
-			))
977
-			->execute();
978
-
979
-		$data = $cursor->fetch();
980
-
981
-		if ($data === false) {
982
-			throw new ShareNotFound();
983
-		}
984
-
985
-		try {
986
-			$share = $this->createShare($data);
987
-		} catch (InvalidShare $e) {
988
-			throw new ShareNotFound();
989
-		}
990
-
991
-		return $share;
992
-	}
993
-
994
-	/**
995
-	 * Create a share object from an database row
996
-	 *
997
-	 * @param mixed[] $data
998
-	 * @return \OCP\Share\IShare
999
-	 * @throws InvalidShare
1000
-	 */
1001
-	private function createShare($data) {
1002
-		$share = new Share($this->rootFolder, $this->userManager);
1003
-		$share->setId((int)$data['id'])
1004
-			->setShareType((int)$data['share_type'])
1005
-			->setPermissions((int)$data['permissions'])
1006
-			->setTarget($data['file_target'])
1007
-			->setNote($data['note'])
1008
-			->setMailSend((bool)$data['mail_send'])
1009
-			->setStatus((int)$data['accepted'])
1010
-			->setLabel($data['label']);
1011
-
1012
-		$shareTime = new \DateTime();
1013
-		$shareTime->setTimestamp((int)$data['stime']);
1014
-		$share->setShareTime($shareTime);
1015
-
1016
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1017
-			$share->setSharedWith($data['share_with']);
1018
-			$user = $this->userManager->get($data['share_with']);
1019
-			if ($user !== null) {
1020
-				$share->setSharedWithDisplayName($user->getDisplayName());
1021
-			}
1022
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1023
-			$share->setSharedWith($data['share_with']);
1024
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
1025
-			$share->setPassword($data['password']);
1026
-			$share->setSendPasswordByTalk((bool)$data['password_by_talk']);
1027
-			$share->setToken($data['token']);
1028
-		}
1029
-
1030
-		$share->setSharedBy($data['uid_initiator']);
1031
-		$share->setShareOwner($data['uid_owner']);
1032
-
1033
-		$share->setNodeId((int)$data['file_source']);
1034
-		$share->setNodeType($data['item_type']);
1035
-
1036
-		if ($data['expiration'] !== null) {
1037
-			$expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
1038
-			$share->setExpirationDate($expiration);
1039
-		}
1040
-
1041
-		if (isset($data['f_permissions'])) {
1042
-			$entryData = $data;
1043
-			$entryData['permissions'] = $entryData['f_permissions'];
1044
-			$entryData['parent'] = $entryData['f_parent'];
1045
-			$share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
1046
-				\OC::$server->getMimeTypeLoader()));
1047
-		}
1048
-
1049
-		$share->setProviderId($this->identifier());
1050
-		$share->setHideDownload((int)$data['hide_download'] === 1);
1051
-
1052
-		return $share;
1053
-	}
1054
-
1055
-	/**
1056
-	 * @param Share[] $shares
1057
-	 * @param $userId
1058
-	 * @return Share[] The updates shares if no update is found for a share return the original
1059
-	 */
1060
-	private function resolveGroupShares($shares, $userId) {
1061
-		$result = [];
1062
-
1063
-		$start = 0;
1064
-		while (true) {
1065
-			/** @var Share[] $shareSlice */
1066
-			$shareSlice = array_slice($shares, $start, 100);
1067
-			$start += 100;
1068
-
1069
-			if ($shareSlice === []) {
1070
-				break;
1071
-			}
1072
-
1073
-			/** @var int[] $ids */
1074
-			$ids = [];
1075
-			/** @var Share[] $shareMap */
1076
-			$shareMap = [];
1077
-
1078
-			foreach ($shareSlice as $share) {
1079
-				$ids[] = (int)$share->getId();
1080
-				$shareMap[$share->getId()] = $share;
1081
-			}
1082
-
1083
-			$qb = $this->dbConn->getQueryBuilder();
1084
-
1085
-			$query = $qb->select('*')
1086
-				->from('share')
1087
-				->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1088
-				->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1089
-				->andWhere($qb->expr()->orX(
1090
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1091
-					$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1092
-				));
1093
-
1094
-			$stmt = $query->execute();
1095
-
1096
-			while ($data = $stmt->fetch()) {
1097
-				$shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1098
-				$shareMap[$data['parent']]->setStatus((int)$data['accepted']);
1099
-				$shareMap[$data['parent']]->setTarget($data['file_target']);
1100
-				$shareMap[$data['parent']]->setParent($data['parent']);
1101
-			}
1102
-
1103
-			$stmt->closeCursor();
1104
-
1105
-			foreach ($shareMap as $share) {
1106
-				$result[] = $share;
1107
-			}
1108
-		}
1109
-
1110
-		return $result;
1111
-	}
1112
-
1113
-	/**
1114
-	 * A user is deleted from the system
1115
-	 * So clean up the relevant shares.
1116
-	 *
1117
-	 * @param string $uid
1118
-	 * @param int $shareType
1119
-	 */
1120
-	public function userDeleted($uid, $shareType) {
1121
-		$qb = $this->dbConn->getQueryBuilder();
1122
-
1123
-		$qb->delete('share');
1124
-
1125
-		if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
1126
-			/*
950
+            $shares = $this->resolveGroupShares($shares2, $userId);
951
+        } else {
952
+            throw new BackendError('Invalid backend');
953
+        }
954
+
955
+
956
+        return $shares;
957
+    }
958
+
959
+    /**
960
+     * Get a share by token
961
+     *
962
+     * @param string $token
963
+     * @return \OCP\Share\IShare
964
+     * @throws ShareNotFound
965
+     */
966
+    public function getShareByToken($token) {
967
+        $qb = $this->dbConn->getQueryBuilder();
968
+
969
+        $cursor = $qb->select('*')
970
+            ->from('share')
971
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)))
972
+            ->andWhere($qb->expr()->eq('token', $qb->createNamedParameter($token)))
973
+            ->andWhere($qb->expr()->orX(
974
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
975
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
976
+            ))
977
+            ->execute();
978
+
979
+        $data = $cursor->fetch();
980
+
981
+        if ($data === false) {
982
+            throw new ShareNotFound();
983
+        }
984
+
985
+        try {
986
+            $share = $this->createShare($data);
987
+        } catch (InvalidShare $e) {
988
+            throw new ShareNotFound();
989
+        }
990
+
991
+        return $share;
992
+    }
993
+
994
+    /**
995
+     * Create a share object from an database row
996
+     *
997
+     * @param mixed[] $data
998
+     * @return \OCP\Share\IShare
999
+     * @throws InvalidShare
1000
+     */
1001
+    private function createShare($data) {
1002
+        $share = new Share($this->rootFolder, $this->userManager);
1003
+        $share->setId((int)$data['id'])
1004
+            ->setShareType((int)$data['share_type'])
1005
+            ->setPermissions((int)$data['permissions'])
1006
+            ->setTarget($data['file_target'])
1007
+            ->setNote($data['note'])
1008
+            ->setMailSend((bool)$data['mail_send'])
1009
+            ->setStatus((int)$data['accepted'])
1010
+            ->setLabel($data['label']);
1011
+
1012
+        $shareTime = new \DateTime();
1013
+        $shareTime->setTimestamp((int)$data['stime']);
1014
+        $share->setShareTime($shareTime);
1015
+
1016
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1017
+            $share->setSharedWith($data['share_with']);
1018
+            $user = $this->userManager->get($data['share_with']);
1019
+            if ($user !== null) {
1020
+                $share->setSharedWithDisplayName($user->getDisplayName());
1021
+            }
1022
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1023
+            $share->setSharedWith($data['share_with']);
1024
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_LINK) {
1025
+            $share->setPassword($data['password']);
1026
+            $share->setSendPasswordByTalk((bool)$data['password_by_talk']);
1027
+            $share->setToken($data['token']);
1028
+        }
1029
+
1030
+        $share->setSharedBy($data['uid_initiator']);
1031
+        $share->setShareOwner($data['uid_owner']);
1032
+
1033
+        $share->setNodeId((int)$data['file_source']);
1034
+        $share->setNodeType($data['item_type']);
1035
+
1036
+        if ($data['expiration'] !== null) {
1037
+            $expiration = \DateTime::createFromFormat('Y-m-d H:i:s', $data['expiration']);
1038
+            $share->setExpirationDate($expiration);
1039
+        }
1040
+
1041
+        if (isset($data['f_permissions'])) {
1042
+            $entryData = $data;
1043
+            $entryData['permissions'] = $entryData['f_permissions'];
1044
+            $entryData['parent'] = $entryData['f_parent'];
1045
+            $share->setNodeCacheEntry(Cache::cacheEntryFromData($entryData,
1046
+                \OC::$server->getMimeTypeLoader()));
1047
+        }
1048
+
1049
+        $share->setProviderId($this->identifier());
1050
+        $share->setHideDownload((int)$data['hide_download'] === 1);
1051
+
1052
+        return $share;
1053
+    }
1054
+
1055
+    /**
1056
+     * @param Share[] $shares
1057
+     * @param $userId
1058
+     * @return Share[] The updates shares if no update is found for a share return the original
1059
+     */
1060
+    private function resolveGroupShares($shares, $userId) {
1061
+        $result = [];
1062
+
1063
+        $start = 0;
1064
+        while (true) {
1065
+            /** @var Share[] $shareSlice */
1066
+            $shareSlice = array_slice($shares, $start, 100);
1067
+            $start += 100;
1068
+
1069
+            if ($shareSlice === []) {
1070
+                break;
1071
+            }
1072
+
1073
+            /** @var int[] $ids */
1074
+            $ids = [];
1075
+            /** @var Share[] $shareMap */
1076
+            $shareMap = [];
1077
+
1078
+            foreach ($shareSlice as $share) {
1079
+                $ids[] = (int)$share->getId();
1080
+                $shareMap[$share->getId()] = $share;
1081
+            }
1082
+
1083
+            $qb = $this->dbConn->getQueryBuilder();
1084
+
1085
+            $query = $qb->select('*')
1086
+                ->from('share')
1087
+                ->where($qb->expr()->in('parent', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1088
+                ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($userId)))
1089
+                ->andWhere($qb->expr()->orX(
1090
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1091
+                    $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1092
+                ));
1093
+
1094
+            $stmt = $query->execute();
1095
+
1096
+            while ($data = $stmt->fetch()) {
1097
+                $shareMap[$data['parent']]->setPermissions((int)$data['permissions']);
1098
+                $shareMap[$data['parent']]->setStatus((int)$data['accepted']);
1099
+                $shareMap[$data['parent']]->setTarget($data['file_target']);
1100
+                $shareMap[$data['parent']]->setParent($data['parent']);
1101
+            }
1102
+
1103
+            $stmt->closeCursor();
1104
+
1105
+            foreach ($shareMap as $share) {
1106
+                $result[] = $share;
1107
+            }
1108
+        }
1109
+
1110
+        return $result;
1111
+    }
1112
+
1113
+    /**
1114
+     * A user is deleted from the system
1115
+     * So clean up the relevant shares.
1116
+     *
1117
+     * @param string $uid
1118
+     * @param int $shareType
1119
+     */
1120
+    public function userDeleted($uid, $shareType) {
1121
+        $qb = $this->dbConn->getQueryBuilder();
1122
+
1123
+        $qb->delete('share');
1124
+
1125
+        if ($shareType === \OCP\Share::SHARE_TYPE_USER) {
1126
+            /*
1127 1127
 			 * Delete all user shares that are owned by this user
1128 1128
 			 * or that are received by this user
1129 1129
 			 */
1130 1130
 
1131
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
1131
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)));
1132 1132
 
1133
-			$qb->andWhere(
1134
-				$qb->expr()->orX(
1135
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1136
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1137
-				)
1138
-			);
1139
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
1140
-			/*
1133
+            $qb->andWhere(
1134
+                $qb->expr()->orX(
1135
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1136
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1137
+                )
1138
+            );
1139
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_GROUP) {
1140
+            /*
1141 1141
 			 * Delete all group shares that are owned by this user
1142 1142
 			 * Or special user group shares that are received by this user
1143 1143
 			 */
1144
-			$qb->where(
1145
-				$qb->expr()->andX(
1146
-					$qb->expr()->orX(
1147
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1148
-						$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
1149
-					),
1150
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
1151
-				)
1152
-			);
1153
-
1154
-			$qb->orWhere(
1155
-				$qb->expr()->andX(
1156
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
1157
-					$qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1158
-				)
1159
-			);
1160
-		} elseif ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
1161
-			/*
1144
+            $qb->where(
1145
+                $qb->expr()->andX(
1146
+                    $qb->expr()->orX(
1147
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1148
+                        $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP))
1149
+                    ),
1150
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid))
1151
+                )
1152
+            );
1153
+
1154
+            $qb->orWhere(
1155
+                $qb->expr()->andX(
1156
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)),
1157
+                    $qb->expr()->eq('share_with', $qb->createNamedParameter($uid))
1158
+                )
1159
+            );
1160
+        } elseif ($shareType === \OCP\Share::SHARE_TYPE_LINK) {
1161
+            /*
1162 1162
 			 * Delete all link shares owned by this user.
1163 1163
 			 * And all link shares initiated by this user (until #22327 is in)
1164 1164
 			 */
1165
-			$qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
1166
-
1167
-			$qb->andWhere(
1168
-				$qb->expr()->orX(
1169
-					$qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1170
-					$qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
1171
-				)
1172
-			);
1173
-		} else {
1174
-			\OC::$server->getLogger()->logException(new \InvalidArgumentException('Default share provider tried to delete all shares for type: ' . $shareType));
1175
-			return;
1176
-		}
1177
-
1178
-		$qb->execute();
1179
-	}
1180
-
1181
-	/**
1182
-	 * Delete all shares received by this group. As well as any custom group
1183
-	 * shares for group members.
1184
-	 *
1185
-	 * @param string $gid
1186
-	 */
1187
-	public function groupDeleted($gid) {
1188
-		/*
1165
+            $qb->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK)));
1166
+
1167
+            $qb->andWhere(
1168
+                $qb->expr()->orX(
1169
+                    $qb->expr()->eq('uid_owner', $qb->createNamedParameter($uid)),
1170
+                    $qb->expr()->eq('uid_initiator', $qb->createNamedParameter($uid))
1171
+                )
1172
+            );
1173
+        } else {
1174
+            \OC::$server->getLogger()->logException(new \InvalidArgumentException('Default share provider tried to delete all shares for type: ' . $shareType));
1175
+            return;
1176
+        }
1177
+
1178
+        $qb->execute();
1179
+    }
1180
+
1181
+    /**
1182
+     * Delete all shares received by this group. As well as any custom group
1183
+     * shares for group members.
1184
+     *
1185
+     * @param string $gid
1186
+     */
1187
+    public function groupDeleted($gid) {
1188
+        /*
1189 1189
 		 * First delete all custom group shares for group members
1190 1190
 		 */
1191
-		$qb = $this->dbConn->getQueryBuilder();
1192
-		$qb->select('id')
1193
-			->from('share')
1194
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1195
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1196
-
1197
-		$cursor = $qb->execute();
1198
-		$ids = [];
1199
-		while ($row = $cursor->fetch()) {
1200
-			$ids[] = (int)$row['id'];
1201
-		}
1202
-		$cursor->closeCursor();
1203
-
1204
-		if (!empty($ids)) {
1205
-			$chunks = array_chunk($ids, 100);
1206
-			foreach ($chunks as $chunk) {
1207
-				$qb->delete('share')
1208
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1209
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1210
-				$qb->execute();
1211
-			}
1212
-		}
1213
-
1214
-		/*
1191
+        $qb = $this->dbConn->getQueryBuilder();
1192
+        $qb->select('id')
1193
+            ->from('share')
1194
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1195
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1196
+
1197
+        $cursor = $qb->execute();
1198
+        $ids = [];
1199
+        while ($row = $cursor->fetch()) {
1200
+            $ids[] = (int)$row['id'];
1201
+        }
1202
+        $cursor->closeCursor();
1203
+
1204
+        if (!empty($ids)) {
1205
+            $chunks = array_chunk($ids, 100);
1206
+            foreach ($chunks as $chunk) {
1207
+                $qb->delete('share')
1208
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1209
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1210
+                $qb->execute();
1211
+            }
1212
+        }
1213
+
1214
+        /*
1215 1215
 		 * Now delete all the group shares
1216 1216
 		 */
1217
-		$qb = $this->dbConn->getQueryBuilder();
1218
-		$qb->delete('share')
1219
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1220
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1221
-		$qb->execute();
1222
-	}
1223
-
1224
-	/**
1225
-	 * Delete custom group shares to this group for this user
1226
-	 *
1227
-	 * @param string $uid
1228
-	 * @param string $gid
1229
-	 */
1230
-	public function userDeletedFromGroup($uid, $gid) {
1231
-		/*
1217
+        $qb = $this->dbConn->getQueryBuilder();
1218
+        $qb->delete('share')
1219
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1220
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1221
+        $qb->execute();
1222
+    }
1223
+
1224
+    /**
1225
+     * Delete custom group shares to this group for this user
1226
+     *
1227
+     * @param string $uid
1228
+     * @param string $gid
1229
+     */
1230
+    public function userDeletedFromGroup($uid, $gid) {
1231
+        /*
1232 1232
 		 * Get all group shares
1233 1233
 		 */
1234
-		$qb = $this->dbConn->getQueryBuilder();
1235
-		$qb->select('id')
1236
-			->from('share')
1237
-			->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1238
-			->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1239
-
1240
-		$cursor = $qb->execute();
1241
-		$ids = [];
1242
-		while ($row = $cursor->fetch()) {
1243
-			$ids[] = (int)$row['id'];
1244
-		}
1245
-		$cursor->closeCursor();
1246
-
1247
-		if (!empty($ids)) {
1248
-			$chunks = array_chunk($ids, 100);
1249
-			foreach ($chunks as $chunk) {
1250
-				/*
1234
+        $qb = $this->dbConn->getQueryBuilder();
1235
+        $qb->select('id')
1236
+            ->from('share')
1237
+            ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)))
1238
+            ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($gid)));
1239
+
1240
+        $cursor = $qb->execute();
1241
+        $ids = [];
1242
+        while ($row = $cursor->fetch()) {
1243
+            $ids[] = (int)$row['id'];
1244
+        }
1245
+        $cursor->closeCursor();
1246
+
1247
+        if (!empty($ids)) {
1248
+            $chunks = array_chunk($ids, 100);
1249
+            foreach ($chunks as $chunk) {
1250
+                /*
1251 1251
 				 * Delete all special shares wit this users for the found group shares
1252 1252
 				 */
1253
-				$qb->delete('share')
1254
-					->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1255
-					->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1256
-					->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1257
-				$qb->execute();
1258
-			}
1259
-		}
1260
-	}
1261
-
1262
-	/**
1263
-	 * @inheritdoc
1264
-	 */
1265
-	public function getAccessList($nodes, $currentAccess) {
1266
-		$ids = [];
1267
-		foreach ($nodes as $node) {
1268
-			$ids[] = $node->getId();
1269
-		}
1270
-
1271
-		$qb = $this->dbConn->getQueryBuilder();
1272
-
1273
-		$or = $qb->expr()->orX(
1274
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
1275
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1276
-			$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
1277
-		);
1278
-
1279
-		if ($currentAccess) {
1280
-			$or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)));
1281
-		}
1282
-
1283
-		$qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
1284
-			->from('share')
1285
-			->where(
1286
-				$or
1287
-			)
1288
-			->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1289
-			->andWhere($qb->expr()->orX(
1290
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1291
-				$qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1292
-			));
1293
-		$cursor = $qb->execute();
1294
-
1295
-		$users = [];
1296
-		$link = false;
1297
-		while ($row = $cursor->fetch()) {
1298
-			$type = (int)$row['share_type'];
1299
-			if ($type === \OCP\Share::SHARE_TYPE_USER) {
1300
-				$uid = $row['share_with'];
1301
-				$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1302
-				$users[$uid][$row['id']] = $row;
1303
-			} elseif ($type === \OCP\Share::SHARE_TYPE_GROUP) {
1304
-				$gid = $row['share_with'];
1305
-				$group = $this->groupManager->get($gid);
1306
-
1307
-				if ($group === null) {
1308
-					continue;
1309
-				}
1310
-
1311
-				$userList = $group->getUsers();
1312
-				foreach ($userList as $user) {
1313
-					$uid = $user->getUID();
1314
-					$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1315
-					$users[$uid][$row['id']] = $row;
1316
-				}
1317
-			} elseif ($type === \OCP\Share::SHARE_TYPE_LINK) {
1318
-				$link = true;
1319
-			} elseif ($type === self::SHARE_TYPE_USERGROUP && $currentAccess === true) {
1320
-				$uid = $row['share_with'];
1321
-				$users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1322
-				$users[$uid][$row['id']] = $row;
1323
-			}
1324
-		}
1325
-		$cursor->closeCursor();
1326
-
1327
-		if ($currentAccess === true) {
1328
-			$users = array_map([$this, 'filterSharesOfUser'], $users);
1329
-			$users = array_filter($users);
1330
-		} else {
1331
-			$users = array_keys($users);
1332
-		}
1333
-
1334
-		return ['users' => $users, 'public' => $link];
1335
-	}
1336
-
1337
-	/**
1338
-	 * For each user the path with the fewest slashes is returned
1339
-	 * @param array $shares
1340
-	 * @return array
1341
-	 */
1342
-	protected function filterSharesOfUser(array $shares) {
1343
-		// Group shares when the user has a share exception
1344
-		foreach ($shares as $id => $share) {
1345
-			$type = (int) $share['share_type'];
1346
-			$permissions = (int) $share['permissions'];
1347
-
1348
-			if ($type === self::SHARE_TYPE_USERGROUP) {
1349
-				unset($shares[$share['parent']]);
1350
-
1351
-				if ($permissions === 0) {
1352
-					unset($shares[$id]);
1353
-				}
1354
-			}
1355
-		}
1356
-
1357
-		$best = [];
1358
-		$bestDepth = 0;
1359
-		foreach ($shares as $id => $share) {
1360
-			$depth = substr_count($share['file_target'], '/');
1361
-			if (empty($best) || $depth < $bestDepth) {
1362
-				$bestDepth = $depth;
1363
-				$best = [
1364
-					'node_id' => $share['file_source'],
1365
-					'node_path' => $share['file_target'],
1366
-				];
1367
-			}
1368
-		}
1369
-
1370
-		return $best;
1371
-	}
1372
-
1373
-	/**
1374
-	 * propagate notes to the recipients
1375
-	 *
1376
-	 * @param IShare $share
1377
-	 * @throws \OCP\Files\NotFoundException
1378
-	 */
1379
-	private function propagateNote(IShare $share) {
1380
-		if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1381
-			$user = $this->userManager->get($share->getSharedWith());
1382
-			$this->sendNote([$user], $share);
1383
-		} elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1384
-			$group = $this->groupManager->get($share->getSharedWith());
1385
-			$groupMembers = $group->getUsers();
1386
-			$this->sendNote($groupMembers, $share);
1387
-		}
1388
-	}
1389
-
1390
-	/**
1391
-	 * send note by mail
1392
-	 *
1393
-	 * @param array $recipients
1394
-	 * @param IShare $share
1395
-	 * @throws \OCP\Files\NotFoundException
1396
-	 */
1397
-	private function sendNote(array $recipients, IShare $share) {
1398
-		$toListByLanguage = [];
1399
-
1400
-		foreach ($recipients as $recipient) {
1401
-			/** @var IUser $recipient */
1402
-			$email = $recipient->getEMailAddress();
1403
-			if ($email) {
1404
-				$language = $this->config->getSystemValue('force_language', false);
1405
-				$language = \is_string($language) ? $language : $this->config->getUserValue($recipient->getUID(), 'core', 'lang', null);
1406
-				$language = $language ?? $this->config->getSystemValue('default_language', 'en');
1407
-
1408
-				if (!isset($toListByLanguage[$language])) {
1409
-					$toListByLanguage[$language] = [];
1410
-				}
1411
-				$toListByLanguage[$language][$email] = $recipient->getDisplayName();
1412
-			}
1413
-		}
1414
-
1415
-		if (empty($toListByLanguage)) {
1416
-			return;
1417
-		}
1418
-
1419
-		foreach ($toListByLanguage as $l10n => $toList) {
1420
-			$filename = $share->getNode()->getName();
1421
-			$initiator = $share->getSharedBy();
1422
-			$note = $share->getNote();
1423
-
1424
-			$l = $this->l10nFactory->get('lib', $l10n);
1425
-
1426
-			$initiatorUser = $this->userManager->get($initiator);
1427
-			$initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
1428
-			$initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
1429
-			$plainHeading = $l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
1430
-			$htmlHeading = $l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
1431
-			$message = $this->mailer->createMessage();
1432
-
1433
-			$emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote');
1434
-
1435
-			$emailTemplate->setSubject($l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
1436
-			$emailTemplate->addHeader();
1437
-			$emailTemplate->addHeading($htmlHeading, $plainHeading);
1438
-			$emailTemplate->addBodyText(htmlspecialchars($note), $note);
1439
-
1440
-			$link = $this->urlGenerator->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $share->getNode()->getId()]);
1441
-			$emailTemplate->addBodyButton(
1442
-				$l->t('Open »%s«', [$filename]),
1443
-				$link
1444
-			);
1445
-
1446
-
1447
-			// The "From" contains the sharers name
1448
-			$instanceName = $this->defaults->getName();
1449
-			$senderName = $l->t(
1450
-				'%1$s via %2$s',
1451
-				[
1452
-					$initiatorDisplayName,
1453
-					$instanceName
1454
-				]
1455
-			);
1456
-			$message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]);
1457
-			if ($initiatorEmailAddress !== null) {
1458
-				$message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]);
1459
-				$emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan());
1460
-			} else {
1461
-				$emailTemplate->addFooter();
1462
-			}
1463
-
1464
-			if (count($toList) === 1) {
1465
-				$message->setTo($toList);
1466
-			} else {
1467
-				$message->setTo([]);
1468
-				$message->setBcc($toList);
1469
-			}
1470
-			$message->useTemplate($emailTemplate);
1471
-			$this->mailer->send($message);
1472
-		}
1473
-	}
1474
-
1475
-	public function getAllShares(): iterable {
1476
-		$qb = $this->dbConn->getQueryBuilder();
1477
-
1478
-		$qb->select('*')
1479
-			->from('share')
1480
-			->where(
1481
-				$qb->expr()->orX(
1482
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_USER)),
1483
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_GROUP)),
1484
-					$qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_LINK))
1485
-				)
1486
-			);
1487
-
1488
-		$cursor = $qb->execute();
1489
-		while ($data = $cursor->fetch()) {
1490
-			try {
1491
-				$share = $this->createShare($data);
1492
-			} catch (InvalidShare $e) {
1493
-				continue;
1494
-			}
1495
-
1496
-			yield $share;
1497
-		}
1498
-		$cursor->closeCursor();
1499
-	}
1253
+                $qb->delete('share')
1254
+                    ->where($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)))
1255
+                    ->andWhere($qb->expr()->eq('share_with', $qb->createNamedParameter($uid)))
1256
+                    ->andWhere($qb->expr()->in('parent', $qb->createNamedParameter($chunk, IQueryBuilder::PARAM_INT_ARRAY)));
1257
+                $qb->execute();
1258
+            }
1259
+        }
1260
+    }
1261
+
1262
+    /**
1263
+     * @inheritdoc
1264
+     */
1265
+    public function getAccessList($nodes, $currentAccess) {
1266
+        $ids = [];
1267
+        foreach ($nodes as $node) {
1268
+            $ids[] = $node->getId();
1269
+        }
1270
+
1271
+        $qb = $this->dbConn->getQueryBuilder();
1272
+
1273
+        $or = $qb->expr()->orX(
1274
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_USER)),
1275
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_GROUP)),
1276
+            $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share::SHARE_TYPE_LINK))
1277
+        );
1278
+
1279
+        if ($currentAccess) {
1280
+            $or->add($qb->expr()->eq('share_type', $qb->createNamedParameter(self::SHARE_TYPE_USERGROUP)));
1281
+        }
1282
+
1283
+        $qb->select('id', 'parent', 'share_type', 'share_with', 'file_source', 'file_target', 'permissions')
1284
+            ->from('share')
1285
+            ->where(
1286
+                $or
1287
+            )
1288
+            ->andWhere($qb->expr()->in('file_source', $qb->createNamedParameter($ids, IQueryBuilder::PARAM_INT_ARRAY)))
1289
+            ->andWhere($qb->expr()->orX(
1290
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('file')),
1291
+                $qb->expr()->eq('item_type', $qb->createNamedParameter('folder'))
1292
+            ));
1293
+        $cursor = $qb->execute();
1294
+
1295
+        $users = [];
1296
+        $link = false;
1297
+        while ($row = $cursor->fetch()) {
1298
+            $type = (int)$row['share_type'];
1299
+            if ($type === \OCP\Share::SHARE_TYPE_USER) {
1300
+                $uid = $row['share_with'];
1301
+                $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1302
+                $users[$uid][$row['id']] = $row;
1303
+            } elseif ($type === \OCP\Share::SHARE_TYPE_GROUP) {
1304
+                $gid = $row['share_with'];
1305
+                $group = $this->groupManager->get($gid);
1306
+
1307
+                if ($group === null) {
1308
+                    continue;
1309
+                }
1310
+
1311
+                $userList = $group->getUsers();
1312
+                foreach ($userList as $user) {
1313
+                    $uid = $user->getUID();
1314
+                    $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1315
+                    $users[$uid][$row['id']] = $row;
1316
+                }
1317
+            } elseif ($type === \OCP\Share::SHARE_TYPE_LINK) {
1318
+                $link = true;
1319
+            } elseif ($type === self::SHARE_TYPE_USERGROUP && $currentAccess === true) {
1320
+                $uid = $row['share_with'];
1321
+                $users[$uid] = isset($users[$uid]) ? $users[$uid] : [];
1322
+                $users[$uid][$row['id']] = $row;
1323
+            }
1324
+        }
1325
+        $cursor->closeCursor();
1326
+
1327
+        if ($currentAccess === true) {
1328
+            $users = array_map([$this, 'filterSharesOfUser'], $users);
1329
+            $users = array_filter($users);
1330
+        } else {
1331
+            $users = array_keys($users);
1332
+        }
1333
+
1334
+        return ['users' => $users, 'public' => $link];
1335
+    }
1336
+
1337
+    /**
1338
+     * For each user the path with the fewest slashes is returned
1339
+     * @param array $shares
1340
+     * @return array
1341
+     */
1342
+    protected function filterSharesOfUser(array $shares) {
1343
+        // Group shares when the user has a share exception
1344
+        foreach ($shares as $id => $share) {
1345
+            $type = (int) $share['share_type'];
1346
+            $permissions = (int) $share['permissions'];
1347
+
1348
+            if ($type === self::SHARE_TYPE_USERGROUP) {
1349
+                unset($shares[$share['parent']]);
1350
+
1351
+                if ($permissions === 0) {
1352
+                    unset($shares[$id]);
1353
+                }
1354
+            }
1355
+        }
1356
+
1357
+        $best = [];
1358
+        $bestDepth = 0;
1359
+        foreach ($shares as $id => $share) {
1360
+            $depth = substr_count($share['file_target'], '/');
1361
+            if (empty($best) || $depth < $bestDepth) {
1362
+                $bestDepth = $depth;
1363
+                $best = [
1364
+                    'node_id' => $share['file_source'],
1365
+                    'node_path' => $share['file_target'],
1366
+                ];
1367
+            }
1368
+        }
1369
+
1370
+        return $best;
1371
+    }
1372
+
1373
+    /**
1374
+     * propagate notes to the recipients
1375
+     *
1376
+     * @param IShare $share
1377
+     * @throws \OCP\Files\NotFoundException
1378
+     */
1379
+    private function propagateNote(IShare $share) {
1380
+        if ($share->getShareType() === \OCP\Share::SHARE_TYPE_USER) {
1381
+            $user = $this->userManager->get($share->getSharedWith());
1382
+            $this->sendNote([$user], $share);
1383
+        } elseif ($share->getShareType() === \OCP\Share::SHARE_TYPE_GROUP) {
1384
+            $group = $this->groupManager->get($share->getSharedWith());
1385
+            $groupMembers = $group->getUsers();
1386
+            $this->sendNote($groupMembers, $share);
1387
+        }
1388
+    }
1389
+
1390
+    /**
1391
+     * send note by mail
1392
+     *
1393
+     * @param array $recipients
1394
+     * @param IShare $share
1395
+     * @throws \OCP\Files\NotFoundException
1396
+     */
1397
+    private function sendNote(array $recipients, IShare $share) {
1398
+        $toListByLanguage = [];
1399
+
1400
+        foreach ($recipients as $recipient) {
1401
+            /** @var IUser $recipient */
1402
+            $email = $recipient->getEMailAddress();
1403
+            if ($email) {
1404
+                $language = $this->config->getSystemValue('force_language', false);
1405
+                $language = \is_string($language) ? $language : $this->config->getUserValue($recipient->getUID(), 'core', 'lang', null);
1406
+                $language = $language ?? $this->config->getSystemValue('default_language', 'en');
1407
+
1408
+                if (!isset($toListByLanguage[$language])) {
1409
+                    $toListByLanguage[$language] = [];
1410
+                }
1411
+                $toListByLanguage[$language][$email] = $recipient->getDisplayName();
1412
+            }
1413
+        }
1414
+
1415
+        if (empty($toListByLanguage)) {
1416
+            return;
1417
+        }
1418
+
1419
+        foreach ($toListByLanguage as $l10n => $toList) {
1420
+            $filename = $share->getNode()->getName();
1421
+            $initiator = $share->getSharedBy();
1422
+            $note = $share->getNote();
1423
+
1424
+            $l = $this->l10nFactory->get('lib', $l10n);
1425
+
1426
+            $initiatorUser = $this->userManager->get($initiator);
1427
+            $initiatorDisplayName = ($initiatorUser instanceof IUser) ? $initiatorUser->getDisplayName() : $initiator;
1428
+            $initiatorEmailAddress = ($initiatorUser instanceof IUser) ? $initiatorUser->getEMailAddress() : null;
1429
+            $plainHeading = $l->t('%1$s shared »%2$s« with you and wants to add:', [$initiatorDisplayName, $filename]);
1430
+            $htmlHeading = $l->t('%1$s shared »%2$s« with you and wants to add', [$initiatorDisplayName, $filename]);
1431
+            $message = $this->mailer->createMessage();
1432
+
1433
+            $emailTemplate = $this->mailer->createEMailTemplate('defaultShareProvider.sendNote');
1434
+
1435
+            $emailTemplate->setSubject($l->t('»%s« added a note to a file shared with you', [$initiatorDisplayName]));
1436
+            $emailTemplate->addHeader();
1437
+            $emailTemplate->addHeading($htmlHeading, $plainHeading);
1438
+            $emailTemplate->addBodyText(htmlspecialchars($note), $note);
1439
+
1440
+            $link = $this->urlGenerator->linkToRouteAbsolute('files.viewcontroller.showFile', ['fileid' => $share->getNode()->getId()]);
1441
+            $emailTemplate->addBodyButton(
1442
+                $l->t('Open »%s«', [$filename]),
1443
+                $link
1444
+            );
1445
+
1446
+
1447
+            // The "From" contains the sharers name
1448
+            $instanceName = $this->defaults->getName();
1449
+            $senderName = $l->t(
1450
+                '%1$s via %2$s',
1451
+                [
1452
+                    $initiatorDisplayName,
1453
+                    $instanceName
1454
+                ]
1455
+            );
1456
+            $message->setFrom([\OCP\Util::getDefaultEmailAddress($instanceName) => $senderName]);
1457
+            if ($initiatorEmailAddress !== null) {
1458
+                $message->setReplyTo([$initiatorEmailAddress => $initiatorDisplayName]);
1459
+                $emailTemplate->addFooter($instanceName . ' - ' . $this->defaults->getSlogan());
1460
+            } else {
1461
+                $emailTemplate->addFooter();
1462
+            }
1463
+
1464
+            if (count($toList) === 1) {
1465
+                $message->setTo($toList);
1466
+            } else {
1467
+                $message->setTo([]);
1468
+                $message->setBcc($toList);
1469
+            }
1470
+            $message->useTemplate($emailTemplate);
1471
+            $this->mailer->send($message);
1472
+        }
1473
+    }
1474
+
1475
+    public function getAllShares(): iterable {
1476
+        $qb = $this->dbConn->getQueryBuilder();
1477
+
1478
+        $qb->select('*')
1479
+            ->from('share')
1480
+            ->where(
1481
+                $qb->expr()->orX(
1482
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_USER)),
1483
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_GROUP)),
1484
+                    $qb->expr()->eq('share_type', $qb->createNamedParameter(\OCP\Share\IShare::TYPE_LINK))
1485
+                )
1486
+            );
1487
+
1488
+        $cursor = $qb->execute();
1489
+        while ($data = $cursor->fetch()) {
1490
+            try {
1491
+                $share = $this->createShare($data);
1492
+            } catch (InvalidShare $e) {
1493
+                continue;
1494
+            }
1495
+
1496
+            yield $share;
1497
+        }
1498
+        $cursor->closeCursor();
1499
+    }
1500 1500
 }
Please login to merge, or discard this patch.