1
|
|
|
<?php |
2
|
|
|
/** |
3
|
|
|
* Analytics |
4
|
|
|
* |
5
|
|
|
* This file is licensed under the Affero General Public License version 3 or |
6
|
|
|
* later. See the LICENSE.md file. |
7
|
|
|
* |
8
|
|
|
* @author Marcel Scherello <[email protected]> |
9
|
|
|
* @copyright 2021 Marcel Scherello |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace OCA\Analytics\Db; |
13
|
|
|
|
14
|
|
|
use OCP\DB\QueryBuilder\IQueryBuilder; |
15
|
|
|
use OCP\IDBConnection; |
16
|
|
|
use OCP\IL10N; |
17
|
|
|
use OCP\IUserSession; |
18
|
|
|
use Psr\Log\LoggerInterface; |
19
|
|
|
|
20
|
|
|
class ShareMapper |
21
|
|
|
{ |
22
|
|
|
/** @var IUserSession */ |
23
|
|
|
private $userSession; |
24
|
|
|
private $l10n; |
25
|
|
|
private $db; |
26
|
|
|
private $logger; |
27
|
|
|
const TABLE_NAME = 'analytics_share'; |
28
|
|
|
const TABLE_NAME_DATASET = 'analytics_dataset'; |
29
|
|
|
|
30
|
|
|
public function __construct( |
31
|
|
|
IL10N $l10n, |
32
|
|
|
IDBConnection $db, |
33
|
|
|
IUserSession $userSession, |
34
|
|
|
LoggerInterface $logger |
35
|
|
|
) |
36
|
|
|
{ |
37
|
|
|
$this->userSession = $userSession; |
38
|
|
|
$this->l10n = $l10n; |
39
|
|
|
$this->db = $db; |
40
|
|
|
$this->logger = $logger; |
41
|
|
|
self::TABLE_NAME; |
42
|
|
|
self::TABLE_NAME_DATASET; |
43
|
|
|
} |
44
|
|
|
|
45
|
|
|
/** |
46
|
|
|
* get all shared datasets by token |
47
|
|
|
* uses for public pages |
48
|
|
|
* @param $token |
49
|
|
|
* @return array |
50
|
|
|
*/ |
51
|
|
|
public function getDatasetByToken($token) |
52
|
|
|
{ |
53
|
|
|
$sql = $this->db->getQueryBuilder(); |
54
|
|
|
$sql->from(self::TABLE_NAME_DATASET, 'DS') |
55
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset')) |
56
|
|
|
->select('DS.*') |
57
|
|
|
->addSelect('SH.permissions') |
58
|
|
|
->selectAlias('SH.password', 'password') |
59
|
|
|
->where($sql->expr()->eq('SH.token', $sql->createNamedParameter($token))); |
60
|
|
|
$statement = $sql->execute(); |
61
|
|
|
$result = $statement->fetch(); |
62
|
|
|
$statement->closeCursor(); |
63
|
|
|
return $result; |
64
|
|
|
} |
65
|
|
|
|
66
|
|
|
/** |
67
|
|
|
* get all shared datasets by group |
68
|
|
|
* @param $group |
69
|
|
|
* @return array |
70
|
|
|
*/ |
71
|
|
|
public function getDatasetsByGroup($group) |
72
|
|
|
{ |
73
|
|
|
$sql = $this->db->getQueryBuilder(); |
74
|
|
|
$sql->from(self::TABLE_NAME_DATASET, 'DS') |
75
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset')) |
76
|
|
|
->select('DS.id', 'DS.name') |
77
|
|
|
->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($group))) |
78
|
|
|
->andWhere($sql->expr()->eq('SH.type', $sql->createNamedParameter(1))); |
79
|
|
|
$statement = $sql->execute(); |
80
|
|
|
$result = $statement->fetchAll(); |
81
|
|
|
$statement->closeCursor(); |
82
|
|
|
return $result; |
83
|
|
|
} |
84
|
|
|
|
85
|
|
|
/** |
86
|
|
|
* get all shared datasets by group |
87
|
|
|
* @param $group |
88
|
|
|
* @param $id |
89
|
|
|
* @return array |
90
|
|
|
*/ |
91
|
|
|
public function getDatasetByGroupId($group, $id) |
92
|
|
|
{ |
93
|
|
|
$sql = $this->db->getQueryBuilder(); |
94
|
|
|
$sql->from(self::TABLE_NAME_DATASET, 'DS') |
95
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset')) |
96
|
|
|
->select('DS.*') |
97
|
|
|
->addSelect('SH.permissions') |
98
|
|
|
->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($group))) |
99
|
|
|
->andWhere($sql->expr()->eq('SH.type', $sql->createNamedParameter(1))) |
100
|
|
|
->andWhere($sql->expr()->eq('SH.dataset', $sql->createNamedParameter($id))); |
101
|
|
|
$statement = $sql->execute(); |
102
|
|
|
$result = $statement->fetch(); |
103
|
|
|
$statement->closeCursor(); |
104
|
|
|
return $result; |
105
|
|
|
} |
106
|
|
|
|
107
|
|
|
/** |
108
|
|
|
* get shared datasets for current user |
109
|
|
|
* @return array |
110
|
|
|
*/ |
111
|
|
|
public function getSharedDatasets() |
112
|
|
|
{ |
113
|
|
|
$sql = $this->db->getQueryBuilder(); |
114
|
|
|
$sql->from(self::TABLE_NAME_DATASET, 'DS') |
115
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset')) |
116
|
|
|
->select('DS.id', 'DS.name') |
117
|
|
|
->selectAlias('SH.id', 'shareId') |
118
|
|
|
->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
119
|
|
|
->andWhere($sql->expr()->neq('SH.type', $sql->createNamedParameter(1))); // don´t find groups with the same name |
120
|
|
|
$statement = $sql->execute(); |
121
|
|
|
$result = $statement->fetchAll(); |
122
|
|
|
$statement->closeCursor(); |
123
|
|
|
return $result; |
124
|
|
|
} |
125
|
|
|
|
126
|
|
|
/** |
127
|
|
|
* get single shared dataset for current user |
128
|
|
|
* @param $id |
129
|
|
|
* @return array |
130
|
|
|
*/ |
131
|
|
|
public function getSharedDataset($id) |
132
|
|
|
{ |
133
|
|
|
$sql = $this->db->getQueryBuilder(); |
134
|
|
|
$sql->from(self::TABLE_NAME_DATASET, 'DS') |
135
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.dataset')) |
136
|
|
|
->select('DS.*') |
137
|
|
|
->addSelect('SH.permissions') |
138
|
|
|
->selectAlias($sql->createNamedParameter(true, IQueryBuilder::PARAM_BOOL), 'isShare') |
139
|
|
|
->where($sql->expr()->eq('SH.uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
140
|
|
|
->andWhere($sql->expr()->eq('DS.id', $sql->createNamedParameter($id))); |
141
|
|
|
$statement = $sql->execute(); |
142
|
|
|
$result = $statement->fetch(); |
143
|
|
|
$statement->closeCursor(); |
144
|
|
|
return $result; |
145
|
|
|
} |
146
|
|
|
|
147
|
|
|
/** |
148
|
|
|
* Create a new share |
149
|
|
|
* @param $datasetId |
150
|
|
|
* @param $type |
151
|
|
|
* @param $uid_owner |
152
|
|
|
* @param $token |
153
|
|
|
* @param $parent |
154
|
|
|
* @return bool |
155
|
|
|
* @throws \OCP\DB\Exception |
156
|
|
|
*/ |
157
|
|
|
public function createShare($datasetId, $type, $uid_owner, $token, $parent = null) |
158
|
|
|
{ |
159
|
|
|
$sql = $this->db->getQueryBuilder(); |
160
|
|
|
$sql->from(self::TABLE_NAME) |
161
|
|
|
->Select('id') |
162
|
|
|
->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))) |
163
|
|
|
->andWhere($sql->expr()->eq('type', $sql->createNamedParameter($type))) |
164
|
|
|
->andWhere($sql->expr()->eq('uid_owner', $sql->createNamedParameter($uid_owner))) |
165
|
|
|
->andWhere($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))); |
166
|
|
|
$statement = $sql->execute(); |
167
|
|
|
$result = $statement->fetchAll(); |
168
|
|
|
$statement->closeCursor(); |
169
|
|
|
|
170
|
|
|
if ($result && ($type !== 3)) { |
|
|
|
|
171
|
|
|
// don´t create double shares |
172
|
|
|
// multiple link shares (3) are possible |
173
|
|
|
return false; |
174
|
|
|
} else { |
175
|
|
|
$sql = $this->db->getQueryBuilder(); |
176
|
|
|
$sql->insert(self::TABLE_NAME) |
177
|
|
|
->values([ |
178
|
|
|
'dataset' => $sql->createNamedParameter($datasetId), |
179
|
|
|
'type' => $sql->createNamedParameter($type), |
180
|
|
|
'uid_owner' => $sql->createNamedParameter($uid_owner), |
181
|
|
|
'uid_initiator' => $sql->createNamedParameter($this->userSession->getUser()->getUID()), |
182
|
|
|
'token' => $sql->createNamedParameter($token), |
183
|
|
|
'parent' => $sql->createNamedParameter($parent), |
184
|
|
|
]); |
185
|
|
|
$sql->execute(); |
186
|
|
|
} |
187
|
|
|
return $sql->getLastInsertId(); |
|
|
|
|
188
|
|
|
} |
189
|
|
|
|
190
|
|
|
/** |
191
|
|
|
* Get single shares metadata |
192
|
|
|
* @param $shareId |
193
|
|
|
* @return array |
194
|
|
|
*/ |
195
|
|
|
public function getShare($shareId) |
196
|
|
|
{ |
197
|
|
|
$sql = $this->db->getQueryBuilder(); |
198
|
|
|
$sql->from(self::TABLE_NAME) |
199
|
|
|
->select('id', 'type', 'parent') |
200
|
|
|
->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
201
|
|
|
$statement = $sql->execute(); |
202
|
|
|
$result = $statement->fetch(); |
203
|
|
|
$statement->closeCursor(); |
204
|
|
|
return $result; |
205
|
|
|
} |
206
|
|
|
|
207
|
|
|
/** |
208
|
|
|
* Get all shares of a dataset |
209
|
|
|
* @param $datasetId |
210
|
|
|
* @return array |
211
|
|
|
*/ |
212
|
|
|
public function getShares($datasetId) |
213
|
|
|
{ |
214
|
|
|
$sql = $this->db->getQueryBuilder(); |
215
|
|
|
$sql->from(self::TABLE_NAME) |
216
|
|
|
->select('id', 'type', 'uid_owner', 'token', 'permissions') |
217
|
|
|
->selectAlias('password', 'pass') |
218
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
219
|
|
|
->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))) |
220
|
|
|
->andWhere($sql->expr()->neq('type', $sql->createNamedParameter(2))); |
221
|
|
|
$statement = $sql->execute(); |
222
|
|
|
$result = $statement->fetchAll(); |
223
|
|
|
$statement->closeCursor(); |
224
|
|
|
return $result; |
225
|
|
|
} |
226
|
|
|
|
227
|
|
|
/** |
228
|
|
|
* Get the all receivers of shares of a dataset |
229
|
|
|
* Used to derive who has to receive activites when a dataset changes |
230
|
|
|
* @param $datasetId |
231
|
|
|
* @return array |
232
|
|
|
*/ |
233
|
|
|
public function getSharedReceiver($datasetId) |
234
|
|
|
{ |
235
|
|
|
$sql = $this->db->getQueryBuilder(); |
236
|
|
|
$sql->from(self::TABLE_NAME) |
237
|
|
|
->select('uid_owner') |
238
|
|
|
->where($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))) |
239
|
|
|
->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0))); |
240
|
|
|
$statement = $sql->execute(); |
241
|
|
|
$result = $statement->fetchAll(); |
242
|
|
|
$statement->closeCursor(); |
243
|
|
|
return $result; |
244
|
|
|
} |
245
|
|
|
|
246
|
|
|
/** |
247
|
|
|
* Update the password of a share |
248
|
|
|
* @param $shareId |
249
|
|
|
* @param $password |
250
|
|
|
* @return bool |
251
|
|
|
*/ |
252
|
|
|
public function updateSharePassword($shareId, $password) |
253
|
|
|
{ |
254
|
|
|
$sql = $this->db->getQueryBuilder(); |
255
|
|
|
$sql->update(self::TABLE_NAME) |
256
|
|
|
->set('password', $sql->createNamedParameter($password)) |
257
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
258
|
|
|
->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
259
|
|
|
$sql->execute(); |
260
|
|
|
return true; |
261
|
|
|
} |
262
|
|
|
|
263
|
|
|
/** |
264
|
|
|
* Update the permissions of a share |
265
|
|
|
* @param $shareId |
266
|
|
|
* @param $password |
267
|
|
|
* @return bool |
268
|
|
|
*/ |
269
|
|
|
public function updateSharePermissions($shareId, $permissions) |
270
|
|
|
{ |
271
|
|
|
$sql = $this->db->getQueryBuilder(); |
272
|
|
|
$sql->update(self::TABLE_NAME) |
273
|
|
|
->set('permissions', $sql->createNamedParameter($permissions)) |
274
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
275
|
|
|
->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
276
|
|
|
$sql->execute(); |
277
|
|
|
return true; |
278
|
|
|
} |
279
|
|
|
|
280
|
|
|
/** |
281
|
|
|
* Delete a share |
282
|
|
|
* @param $shareId |
283
|
|
|
* @return bool |
284
|
|
|
* @throws \OCP\DB\Exception |
285
|
|
|
*/ |
286
|
|
|
public function deleteShare($shareId) |
287
|
|
|
{ |
288
|
|
|
$sql = $this->db->getQueryBuilder(); |
289
|
|
|
$sql->delete(self::TABLE_NAME) |
290
|
|
|
->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId))) |
291
|
|
|
->andWhere($sql->expr()->orX( |
292
|
|
|
$sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())), |
293
|
|
|
$sql->expr()->eq('uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())) |
294
|
|
|
)); |
295
|
|
|
$sql->execute(); |
296
|
|
|
return true; |
297
|
|
|
} |
298
|
|
|
|
299
|
|
|
/** |
300
|
|
|
* Delete all shares by parent ID (users of a group share) |
301
|
|
|
* @param $parent |
302
|
|
|
* @return bool |
303
|
|
|
*/ |
304
|
|
|
public function deleteShareByParent($parent) |
305
|
|
|
{ |
306
|
|
|
$sql = $this->db->getQueryBuilder(); |
307
|
|
|
$sql->delete(self::TABLE_NAME) |
308
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
309
|
|
|
->andWhere($sql->expr()->eq('parent', $sql->createNamedParameter($parent))); |
310
|
|
|
$sql->execute(); |
311
|
|
|
return true; |
312
|
|
|
} |
313
|
|
|
|
314
|
|
|
/** |
315
|
|
|
* Delete all shares of a dataset |
316
|
|
|
* Used during dataset deletion |
317
|
|
|
* @param $datasetId |
318
|
|
|
* @return bool |
319
|
|
|
*/ |
320
|
|
|
public function deleteShareByDataset($datasetId) |
321
|
|
|
{ |
322
|
|
|
$sql = $this->db->getQueryBuilder(); |
323
|
|
|
$sql->delete(self::TABLE_NAME) |
324
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
325
|
|
|
->andWhere($sql->expr()->eq('dataset', $sql->createNamedParameter($datasetId))); |
326
|
|
|
$sql->execute(); |
327
|
|
|
return true; |
328
|
|
|
} |
329
|
|
|
} |
This check marks implicit conversions of arrays to boolean values in a comparison. While in PHP an empty array is considered to be equal (but not identical) to false, this is not always apparent.
Consider making the comparison explicit by using
empty(..)
or! empty(...)
instead.