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 2019-2022 Marcel Scherello |
10
|
|
|
*/ |
11
|
|
|
|
12
|
|
|
namespace OCA\Analytics\Db; |
13
|
|
|
|
14
|
|
|
use OCP\DB\Exception; |
15
|
|
|
use OCP\DB\QueryBuilder\IQueryBuilder; |
16
|
|
|
use OCP\IDBConnection; |
17
|
|
|
use OCP\IUserSession; |
18
|
|
|
use Psr\Log\LoggerInterface; |
19
|
|
|
|
20
|
|
|
class ShareMapper |
21
|
|
|
{ |
22
|
|
|
/** @var IUserSession */ |
23
|
|
|
private $userSession; |
24
|
|
|
/** @var IDBConnection */ |
25
|
|
|
private $db; |
26
|
|
|
private $logger; |
27
|
|
|
const TABLE_NAME = 'analytics_share'; |
28
|
|
|
const TABLE_NAME_REPORT = 'analytics_report'; |
29
|
|
|
|
30
|
|
|
public function __construct( |
31
|
|
|
IDBConnection $db, |
32
|
|
|
IUserSession $userSession, |
33
|
|
|
LoggerInterface $logger |
34
|
|
|
) |
35
|
|
|
{ |
36
|
|
|
$this->userSession = $userSession; |
37
|
|
|
$this->db = $db; |
38
|
|
|
$this->logger = $logger; |
39
|
|
|
} |
40
|
|
|
|
41
|
|
|
/** |
42
|
|
|
* get all shared reports by token |
43
|
|
|
* uses for public pages |
44
|
|
|
* @param $token |
45
|
|
|
* @return array |
46
|
|
|
* @throws Exception |
47
|
|
|
*/ |
48
|
|
|
public function getReportByToken($token) |
49
|
|
|
{ |
50
|
|
|
$sql = $this->db->getQueryBuilder(); |
51
|
|
|
$sql->from(self::TABLE_NAME_REPORT, 'DS') |
52
|
|
|
->leftJoin('DS', self::TABLE_NAME, 'SH', $sql->expr()->eq('DS.id', 'SH.report')) |
53
|
|
|
->select('DS.*') |
54
|
|
|
->addSelect('SH.permissions') |
55
|
|
|
->selectAlias('SH.domain', 'domain') |
56
|
|
|
->selectAlias('SH.password', 'password') |
57
|
|
|
->where($sql->expr()->eq('SH.token', $sql->createNamedParameter($token))); |
58
|
|
|
$statement = $sql->executeQuery(); |
59
|
|
|
$result = $statement->fetch(); |
60
|
|
|
$statement->closeCursor(); |
61
|
|
|
return $result; |
62
|
|
|
} |
63
|
|
|
|
64
|
|
|
/** |
65
|
|
|
* get all shared reports |
66
|
|
|
* @return array |
67
|
|
|
* @throws Exception |
68
|
|
|
*/ |
69
|
|
|
public function getAllSharedReports() |
70
|
|
|
{ |
71
|
|
|
$sql = $this->db->getQueryBuilder(); |
72
|
|
|
$sql->from(self::TABLE_NAME_REPORT, 'REPORT') |
73
|
|
|
->rightJoin('REPORT', self::TABLE_NAME, 'SHARE', $sql->expr()->eq('REPORT.id', 'SHARE.report')) |
74
|
|
|
->select('REPORT.*') |
75
|
|
|
->selectAlias('SHARE.id', 'shareId') |
76
|
|
|
->selectAlias('SHARE.type', 'shareType') |
77
|
|
|
->selectAlias('SHARE.uid_owner', 'shareUid_owner') |
78
|
|
|
->selectAlias($sql->createNamedParameter(true, IQueryBuilder::PARAM_BOOL), 'isShare') |
79
|
|
|
->addSelect('SHARE.permissions'); |
80
|
|
|
$statement = $sql->executeQuery(); |
81
|
|
|
$result = $statement->fetchAll(); |
82
|
|
|
$statement->closeCursor(); |
83
|
|
|
return $result; |
84
|
|
|
} |
85
|
|
|
|
86
|
|
|
/** |
87
|
|
|
* Create a new share |
88
|
|
|
* @param $reportId |
89
|
|
|
* @param $type |
90
|
|
|
* @param $uid_owner |
91
|
|
|
* @param $token |
92
|
|
|
* @param $parent |
93
|
|
|
* @return bool |
94
|
|
|
* @throws \OCP\DB\Exception |
95
|
|
|
*/ |
96
|
|
|
public function createShare($reportId, $type, $uid_owner, $token, $parent = null) |
97
|
|
|
{ |
98
|
|
|
$sql = $this->db->getQueryBuilder(); |
99
|
|
|
$sql->from(self::TABLE_NAME) |
100
|
|
|
->Select('id') |
101
|
|
|
->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId))) |
102
|
|
|
->andWhere($sql->expr()->eq('type', $sql->createNamedParameter($type))) |
103
|
|
|
->andWhere($sql->expr()->eq('uid_owner', $sql->createNamedParameter($uid_owner))) |
104
|
|
|
->andWhere($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))); |
105
|
|
|
$statement = $sql->executeQuery(); |
106
|
|
|
$result = $statement->fetchAll(); |
107
|
|
|
$statement->closeCursor(); |
108
|
|
|
|
109
|
|
|
if ($result && ($type !== 3)) { |
|
|
|
|
110
|
|
|
// don´t create double shares |
111
|
|
|
// multiple link shares (3) are possible |
112
|
|
|
return false; |
113
|
|
|
} else { |
114
|
|
|
$sql = $this->db->getQueryBuilder(); |
115
|
|
|
$sql->insert(self::TABLE_NAME) |
116
|
|
|
->values([ |
117
|
|
|
'report' => $sql->createNamedParameter($reportId), |
118
|
|
|
'type' => $sql->createNamedParameter($type), |
119
|
|
|
'uid_owner' => $sql->createNamedParameter($uid_owner), |
120
|
|
|
'uid_initiator' => $sql->createNamedParameter($this->userSession->getUser()->getUID()), |
121
|
|
|
'token' => $sql->createNamedParameter($token), |
122
|
|
|
'parent' => $sql->createNamedParameter($parent), |
123
|
|
|
]); |
124
|
|
|
$sql->executeQuery(); |
125
|
|
|
} |
126
|
|
|
return $sql->getLastInsertId(); |
|
|
|
|
127
|
|
|
} |
128
|
|
|
|
129
|
|
|
/** |
130
|
|
|
* Get single shares metadata |
131
|
|
|
* @param $shareId |
132
|
|
|
* @return array |
133
|
|
|
* @throws Exception |
134
|
|
|
*/ |
135
|
|
|
public function getShare($shareId) |
136
|
|
|
{ |
137
|
|
|
$sql = $this->db->getQueryBuilder(); |
138
|
|
|
$sql->from(self::TABLE_NAME) |
139
|
|
|
->select('id', 'type', 'parent') |
140
|
|
|
->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
141
|
|
|
$statement = $sql->executeQuery(); |
142
|
|
|
$result = $statement->fetch(); |
143
|
|
|
$statement->closeCursor(); |
144
|
|
|
return $result; |
145
|
|
|
} |
146
|
|
|
|
147
|
|
|
/** |
148
|
|
|
* Get all shares of a report |
149
|
|
|
* @param $reportId |
150
|
|
|
* @return array |
151
|
|
|
* @throws Exception |
152
|
|
|
*/ |
153
|
|
|
public function getShares($reportId) |
154
|
|
|
{ |
155
|
|
|
$sql = $this->db->getQueryBuilder(); |
156
|
|
|
$sql->from(self::TABLE_NAME) |
157
|
|
|
->select('id', 'type', 'uid_owner', 'token', 'permissions', 'domain') |
158
|
|
|
->selectAlias('password', 'pass') |
159
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
160
|
|
|
->andWhere($sql->expr()->eq('report', $sql->createNamedParameter($reportId))) |
161
|
|
|
->andWhere($sql->expr()->neq('type', $sql->createNamedParameter(2))) |
162
|
|
|
->orderBy('id', 'ASC'); |
163
|
|
|
$statement = $sql->executeQuery(); |
164
|
|
|
$result = $statement->fetchAll(); |
165
|
|
|
$statement->closeCursor(); |
166
|
|
|
return $result; |
167
|
|
|
} |
168
|
|
|
|
169
|
|
|
/** |
170
|
|
|
* Get the all receivers of shares of a report |
171
|
|
|
* Used to derive who has to receive activities when a report changes |
172
|
|
|
* @param $reportId |
173
|
|
|
* @return array |
174
|
|
|
* @throws Exception |
175
|
|
|
*/ |
176
|
|
|
public function getSharedReceiver($reportId) |
177
|
|
|
{ |
178
|
|
|
$sql = $this->db->getQueryBuilder(); |
179
|
|
|
$sql->from(self::TABLE_NAME) |
180
|
|
|
->select('uid_owner') |
181
|
|
|
->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId))) |
182
|
|
|
->andWhere($sql->expr()->eq('type', $sql->createNamedParameter(0))); |
183
|
|
|
$statement = $sql->executeQuery(); |
184
|
|
|
$result = $statement->fetchAll(); |
185
|
|
|
$statement->closeCursor(); |
186
|
|
|
return $result; |
187
|
|
|
} |
188
|
|
|
|
189
|
|
|
/** |
190
|
|
|
* Update the password of a share |
191
|
|
|
* @param $shareId |
192
|
|
|
* @param $password |
193
|
|
|
* @return bool |
194
|
|
|
* @throws Exception |
195
|
|
|
*/ |
196
|
|
|
public function updateSharePassword($shareId, $password) |
197
|
|
|
{ |
198
|
|
|
$sql = $this->db->getQueryBuilder(); |
199
|
|
|
$sql->update(self::TABLE_NAME) |
200
|
|
|
->set('password', $sql->createNamedParameter($password)) |
201
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
202
|
|
|
->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
203
|
|
|
$sql->executeStatement(); |
204
|
|
|
return true; |
205
|
|
|
} |
206
|
|
|
|
207
|
|
|
/** |
208
|
|
|
* Update the password of a share |
209
|
|
|
* @param $shareId |
210
|
|
|
* @param $domain |
211
|
|
|
* @return bool |
212
|
|
|
* @throws Exception |
213
|
|
|
*/ |
214
|
|
|
public function updateShareDomain($shareId, $domain) |
215
|
|
|
{ |
216
|
|
|
$sql = $this->db->getQueryBuilder(); |
217
|
|
|
$sql->update(self::TABLE_NAME) |
218
|
|
|
->set('domain', $sql->createNamedParameter($domain)) |
219
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
220
|
|
|
->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
221
|
|
|
$sql->executeStatement(); |
222
|
|
|
return true; |
223
|
|
|
} |
224
|
|
|
|
225
|
|
|
/** |
226
|
|
|
* Update the permissions of a share |
227
|
|
|
* @param $shareId |
228
|
|
|
* @param $permissions |
229
|
|
|
* @return bool |
230
|
|
|
* @throws Exception |
231
|
|
|
*/ |
232
|
|
|
public function updateSharePermissions($shareId, $permissions) |
233
|
|
|
{ |
234
|
|
|
// update the share itself |
235
|
|
|
$sql = $this->db->getQueryBuilder(); |
236
|
|
|
$sql->update(self::TABLE_NAME) |
237
|
|
|
->set('permissions', $sql->createNamedParameter($permissions)) |
238
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
239
|
|
|
->andWhere($sql->expr()->eq('id', $sql->createNamedParameter($shareId))); |
240
|
|
|
$sql->executeStatement(); |
241
|
|
|
|
242
|
|
|
return true; |
243
|
|
|
} |
244
|
|
|
|
245
|
|
|
/** |
246
|
|
|
* Delete a share |
247
|
|
|
* @param $shareId |
248
|
|
|
* @return bool |
249
|
|
|
* @throws Exception |
250
|
|
|
*/ |
251
|
|
|
public function deleteShare($shareId) |
252
|
|
|
{ |
253
|
|
|
$sql = $this->db->getQueryBuilder(); |
254
|
|
|
$sql->delete(self::TABLE_NAME) |
255
|
|
|
->where($sql->expr()->eq('id', $sql->createNamedParameter($shareId))) |
256
|
|
|
->andWhere($sql->expr()->orX( |
257
|
|
|
$sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID())), |
258
|
|
|
$sql->expr()->eq('uid_owner', $sql->createNamedParameter($this->userSession->getUser()->getUID())) |
259
|
|
|
)); |
260
|
|
|
$sql->executeStatement(); |
261
|
|
|
return true; |
262
|
|
|
} |
263
|
|
|
|
264
|
|
|
/** |
265
|
|
|
* Delete all shares by parent ID (users of a group share) |
266
|
|
|
* @param $parent |
267
|
|
|
* @return bool |
268
|
|
|
* @throws Exception |
269
|
|
|
*/ |
270
|
|
|
public function deleteShareByParent($parent) |
271
|
|
|
{ |
272
|
|
|
$sql = $this->db->getQueryBuilder(); |
273
|
|
|
$sql->delete(self::TABLE_NAME) |
274
|
|
|
->where($sql->expr()->eq('uid_initiator', $sql->createNamedParameter($this->userSession->getUser()->getUID()))) |
275
|
|
|
->andWhere($sql->expr()->eq('parent', $sql->createNamedParameter($parent))); |
276
|
|
|
$sql->executeStatement(); |
277
|
|
|
return true; |
278
|
|
|
} |
279
|
|
|
|
280
|
|
|
/** |
281
|
|
|
* Delete all shares of a report |
282
|
|
|
* Used during report deletion |
283
|
|
|
* @param $reportId |
284
|
|
|
* @return bool |
285
|
|
|
* @throws Exception |
286
|
|
|
*/ |
287
|
|
|
public function deleteShareByReport($reportId) |
288
|
|
|
{ |
289
|
|
|
$sql = $this->db->getQueryBuilder(); |
290
|
|
|
$sql->delete(self::TABLE_NAME) |
291
|
|
|
->where($sql->expr()->eq('report', $sql->createNamedParameter($reportId))); |
292
|
|
|
$sql->executeStatement(); |
293
|
|
|
return true; |
294
|
|
|
} |
295
|
|
|
} |
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.