Completed
Pull Request — master (#586)
by Maxence
03:47
created

CirclesReport::obfuscateMember()   B

Complexity

Conditions 6
Paths 32

Size

Total Lines 43

Duplication

Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
dl 0
loc 43
rs 8.6097
c 0
b 0
f 0
cc 6
nc 32
nop 1
1
<?php
2
3
declare(strict_types=1);
4
5
6
/**
7
 * Circles - Bring cloud-users closer together.
8
 *
9
 * This file is licensed under the Affero General Public License version 3 or
10
 * later. See the COPYING file.
11
 *
12
 * @author Maxence Lange <[email protected]>
13
 * @copyright 2021
14
 * @license GNU AGPL version 3 or any later version
15
 *
16
 * This program is free software: you can redistribute it and/or modify
17
 * it under the terms of the GNU Affero General Public License as
18
 * published by the Free Software Foundation, either version 3 of the
19
 * License, or (at your option) any later version.
20
 *
21
 * This program is distributed in the hope that it will be useful,
22
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
23
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
24
 * GNU Affero General Public License for more details.
25
 *
26
 * You should have received a copy of the GNU Affero General Public License
27
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
28
 *
29
 */
30
31
32
namespace OCA\Circles\Command;
33
34
use daita\MySmallPhpTools\Exceptions\InvalidItemException;
35
use daita\MySmallPhpTools\Model\SimpleDataStore;
36
use daita\MySmallPhpTools\Traits\Nextcloud\nc22\TNC22Deserialize;
37
use daita\MySmallPhpTools\Traits\TArrayTools;
38
use OC\Core\Command\Base;
39
use OCA\Circles\Exceptions\InitiatorNotFoundException;
40
use OCA\Circles\Model\Circle;
41
use OCA\Circles\Model\FederatedUser;
42
use OCA\Circles\Model\Member;
43
use OCA\Circles\Model\Membership;
44
use OCA\Circles\Model\Report;
45
use OCA\Circles\Service\CircleService;
46
use OCA\Circles\Service\FederatedUserService;
47
use OCA\Circles\Service\MemberService;
48
use Symfony\Component\Console\Input\InputInterface;
49
use Symfony\Component\Console\Output\OutputInterface;
50
51
52
/**
53
 * Class CirclesReport
54
 *
55
 * @package OCA\Circles\Command
56
 */
57
class CirclesReport extends Base {
58
59
60
	use TNC22Deserialize;
61
	use TArrayTools;
62
63
64
	/** @var FederatedUserService */
65
	private $federatedUserService;
66
67
	/** @var CircleService */
68
	private $circleService;
69
70
	/** @var MemberService */
71
	private $memberService;
72
73
74
	/**
75
	 * CirclesReport constructor.
76
	 *
77
	 * @param FederatedUserService $federatedUserService
78
	 * @param CircleService $circleService
79
	 * @param MemberService $memberService
80
	 */
81
	public function __construct(
82
		FederatedUserService $federatedUserService,
83
		CircleService $circleService,
84
		MemberService $memberService
85
	) {
86
		parent::__construct();
87
88
		$this->federatedUserService = $federatedUserService;
89
		$this->circleService = $circleService;
90
		$this->memberService = $memberService;
91
	}
92
93
94
	/**
95
	 *
96
	 */
97
	protected function configure() {
98
		parent::configure();
99
		$this->setName('circles:report')
100
			 ->setDescription('read and write report');
101
	}
102
103
104
	/**
105
	 * @param InputInterface $input
106
	 * @param OutputInterface $output
107
	 *
108
	 * @return int
109
	 * @throws InvalidItemException
110
	 */
111
	protected function execute(InputInterface $input, OutputInterface $output): int {
112
		stream_set_blocking(STDIN, false);
113
		$data = file_get_contents('php://stdin');
114
115
		if ($data === '') {
116
			$this->generateReport($output);
117
		} else {
118
			/** @var Report $report */
119
			$report = $this->deserialize(json_decode($data, true), Report::class);
120
			$this->readReport($output, $report);
121
		}
122
123
		return 0;
124
	}
125
126
127
	/**
128
	 * @param OutputInterface $output
129
	 *
130
	 * @throws InitiatorNotFoundException
131
	 */
132
	private function generateReport(OutputInterface $output): void {
133
		$report = new Report();
134
		$this->federatedUserService->bypassCurrentUserCondition(true);
135
136
		$raw = $this->circleService->getCircles(
137
			null,
138
			null,
139
			new SimpleDataStore(['includeSystemCircles' => true])
140
		);
141
142
		$circles = [];
143
		foreach ($raw as $circle) {
144
			$circle->getMembers();
145
146
			$circles[] = $this->obfuscateCircle($circle);
147
		}
148
149
		$report->setCircles($circles);
150
151
		$output->writeln(json_encode($report, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
152
	}
153
154
155
	/**
156
	 * @param OutputInterface $output
157
	 * @param Report $report
158
	 */
159
	private function readReport(OutputInterface $output, Report $report) {
160
		echo json_encode($report);
161
	}
162
163
164
	/**
165
	 * @param Circle $circle
166
	 */
167
	private function obfuscateCircle(Circle $circle): Circle {
168
		$singleId = $this->obfuscateId($circle->getSingleId());
169
		$circle->setSingleId($singleId)
170
			   ->setName($singleId)
171
			   ->setDisplayName($singleId)
172
			   ->setDescription('')
173
			   ->setCreation(0);
174
175
		if ($circle->hasOwner()) {
176
			$circle->setOwner($this->obfuscateMember($circle->getOwner()));
177
		}
178
179
		return $circle;
180
	}
181
182
183
	/**
184
	 * @param Member $member
185
	 */
186
	private function obfuscateMember(Member $member): Member {
187
		$memberId = $this->obfuscateId($member->getId());
188
		$singleId = $this->obfuscateId($member->getSingleId());
189
		$circleId = $this->obfuscateId($member->getCircleId());
190
191
		$member->setSingleId($singleId)
192
			   ->setCircleId($circleId)
193
			   ->setId($memberId)
194
			   ->setUserId($singleId)
195
			   ->setDisplayName($singleId)
196
			   ->setDisplayUpdate(0)
197
			   ->setNote('')
198
			   ->setContactId('')
199
			   ->setContactMeta('')
200
			   ->setJoined(0);
201
202
		if ($member->hasCircle()) {
203
			$member->setCircle($this->obfuscateCircle($member->getCircle()));
204
		}
205
206
		if ($member->hasBasedOn()) {
207
			$member->setBasedOn($this->obfuscateCircle($member->getBasedOn()));
208
		}
209
210
		if ($member->hasInheritedBy()) {
211
			$member->setInheritedBy($this->obfuscateFederatedUser($member->getInheritedBy()));
212
		}
213
214
		if ($member->hasInheritanceFrom()) {
215
			$member->setInheritanceFrom($this->obfuscateMember($member->getInheritanceFrom()));
216
		}
217
218
		if ($member->hasInheritedBy()) {
219
			$member->setInheritedBy($this->obfuscateFederatedUser($member->getInheritedBy()));
220
		}
221
222
//			$arr['members'] = $this->getMembers();
223
//			$arr['inheritedMembers'] = $this->getInheritedMembers();
224
//			$arr['memberships'] = $this->getMemberships();
225
//			$arr['remoteInstance'] = $this->getRemoteInstance();
226
227
		return $member;
228
	}
229
230
231
	/**
232
	 * @param FederatedUser $federatedUser
233
	 *
234
	 * @return FederatedUser
235
	 */
236
	private function obfuscateFederatedUser(FederatedUser $federatedUser): FederatedUser {
237
		$singleId = $this->obfuscateId($federatedUser->getSingleId());
238
		$federatedUser->setSingleId($singleId)
239
					  ->setUserId($singleId);
240
241
		if ($federatedUser->hasBasedOn()) {
242
			$federatedUser->setBasedOn($this->obfuscateCircle($federatedUser->getBasedOn()));
243
		}
244
245
		if ($federatedUser->hasLink()) {
246
			$federatedUser->setLink($this->obfuscateMembership($federatedUser->getLink()));
247
		}
248
249
		if ($federatedUser->hasMembers()) {
250
		}
251
252
//			$arr['members'] = $this->getMembers();
253
//			$arr['inheritedMembers'] = $this->getInheritedMembers();
254
//			$arr['memberships'] = $this->getMemberships();
255
	}
256
257
258
	/**
259
	 * @param Membership $membership
260
	 *
261
	 * @return Membership
262
	 */
263
	private function obfuscateMembership(Membership $membership): Membership {
264
265
266
		return $membership;
267
	}
268
269
270
	/**
271
	 * @param string $id
272
	 *
273
	 * @return string
274
	 */
275
	private function obfuscateId(string $id): string {
276
		return substr($id, 0, 5) . '.' . md5(substr($id, 5));
277
	}
278
279
280
}
281
282