From 3d628783d93edc7e067dcaaa3f1883dd84108a85 Mon Sep 17 00:00:00 2001 From: Joas Schilling Date: Wed, 5 Apr 2017 14:51:55 +0200 Subject: [PATCH] Allow to change account info via provisioning api Signed-off-by: Joas Schilling --- .../lib/Controller/UsersController.php | 41 ++++++++++++---- .../tests/Controller/UsersControllerTest.php | 12 ++--- .../features/bootstrap/Provisioning.php | 26 ++++++++++ .../features/provisioning-v1.feature | 47 ++++++++++++++++++- 4 files changed, 108 insertions(+), 18 deletions(-) diff --git a/apps/provisioning_api/lib/Controller/UsersController.php b/apps/provisioning_api/lib/Controller/UsersController.php index 9155d34276..cb4e4b3291 100644 --- a/apps/provisioning_api/lib/Controller/UsersController.php +++ b/apps/provisioning_api/lib/Controller/UsersController.php @@ -290,12 +290,12 @@ class UsersController extends OCSController { // Find the data $data['id'] = $targetUserObject->getUID(); $data['quota'] = $this->fillStorageInfo($userId); - $data['email'] = $targetUserObject->getEMailAddress(); - $data['displayname'] = $targetUserObject->getDisplayName(); - $data['phone'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_PHONE]['value']; - $data['address'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_ADDRESS]['value']; - $data['webpage'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_WEBSITE]['value']; - $data['twitter'] = $userAccount[\OC\Accounts\AccountManager::PROPERTY_TWITTER]['value']; + $data[AccountManager::PROPERTY_EMAIL] = $targetUserObject->getEMailAddress(); + $data[AccountManager::PROPERTY_DISPLAYNAME] = $targetUserObject->getDisplayName(); + $data[AccountManager::PROPERTY_PHONE] = $userAccount[AccountManager::PROPERTY_PHONE]['value']; + $data[AccountManager::PROPERTY_ADDRESS] = $userAccount[AccountManager::PROPERTY_ADDRESS]['value']; + $data[AccountManager::PROPERTY_WEBSITE] = $userAccount[AccountManager::PROPERTY_WEBSITE]['value']; + $data[AccountManager::PROPERTY_TWITTER] = $userAccount[AccountManager::PROPERTY_TWITTER]['value']; $data['groups'] = $gids; return $data; @@ -327,8 +327,13 @@ class UsersController extends OCSController { if($userId === $currentLoggedInUser->getUID()) { // Editing self (display, email) $permittedFields[] = 'display'; - $permittedFields[] = 'email'; + $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME; + $permittedFields[] = AccountManager::PROPERTY_EMAIL; $permittedFields[] = 'password'; + $permittedFields[] = AccountManager::PROPERTY_PHONE; + $permittedFields[] = AccountManager::PROPERTY_ADDRESS; + $permittedFields[] = AccountManager::PROPERTY_WEBSITE; + $permittedFields[] = AccountManager::PROPERTY_TWITTER; // If admin they can edit their own quota if($this->groupManager->isAdmin($currentLoggedInUser->getUID())) { $permittedFields[] = 'quota'; @@ -340,9 +345,14 @@ class UsersController extends OCSController { || $this->groupManager->isAdmin($currentLoggedInUser->getUID())) { // They have permissions over the user $permittedFields[] = 'display'; - $permittedFields[] = 'quota'; + $permittedFields[] = AccountManager::PROPERTY_DISPLAYNAME; + $permittedFields[] = AccountManager::PROPERTY_EMAIL; $permittedFields[] = 'password'; - $permittedFields[] = 'email'; + $permittedFields[] = AccountManager::PROPERTY_PHONE; + $permittedFields[] = AccountManager::PROPERTY_ADDRESS; + $permittedFields[] = AccountManager::PROPERTY_WEBSITE; + $permittedFields[] = AccountManager::PROPERTY_TWITTER; + $permittedFields[] = 'quota'; } else { // No rights throw new OCSException('', \OCP\API::RESPOND_UNAUTHORISED); @@ -355,6 +365,7 @@ class UsersController extends OCSController { // Process the edit switch($key) { case 'display': + case AccountManager::PROPERTY_DISPLAYNAME: $targetUser->setDisplayName($value); break; case 'quota': @@ -381,13 +392,23 @@ class UsersController extends OCSController { case 'password': $targetUser->setPassword($value); break; - case 'email': + case AccountManager::PROPERTY_EMAIL: if(filter_var($value, FILTER_VALIDATE_EMAIL)) { $targetUser->setEMailAddress($value); } else { throw new OCSException('', 102); } break; + case AccountManager::PROPERTY_PHONE: + case AccountManager::PROPERTY_ADDRESS: + case AccountManager::PROPERTY_WEBSITE: + case AccountManager::PROPERTY_TWITTER: + $userAccount = $this->accountManager->getUser($targetUser); + if ($userAccount[$key]['value'] !== $value) { + $userAccount[$key]['value'] = $value; + $this->accountManager->updateUser($targetUser, $userAccount); + } + break; default: throw new OCSException('', 103); } diff --git a/apps/provisioning_api/tests/Controller/UsersControllerTest.php b/apps/provisioning_api/tests/Controller/UsersControllerTest.php index b5b63319d3..2c85fe0483 100644 --- a/apps/provisioning_api/tests/Controller/UsersControllerTest.php +++ b/apps/provisioning_api/tests/Controller/UsersControllerTest.php @@ -734,7 +734,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => ['group0', 'group1', 'group2'] ]; @@ -823,7 +823,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => [] ]; @@ -952,7 +952,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Subadmin User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'groups' => [] ]; @@ -2636,7 +2636,7 @@ class UsersControllerTest extends TestCase { 'displayname' => 'Demo User', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter' ] ); @@ -2648,7 +2648,7 @@ class UsersControllerTest extends TestCase { 'email' => 'demo@owncloud.org', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'display-name' => 'Demo User' ]; @@ -2696,7 +2696,7 @@ class UsersControllerTest extends TestCase { 'email' => 'demo@owncloud.org', 'phone' => 'phone', 'address' => 'address', - 'webpage' => 'website', + 'website' => 'website', 'twitter' => 'twitter', 'displayname' => 'Demo User' ]; diff --git a/build/integration/features/bootstrap/Provisioning.php b/build/integration/features/bootstrap/Provisioning.php index 2e17508120..94da63a653 100644 --- a/build/integration/features/bootstrap/Provisioning.php +++ b/build/integration/features/bootstrap/Provisioning.php @@ -121,6 +121,32 @@ trait Provisioning { $client->send($client->createRequest('GET', $url, $options2)); } + /** + * @Then /^user "([^"]*)" has$/ + * + * @param string $user + * @param \Behat\Gherkin\Node\TableNode|null $settings + */ + public function userHasSetting($user, $settings) { + $fullUrl = $this->baseUrl . "v{$this->apiVersion}.php/cloud/users/$user"; + $client = new Client(); + $options = []; + $options['auth'] = $this->adminUser; + $options['headers'] = [ + 'OCS-APIREQUEST' => 'true', + ]; + + $response = $client->send($client->createRequest("GET", $fullUrl, $options)); + foreach ($settings->getRows() as $setting) { + $value = json_decode(json_encode($response->xml()->data->{$setting[0]}), 1); + if (isset($value[0])) { + PHPUnit_Framework_Assert::assertEquals($setting[1], $value[0], "", 0.0, 10, true); + } else { + PHPUnit_Framework_Assert::assertEquals('', $setting[1]); + } + } + } + public function createUser($user) { $previous_user = $this->currentUser; $this->currentUser = "admin"; diff --git a/build/integration/features/provisioning-v1.feature b/build/integration/features/provisioning-v1.feature index ad9d901d05..555960b8a5 100644 --- a/build/integration/features/provisioning-v1.feature +++ b/build/integration/features/provisioning-v1.feature @@ -32,6 +32,14 @@ Feature: provisioning | password | 123456 | Then the OCS status code should be "102" And the HTTP status code should be "200" + And user "brand-new-user" has + | id | brand-new-user | + | displayname | brand-new-user | + | email | | + | phone | | + | address | | + | website | | + | twitter | | Scenario: Get an existing user Given As an "admin" @@ -52,13 +60,48 @@ Feature: provisioning Given As an "admin" And user "brand-new-user" exists When sending "PUT" to "/cloud/users/brand-new-user" with + | key | displayname | + | value | Brand New User | + And the OCS status code should be "100" + And the HTTP status code should be "200" + And sending "PUT" to "/cloud/users/brand-new-user" with | key | quota | | value | 12MB | + And the OCS status code should be "100" + And the HTTP status code should be "200" + And sending "PUT" to "/cloud/users/brand-new-user" with | key | email | | value | brand-new-user@gmail.com | - Then the OCS status code should be "100" + And the OCS status code should be "100" And the HTTP status code should be "200" - And user "brand-new-user" exists + And sending "PUT" to "/cloud/users/brand-new-user" with + | key | phone | + | value | 0123 456 789 | + And the OCS status code should be "100" + And the HTTP status code should be "200" + And sending "PUT" to "/cloud/users/brand-new-user" with + | key | address | + | value | Foo Bar Town | + And the OCS status code should be "100" + And the HTTP status code should be "200" + And sending "PUT" to "/cloud/users/brand-new-user" with + | key | website | + | value | https://nextcloud.com | + And the OCS status code should be "100" + And the HTTP status code should be "200" + And sending "PUT" to "/cloud/users/brand-new-user" with + | key | twitter | + | value | Nextcloud | + And the OCS status code should be "100" + And the HTTP status code should be "200" + Then user "brand-new-user" has + | id | brand-new-user | + | displayname | Brand New User | + | email | brand-new-user@gmail.com | + | phone | 0123 456 789 | + | address | Foo Bar Town | + | website | https://nextcloud.com | + | twitter | Nextcloud | Scenario: Create a group Given As an "admin"