cli_credentials_parse_string: fix parsing of principals
authorAlexander Bokovoy <ab@samba.org>
Wed, 7 Oct 2020 16:25:24 +0000 (19:25 +0300)
committerAlexander Bokovoy <ab@samba.org>
Wed, 4 Nov 2020 14:59:34 +0000 (14:59 +0000)
When parsing a principal-like name, user name was left with full
principal instead of taking only the left part before '@' sign.

>>> from samba import credentials
>>> t = credentials.Credentials()
>>> t.parse_string('admin@realm.test', credentials.SPECIFIED)
>>> t.get_username()
'admin@realm.test'

The issue is that cli_credentials_set_username() does a talloc_strdup()
of the argument, so we need to change order of assignment to allow
talloc_strdup() to copy the right part of the string.

Signed-off-by: Alexander Bokovoy <ab@samba.org>
Reviewed-by: Andreas Schneider <asn@samba.org>
Reviewed-by: Stefan Metzmacher <metze@samba.org>
auth/credentials/credentials.c
auth/credentials/tests/test_creds.c
python/samba/tests/credentials.py

index 1bdd6f15a09d779294a6790505ed827ed8eda5ce..a8d25278e9dbd6369eb6a90889d422e27b9cacc7 100644 (file)
@@ -842,11 +842,10 @@ _PUBLIC_ void cli_credentials_parse_string(struct cli_credentials *credentials,
                 * in order to undo the effect of
                 * cli_credentials_guess().
                 */
-               cli_credentials_set_username(credentials, uname, obtained);
-               cli_credentials_set_domain(credentials, "", obtained);
-
                cli_credentials_set_principal(credentials, uname, obtained);
                *p = 0;
+               cli_credentials_set_username(credentials, uname, obtained);
+               cli_credentials_set_domain(credentials, "", obtained);
                cli_credentials_set_realm(credentials, p+1, obtained);
                return;
        } else if ((p = strchr_m(uname,'\\'))
index d2d3d30d73d43d8dd65e69b445de746947019b06..541ecc7b264519c0f0452eedf114560fa752f3fd 100644 (file)
@@ -187,7 +187,7 @@ static void torture_creds_parse_string(void **state)
        assert_string_equal(creds->domain, "");
        assert_int_equal(creds->domain_obtained, CRED_SPECIFIED);
 
-       assert_string_equal(creds->username, "wurst@brot.realm");
+       assert_string_equal(creds->username, "wurst");
        assert_int_equal(creds->username_obtained, CRED_SPECIFIED);
 
        assert_string_equal(creds->principal, "wurst@brot.realm");
index bcd15b1130f943dc37d93db80f5a0b4a4950be69..5d1378fb7900db767e5c374cdeca511b05c5d2f0 100644 (file)
@@ -400,7 +400,7 @@ class CredentialsTests(samba.tests.TestCaseInTempDir):
         os.environ["USER"] = "env_user"
         creds.guess(lp)
         creds.parse_string("user@samba.org")
-        self.assertEqual(creds.get_username(), "user@samba.org")
+        self.assertEqual(creds.get_username(), "user")
         self.assertEqual(creds.get_domain(), "")
         self.assertEqual(creds.get_realm(), "SAMBA.ORG")
         self.assertEqual(creds.get_principal(), "user@samba.org")
@@ -441,7 +441,7 @@ class CredentialsTests(samba.tests.TestCaseInTempDir):
         os.environ["USER"] = "env_user"
         creds.guess(lp)
         creds.parse_string("user@samba.org%pass")
-        self.assertEqual(creds.get_username(), "user@samba.org")
+        self.assertEqual(creds.get_username(), "user")
         self.assertEqual(creds.get_domain(), "")
         self.assertEqual(creds.get_password(), "pass")
         self.assertEqual(creds.get_realm(), "SAMBA.ORG")