Browse Source

Merge pull request #4522 from nextcloud/downstream-27596

Allow to create a user for a specific backend
Morris Jobke 7 years ago
parent
commit
f000e22a97
3 changed files with 57 additions and 25 deletions
  1. 35 19
      lib/private/User/Manager.php
  2. 11 1
      lib/public/IUserManager.php
  3. 11 5
      tests/lib/User/ManagerTest.php

+ 35 - 19
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;
 	}
 
 	/**

+ 11 - 1
lib/public/IUserManager.php

@@ -123,12 +123,22 @@ 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)
 	 *

+ 11 - 5
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);