summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMorris Jobke <hey@morrisjobke.de>2017-04-27 16:41:08 -0300
committerGitHub <noreply@github.com>2017-04-27 16:41:08 -0300
commitf000e22a97b9bae756cc5977badeffbc7a6852e9 (patch)
tree570c1d983747c92d4d5c396a92bfce9a311bd5bb
parent2be212d179302d25e53b41a3d36b651fbc12014e (diff)
parent9212089151e827b648033a4812a5dcac5058b715 (diff)
downloadnextcloud-server-f000e22a97b9bae756cc5977badeffbc7a6852e9.tar.gz
nextcloud-server-f000e22a97b9bae756cc5977badeffbc7a6852e9.zip
Merge pull request #4522 from nextcloud/downstream-27596
Allow to create a user for a specific backend
-rw-r--r--lib/private/User/Manager.php54
-rw-r--r--lib/public/IUserManager.php12
-rw-r--r--tests/lib/User/ManagerTest.php16
3 files changed, 57 insertions, 25 deletions
diff --git a/lib/private/User/Manager.php b/lib/private/User/Manager.php
index 6220613cbb1..4a87dc7161c 100644
--- a/lib/private/User/Manager.php
+++ b/lib/private/User/Manager.php
@@ -38,6 +38,7 @@ use OCP\IUser;
use OCP\IUserBackend;
use OCP\IUserManager;
use OCP\IConfig;
+use OCP\UserInterface;
/**
* Class Manager
@@ -279,49 +280,64 @@ class Manager extends PublicEmitter implements IUserManager {
/**
* @param string $uid
* @param string $password
- * @throws \Exception
- * @return bool|\OC\User\User the created user or false
+ * @throws \InvalidArgumentException
+ * @return bool|IUser the created user or false
*/
public function createUser($uid, $password) {
+ foreach ($this->backends as $backend) {
+ if ($backend->implementsActions(Backend::CREATE_USER)) {
+ return $this->createUserFromBackend($uid, $password, $backend);
+ }
+ }
+
+ return false;
+ }
+
+ /**
+ * @param string $uid
+ * @param string $password
+ * @param UserInterface $backend
+ * @return IUser|null
+ * @throws \InvalidArgumentException
+ */
+ public function createUserFromBackend($uid, $password, UserInterface $backend) {
$l = \OC::$server->getL10N('lib');
+
// Check the name for bad characters
// Allowed are: "a-z", "A-Z", "0-9" and "_.@-'"
if (preg_match('/[^a-zA-Z0-9 _\.@\-\']/', $uid)) {
- throw new \Exception($l->t('Only the following characters are allowed in a username:'
+ throw new \InvalidArgumentException($l->t('Only the following characters are allowed in a username:'
. ' "a-z", "A-Z", "0-9", and "_.@-\'"'));
}
// No empty username
- if (trim($uid) == '') {
- throw new \Exception($l->t('A valid username must be provided'));
+ if (trim($uid) === '') {
+ throw new \InvalidArgumentException($l->t('A valid username must be provided'));
}
// No whitespace at the beginning or at the end
if (trim($uid) !== $uid) {
- throw new \Exception($l->t('Username contains whitespace at the beginning or at the end'));
+ throw new \InvalidArgumentException($l->t('Username contains whitespace at the beginning or at the end'));
}
// Username only consists of 1 or 2 dots (directory traversal)
if ($uid === '.' || $uid === '..') {
- throw new \Exception($l->t('Username must not consist of dots only'));
+ throw new \InvalidArgumentException($l->t('Username must not consist of dots only'));
}
// No empty password
- if (trim($password) == '') {
- throw new \Exception($l->t('A valid password must be provided'));
+ if (trim($password) === '') {
+ throw new \InvalidArgumentException($l->t('A valid password must be provided'));
}
// Check if user already exists
if ($this->userExists($uid)) {
- throw new \Exception($l->t('The username is already being used'));
+ throw new \InvalidArgumentException($l->t('The username is already being used'));
}
- $this->emit('\OC\User', 'preCreateUser', array($uid, $password));
- foreach ($this->backends as $backend) {
- if ($backend->implementsActions(Backend::CREATE_USER)) {
- $backend->createUser($uid, $password);
- $user = $this->getUserObject($uid, $backend);
- $this->emit('\OC\User', 'postCreateUser', array($user, $password));
- return $user;
- }
+ $this->emit('\OC\User', 'preCreateUser', [$uid, $password]);
+ $backend->createUser($uid, $password);
+ $user = $this->getUserObject($uid, $backend);
+ if ($user instanceof IUser) {
+ $this->emit('\OC\User', 'postCreateUser', [$user, $password]);
}
- return false;
+ return $user;
}
/**
diff --git a/lib/public/IUserManager.php b/lib/public/IUserManager.php
index 1f8c23dbedf..1ec392dfd82 100644
--- a/lib/public/IUserManager.php
+++ b/lib/public/IUserManager.php
@@ -123,13 +123,23 @@ interface IUserManager {
/**
* @param string $uid
* @param string $password
- * @throws \Exception
+ * @throws \InvalidArgumentException
* @return bool|\OCP\IUser the created user of false
* @since 8.0.0
*/
public function createUser($uid, $password);
/**
+ * @param string $uid
+ * @param string $password
+ * @param UserInterface $backend
+ * @return IUser|null
+ * @throws \InvalidArgumentException
+ * @since 12.0.0
+ */
+ public function createUserFromBackend($uid, $password, UserInterface $backend);
+
+ /**
* returns how many users per backend exist (if supported by backend)
*
* @return array an array of backend class as key and count number as value
diff --git a/tests/lib/User/ManagerTest.php b/tests/lib/User/ManagerTest.php
index 671b2ac57c1..aaee64f1863 100644
--- a/tests/lib/User/ManagerTest.php
+++ b/tests/lib/User/ManagerTest.php
@@ -291,10 +291,18 @@ class ManagerTest extends TestCase {
* @dataProvider dataCreateUserInvalid
*/
public function testCreateUserInvalid($uid, $password, $exception) {
+ /** @var \Test\Util\User\Dummy|\PHPUnit_Framework_MockObject_MockObject $backend */
+ $backend = $this->createMock(\Test\Util\User\Dummy::class);
+ $backend->expects($this->once())
+ ->method('implementsActions')
+ ->with(\OC\User\Backend::CREATE_USER)
+ ->willReturn(true);
- $this->setExpectedException(\Exception::class, $exception);
$manager = new \OC\User\Manager($this->config);
+ $manager->registerBackend($backend);
+
+ $this->setExpectedException(\InvalidArgumentException::class, $exception);
$manager->createUser($uid, $password);
}
@@ -362,10 +370,8 @@ class ManagerTest extends TestCase {
$backend->expects($this->never())
->method('createUser');
- $backend->expects($this->once())
- ->method('userExists')
- ->with($this->equalTo('foo'))
- ->will($this->returnValue(false));
+ $backend->expects($this->never())
+ ->method('userExists');
$manager = new \OC\User\Manager($this->config);
$manager->registerBackend($backend);