]> source.dussan.org Git - nextcloud-server.git/commitdiff
Better validation of allowed user names 4390/head
authorJoas Schilling <coding@schilljs.com>
Wed, 12 Apr 2017 08:29:28 +0000 (10:29 +0200)
committerJoas Schilling <coding@schilljs.com>
Wed, 19 Apr 2017 07:21:46 +0000 (09:21 +0200)
Signed-off-by: Joas Schilling <coding@schilljs.com>
lib/private/User/Manager.php
tests/lib/User/ManagerTest.php

index 3d016700ee333968997cb80e97dbd6d5f379d153..45400d621cbf925a330ac5491f45128b6acd6016 100644 (file)
@@ -278,9 +278,13 @@ class Manager extends PublicEmitter implements IUserManager {
                        throw new \Exception($l->t('A valid username must be provided'));
                }
                // No whitespace at the beginning or at the end
-               if (strlen(trim($uid, "\t\n\r\0\x0B\xe2\x80\x8b")) !== strlen(trim($uid))) {
+               if (trim($uid) !== $uid) {
                        throw new \Exception($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'));
+               }
                // No empty password
                if (trim($password) == '') {
                        throw new \Exception($l->t('A valid password must be provided'));
index 123271bcc8fb5e50c1f6933a6d1dcde7e7445afa..671b2ac57c1d5a9f2ea51ea711924157e0878ade 100644 (file)
@@ -256,6 +256,49 @@ class ManagerTest extends TestCase {
                $this->assertEquals('foo3', array_shift($result)->getUID());
        }
 
+       public function dataCreateUserInvalid() {
+               return [
+                       ['te?st', 'foo', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\tst", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\nst", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\rst", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\0st", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\x0Bst", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\xe2st", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\x80st", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ["te\x8bst", '', 'Only the following characters are allowed in a username:'
+                               . ' "a-z", "A-Z", "0-9", and "_.@-\'"'],
+                       ['', 'foo', 'A valid username must be provided'],
+                       [' ', 'foo', 'A valid username must be provided'],
+                       [' test', 'foo', 'Username contains whitespace at the beginning or at the end'],
+                       ['test ', 'foo', 'Username contains whitespace at the beginning or at the end'],
+                       ['.', 'foo', 'Username must not consist of dots only'],
+                       ['..', 'foo', 'Username must not consist of dots only'],
+                       ['.test', '', 'A valid password must be provided'],
+                       ['test', '', 'A valid password must be provided'],
+               ];
+       }
+
+       /**
+        * @dataProvider dataCreateUserInvalid
+        */
+       public function testCreateUserInvalid($uid, $password, $exception) {
+
+               $this->setExpectedException(\Exception::class, $exception);
+
+               $manager = new \OC\User\Manager($this->config);
+               $manager->createUser($uid, $password);
+
+       }
+
        public function testCreateUserSingleBackendNotExists() {
                /**
                 * @var \Test\Util\User\Dummy | \PHPUnit_Framework_MockObject_MockObject $backend