]> source.dussan.org Git - nextcloud-server.git/commitdiff
introduce accounts table and keep it up-to-date with the data added to the personal...
authorBjörn Schießle <schiessle@owncloud.com>
Mon, 25 Apr 2016 12:56:11 +0000 (14:56 +0200)
committerRoeland Jago Douma <roeland@famdouma.nl>
Mon, 21 Nov 2016 10:29:41 +0000 (11:29 +0100)
Signed-off-by: Roeland Jago Douma <roeland@famdouma.nl>
db_structure.xml
lib/private/Accounts/AccountManager.php [new file with mode: 0644]
settings/Application.php
settings/Controller/UsersController.php
tests/lib/accounts/AccountsManagerTest.php [new file with mode: 0644]

index c7e1e072a8eff238f5f36e6d62db47b7489ebb52..545628a9233a78fafa8c279b16c392e6bc5602b6 100644 (file)
                </declaration>
        </table>
 
+       <table>
+
+               <name>*dbprefix*accounts</name>
+
+               <declaration>
+                       <field>
+                               <name>uid</name>
+                               <type>text</type>
+                               <default></default>
+                               <notnull>true</notnull>
+                               <length>64</length>
+                       </field>
+                       <field>
+                               <name>data</name>
+                               <type>clob</type>
+                               <default></default>
+                               <notnull>true</notnull>
+                       </field>
+
+                       <index>
+                               <name>uid_index</name>
+                               <primary>true</primary>
+                               <unique>true</unique>
+                               <field>
+                                       <name>uid</name>
+                                       <sorting>ascending</sorting>
+                               </field>
+                       </index>
+
+               </declaration>
+       </table>
+
 </database>
diff --git a/lib/private/Accounts/AccountManager.php b/lib/private/Accounts/AccountManager.php
new file mode 100644 (file)
index 0000000..3decac0
--- /dev/null
@@ -0,0 +1,116 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace OC\Accounts;
+
+
+use OCP\IDBConnection;
+
+/**
+ * Class AccountManager
+ *
+ * Manage system accounts table
+ *
+ * @group DB
+ * @package OC\Accounts
+ */
+class AccountManager {
+
+       /** @var  IDBConnection database connection */
+       private $connection;
+
+       /** @var string table name */
+       private $table = 'accounts';
+
+       /**
+        * AccountManager constructor.
+        *
+        * @param IDBConnection $connection
+        */
+       public function __construct(IDBConnection $connection) {
+               $this->connection = $connection;
+       }
+
+       public function updateUser($uid, $data) {
+               $userData = $this->getUser($uid);
+               if (empty($userData)) {
+                       $this->insertNewUser($uid, $data);
+               } else {
+                       $this->updateExistingUser($uid, $data);
+               }
+       }
+
+       /**
+        * get stored data from a given user
+        *
+        * @param $uid
+        * @return array
+        */
+       public function getUser($uid) {
+               $query = $this->connection->getQueryBuilder();
+               $query->select('data')->from($this->table)
+                       ->where($query->expr()->eq('uid', $query->createParameter('uid')))
+                       ->setParameter('uid', $uid);
+               $query->execute();
+               $result = $query->execute()->fetchAll();
+
+               if (empty($result)) {
+                       return [];
+               }
+
+               return json_decode($result[0]['data'], true);
+       }
+
+       /**
+        * add new user to accounts table
+        *
+        * @param string $uid
+        * @param array $data
+        */
+       protected function insertNewUser($uid, $data) {
+               $jsonEncodedData = json_encode($data);
+               $query = $this->connection->getQueryBuilder();
+               $query->insert($this->table)
+                       ->values(
+                               [
+                                       'uid' => $query->createNamedParameter($uid),
+                                       'data' => $query->createNamedParameter($jsonEncodedData),
+                               ]
+                       )
+                       ->execute();
+       }
+
+       /**
+        * update existing user in accounts table
+        *
+        * @param string $uid
+        * @param array $data
+        */
+       protected function updateExistingUser($uid, $data) {
+               $jsonEncodedData = json_encode($data);
+               $query = $this->connection->getQueryBuilder();
+               $query->update($this->table)
+                       ->set('data', $query->createNamedParameter($jsonEncodedData))
+                       ->where($query->expr()->eq('uid', $query->createNamedParameter($uid)))
+                       ->execute();
+       }
+}
index d907cd666fb76ce41b1f0a4033aabd085c0845dd..d0eab02cdd3b93e985c3b0bd226b192baa8c8848 100644 (file)
@@ -35,8 +35,21 @@ use OC\App\AppStore\Fetcher\CategoryFetcher;
 use OC\AppFramework\Utility\TimeFactory;
 use OC\Authentication\Token\IProvider;
 use OC\Server;
+use OC\Files\View;
+use OC\Server;
+use OC\Settings\Controller\AppSettingsController;
+use OC\Settings\Controller\AuthSettingsController;
+use OC\Settings\Controller\CertificateController;
+use OC\Settings\Controller\CheckSetupController;
+use OC\Settings\Controller\EncryptionController;
+use OC\Settings\Controller\GroupsController;
+use OC\Settings\Controller\LogSettingsController;
+use OC\Settings\Controller\MailSettingsController;
+use OC\Settings\Controller\SecuritySettingsController;
+use OC\Settings\Controller\UsersController;
 use OC\Settings\Middleware\SubadminMiddleware;
 use OCP\AppFramework\App;
+use OCP\AppFramework\IAppContainer;
 use OCP\IContainer;
 use OCP\Settings\IManager;
 use OCP\Util;
@@ -57,7 +70,127 @@ class Application extends App {
 
                // Register Middleware
                $container->registerAlias('SubadminMiddleware', SubadminMiddleware::class);
-               $container->registerMiddleWare('SubadminMiddleware');
+               /**
+                * Controllers
+                */
+               $container->registerService('MailSettingsController', function(IContainer $c) {
+                       return new MailSettingsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('L10N'),
+                               $c->query('Config'),
+                               $c->query('UserSession'),
+                               $c->query('Defaults'),
+                               $c->query('Mailer'),
+                               $c->query('DefaultMailAddress')
+                       );
+               });
+               $container->registerService('EncryptionController', function(IContainer $c) {
+                       return new EncryptionController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('L10N'),
+                               $c->query('Config'),
+                               $c->query('DatabaseConnection'),
+                               $c->query('UserManager'),
+                               new View(),
+                               $c->query('Logger')
+                       );
+               });
+               $container->registerService('AppSettingsController', function(IContainer $c) {
+                       return new AppSettingsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('L10N'),
+                               $c->query('Config'),
+                               $c->query('ICacheFactory'),
+                               $c->query('INavigationManager'),
+                               $c->query('IAppManager'),
+                               $c->query('OcsClient')
+                       );
+               });
+               $container->registerService('AuthSettingsController', function(IContainer $c) {
+                       return new AuthSettingsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('ServerContainer')->query('OC\Authentication\Token\IProvider'),
+                               $c->query('UserManager'),
+                               $c->query('ServerContainer')->getSession(),
+                               $c->query('ServerContainer')->getSecureRandom(),
+                               $c->query('UserId')
+                       );
+               });
+               $container->registerService('SecuritySettingsController', function(IContainer $c) {
+                       return new SecuritySettingsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('Config')
+                       );
+               });
+               $container->registerService('AccountManager', function(IAppContainer $c) {
+                       return new AccountManager($c->getServer()->getDatabaseConnection());
+               });
+               $container->registerService('CertificateController', function(IContainer $c) {
+                       return new CertificateController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('CertificateManager'),
+                               $c->query('SystemCertificateManager'),
+                               $c->query('L10N'),
+                               $c->query('IAppManager')
+                       );
+               });
+               $container->registerService('GroupsController', function(IContainer $c) {
+                       return new GroupsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('GroupManager'),
+                               $c->query('UserSession'),
+                               $c->query('IsAdmin'),
+                               $c->query('L10N')
+                       );
+               });
+               $container->registerService('UsersController', function(IContainer $c) {
+                       return new UsersController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('UserManager'),
+                               $c->query('GroupManager'),
+                               $c->query('UserSession'),
+                               $c->query('Config'),
+                               $c->query('IsAdmin'),
+                               $c->query('L10N'),
+                               $c->query('Logger'),
+                               $c->query('Defaults'),
+                               $c->query('Mailer'),
+                               $c->query('DefaultMailAddress'),
+                               $c->query('URLGenerator'),
+                               $c->query('OCP\\App\\IAppManager'),
+                               $c->query('OCP\\IAvatarManager'),
+                               $c->query('AccountManager')
+                       );
+               });
+               $container->registerService('LogSettingsController', function(IContainer $c) {
+                       return new LogSettingsController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('Config'),
+                               $c->query('L10N')
+                       );
+               });
+               $container->registerService('CheckSetupController', function(IContainer $c) {
+                       return new CheckSetupController(
+                               $c->query('AppName'),
+                               $c->query('Request'),
+                               $c->query('Config'),
+                               $c->query('ClientService'),
+                               $c->query('URLGenerator'),
+                               $c->query('Util'),
+                               $c->query('L10N'),
+                               $c->query('Checker')
+                       );
+               });
+
 
                /**
                 * Core class wrappers
index 7529cedd196e38489f321ddc8e14f08951b129c2..353442343307c407356ba047bc090dcfcf6cf952 100644 (file)
@@ -30,6 +30,7 @@
 
 namespace OC\Settings\Controller;
 
+use OC\Accounts\AccountManager;
 use OC\AppFramework\Http;
 use OC\User\User;
 use OCP\App\IAppManager;
@@ -80,6 +81,8 @@ class UsersController extends Controller {
        private $isRestoreEnabled = false;
        /** @var IAvatarManager */
        private $avatarManager;
+       /** @var AccountManager */
+       private $accountManager;
 
        /**
         * @param string $appName
@@ -97,6 +100,7 @@ class UsersController extends Controller {
         * @param IURLGenerator $urlGenerator
         * @param IAppManager $appManager
         * @param IAvatarManager $avatarManager
+        * @param AccountManager $accountManager
         */
        public function __construct($appName,
                                                                IRequest $request,
@@ -112,7 +116,9 @@ class UsersController extends Controller {
                                                                $fromMailAddress,
                                                                IURLGenerator $urlGenerator,
                                                                IAppManager $appManager,
-                                                               IAvatarManager $avatarManager) {
+                                                               IAvatarManager $avatarManager,
+                                                               AccountManager $accountManager
+) {
                parent::__construct($appName, $request);
                $this->userManager = $userManager;
                $this->groupManager = $groupManager;
@@ -126,6 +132,7 @@ class UsersController extends Controller {
                $this->fromMailAddress = $fromMailAddress;
                $this->urlGenerator = $urlGenerator;
                $this->avatarManager = $avatarManager;
+               $this->accountManager = $accountManager;
 
                // check for encryption state - TODO see formatUserForIndex
                $this->isEncryptionAppEnabled = $appManager->isEnabledForUser('encryption');
@@ -519,7 +526,22 @@ class UsersController extends Controller {
                                        $email, $emailScope,
                                        $website, $websiteScope,
                                        $address, $addressScope) {
-               // TODO: implement
+
+               if($userId === null) {
+                       $userId = $this->userSession->getUser()->getUID();
+               }
+
+               $data = [
+                       'avatar' =>  ['scope' => $avatarScope],
+                       'displayName' => ['value' => $displayname, 'scope' => $displaynameScope],
+                       'email' => ['value' => $email, 'scope' => $emailScope],
+                       'website' => ['value' => $website, 'scope' => $websiteScope],
+                       'address' => ['value' => $address, 'scope' => $addressScope],
+                       'phone' => ['value' => $phone, 'scope' => $phoneScope]
+               ];
+
+               $this->accountManager->updateUser($userId, $data);
+
                return new DataResponse(
                        array(
                                'status' => 'success',
diff --git a/tests/lib/accounts/AccountsManagerTest.php b/tests/lib/accounts/AccountsManagerTest.php
new file mode 100644 (file)
index 0000000..1e9464b
--- /dev/null
@@ -0,0 +1,173 @@
+<?php
+/**
+ * @author Björn Schießle <schiessle@owncloud.com>
+ *
+ * @copyright Copyright (c) 2016, ownCloud, Inc.
+ * @license AGPL-3.0
+ *
+ * This code is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License, version 3,
+ * as published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License, version 3,
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>
+ *
+ */
+
+
+namespace Test\Accounts;
+
+
+use OC\Accounts\AccountManager;
+use OC\Mail\Mailer;
+use Test\TestCase;
+
+/**
+ * Class AccountsManagerTest
+ *
+ * @group DB
+ * @package Test\Accounts
+ */
+class AccountsManagerTest extends TestCase {
+
+       /** @var  \OCP\IDBConnection */
+       private $connection;
+
+       /** @var string accounts table name */
+       private $table = 'accounts';
+       
+       public function setUp() {
+               parent::setUp();
+               $this->connection = \OC::$server->getDatabaseConnection();
+       }
+
+       public function tearDown() {
+               parent::tearDown();
+               $query = $this->connection->getQueryBuilder();
+               $query->delete($this->table)->execute();
+       }
+
+       /**
+        * get a instance of the accountManager
+        *
+        * @param array $mockedMethods list of methods which should be mocked
+        * @return \PHPUnit_Framework_MockObject_MockObject | AccountManager
+        */
+       public function getInstance($mockedMethods = null) {
+               return $this->getMockBuilder('OC\Accounts\AccountManager')
+                       ->setConstructorArgs([$this->connection])
+                       ->setMethods($mockedMethods)
+                       ->getMock();
+               
+       }
+
+       /**
+        * @dataProvider dataTrueFalse
+        *
+        * @param bool $userAlreadyExists
+        */
+       public function testUpdateUser($userAlreadyExists) {
+               $accountManager = $this->getInstance(['getUser', 'insertNewUser', 'updateExistingUser']);
+
+               $accountManager->expects($this->once())->method('getUser')->willReturn($userAlreadyExists);
+
+               if ($userAlreadyExists) {
+                       $accountManager->expects($this->once())->method('updateExistingUser')
+                               ->with('uid', 'data');
+                       $accountManager->expects($this->never())->method('insertNewUser');
+               } else {
+                       $accountManager->expects($this->once())->method('insertNewUser')
+                               ->with('uid', 'data');
+                       $accountManager->expects($this->never())->method('updateExistingUser');
+               }
+
+               $accountManager->updateUser('uid', 'data');
+       }
+
+       public function dataTrueFalse() {
+               return [
+                       [true],
+                       [false]
+               ];
+       }
+
+
+       /**
+        * @dataProvider dataTestGetUser
+        *
+        * @param string $setUser
+        * @param array $setData
+        * @param string $askUser
+        * @param array $expectedData
+        */
+       public function testGetUser($setUser, $setData, $askUser, $expectedData) {
+               $accountManager = $this->getInstance();
+               $this->addDummyValuesToTable($setUser, $setData);
+               $this->assertEquals($expectedData,
+                       $accountManager->getUser($askUser)
+               );
+       }
+
+       public function dataTestGetUser() {
+               return [
+                       ['user1', ['key' => 'value'], 'user1', ['key' => 'value']],
+                       ['user1', ['key' => 'value'], 'user2', []],
+               ];
+       }
+
+       public function testUpdateExistingUser() {
+               $user = 'user1';
+               $oldData = ['key' => 'value'];
+               $newData = ['newKey' => 'newValue'];
+
+               $accountManager = $this->getInstance();
+               $this->addDummyValuesToTable($user, $oldData);
+               $this->invokePrivate($accountManager, 'updateExistingUser', [$user, $newData]);
+               $newDataFromTable = $this->getDataFromTable($user);
+               $this->assertEquals($newData, $newDataFromTable);
+       }
+
+       public function testInsertNewUser() {
+               $user = 'user1';
+               $data = ['key' => 'value'];
+
+               $accountManager = $this->getInstance();
+               $this->assertNull($this->getDataFromTable($user));
+               $this->invokePrivate($accountManager, 'insertNewUser', [$user, $data]);
+
+               $dataFromDb = $this->getDataFromTable($user);
+               $this->assertEquals($data, $dataFromDb);
+       }
+
+       private function addDummyValuesToTable($uid, $data) {
+
+               $query = $this->connection->getQueryBuilder();
+               $query->insert($this->table)
+                       ->values(
+                               [
+                                       'uid' => $query->createNamedParameter($uid),
+                                       'data' => $query->createNamedParameter(json_encode($data)),
+                               ]
+                       )
+                       ->execute();
+       }
+
+       private function getDataFromTable($uid) {
+               $query = $this->connection->getQueryBuilder();
+               $query->select('data')->from($this->table)
+                       ->where($query->expr()->eq('uid', $query->createParameter('uid')))
+                       ->setParameter('uid', $uid);
+               $query->execute();
+               $result = $query->execute()->fetchAll();
+
+               if (!empty($result)) {
+                       return json_decode($result[0]['data'], true);
+               }
+       }
+
+}