2 * Credential Function Tests
4 * Copyright 2007 Robert Shearman
6 * This library is free software; you can redistribute it and/or
7 * modify it under the terms of the GNU Lesser General Public
8 * License as published by the Free Software Foundation; either
9 * version 2.1 of the License, or (at your option) any later version.
11 * This library is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
14 * Lesser General Public License for more details.
16 * You should have received a copy of the GNU Lesser General Public
17 * License along with this library; if not, write to the Free Software
18 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
28 #include "wine/test.h"
30 static BOOL (WINAPI
*pCredDeleteA
)(LPCSTR
,DWORD
,DWORD
);
31 static BOOL (WINAPI
*pCredEnumerateA
)(LPCSTR
,DWORD
,DWORD
*,PCREDENTIALA
**);
32 static VOID (WINAPI
*pCredFree
)(PVOID
);
33 static BOOL (WINAPI
*pCredReadA
)(LPCSTR
,DWORD
,DWORD
,PCREDENTIALA
*);
34 static BOOL (WINAPI
*pCredRenameA
)(LPCSTR
,LPCSTR
,DWORD
,DWORD
);
35 static BOOL (WINAPI
*pCredWriteA
)(PCREDENTIALA
,DWORD
);
37 #define TEST_TARGET_NAME "credtest.winehq.org"
38 #define TEST_TARGET_NAME2 "credtest2.winehq.org"
40 static void test_CredReadA(void)
45 SetLastError(0xdeadbeef);
46 ret
= pCredReadA(TEST_TARGET_NAME
, -1, 0, &cred
);
47 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
48 "CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
51 SetLastError(0xdeadbeef);
52 ret
= pCredReadA(TEST_TARGET_NAME
, CRED_TYPE_GENERIC
, 0xdeadbeef, &cred
);
53 ok(!ret
&& GetLastError() == ERROR_INVALID_FLAGS
,
54 "CredReadA should have failed with ERROR_INVALID_FLAGS instead of %d\n",
57 SetLastError(0xdeadbeef);
58 ret
= pCredReadA(NULL
, CRED_TYPE_GENERIC
, 0, &cred
);
59 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
60 "CredReadA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
64 static void test_CredWriteA(void)
69 SetLastError(0xdeadbeef);
70 ret
= pCredWriteA(NULL
, 0);
71 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
72 "CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
76 new_cred
.Type
= CRED_TYPE_GENERIC
;
77 new_cred
.TargetName
= NULL
;
78 new_cred
.Comment
= (char *)"Comment";
79 new_cred
.CredentialBlobSize
= 0;
80 new_cred
.CredentialBlob
= NULL
;
81 new_cred
.Persist
= CRED_PERSIST_ENTERPRISE
;
82 new_cred
.AttributeCount
= 0;
83 new_cred
.Attributes
= NULL
;
84 new_cred
.TargetAlias
= NULL
;
85 new_cred
.UserName
= (char *)"winetest";
87 SetLastError(0xdeadbeef);
88 ret
= pCredWriteA(&new_cred
, 0);
89 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
90 "CredWriteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
93 new_cred
.TargetName
= (char *)TEST_TARGET_NAME
;
94 new_cred
.Type
= CRED_TYPE_DOMAIN_PASSWORD
;
96 SetLastError(0xdeadbeef);
97 ret
= pCredWriteA(&new_cred
, 0);
98 ok(!ret
&& GetLastError() == ERROR_BAD_USERNAME
,
99 "CredWrite with username without domain should return ERROR_BAD_USERNAME not %d\n", GetLastError());
101 new_cred
.UserName
= NULL
;
102 SetLastError(0xdeadbeef);
103 ret
= pCredWriteA(&new_cred
, 0);
104 ok(!ret
&& GetLastError() == ERROR_BAD_USERNAME
,
105 "CredWriteA with NULL username should have failed with ERROR_BAD_USERNAME instead of %d\n",
109 static void test_CredDeleteA(void)
113 SetLastError(0xdeadbeef);
114 ret
= pCredDeleteA(TEST_TARGET_NAME
, -1, 0);
115 ok(!ret
&& GetLastError() == ERROR_INVALID_PARAMETER
,
116 "CredDeleteA should have failed with ERROR_INVALID_PARAMETER instead of %d\n",
119 SetLastError(0xdeadbeef);
120 ret
= pCredDeleteA(TEST_TARGET_NAME
, CRED_TYPE_GENERIC
, 0xdeadbeef);
121 ok(!ret
&& GetLastError() == ERROR_INVALID_FLAGS
,
122 "CredDeleteA should have failed with ERROR_INVALID_FLAGS instead of %d\n",
126 static void test_generic(void)
131 CREDENTIALA new_cred
;
133 static const WCHAR password
[] = {'p','4','$','$','w','0','r','d','!',0};
137 new_cred
.Type
= CRED_TYPE_GENERIC
;
138 new_cred
.TargetName
= (char *)TEST_TARGET_NAME
;
139 new_cred
.Comment
= (char *)"Comment";
140 new_cred
.CredentialBlobSize
= sizeof(password
);
141 new_cred
.CredentialBlob
= (LPBYTE
)password
;
142 new_cred
.Persist
= CRED_PERSIST_ENTERPRISE
;
143 new_cred
.AttributeCount
= 0;
144 new_cred
.Attributes
= NULL
;
145 new_cred
.TargetAlias
= NULL
;
146 new_cred
.UserName
= (char *)"winetest";
148 ret
= pCredWriteA(&new_cred
, 0);
149 ok(ret
, "CredWriteA failed with error %d\n", GetLastError());
151 ret
= pCredEnumerateA(NULL
, 0, &count
, &creds
);
152 ok(ret
, "CredEnumerateA failed with error %d\n", GetLastError());
154 for (i
= 0; i
< count
; i
++)
156 if (!strcmp(creds
[i
]->TargetName
, TEST_TARGET_NAME
))
158 ok(creds
[i
]->Type
== CRED_TYPE_GENERIC
, "expected creds[%d]->Type CRED_TYPE_GENERIC but got %d\n", i
, creds
[i
]->Type
);
159 ok(!creds
[i
]->Flags
, "expected creds[%d]->Flags 0 but got 0x%x\n", i
, creds
[i
]->Flags
);
160 ok(!strcmp(creds
[i
]->Comment
, "Comment"), "expected creds[%d]->Comment \"Comment\" but got \"%s\"\n", i
, creds
[i
]->Comment
);
161 ok(creds
[i
]->CredentialBlobSize
== sizeof(password
), "wrong CredentialBlobSize %d\n", creds
[i
]->CredentialBlobSize
);
162 ok(creds
[i
]->CredentialBlob
!= NULL
, "CredentialBlob should be present\n");
163 if (creds
[i
]->CredentialBlob
)
164 ok(!memcmp(creds
[i
]->CredentialBlob
, password
, sizeof(password
)), "credentials don't match\n");
165 ok(creds
[i
]->Persist
, "expected creds[%d]->Persist CRED_PERSIST_ENTERPRISE but got %d\n", i
, creds
[i
]->Persist
);
166 ok(!strcmp(creds
[i
]->UserName
, "winetest"), "expected creds[%d]->UserName \"winetest\" but got \"%s\"\n", i
, creds
[i
]->UserName
);
171 ok(found
, "credentials not found\n");
173 ret
= pCredReadA(TEST_TARGET_NAME
, CRED_TYPE_GENERIC
, 0, &cred
);
174 ok(ret
, "CredReadA failed with error %d\n", GetLastError());
177 ret
= pCredDeleteA(TEST_TARGET_NAME
, CRED_TYPE_GENERIC
, 0);
178 ok(ret
, "CredDeleteA failed with error %d\n", GetLastError());
181 static void test_domain_password(void)
186 CREDENTIALA new_cred
;
188 static const WCHAR password
[] = {'p','4','$','$','w','0','r','d','!',0};
192 new_cred
.Type
= CRED_TYPE_DOMAIN_PASSWORD
;
193 new_cred
.TargetName
= (char *)TEST_TARGET_NAME
;
194 new_cred
.Comment
= (char *)"Comment";
195 new_cred
.CredentialBlobSize
= sizeof(password
);
196 new_cred
.CredentialBlob
= (LPBYTE
)password
;
197 new_cred
.Persist
= CRED_PERSIST_ENTERPRISE
;
198 new_cred
.AttributeCount
= 0;
199 new_cred
.Attributes
= NULL
;
200 new_cred
.TargetAlias
= NULL
;
201 new_cred
.UserName
= (char *)"test\\winetest";
202 ret
= pCredWriteA(&new_cred
, 0);
203 ok(ret
, "CredWriteA failed with error %d\n", GetLastError());
205 ret
= pCredEnumerateA(NULL
, 0, &count
, &creds
);
206 ok(ret
, "CredEnumerateA failed with error %d\n", GetLastError());
208 for (i
= 0; i
< count
; i
++)
210 if (!strcmp(creds
[i
]->TargetName
, TEST_TARGET_NAME
))
212 ok(creds
[i
]->Type
== CRED_TYPE_DOMAIN_PASSWORD
, "expected creds[%d]->Type CRED_TYPE_DOMAIN_PASSWORD but got %d\n", i
, creds
[i
]->Type
);
213 ok(!creds
[i
]->Flags
, "expected creds[%d]->Flags 0 but got 0x%x\n", i
, creds
[i
]->Flags
);
214 ok(!strcmp(creds
[i
]->Comment
, "Comment"), "expected creds[%d]->Comment \"Comment\" but got \"%s\"\n", i
, creds
[i
]->Comment
);
216 ok(creds
[i
]->CredentialBlobSize
== 0, "expected CredentialBlobSize of 0 but got %d\n", creds
[i
]->CredentialBlobSize
);
218 ok(!creds
[i
]->CredentialBlob
, "expected NULL credentials but got %p\n", creds
[i
]->CredentialBlob
);
219 ok(creds
[i
]->Persist
, "expected creds[%d]->Persist CRED_PERSIST_ENTERPRISE but got %d\n", i
, creds
[i
]->Persist
);
220 ok(!strcmp(creds
[i
]->UserName
, "test\\winetest"), "expected creds[%d]->UserName \"winetest\" but got \"%s\"\n", i
, creds
[i
]->UserName
);
225 ok(found
, "credentials not found\n");
227 ret
= pCredReadA(TEST_TARGET_NAME
, CRED_TYPE_DOMAIN_PASSWORD
, 0, &cred
);
228 ok(ret
, "CredReadA failed with error %d\n", GetLastError());
230 ok(cred
->CredentialBlobSize
== 0, "expected CredentialBlobSize of 0 but got %d\n", cred
->CredentialBlobSize
);
232 ok(!cred
->CredentialBlob
, "expected NULL credentials but got %p\n", cred
->CredentialBlob
);
235 ret
= pCredDeleteA(TEST_TARGET_NAME
, CRED_TYPE_DOMAIN_PASSWORD
, 0);
236 ok(ret
, "CredDeleteA failed with error %d\n", GetLastError());
241 pCredEnumerateA
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredEnumerateA");
242 pCredFree
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredFree");
243 pCredWriteA
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredWriteA");
244 pCredDeleteA
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredDeleteA");
245 pCredReadA
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredReadA");
246 pCredRenameA
= (void *)GetProcAddress(GetModuleHandle("advapi32.dll"), "CredRenameA");
248 if (!pCredEnumerateA
|| !pCredFree
|| !pCredWriteA
|| !pCredDeleteA
||
251 skip("credentials functions not present in advapi32.dll\n");
261 trace("domain password:\n");
262 test_domain_password();