Module: wine Branch: master Commit: fc5ea773e5f78049a7fa6f989d9f79a0d5933c97 URL: http://source.winehq.org/git/wine.git/?a=commit;h=fc5ea773e5f78049a7fa6f989d...
Author: Juan Lang juan.lang@gmail.com Date: Wed Feb 4 13:20:39 2009 -0800
advapi32: Support the computer name as an account name in LookupAccountNameW.
---
dlls/advapi32/security.c | 179 ++++++++++++++++++++++++++-------------- dlls/advapi32/tests/security.c | 1 - 2 files changed, 118 insertions(+), 62 deletions(-)
diff --git a/dlls/advapi32/security.c b/dlls/advapi32/security.c index ee06270..d62bb23 100644 --- a/dlls/advapi32/security.c +++ b/dlls/advapi32/security.c @@ -2531,17 +2531,119 @@ LookupAccountNameA( }
/****************************************************************************** + * lookup_user_account_name + */ +static BOOL lookup_user_account_name(PSID Sid, PDWORD cbSid, LPWSTR ReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) +{ + /* Default implementation: Always return a default SID */ + SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY}; + BOOL ret; + PSID pSid; + static const WCHAR dm[] = {'D','O','M','A','I','N',0}; + DWORD nameLen; + LPCWSTR domainName; + + ret = AllocateAndInitializeSid(&identifierAuthority, + 2, + SECURITY_BUILTIN_DOMAIN_RID, + DOMAIN_ALIAS_RID_ADMINS, + 0, 0, 0, 0, 0, 0, + &pSid); + + if (!ret) + return FALSE; + + if (!RtlValidSid(pSid)) + { + FreeSid(pSid); + return FALSE; + } + + if (Sid != NULL && (*cbSid >= GetLengthSid(pSid))) + CopySid(*cbSid, Sid, pSid); + if (*cbSid < GetLengthSid(pSid)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + ret = FALSE; + } + *cbSid = GetLengthSid(pSid); + + domainName = dm; + nameLen = strlenW(domainName); + + if (*cchReferencedDomainName <= nameLen || !ret) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + nameLen += 1; + ret = FALSE; + } + else if (ReferencedDomainName) + strcpyW(ReferencedDomainName, domainName); + + *cchReferencedDomainName = nameLen; + + if (ret) + *peUse = SidTypeUser; + + FreeSid(pSid); + + return ret; +} + +/****************************************************************************** + * lookup_computer_account_name + */ +static BOOL lookup_computer_account_name(PSID Sid, PDWORD cbSid, LPWSTR ReferencedDomainName, + LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) +{ + MAX_SID local; + BOOL ret; + static const WCHAR dm[] = {'D','O','M','A','I','N',0}; + DWORD nameLen; + LPCWSTR domainName; + + if ((ret = ADVAPI_GetComputerSid(&local))) + { + if (Sid != NULL && (*cbSid >= GetLengthSid(&local))) + CopySid(*cbSid, Sid, &local); + if (*cbSid < GetLengthSid(&local)) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + ret = FALSE; + } + *cbSid = GetLengthSid(&local); + } + + domainName = dm; + nameLen = strlenW(domainName); + + if (*cchReferencedDomainName <= nameLen || !ret) + { + SetLastError(ERROR_INSUFFICIENT_BUFFER); + nameLen += 1; + ret = FALSE; + } + else if (ReferencedDomainName) + strcpyW(ReferencedDomainName, domainName); + + *cchReferencedDomainName = nameLen; + + if (ret) + *peUse = SidTypeDomain; + + return ret; +} + +/****************************************************************************** * LookupAccountNameW [ADVAPI32.@] */ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSID Sid, LPDWORD cbSid, LPWSTR ReferencedDomainName, LPDWORD cchReferencedDomainName, PSID_NAME_USE peUse ) { - /* Default implementation: Always return a default SID */ - SID_IDENTIFIER_AUTHORITY identifierAuthority = {SECURITY_NT_AUTHORITY}; BOOL ret; PSID pSid; - static const WCHAR dm[] = {'D','O','M','A','I','N',0}; unsigned int i; DWORD nameLen; LPWSTR userName = NULL; @@ -2621,69 +2723,24 @@ BOOL WINAPI LookupAccountNameW( LPCWSTR lpSystemName, LPCWSTR lpAccountName, PSI
userName = HeapAlloc(GetProcessHeap(), 0, nameLen);
- ret = GetUserNameW(userName, &nameLen); - - if (ret && strcmpW(lpAccountName, userName) != 0) + if (GetUserNameW(userName, &nameLen) && !strcmpW(lpAccountName, userName)) + ret = lookup_user_account_name(Sid, cbSid, ReferencedDomainName, + cchReferencedDomainName, peUse); + else { - SetLastError(ERROR_NONE_MAPPED); - ret = FALSE; + nameLen = UNLEN + 1; + if (GetComputerNameW(userName, &nameLen) && !strcmpW(lpAccountName, userName)) + ret = lookup_computer_account_name(Sid, cbSid, ReferencedDomainName, + cchReferencedDomainName, peUse); + else + { + SetLastError(ERROR_NONE_MAPPED); + ret = FALSE; + } }
HeapFree(GetProcessHeap(), 0, userName);
- if (!ret) - { - return ret; - } - - ret = AllocateAndInitializeSid(&identifierAuthority, - 2, - SECURITY_BUILTIN_DOMAIN_RID, - DOMAIN_ALIAS_RID_ADMINS, - 0, 0, 0, 0, 0, 0, - &pSid); - - if (!ret) - return FALSE; - - if (!RtlValidSid(pSid)) - { - FreeSid(pSid); - return FALSE; - } - - if (Sid != NULL && (*cbSid >= GetLengthSid(pSid))) - CopySid(*cbSid, Sid, pSid); - if (*cbSid < GetLengthSid(pSid)) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - ret = FALSE; - } - *cbSid = GetLengthSid(pSid); - - domainName = dm; - nameLen = strlenW(domainName); - - if (*cchReferencedDomainName <= nameLen || !ret) - { - SetLastError(ERROR_INSUFFICIENT_BUFFER); - nameLen += 1; - ret = FALSE; - } - else if (ReferencedDomainName) - { - strcpyW(ReferencedDomainName, domainName); - } - - *cchReferencedDomainName = nameLen; - - if (ret) - { - *peUse = SidTypeUser; - } - - FreeSid(pSid); - return ret; }
diff --git a/dlls/advapi32/tests/security.c b/dlls/advapi32/tests/security.c index 8ca4d54..a681cb1 100644 --- a/dlls/advapi32/tests/security.c +++ b/dlls/advapi32/tests/security.c @@ -1883,7 +1883,6 @@ static void test_LookupAccountName(void) sid_size = 0; domain_size = 0; ret = LookupAccountNameA(NULL, computer_name, NULL, &sid_size, NULL, &domain_size, &sid_use); - todo_wine ok(!ret && (GetLastError() == ERROR_INSUFFICIENT_BUFFER || broken(GetLastError() == ERROR_TRUSTED_DOMAIN_FAILURE) || broken(GetLastError() == ERROR_TRUSTED_RELATIONSHIP_FAILURE)),