Passed
Push — master ( d870e9...1c1b34 )
by Roeland
10:38 queued 11s
created
lib/private/Accounts/AccountManager.php 1 patch
Indentation   +301 added lines, -301 removed lines patch added patch discarded remove patch
@@ -52,305 +52,305 @@
 block discarded – undo
52 52
  */
53 53
 class AccountManager implements IAccountManager {
54 54
 
55
-	/** @var  IDBConnection database connection */
56
-	private $connection;
57
-
58
-	/** @var string table name */
59
-	private $table = 'accounts';
60
-
61
-	/** @var EventDispatcherInterface */
62
-	private $eventDispatcher;
63
-
64
-	/** @var IJobList */
65
-	private $jobList;
66
-
67
-	/** @var ILogger */
68
-	private $logger;
69
-
70
-	/**
71
-	 * AccountManager constructor.
72
-	 *
73
-	 * @param IDBConnection $connection
74
-	 * @param EventDispatcherInterface $eventDispatcher
75
-	 * @param IJobList $jobList
76
-	 */
77
-	public function __construct(IDBConnection $connection,
78
-								EventDispatcherInterface $eventDispatcher,
79
-								IJobList $jobList,
80
-								ILogger $logger) {
81
-		$this->connection = $connection;
82
-		$this->eventDispatcher = $eventDispatcher;
83
-		$this->jobList = $jobList;
84
-		$this->logger = $logger;
85
-	}
86
-
87
-	/**
88
-	 * update user record
89
-	 *
90
-	 * @param IUser $user
91
-	 * @param $data
92
-	 */
93
-	public function updateUser(IUser $user, $data) {
94
-		$userData = $this->getUser($user);
95
-		$updated = true;
96
-		if (empty($userData)) {
97
-			$this->insertNewUser($user, $data);
98
-		} elseif ($userData !== $data) {
99
-			$data = $this->checkEmailVerification($userData, $data, $user);
100
-			$data = $this->updateVerifyStatus($userData, $data);
101
-			$this->updateExistingUser($user, $data);
102
-		} else {
103
-			// nothing needs to be done if new and old data set are the same
104
-			$updated = false;
105
-		}
106
-
107
-		if ($updated) {
108
-			$this->eventDispatcher->dispatch(
109
-				'OC\AccountManager::userUpdated',
110
-				new GenericEvent($user, $data)
111
-			);
112
-		}
113
-	}
114
-
115
-	/**
116
-	 * delete user from accounts table
117
-	 *
118
-	 * @param IUser $user
119
-	 */
120
-	public function deleteUser(IUser $user) {
121
-		$uid = $user->getUID();
122
-		$query = $this->connection->getQueryBuilder();
123
-		$query->delete($this->table)
124
-			->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
125
-			->execute();
126
-	}
127
-
128
-	/**
129
-	 * get stored data from a given user
130
-	 *
131
-	 * @param IUser $user
132
-	 * @return array
133
-	 */
134
-	public function getUser(IUser $user) {
135
-		$uid = $user->getUID();
136
-		$query = $this->connection->getQueryBuilder();
137
-		$query->select('data')->from($this->table)
138
-			->where($query->expr()->eq('uid', $query->createParameter('uid')))
139
-			->setParameter('uid', $uid);
140
-		$query->execute();
141
-		$result = $query->execute()->fetchAll();
142
-
143
-		if (empty($result)) {
144
-			$userData = $this->buildDefaultUserRecord($user);
145
-			$this->insertNewUser($user, $userData);
146
-			return $userData;
147
-		}
148
-
149
-		$userDataArray = json_decode($result[0]['data'], true);
150
-		$jsonError = json_last_error();
151
-		if ($userDataArray === null || $userDataArray === [] || $jsonError !== JSON_ERROR_NONE) {
152
-			$this->logger->critical("User data of $uid contained invalid JSON (error $jsonError), hence falling back to a default user record");
153
-			return $this->buildDefaultUserRecord($user);
154
-		}
155
-
156
-		$userDataArray = $this->addMissingDefaultValues($userDataArray);
157
-
158
-		return $userDataArray;
159
-	}
160
-
161
-	/**
162
-	 * check if we need to ask the server for email verification, if yes we create a cronjob
163
-	 *
164
-	 * @param $oldData
165
-	 * @param $newData
166
-	 * @param IUser $user
167
-	 * @return array
168
-	 */
169
-	protected function checkEmailVerification($oldData, $newData, IUser $user) {
170
-		if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) {
171
-			$this->jobList->add(VerifyUserData::class,
172
-				[
173
-					'verificationCode' => '',
174
-					'data' => $newData[self::PROPERTY_EMAIL]['value'],
175
-					'type' => self::PROPERTY_EMAIL,
176
-					'uid' => $user->getUID(),
177
-					'try' => 0,
178
-					'lastRun' => time()
179
-				]
180
-			);
181
-			$newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS;
182
-		}
183
-
184
-		return $newData;
185
-	}
186
-
187
-	/**
188
-	 * make sure that all expected data are set
189
-	 *
190
-	 * @param array $userData
191
-	 * @return array
192
-	 */
193
-	protected function addMissingDefaultValues(array $userData) {
194
-		foreach ($userData as $key => $value) {
195
-			if (!isset($userData[$key]['verified'])) {
196
-				$userData[$key]['verified'] = self::NOT_VERIFIED;
197
-			}
198
-		}
199
-
200
-		return $userData;
201
-	}
202
-
203
-	/**
204
-	 * reset verification status if personal data changed
205
-	 *
206
-	 * @param array $oldData
207
-	 * @param array $newData
208
-	 * @return array
209
-	 */
210
-	protected function updateVerifyStatus($oldData, $newData) {
211
-
212
-		// which account was already verified successfully?
213
-		$twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED;
214
-		$websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED;
215
-		$emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED;
216
-
217
-		// keep old verification status if we don't have a new one
218
-		if (!isset($newData[self::PROPERTY_TWITTER]['verified'])) {
219
-			// keep old verification status if value didn't changed and an old value exists
220
-			$keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']);
221
-			$newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED;
222
-		}
223
-
224
-		if (!isset($newData[self::PROPERTY_WEBSITE]['verified'])) {
225
-			// keep old verification status if value didn't changed and an old value exists
226
-			$keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']);
227
-			$newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED;
228
-		}
229
-
230
-		if (!isset($newData[self::PROPERTY_EMAIL]['verified'])) {
231
-			// keep old verification status if value didn't changed and an old value exists
232
-			$keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']);
233
-			$newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS;
234
-		}
235
-
236
-		// reset verification status if a value from a previously verified data was changed
237
-		if ($twitterVerified &&
238
-			$oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value']
239
-		) {
240
-			$newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED;
241
-		}
242
-
243
-		if ($websiteVerified &&
244
-			$oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value']
245
-		) {
246
-			$newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED;
247
-		}
248
-
249
-		if ($emailVerified &&
250
-			$oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']
251
-		) {
252
-			$newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED;
253
-		}
254
-
255
-		return $newData;
256
-	}
257
-
258
-	/**
259
-	 * add new user to accounts table
260
-	 *
261
-	 * @param IUser $user
262
-	 * @param array $data
263
-	 */
264
-	protected function insertNewUser(IUser $user, $data) {
265
-		$uid = $user->getUID();
266
-		$jsonEncodedData = json_encode($data);
267
-		$query = $this->connection->getQueryBuilder();
268
-		$query->insert($this->table)
269
-			->values(
270
-				[
271
-					'uid' => $query->createNamedParameter($uid),
272
-					'data' => $query->createNamedParameter($jsonEncodedData),
273
-				]
274
-			)
275
-			->execute();
276
-	}
277
-
278
-	/**
279
-	 * update existing user in accounts table
280
-	 *
281
-	 * @param IUser $user
282
-	 * @param array $data
283
-	 */
284
-	protected function updateExistingUser(IUser $user, $data) {
285
-		$uid = $user->getUID();
286
-		$jsonEncodedData = json_encode($data);
287
-		$query = $this->connection->getQueryBuilder();
288
-		$query->update($this->table)
289
-			->set('data', $query->createNamedParameter($jsonEncodedData))
290
-			->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
291
-			->execute();
292
-	}
293
-
294
-	/**
295
-	 * build default user record in case not data set exists yet
296
-	 *
297
-	 * @param IUser $user
298
-	 * @return array
299
-	 */
300
-	protected function buildDefaultUserRecord(IUser $user) {
301
-		return [
302
-			self::PROPERTY_DISPLAYNAME =>
303
-				[
304
-					'value' => $user->getDisplayName(),
305
-					'scope' => self::VISIBILITY_CONTACTS_ONLY,
306
-					'verified' => self::NOT_VERIFIED,
307
-				],
308
-			self::PROPERTY_ADDRESS =>
309
-				[
310
-					'value' => '',
311
-					'scope' => self::VISIBILITY_PRIVATE,
312
-					'verified' => self::NOT_VERIFIED,
313
-				],
314
-			self::PROPERTY_WEBSITE =>
315
-				[
316
-					'value' => '',
317
-					'scope' => self::VISIBILITY_PRIVATE,
318
-					'verified' => self::NOT_VERIFIED,
319
-				],
320
-			self::PROPERTY_EMAIL =>
321
-				[
322
-					'value' => $user->getEMailAddress(),
323
-					'scope' => self::VISIBILITY_CONTACTS_ONLY,
324
-					'verified' => self::NOT_VERIFIED,
325
-				],
326
-			self::PROPERTY_AVATAR =>
327
-				[
328
-					'scope' => self::VISIBILITY_CONTACTS_ONLY
329
-				],
330
-			self::PROPERTY_PHONE =>
331
-				[
332
-					'value' => '',
333
-					'scope' => self::VISIBILITY_PRIVATE,
334
-					'verified' => self::NOT_VERIFIED,
335
-				],
336
-			self::PROPERTY_TWITTER =>
337
-				[
338
-					'value' => '',
339
-					'scope' => self::VISIBILITY_PRIVATE,
340
-					'verified' => self::NOT_VERIFIED,
341
-				],
342
-		];
343
-	}
344
-
345
-	private function parseAccountData(IUser $user, $data): Account {
346
-		$account = new Account($user);
347
-		foreach ($data as $property => $accountData) {
348
-			$account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'] ?? self::VISIBILITY_PRIVATE, $accountData['verified'] ?? self::NOT_VERIFIED);
349
-		}
350
-		return $account;
351
-	}
352
-
353
-	public function getAccount(IUser $user): IAccount {
354
-		return $this->parseAccountData($user, $this->getUser($user));
355
-	}
55
+    /** @var  IDBConnection database connection */
56
+    private $connection;
57
+
58
+    /** @var string table name */
59
+    private $table = 'accounts';
60
+
61
+    /** @var EventDispatcherInterface */
62
+    private $eventDispatcher;
63
+
64
+    /** @var IJobList */
65
+    private $jobList;
66
+
67
+    /** @var ILogger */
68
+    private $logger;
69
+
70
+    /**
71
+     * AccountManager constructor.
72
+     *
73
+     * @param IDBConnection $connection
74
+     * @param EventDispatcherInterface $eventDispatcher
75
+     * @param IJobList $jobList
76
+     */
77
+    public function __construct(IDBConnection $connection,
78
+                                EventDispatcherInterface $eventDispatcher,
79
+                                IJobList $jobList,
80
+                                ILogger $logger) {
81
+        $this->connection = $connection;
82
+        $this->eventDispatcher = $eventDispatcher;
83
+        $this->jobList = $jobList;
84
+        $this->logger = $logger;
85
+    }
86
+
87
+    /**
88
+     * update user record
89
+     *
90
+     * @param IUser $user
91
+     * @param $data
92
+     */
93
+    public function updateUser(IUser $user, $data) {
94
+        $userData = $this->getUser($user);
95
+        $updated = true;
96
+        if (empty($userData)) {
97
+            $this->insertNewUser($user, $data);
98
+        } elseif ($userData !== $data) {
99
+            $data = $this->checkEmailVerification($userData, $data, $user);
100
+            $data = $this->updateVerifyStatus($userData, $data);
101
+            $this->updateExistingUser($user, $data);
102
+        } else {
103
+            // nothing needs to be done if new and old data set are the same
104
+            $updated = false;
105
+        }
106
+
107
+        if ($updated) {
108
+            $this->eventDispatcher->dispatch(
109
+                'OC\AccountManager::userUpdated',
110
+                new GenericEvent($user, $data)
111
+            );
112
+        }
113
+    }
114
+
115
+    /**
116
+     * delete user from accounts table
117
+     *
118
+     * @param IUser $user
119
+     */
120
+    public function deleteUser(IUser $user) {
121
+        $uid = $user->getUID();
122
+        $query = $this->connection->getQueryBuilder();
123
+        $query->delete($this->table)
124
+            ->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
125
+            ->execute();
126
+    }
127
+
128
+    /**
129
+     * get stored data from a given user
130
+     *
131
+     * @param IUser $user
132
+     * @return array
133
+     */
134
+    public function getUser(IUser $user) {
135
+        $uid = $user->getUID();
136
+        $query = $this->connection->getQueryBuilder();
137
+        $query->select('data')->from($this->table)
138
+            ->where($query->expr()->eq('uid', $query->createParameter('uid')))
139
+            ->setParameter('uid', $uid);
140
+        $query->execute();
141
+        $result = $query->execute()->fetchAll();
142
+
143
+        if (empty($result)) {
144
+            $userData = $this->buildDefaultUserRecord($user);
145
+            $this->insertNewUser($user, $userData);
146
+            return $userData;
147
+        }
148
+
149
+        $userDataArray = json_decode($result[0]['data'], true);
150
+        $jsonError = json_last_error();
151
+        if ($userDataArray === null || $userDataArray === [] || $jsonError !== JSON_ERROR_NONE) {
152
+            $this->logger->critical("User data of $uid contained invalid JSON (error $jsonError), hence falling back to a default user record");
153
+            return $this->buildDefaultUserRecord($user);
154
+        }
155
+
156
+        $userDataArray = $this->addMissingDefaultValues($userDataArray);
157
+
158
+        return $userDataArray;
159
+    }
160
+
161
+    /**
162
+     * check if we need to ask the server for email verification, if yes we create a cronjob
163
+     *
164
+     * @param $oldData
165
+     * @param $newData
166
+     * @param IUser $user
167
+     * @return array
168
+     */
169
+    protected function checkEmailVerification($oldData, $newData, IUser $user) {
170
+        if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) {
171
+            $this->jobList->add(VerifyUserData::class,
172
+                [
173
+                    'verificationCode' => '',
174
+                    'data' => $newData[self::PROPERTY_EMAIL]['value'],
175
+                    'type' => self::PROPERTY_EMAIL,
176
+                    'uid' => $user->getUID(),
177
+                    'try' => 0,
178
+                    'lastRun' => time()
179
+                ]
180
+            );
181
+            $newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS;
182
+        }
183
+
184
+        return $newData;
185
+    }
186
+
187
+    /**
188
+     * make sure that all expected data are set
189
+     *
190
+     * @param array $userData
191
+     * @return array
192
+     */
193
+    protected function addMissingDefaultValues(array $userData) {
194
+        foreach ($userData as $key => $value) {
195
+            if (!isset($userData[$key]['verified'])) {
196
+                $userData[$key]['verified'] = self::NOT_VERIFIED;
197
+            }
198
+        }
199
+
200
+        return $userData;
201
+    }
202
+
203
+    /**
204
+     * reset verification status if personal data changed
205
+     *
206
+     * @param array $oldData
207
+     * @param array $newData
208
+     * @return array
209
+     */
210
+    protected function updateVerifyStatus($oldData, $newData) {
211
+
212
+        // which account was already verified successfully?
213
+        $twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED;
214
+        $websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED;
215
+        $emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED;
216
+
217
+        // keep old verification status if we don't have a new one
218
+        if (!isset($newData[self::PROPERTY_TWITTER]['verified'])) {
219
+            // keep old verification status if value didn't changed and an old value exists
220
+            $keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']);
221
+            $newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED;
222
+        }
223
+
224
+        if (!isset($newData[self::PROPERTY_WEBSITE]['verified'])) {
225
+            // keep old verification status if value didn't changed and an old value exists
226
+            $keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']);
227
+            $newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED;
228
+        }
229
+
230
+        if (!isset($newData[self::PROPERTY_EMAIL]['verified'])) {
231
+            // keep old verification status if value didn't changed and an old value exists
232
+            $keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']);
233
+            $newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS;
234
+        }
235
+
236
+        // reset verification status if a value from a previously verified data was changed
237
+        if ($twitterVerified &&
238
+            $oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value']
239
+        ) {
240
+            $newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED;
241
+        }
242
+
243
+        if ($websiteVerified &&
244
+            $oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value']
245
+        ) {
246
+            $newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED;
247
+        }
248
+
249
+        if ($emailVerified &&
250
+            $oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']
251
+        ) {
252
+            $newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED;
253
+        }
254
+
255
+        return $newData;
256
+    }
257
+
258
+    /**
259
+     * add new user to accounts table
260
+     *
261
+     * @param IUser $user
262
+     * @param array $data
263
+     */
264
+    protected function insertNewUser(IUser $user, $data) {
265
+        $uid = $user->getUID();
266
+        $jsonEncodedData = json_encode($data);
267
+        $query = $this->connection->getQueryBuilder();
268
+        $query->insert($this->table)
269
+            ->values(
270
+                [
271
+                    'uid' => $query->createNamedParameter($uid),
272
+                    'data' => $query->createNamedParameter($jsonEncodedData),
273
+                ]
274
+            )
275
+            ->execute();
276
+    }
277
+
278
+    /**
279
+     * update existing user in accounts table
280
+     *
281
+     * @param IUser $user
282
+     * @param array $data
283
+     */
284
+    protected function updateExistingUser(IUser $user, $data) {
285
+        $uid = $user->getUID();
286
+        $jsonEncodedData = json_encode($data);
287
+        $query = $this->connection->getQueryBuilder();
288
+        $query->update($this->table)
289
+            ->set('data', $query->createNamedParameter($jsonEncodedData))
290
+            ->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
291
+            ->execute();
292
+    }
293
+
294
+    /**
295
+     * build default user record in case not data set exists yet
296
+     *
297
+     * @param IUser $user
298
+     * @return array
299
+     */
300
+    protected function buildDefaultUserRecord(IUser $user) {
301
+        return [
302
+            self::PROPERTY_DISPLAYNAME =>
303
+                [
304
+                    'value' => $user->getDisplayName(),
305
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY,
306
+                    'verified' => self::NOT_VERIFIED,
307
+                ],
308
+            self::PROPERTY_ADDRESS =>
309
+                [
310
+                    'value' => '',
311
+                    'scope' => self::VISIBILITY_PRIVATE,
312
+                    'verified' => self::NOT_VERIFIED,
313
+                ],
314
+            self::PROPERTY_WEBSITE =>
315
+                [
316
+                    'value' => '',
317
+                    'scope' => self::VISIBILITY_PRIVATE,
318
+                    'verified' => self::NOT_VERIFIED,
319
+                ],
320
+            self::PROPERTY_EMAIL =>
321
+                [
322
+                    'value' => $user->getEMailAddress(),
323
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY,
324
+                    'verified' => self::NOT_VERIFIED,
325
+                ],
326
+            self::PROPERTY_AVATAR =>
327
+                [
328
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY
329
+                ],
330
+            self::PROPERTY_PHONE =>
331
+                [
332
+                    'value' => '',
333
+                    'scope' => self::VISIBILITY_PRIVATE,
334
+                    'verified' => self::NOT_VERIFIED,
335
+                ],
336
+            self::PROPERTY_TWITTER =>
337
+                [
338
+                    'value' => '',
339
+                    'scope' => self::VISIBILITY_PRIVATE,
340
+                    'verified' => self::NOT_VERIFIED,
341
+                ],
342
+        ];
343
+    }
344
+
345
+    private function parseAccountData(IUser $user, $data): Account {
346
+        $account = new Account($user);
347
+        foreach ($data as $property => $accountData) {
348
+            $account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'] ?? self::VISIBILITY_PRIVATE, $accountData['verified'] ?? self::NOT_VERIFIED);
349
+        }
350
+        return $account;
351
+    }
352
+
353
+    public function getAccount(IUser $user): IAccount {
354
+        return $this->parseAccountData($user, $this->getUser($user));
355
+    }
356 356
 }
Please login to merge, or discard this patch.