fixup the previous commit
authorDenis Ovsienko <denis@ovsienko.info>
Mon, 17 Sep 2018 17:13:40 +0000 (18:13 +0100)
committerDenis Ovsienko <denis@ovsienko.info>
Mon, 17 Sep 2018 17:13:40 +0000 (18:13 +0100)
Move the call to sha1() back into updateUser() to fix the test that
properly failed after the unintended API change. Add missing hash
argument assertions to commitCreateUserAccount() and
commitUpdateUserAccount() and cover these with new tests. While at it,
update some code for clarity.

tests/UserAccountTest.php
wwwroot/inc/database.php
wwwroot/inc/ophandlers.php

index 4a3662a..dfde0dc 100644 (file)
@@ -51,4 +51,22 @@ class UserAccountTest extends RTTestCase
        {
                commitCreateUserAccount ($this->user_name, 'x' . self::REALNAME, sha1 (self::PSWDHASH));
        }
+
+       /**
+        * @group small
+        * @expectedException InvalidArgException
+        */
+       public function testInvalidPassword1 ()
+       {
+               commitUpdateUserAccount ($this->user_id, $this->user_name, self::REALNAME, 'password');
+       }
+
+       /**
+        * @group small
+        * @expectedException InvalidArgException
+        */
+       public function testInvalidPassword2 ()
+       {
+               commitCreateUserAccount ($this->user_name, self::REALNAME, 'password');
+       }
 }
index 1d0683b..c97f2e6 100644 (file)
@@ -3350,16 +3350,18 @@ WHERE
 
 // returns user_id
 // throws an exception if error occured
-function commitCreateUserAccount ($username, $realname, $password)
+function commitCreateUserAccount ($username, $realname, $password_hash)
 {
+       if (! preg_match ('/^[0-9a-f]{40}$/', $password_hash))
+               throw new InvalidArgException ('password_hash', $password_hash, 'not a 20-octet hex string');
        usePreparedInsertBlade
        (
                'UserAccount',
                array
                (
                        'user_name' => $username,
-                       'user_realname' => $realname == '' ? NULL : $realname,
-                       'user_password_hash' => $password,
+                       'user_realname' => nullIfEmptyStr ($realname),
+                       'user_password_hash' => $password_hash,
                )
        );
        $user_id = lastInsertID();
@@ -3368,15 +3370,19 @@ function commitCreateUserAccount ($username, $realname, $password)
 }
 
 // Update the password only if it is provided.
-function commitUpdateUserAccount ($id, $new_username, $new_realname, $new_password = '')
+function commitUpdateUserAccount ($id, $new_username, $new_realname, $new_password_hash = '')
 {
        $set_columns = array
        (
                'user_name' => $new_username,
                'user_realname' => nullIfEmptyStr ($new_realname),
        );
-       if ($new_password != '')
-               $set_columns['user_password_hash'] = sha1 ($new_password);
+       if ($new_password_hash != '')
+       {
+               if (! preg_match ('/^[0-9a-f]{40}$/', $new_password_hash))
+                       throw new InvalidArgException ('new_password_hash', $new_password_hash, 'not a 20-octet hex string');
+               $set_columns['user_password_hash'] = $new_password_hash;
+       }
        $userinfo = spotEntity ('user', $id);
        usePreparedUpdateBlade ('UserAccount', $set_columns, array ('user_id' => $id));
        // There is no FK to do this update as user-specific configuration is always local,
index 0ae09d0..a61ccf7 100644 (file)
@@ -1080,7 +1080,7 @@ function updateUser ()
                genericAssertion ('user_id', 'natural'),
                $username,
                genericAssertion ('realname', 'string0'),
-               genericAssertion ('password', 'string0')
+               sha1 (genericAssertion ('password', 'string0'))
        );
        showFuncMessage (__FUNCTION__, 'OK', array ($username));
 }