Merge pull request #4522 from nextcloud/downstream-27596

Allow to create a user for a specific backend
This commit is contained in:
Morris Jobke 2017-04-27 16:41:08 -03:00 committed by GitHub
commit f000e22a97
3 changed files with 57 additions and 25 deletions

View File

@ -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;
}
/**

View File

@ -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)
*

View File

@ -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);