Passed
Push — master ( e0372e...0c8995 )
by Roeland
12:15 queued 15s
created
lib/private/Accounts/AccountManager.php 1 patch
Indentation   +303 added lines, -303 removed lines patch added patch discarded remove patch
@@ -52,307 +52,307 @@
 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')
138
-			->from($this->table)
139
-			->where($query->expr()->eq('uid', $query->createParameter('uid')))
140
-			->setParameter('uid', $uid);
141
-		$result = $query->execute();
142
-		$accountData = $result->fetchAll();
143
-		$result->closeCursor();
144
-
145
-		if (empty($accountData)) {
146
-			$userData = $this->buildDefaultUserRecord($user);
147
-			$this->insertNewUser($user, $userData);
148
-			return $userData;
149
-		}
150
-
151
-		$userDataArray = json_decode($accountData[0]['data'], true);
152
-		$jsonError = json_last_error();
153
-		if ($userDataArray === null || $userDataArray === [] || $jsonError !== JSON_ERROR_NONE) {
154
-			$this->logger->critical("User data of $uid contained invalid JSON (error $jsonError), hence falling back to a default user record");
155
-			return $this->buildDefaultUserRecord($user);
156
-		}
157
-
158
-		$userDataArray = $this->addMissingDefaultValues($userDataArray);
159
-
160
-		return $userDataArray;
161
-	}
162
-
163
-	/**
164
-	 * check if we need to ask the server for email verification, if yes we create a cronjob
165
-	 *
166
-	 * @param $oldData
167
-	 * @param $newData
168
-	 * @param IUser $user
169
-	 * @return array
170
-	 */
171
-	protected function checkEmailVerification($oldData, $newData, IUser $user) {
172
-		if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) {
173
-			$this->jobList->add(VerifyUserData::class,
174
-				[
175
-					'verificationCode' => '',
176
-					'data' => $newData[self::PROPERTY_EMAIL]['value'],
177
-					'type' => self::PROPERTY_EMAIL,
178
-					'uid' => $user->getUID(),
179
-					'try' => 0,
180
-					'lastRun' => time()
181
-				]
182
-			);
183
-			$newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS;
184
-		}
185
-
186
-		return $newData;
187
-	}
188
-
189
-	/**
190
-	 * make sure that all expected data are set
191
-	 *
192
-	 * @param array $userData
193
-	 * @return array
194
-	 */
195
-	protected function addMissingDefaultValues(array $userData) {
196
-		foreach ($userData as $key => $value) {
197
-			if (!isset($userData[$key]['verified'])) {
198
-				$userData[$key]['verified'] = self::NOT_VERIFIED;
199
-			}
200
-		}
201
-
202
-		return $userData;
203
-	}
204
-
205
-	/**
206
-	 * reset verification status if personal data changed
207
-	 *
208
-	 * @param array $oldData
209
-	 * @param array $newData
210
-	 * @return array
211
-	 */
212
-	protected function updateVerifyStatus($oldData, $newData) {
213
-
214
-		// which account was already verified successfully?
215
-		$twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED;
216
-		$websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED;
217
-		$emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED;
218
-
219
-		// keep old verification status if we don't have a new one
220
-		if (!isset($newData[self::PROPERTY_TWITTER]['verified'])) {
221
-			// keep old verification status if value didn't changed and an old value exists
222
-			$keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']);
223
-			$newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED;
224
-		}
225
-
226
-		if (!isset($newData[self::PROPERTY_WEBSITE]['verified'])) {
227
-			// keep old verification status if value didn't changed and an old value exists
228
-			$keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']);
229
-			$newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED;
230
-		}
231
-
232
-		if (!isset($newData[self::PROPERTY_EMAIL]['verified'])) {
233
-			// keep old verification status if value didn't changed and an old value exists
234
-			$keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']);
235
-			$newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS;
236
-		}
237
-
238
-		// reset verification status if a value from a previously verified data was changed
239
-		if ($twitterVerified &&
240
-			$oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value']
241
-		) {
242
-			$newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED;
243
-		}
244
-
245
-		if ($websiteVerified &&
246
-			$oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value']
247
-		) {
248
-			$newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED;
249
-		}
250
-
251
-		if ($emailVerified &&
252
-			$oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']
253
-		) {
254
-			$newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED;
255
-		}
256
-
257
-		return $newData;
258
-	}
259
-
260
-	/**
261
-	 * add new user to accounts table
262
-	 *
263
-	 * @param IUser $user
264
-	 * @param array $data
265
-	 */
266
-	protected function insertNewUser(IUser $user, $data) {
267
-		$uid = $user->getUID();
268
-		$jsonEncodedData = json_encode($data);
269
-		$query = $this->connection->getQueryBuilder();
270
-		$query->insert($this->table)
271
-			->values(
272
-				[
273
-					'uid' => $query->createNamedParameter($uid),
274
-					'data' => $query->createNamedParameter($jsonEncodedData),
275
-				]
276
-			)
277
-			->execute();
278
-	}
279
-
280
-	/**
281
-	 * update existing user in accounts table
282
-	 *
283
-	 * @param IUser $user
284
-	 * @param array $data
285
-	 */
286
-	protected function updateExistingUser(IUser $user, $data) {
287
-		$uid = $user->getUID();
288
-		$jsonEncodedData = json_encode($data);
289
-		$query = $this->connection->getQueryBuilder();
290
-		$query->update($this->table)
291
-			->set('data', $query->createNamedParameter($jsonEncodedData))
292
-			->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
293
-			->execute();
294
-	}
295
-
296
-	/**
297
-	 * build default user record in case not data set exists yet
298
-	 *
299
-	 * @param IUser $user
300
-	 * @return array
301
-	 */
302
-	protected function buildDefaultUserRecord(IUser $user) {
303
-		return [
304
-			self::PROPERTY_DISPLAYNAME =>
305
-				[
306
-					'value' => $user->getDisplayName(),
307
-					'scope' => self::VISIBILITY_CONTACTS_ONLY,
308
-					'verified' => self::NOT_VERIFIED,
309
-				],
310
-			self::PROPERTY_ADDRESS =>
311
-				[
312
-					'value' => '',
313
-					'scope' => self::VISIBILITY_PRIVATE,
314
-					'verified' => self::NOT_VERIFIED,
315
-				],
316
-			self::PROPERTY_WEBSITE =>
317
-				[
318
-					'value' => '',
319
-					'scope' => self::VISIBILITY_PRIVATE,
320
-					'verified' => self::NOT_VERIFIED,
321
-				],
322
-			self::PROPERTY_EMAIL =>
323
-				[
324
-					'value' => $user->getEMailAddress(),
325
-					'scope' => self::VISIBILITY_CONTACTS_ONLY,
326
-					'verified' => self::NOT_VERIFIED,
327
-				],
328
-			self::PROPERTY_AVATAR =>
329
-				[
330
-					'scope' => self::VISIBILITY_CONTACTS_ONLY
331
-				],
332
-			self::PROPERTY_PHONE =>
333
-				[
334
-					'value' => '',
335
-					'scope' => self::VISIBILITY_PRIVATE,
336
-					'verified' => self::NOT_VERIFIED,
337
-				],
338
-			self::PROPERTY_TWITTER =>
339
-				[
340
-					'value' => '',
341
-					'scope' => self::VISIBILITY_PRIVATE,
342
-					'verified' => self::NOT_VERIFIED,
343
-				],
344
-		];
345
-	}
346
-
347
-	private function parseAccountData(IUser $user, $data): Account {
348
-		$account = new Account($user);
349
-		foreach ($data as $property => $accountData) {
350
-			$account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'] ?? self::VISIBILITY_PRIVATE, $accountData['verified'] ?? self::NOT_VERIFIED);
351
-		}
352
-		return $account;
353
-	}
354
-
355
-	public function getAccount(IUser $user): IAccount {
356
-		return $this->parseAccountData($user, $this->getUser($user));
357
-	}
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')
138
+            ->from($this->table)
139
+            ->where($query->expr()->eq('uid', $query->createParameter('uid')))
140
+            ->setParameter('uid', $uid);
141
+        $result = $query->execute();
142
+        $accountData = $result->fetchAll();
143
+        $result->closeCursor();
144
+
145
+        if (empty($accountData)) {
146
+            $userData = $this->buildDefaultUserRecord($user);
147
+            $this->insertNewUser($user, $userData);
148
+            return $userData;
149
+        }
150
+
151
+        $userDataArray = json_decode($accountData[0]['data'], true);
152
+        $jsonError = json_last_error();
153
+        if ($userDataArray === null || $userDataArray === [] || $jsonError !== JSON_ERROR_NONE) {
154
+            $this->logger->critical("User data of $uid contained invalid JSON (error $jsonError), hence falling back to a default user record");
155
+            return $this->buildDefaultUserRecord($user);
156
+        }
157
+
158
+        $userDataArray = $this->addMissingDefaultValues($userDataArray);
159
+
160
+        return $userDataArray;
161
+    }
162
+
163
+    /**
164
+     * check if we need to ask the server for email verification, if yes we create a cronjob
165
+     *
166
+     * @param $oldData
167
+     * @param $newData
168
+     * @param IUser $user
169
+     * @return array
170
+     */
171
+    protected function checkEmailVerification($oldData, $newData, IUser $user) {
172
+        if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) {
173
+            $this->jobList->add(VerifyUserData::class,
174
+                [
175
+                    'verificationCode' => '',
176
+                    'data' => $newData[self::PROPERTY_EMAIL]['value'],
177
+                    'type' => self::PROPERTY_EMAIL,
178
+                    'uid' => $user->getUID(),
179
+                    'try' => 0,
180
+                    'lastRun' => time()
181
+                ]
182
+            );
183
+            $newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS;
184
+        }
185
+
186
+        return $newData;
187
+    }
188
+
189
+    /**
190
+     * make sure that all expected data are set
191
+     *
192
+     * @param array $userData
193
+     * @return array
194
+     */
195
+    protected function addMissingDefaultValues(array $userData) {
196
+        foreach ($userData as $key => $value) {
197
+            if (!isset($userData[$key]['verified'])) {
198
+                $userData[$key]['verified'] = self::NOT_VERIFIED;
199
+            }
200
+        }
201
+
202
+        return $userData;
203
+    }
204
+
205
+    /**
206
+     * reset verification status if personal data changed
207
+     *
208
+     * @param array $oldData
209
+     * @param array $newData
210
+     * @return array
211
+     */
212
+    protected function updateVerifyStatus($oldData, $newData) {
213
+
214
+        // which account was already verified successfully?
215
+        $twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED;
216
+        $websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED;
217
+        $emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED;
218
+
219
+        // keep old verification status if we don't have a new one
220
+        if (!isset($newData[self::PROPERTY_TWITTER]['verified'])) {
221
+            // keep old verification status if value didn't changed and an old value exists
222
+            $keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']);
223
+            $newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED;
224
+        }
225
+
226
+        if (!isset($newData[self::PROPERTY_WEBSITE]['verified'])) {
227
+            // keep old verification status if value didn't changed and an old value exists
228
+            $keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']);
229
+            $newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED;
230
+        }
231
+
232
+        if (!isset($newData[self::PROPERTY_EMAIL]['verified'])) {
233
+            // keep old verification status if value didn't changed and an old value exists
234
+            $keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']);
235
+            $newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS;
236
+        }
237
+
238
+        // reset verification status if a value from a previously verified data was changed
239
+        if ($twitterVerified &&
240
+            $oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value']
241
+        ) {
242
+            $newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED;
243
+        }
244
+
245
+        if ($websiteVerified &&
246
+            $oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value']
247
+        ) {
248
+            $newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED;
249
+        }
250
+
251
+        if ($emailVerified &&
252
+            $oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']
253
+        ) {
254
+            $newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED;
255
+        }
256
+
257
+        return $newData;
258
+    }
259
+
260
+    /**
261
+     * add new user to accounts table
262
+     *
263
+     * @param IUser $user
264
+     * @param array $data
265
+     */
266
+    protected function insertNewUser(IUser $user, $data) {
267
+        $uid = $user->getUID();
268
+        $jsonEncodedData = json_encode($data);
269
+        $query = $this->connection->getQueryBuilder();
270
+        $query->insert($this->table)
271
+            ->values(
272
+                [
273
+                    'uid' => $query->createNamedParameter($uid),
274
+                    'data' => $query->createNamedParameter($jsonEncodedData),
275
+                ]
276
+            )
277
+            ->execute();
278
+    }
279
+
280
+    /**
281
+     * update existing user in accounts table
282
+     *
283
+     * @param IUser $user
284
+     * @param array $data
285
+     */
286
+    protected function updateExistingUser(IUser $user, $data) {
287
+        $uid = $user->getUID();
288
+        $jsonEncodedData = json_encode($data);
289
+        $query = $this->connection->getQueryBuilder();
290
+        $query->update($this->table)
291
+            ->set('data', $query->createNamedParameter($jsonEncodedData))
292
+            ->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
293
+            ->execute();
294
+    }
295
+
296
+    /**
297
+     * build default user record in case not data set exists yet
298
+     *
299
+     * @param IUser $user
300
+     * @return array
301
+     */
302
+    protected function buildDefaultUserRecord(IUser $user) {
303
+        return [
304
+            self::PROPERTY_DISPLAYNAME =>
305
+                [
306
+                    'value' => $user->getDisplayName(),
307
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY,
308
+                    'verified' => self::NOT_VERIFIED,
309
+                ],
310
+            self::PROPERTY_ADDRESS =>
311
+                [
312
+                    'value' => '',
313
+                    'scope' => self::VISIBILITY_PRIVATE,
314
+                    'verified' => self::NOT_VERIFIED,
315
+                ],
316
+            self::PROPERTY_WEBSITE =>
317
+                [
318
+                    'value' => '',
319
+                    'scope' => self::VISIBILITY_PRIVATE,
320
+                    'verified' => self::NOT_VERIFIED,
321
+                ],
322
+            self::PROPERTY_EMAIL =>
323
+                [
324
+                    'value' => $user->getEMailAddress(),
325
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY,
326
+                    'verified' => self::NOT_VERIFIED,
327
+                ],
328
+            self::PROPERTY_AVATAR =>
329
+                [
330
+                    'scope' => self::VISIBILITY_CONTACTS_ONLY
331
+                ],
332
+            self::PROPERTY_PHONE =>
333
+                [
334
+                    'value' => '',
335
+                    'scope' => self::VISIBILITY_PRIVATE,
336
+                    'verified' => self::NOT_VERIFIED,
337
+                ],
338
+            self::PROPERTY_TWITTER =>
339
+                [
340
+                    'value' => '',
341
+                    'scope' => self::VISIBILITY_PRIVATE,
342
+                    'verified' => self::NOT_VERIFIED,
343
+                ],
344
+        ];
345
+    }
346
+
347
+    private function parseAccountData(IUser $user, $data): Account {
348
+        $account = new Account($user);
349
+        foreach ($data as $property => $accountData) {
350
+            $account->setProperty($property, $accountData['value'] ?? '', $accountData['scope'] ?? self::VISIBILITY_PRIVATE, $accountData['verified'] ?? self::NOT_VERIFIED);
351
+        }
352
+        return $account;
353
+    }
354
+
355
+    public function getAccount(IUser $user): IAccount {
356
+        return $this->parseAccountData($user, $this->getUser($user));
357
+    }
358 358
 }
Please login to merge, or discard this patch.