advapi32: Only require a domain in the username for CRED_PERSIST_ENTERPRISE credentials. (try 2)

Hans Leidekker hans at codeweavers.com
Thu Oct 18 08:10:05 CDT 2012


---
 dlls/advapi32/cred.c       |    8 +++++++-
 dlls/advapi32/tests/cred.c |   41 +++++++++++++++++++++++++++++++++++++++++
 2 files changed, 48 insertions(+), 1 deletion(-)

diff --git a/dlls/advapi32/cred.c b/dlls/advapi32/cred.c
index 98c4ba7..b2597b6 100644
--- a/dlls/advapi32/cred.c
+++ b/dlls/advapi32/cred.c
@@ -1804,13 +1804,19 @@ BOOL WINAPI CredWriteW(PCREDENTIALW Credential, DWORD Flags)
         return FALSE;
     }
 
+    TRACE("Credential->Flags = 0x%08x\n", Credential->Flags);
+    TRACE("Credential->Type = %u\n", Credential->Type);
     TRACE("Credential->TargetName = %s\n", debugstr_w(Credential->TargetName));
+    TRACE("Credential->Comment = %s\n", debugstr_w(Credential->Comment));
+    TRACE("Credential->Persist = %u\n", Credential->Persist);
+    TRACE("Credential->TargetAlias = %s\n", debugstr_w(Credential->TargetAlias));
     TRACE("Credential->UserName = %s\n", debugstr_w(Credential->UserName));
 
     if (Credential->Type == CRED_TYPE_DOMAIN_PASSWORD)
     {
         if (!Credential->UserName ||
-            (!strchrW(Credential->UserName, '\\') && !strchrW(Credential->UserName, '@')))
+            (Credential->Persist == CRED_PERSIST_ENTERPRISE &&
+            (!strchrW(Credential->UserName, '\\') && !strchrW(Credential->UserName, '@'))))
         {
             ERR("bad username %s\n", debugstr_w(Credential->UserName));
             SetLastError(ERROR_BAD_USERNAME);
diff --git a/dlls/advapi32/tests/cred.c b/dlls/advapi32/tests/cred.c
index 5762f1b..b32537d 100644
--- a/dlls/advapi32/tests/cred.c
+++ b/dlls/advapi32/tests/cred.c
@@ -121,6 +121,47 @@ static void test_CredWriteA(void)
     ok(!ret && GetLastError() == ERROR_BAD_USERNAME,
         "CredWriteA with NULL username should have failed with ERROR_BAD_USERNAME instead of %d\n",
         GetLastError());
+
+    new_cred.UserName = (char *)"winetest";
+    new_cred.Persist = CRED_PERSIST_LOCAL_MACHINE;
+    SetLastError(0xdeadbeef);
+    ret = pCredWriteA(&new_cred, 0);
+    ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
+    if (ret)
+    {
+        ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_DOMAIN_PASSWORD, 0);
+        ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
+    }
+    new_cred.Type = CRED_TYPE_GENERIC;
+    SetLastError(0xdeadbeef);
+    ret = pCredWriteA(&new_cred, 0);
+    ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
+    if  (ret)
+    { 
+        ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0);
+        ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
+    }
+    new_cred.Persist = CRED_PERSIST_SESSION;
+    ret = pCredWriteA(&new_cred, 0);
+    ok(ret, "CredWriteA failed with error %u\n", GetLastError());
+
+    ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_GENERIC, 0);
+    ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
+
+    new_cred.Type = CRED_TYPE_DOMAIN_PASSWORD;
+    SetLastError(0xdeadbeef);
+    ret = pCredWriteA(&new_cred, 0);
+    ok(ret || broken(!ret), "CredWriteA failed with error %u\n", GetLastError());
+    if (ret)
+    {
+        ret = pCredDeleteA(TEST_TARGET_NAME, CRED_TYPE_DOMAIN_PASSWORD, 0);
+        ok(ret, "CredDeleteA failed with error %u\n", GetLastError());
+    }
+    new_cred.UserName = NULL;
+    SetLastError(0xdeadbeef);
+    ret = pCredWriteA(&new_cred, 0);
+    ok(!ret, "CredWriteA succeeded\n");
+    ok(GetLastError() == ERROR_BAD_USERNAME, "got %u\n", GetLastError());
 }
 
 static void test_CredDeleteA(void)
-- 
1.7.10.4






More information about the wine-patches mailing list