aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/composer/composer/autoload_classmap.php1
-rw-r--r--lib/composer/composer/autoload_static.php1
-rw-r--r--lib/private/Accounts/AccountManager.php127
-rw-r--r--lib/private/Accounts/Hooks.php3
4 files changed, 129 insertions, 3 deletions
diff --git a/lib/composer/composer/autoload_classmap.php b/lib/composer/composer/autoload_classmap.php
index 8a883938b55..2151aeff33b 100644
--- a/lib/composer/composer/autoload_classmap.php
+++ b/lib/composer/composer/autoload_classmap.php
@@ -789,6 +789,7 @@ return array(
'OC\\Settings\\Admin\\Sharing' => $baseDir . '/lib/private/Settings/Admin/Sharing.php',
'OC\\Settings\\Admin\\TipsTricks' => $baseDir . '/lib/private/Settings/Admin/TipsTricks.php',
'OC\\Settings\\Application' => $baseDir . '/settings/Application.php',
+ 'OC\\Settings\\BackgroundJobs\\VerifyUserData' => $baseDir . '/settings/BackgroundJobs/VerifyUserData.php',
'OC\\Settings\\Controller\\AdminSettingsController' => $baseDir . '/settings/Controller/AdminSettingsController.php',
'OC\\Settings\\Controller\\AppSettingsController' => $baseDir . '/settings/Controller/AppSettingsController.php',
'OC\\Settings\\Controller\\AuthSettingsController' => $baseDir . '/settings/Controller/AuthSettingsController.php',
diff --git a/lib/composer/composer/autoload_static.php b/lib/composer/composer/autoload_static.php
index 70761572620..ec5190bc71d 100644
--- a/lib/composer/composer/autoload_static.php
+++ b/lib/composer/composer/autoload_static.php
@@ -819,6 +819,7 @@ class ComposerStaticInit53792487c5a8370acc0b06b1a864ff4c
'OC\\Settings\\Admin\\Sharing' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/Sharing.php',
'OC\\Settings\\Admin\\TipsTricks' => __DIR__ . '/../../..' . '/lib/private/Settings/Admin/TipsTricks.php',
'OC\\Settings\\Application' => __DIR__ . '/../../..' . '/settings/Application.php',
+ 'OC\\Settings\\BackgroundJobs\\VerifyUserData' => __DIR__ . '/../../..' . '/settings/BackgroundJobs/VerifyUserData.php',
'OC\\Settings\\Controller\\AdminSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AdminSettingsController.php',
'OC\\Settings\\Controller\\AppSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AppSettingsController.php',
'OC\\Settings\\Controller\\AuthSettingsController' => __DIR__ . '/../../..' . '/settings/Controller/AuthSettingsController.php',
diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php
index 2eb518d4f04..41fdad148aa 100644
--- a/lib/private/Accounts/AccountManager.php
+++ b/lib/private/Accounts/AccountManager.php
@@ -23,6 +23,7 @@
namespace OC\Accounts;
+use OCP\BackgroundJob\IJobList;
use OCP\IDBConnection;
use OCP\IUser;
use Symfony\Component\EventDispatcher\EventDispatcherInterface;
@@ -53,6 +54,10 @@ class AccountManager {
const PROPERTY_ADDRESS = 'address';
const PROPERTY_TWITTER = 'twitter';
+ const NOT_VERIFIED = '0';
+ const VERIFICATION_IN_PROGRESS = '1';
+ const VERIFIED = '2';
+
/** @var IDBConnection database connection */
private $connection;
@@ -62,15 +67,22 @@ class AccountManager {
/** @var EventDispatcherInterface */
private $eventDispatcher;
+ /** @var IJobList */
+ private $jobList;
+
/**
* AccountManager constructor.
*
* @param IDBConnection $connection
* @param EventDispatcherInterface $eventDispatcher
+ * @param IJobList $jobList
*/
- public function __construct(IDBConnection $connection, EventDispatcherInterface $eventDispatcher) {
+ public function __construct(IDBConnection $connection,
+ EventDispatcherInterface $eventDispatcher,
+ IJobList $jobList) {
$this->connection = $connection;
$this->eventDispatcher = $eventDispatcher;
+ $this->jobList = $jobList;
}
/**
@@ -85,6 +97,8 @@ class AccountManager {
if (empty($userData)) {
$this->insertNewUser($user, $data);
} elseif ($userData !== $data) {
+ $data = $this->checkEmailVerification($userData, $data, $user);
+ $data = $this->updateVerifyStatus($userData, $data);
$this->updateExistingUser($user, $data);
} else {
// nothing needs to be done if new and old data set are the same
@@ -120,7 +134,110 @@ class AccountManager {
return $userData;
}
- return json_decode($result[0]['data'], true);
+ $userDataArray = json_decode($result[0]['data'], true);
+
+ $userDataArray = $this->addMissingDefaultValues($userDataArray);
+
+ return $userDataArray;
+ }
+
+ /**
+ * check if we need to ask the server for email verification, if yes we create a cronjob
+ *
+ * @param $oldData
+ * @param $newData
+ * @param IUser $user
+ * @return array
+ */
+ protected function checkEmailVerification($oldData, $newData, IUser $user) {
+ if ($oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']) {
+ $this->jobList->add('OC\Settings\BackgroundJobs\VerifyUserData',
+ [
+ 'verificationCode' => '',
+ 'data' => $newData[self::PROPERTY_EMAIL]['value'],
+ 'type' => self::PROPERTY_EMAIL,
+ 'uid' => $user->getUID(),
+ 'try' => 0,
+ 'lastRun' => time()
+ ]
+ );
+ $newData[AccountManager::PROPERTY_EMAIL]['verified'] = AccountManager::VERIFICATION_IN_PROGRESS;
+ }
+
+ return $newData;
+ }
+
+ /**
+ * make sure that all expected data are set
+ *
+ * @param array $userData
+ * @return array
+ */
+ protected function addMissingDefaultValues(array $userData) {
+
+ foreach ($userData as $key => $value) {
+ if (!isset($userData[$key]['verified'])) {
+ $userData[$key]['verified'] = self::NOT_VERIFIED;
+ }
+ }
+
+ return $userData;
+ }
+
+ /**
+ * reset verification status if personal data changed
+ *
+ * @param array $oldData
+ * @param array $newData
+ * @return array
+ */
+ protected function updateVerifyStatus($oldData, $newData) {
+
+ // which account was already verified successfully?
+ $twitterVerified = isset($oldData[self::PROPERTY_TWITTER]['verified']) && $oldData[self::PROPERTY_TWITTER]['verified'] === self::VERIFIED;
+ $websiteVerified = isset($oldData[self::PROPERTY_WEBSITE]['verified']) && $oldData[self::PROPERTY_WEBSITE]['verified'] === self::VERIFIED;
+ $emailVerified = isset($oldData[self::PROPERTY_EMAIL]['verified']) && $oldData[self::PROPERTY_EMAIL]['verified'] === self::VERIFIED;
+
+ // keep old verification status if we don't have a new one
+ if(!isset($newData[self::PROPERTY_TWITTER]['verified'])) {
+ // keep old verification status if value didn't changed and an old value exists
+ $keepOldStatus = $newData[self::PROPERTY_TWITTER]['value'] === $oldData[self::PROPERTY_TWITTER]['value'] && isset($oldData[self::PROPERTY_TWITTER]['verified']);
+ $newData[self::PROPERTY_TWITTER]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_TWITTER]['verified'] : self::NOT_VERIFIED;
+ }
+
+ if(!isset($newData[self::PROPERTY_WEBSITE]['verified'])) {
+ // keep old verification status if value didn't changed and an old value exists
+ $keepOldStatus = $newData[self::PROPERTY_WEBSITE]['value'] === $oldData[self::PROPERTY_WEBSITE]['value'] && isset($oldData[self::PROPERTY_WEBSITE]['verified']);
+ $newData[self::PROPERTY_WEBSITE]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_WEBSITE]['verified'] : self::NOT_VERIFIED;
+ }
+
+ if(!isset($newData[self::PROPERTY_EMAIL]['verified'])) {
+ // keep old verification status if value didn't changed and an old value exists
+ $keepOldStatus = $newData[self::PROPERTY_EMAIL]['value'] === $oldData[self::PROPERTY_EMAIL]['value'] && isset($oldData[self::PROPERTY_EMAIL]['verified']);
+ $newData[self::PROPERTY_EMAIL]['verified'] = $keepOldStatus ? $oldData[self::PROPERTY_EMAIL]['verified'] : self::VERIFICATION_IN_PROGRESS;
+ }
+
+ // reset verification status if a value from a previously verified data was changed
+ if($twitterVerified &&
+ $oldData[self::PROPERTY_TWITTER]['value'] !== $newData[self::PROPERTY_TWITTER]['value']
+ ) {
+ $newData[self::PROPERTY_TWITTER]['verified'] = self::NOT_VERIFIED;
+ }
+
+ if($websiteVerified &&
+ $oldData[self::PROPERTY_WEBSITE]['value'] !== $newData[self::PROPERTY_WEBSITE]['value']
+ ) {
+ $newData[self::PROPERTY_WEBSITE]['verified'] = self::NOT_VERIFIED;
+ }
+
+ if($emailVerified &&
+ $oldData[self::PROPERTY_EMAIL]['value'] !== $newData[self::PROPERTY_EMAIL]['value']
+ ) {
+ $newData[self::PROPERTY_EMAIL]['verified'] = self::NOT_VERIFIED;
+ }
+
+ return $newData;
+
}
/**
@@ -171,21 +288,25 @@ class AccountManager {
[
'value' => $user->getDisplayName(),
'scope' => self::VISIBILITY_CONTACTS_ONLY,
+ 'verified' => self::NOT_VERIFIED,
],
self::PROPERTY_ADDRESS =>
[
'value' => '',
'scope' => self::VISIBILITY_PRIVATE,
+ 'verified' => self::NOT_VERIFIED,
],
self::PROPERTY_WEBSITE =>
[
'value' => '',
'scope' => self::VISIBILITY_PRIVATE,
+ 'verified' => self::NOT_VERIFIED,
],
self::PROPERTY_EMAIL =>
[
'value' => $user->getEMailAddress(),
'scope' => self::VISIBILITY_CONTACTS_ONLY,
+ 'verified' => self::NOT_VERIFIED,
],
self::PROPERTY_AVATAR =>
[
@@ -195,11 +316,13 @@ class AccountManager {
[
'value' => '',
'scope' => self::VISIBILITY_PRIVATE,
+ 'verified' => self::NOT_VERIFIED,
],
self::PROPERTY_TWITTER =>
[
'value' => '',
'scope' => self::VISIBILITY_PRIVATE,
+ 'verified' => self::NOT_VERIFIED,
],
];
}
diff --git a/lib/private/Accounts/Hooks.php b/lib/private/Accounts/Hooks.php
index 38e7e20485b..eca56913fbd 100644
--- a/lib/private/Accounts/Hooks.php
+++ b/lib/private/Accounts/Hooks.php
@@ -89,7 +89,8 @@ class Hooks {
if (is_null($this->accountManager)) {
$this->accountManager = new AccountManager(
\OC::$server->getDatabaseConnection(),
- \OC::$server->getEventDispatcher()
+ \OC::$server->getEventDispatcher(),
+ \OC::$server->getJobList()
);
}
return $this->accountManager;