diff options
author | David Boreham <dboreham@redhat.com> | 2005-05-11 21:00:08 +0000 |
---|---|---|
committer | David Boreham <dboreham@redhat.com> | 2005-05-11 21:00:08 +0000 |
commit | 67730e723afaf37c3153a1e93e7224e306f155d1 (patch) | |
tree | b5e872f33d04d6e6ee5dd239da5788a80ca9007b | |
parent | 37bff7c59f8cca09ba2a2e6eb3e6c852327bbb17 (diff) | |
download | ds-67730e723afaf37c3153a1e93e7224e306f155d1.tar.gz ds-67730e723afaf37c3153a1e93e7224e306f155d1.tar.xz ds-67730e723afaf37c3153a1e93e7224e306f155d1.zip |
Fixes for memory leaks in ntds
-rw-r--r-- | ldap/servers/ntds/netman/netman.cpp | 1751 | ||||
-rw-r--r-- | ldap/servers/ntds/netman/netman.h | 36 | ||||
-rw-r--r-- | ldap/servers/ntds/wrapper/wrapper.conf | 4 |
3 files changed, 1190 insertions, 601 deletions
diff --git a/ldap/servers/ntds/netman/netman.cpp b/ldap/servers/ntds/netman/netman.cpp index 5d9447b9..ac94415a 100644 --- a/ldap/servers/ntds/netman/netman.cpp +++ b/ldap/servers/ntds/netman/netman.cpp @@ -41,202 +41,210 @@ #include "netman.h" // **************************************************************** -// UTF16ToUTF8 +// quickFree // **************************************************************** -char* UTF16ToUTF8(unsigned short* inString) +void quickFree(char** buf) { - int length = WideCharToMultiByte(CP_ACP, 0, inString, -1, 0, 0, 0, 0); - char* outString = NULL; - - outString = (char*)malloc(length); - - WideCharToMultiByte(CP_ACP, 0, inString, -1, outString, length, 0, 0); - - return outString; + if(*buf != NULL) + { + free(*buf); + *buf = NULL; + } } // **************************************************************** -// UTF8ToUTF16 +// UTF16ToUTF8 // **************************************************************** -unsigned short* UTF8ToUTF16(char* inString) +int UTF16ToUTF8(unsigned short* inStr, char* outStr, unsigned long* outStrBufLen) { - unsigned short* outString = NULL; - int length = MultiByteToWideChar(CP_ACP, 0, inString, -1, 0, 0); + int result = 0; + unsigned long length = WideCharToMultiByte(CP_ACP, 0, inStr, -1, 0, 0, 0, 0); - outString = (unsigned short*)malloc(length * 2); + if(outStr == NULL) + { + result = 0; + goto exit; + } + if(*outStrBufLen < length) + { + result = -1; + goto exit; + } - MultiByteToWideChar(CP_ACP, 0, inString, -1, outString, length); + WideCharToMultiByte(CP_ACP, 0, inStr, -1, outStr, length, 0, 0); - return outString; +exit: + *outStrBufLen = length; + + return result; } // **************************************************************** -// BinToHexStr +// UTF8ToUTF16 // **************************************************************** -int BinToHexStr(char* bin, unsigned long binLen, char** hexStr) +int UTF8ToUTF16(char* inStr, unsigned short* outStr, unsigned long* outStrBufLen) { - int hexStrLen = binLen * 2 + 1; - - *hexStr = (char*)calloc(hexStrLen, sizeof(char)); + int result = 0; + unsigned long length = MultiByteToWideChar(CP_ACP, 0, inStr, -1, 0, 0) * 2; - for(unsigned long i = 0; i < binLen; i++) + if(outStr == NULL) { - sprintf(&(*hexStr)[i * 2], "%02X", (unsigned char)bin[i]); + result = 0; + goto exit; } - - return 0; -} - -// **************************************************************** -// HexStrToBin -// **************************************************************** -int HexStrToBin(char* hexStr, char** bin, unsigned long* binLen) -{ - int temp; - *binLen = strlen(hexStr) / 2; - - *bin = (char*)malloc(*binLen); - - for(unsigned long i = 0; i < *binLen; i++) + if(*outStrBufLen < length) { - sscanf(&hexStr[i * 2], "%02X", &temp); - (*bin)[i] = (unsigned char)temp; + result = -1; + goto exit; } - return 0; + MultiByteToWideChar(CP_ACP, 0, inStr, -1, outStr, length); + +exit: + *outStrBufLen = length; + + return result; } // **************************************************************** -// GetSIDByAccountName +// BinToHexStr // **************************************************************** -int GetSIDByAccountName(char* accountName, char** sid) +int BinToHexStr(char* bin, unsigned long binLen, char* hexStr, unsigned long* hexStrBufLen) { int result = 0; - unsigned long sidLen = 0; - char* domain; - unsigned long domainLen = 0; - SID_NAME_USE testType; + unsigned long length = binLen * 2 + 1; + unsigned long i; - if(LookupAccountName(NULL, accountName, NULL, &sidLen, NULL, &domainLen, &testType) == 0) + if(hexStr == NULL) { - result = GetLastError(); + result = 0; + goto exit; } - - *sid = (char*)malloc(sidLen); - domain = (char*)malloc(domainLen); - - if(LookupAccountName(NULL, accountName, *sid, &sidLen, domain, &domainLen, &testType) == 0) + if(*hexStrBufLen < length) { - result = GetLastError(); + result = -1; + goto exit; } - else + + for(i = 0; i < binLen; i++) { - result = 0; + sprintf(&hexStr[i * 2], "%02X", (unsigned char)bin[i]); } +exit: + *hexStrBufLen = length; + return result; } // **************************************************************** -// GetAccountNameBySID +// HexStrToBin // **************************************************************** -int GetAccountNameBySID(char* sid, char** accountName) +int HexStrToBin(char* hexStr, char* bin, unsigned long* binBufLen) { int result = 0; - unsigned long sidLen = 0; - char* domain; - unsigned long domainLen = 0; - SID_NAME_USE testType; - - unsigned long accountNameLen = 0; + unsigned long length = strlen(hexStr) / 2; + unsigned long i; + int temp; - if(LookupAccountSid(NULL, sid, NULL, &accountNameLen, NULL, &domainLen, &testType) == 0) + if(bin == NULL) { - result = GetLastError(); + result = 0; + goto exit; } - - domain = (char*)malloc(domainLen); - *accountName = (char*)calloc(accountNameLen, sizeof(char)); - - if(LookupAccountSid(NULL, sid, *accountName, &accountNameLen, domain, &domainLen, &testType) == 0) + if(*binBufLen < length) { - result = GetLastError(); + result = -1; + goto exit; } - else + + for(i = 0; i < length; i++) { - result = 0; + sscanf(&hexStr[i * 2], "%02X", &temp); + bin[i] = (unsigned char)temp; } +exit: + *binBufLen = length; + return result; } // **************************************************************** -// GetSIDHexStrByAccountName +// GetSIDByAccountName // **************************************************************** -int GetSIDHexStrByAccountName(char* accountName, char** sidHexStr) +int GetSIDByAccountName(char* accountName, char* sid, unsigned long* sidBufLen) { int result = 0; - char* sid; unsigned long sidLen = 0; - char* domain; unsigned long domainLen = 0; + char* domain = NULL; SID_NAME_USE testType; - if(LookupAccountName(NULL, accountName, NULL, &sidLen, NULL, &domainLen, &testType) == 0) + LookupAccountName(NULL, accountName, NULL, &sidLen, NULL, &domainLen, &testType); + + if(sid == NULL) { - result = GetLastError(); + result = 0; + goto exit; + } + if(*sidBufLen < sidLen) + { + result = -1; + goto exit; } - - sid = (char*)malloc(sidLen); domain = (char*)malloc(domainLen); - if(LookupAccountName(NULL, accountName, sid, &sidLen, domain, &domainLen, &testType) == 0) + if(LookupAccountName(NULL, accountName, (void*)sid, &sidLen, domain, &domainLen, &testType) == 0) { result = GetLastError(); - } - else - { - result = 0; + goto exit; } +exit: + *sidBufLen = sidLen; - BinToHexStr(sid, sidLen, sidHexStr); + quickFree(&domain); return result; } // **************************************************************** -// GetAccountNameBySIDHexStr +// GetAccountNameBySID // **************************************************************** -int GetAccountNameBySIDHexStr(char* sidHexStr, char** accountName) +int GetAccountNameBySID(char* sid, char* accountName, unsigned long* accountNameBufLen) { int result = 0; - char* sid; - unsigned long sidLen = 0; - char* domain; + unsigned long accountNameLen = 0; unsigned long domainLen = 0; + char* domain = NULL; SID_NAME_USE testType; - unsigned long accountNameLen = 0; + LookupAccountSid(NULL, sid, NULL, &accountNameLen, NULL, &domainLen, &testType); - HexStrToBin(sidHexStr, &sid, &sidLen); - if(LookupAccountSid(NULL, sid, NULL, &accountNameLen, NULL, &domainLen, &testType) == 0) + if(accountName == NULL) { - result = GetLastError(); + result = 0; + goto exit; + } + if(*accountNameBufLen < accountNameLen) + { + result = -1; + goto exit; } - domain = (char*)malloc(domainLen); - *accountName = (char*)calloc(accountNameLen, sizeof(char)); - if(LookupAccountSid(NULL, sid, *accountName, &accountNameLen, domain, &domainLen, &testType) == 0) + if(LookupAccountSid(NULL, sid, accountName, &accountNameLen, domain, &domainLen, &testType) == 0) { result = GetLastError(); + goto exit; } - else - { - result = 0; - } + +exit: + *accountNameBufLen = accountNameLen; + + quickFree(&domain); return result; } @@ -246,7 +254,7 @@ int GetAccountNameBySIDHexStr(char* sidHexStr, char** accountName) // **************************************************************** NTUser::NTUser() { - userInfo = NULL; + currentAccountName = NULL; groupsInfo = NULL; currentGroupEntry = 0; @@ -257,6 +265,8 @@ NTUser::NTUser() currentLocalGroupEntry = 0; localGroupEntriesRead = 0; localGroupEntriesTotal = 0; + + resultBuf = NULL; } // **************************************************************** @@ -264,11 +274,7 @@ NTUser::NTUser() // **************************************************************** NTUser::~NTUser() { - if(userInfo != NULL) - { - NetApiBufferFree(userInfo); - userInfo = NULL; - } + quickFree((char**)¤tAccountName); if(groupsInfo != NULL) { NetApiBufferFree(groupsInfo); @@ -279,35 +285,42 @@ NTUser::~NTUser() NetApiBufferFree(localGroupsInfo); localGroupsInfo = NULL; } + quickFree((char**)&resultBuf); } // **************************************************************** // NTUser::NewUser // **************************************************************** -void NTUser::NewUser(char* username) +int NTUser::NewUser(char* username) { - if(userInfo != NULL) - { - NetApiBufferFree(userInfo); - userInfo = NULL; - } + int result = 0; + unsigned long length; + PUSER_INFO_3 info = NULL; + DWORD badParam = 0; - NetApiBufferAllocate(sizeof(USER_INFO_3),(LPVOID*)&userInfo); - memset(userInfo, 0, sizeof(USER_INFO_3)); - userInfo->usri3_name = UTF8ToUTF16(username); + quickFree((char**)¤tAccountName); + UTF8ToUTF16(username, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(username, currentAccountName, &length); - // Possible required inits for AddUser - //userInfo->usri3_priv = USER_PRIV_USER; - //userInfo->usri3_home_dir = NULL; - //userInfo->usri3_comment = NULL; - //userInfo->usri3_script_path = NULL; + info = (USER_INFO_3*)malloc(sizeof(USER_INFO_3)); + memset(info, 0, sizeof(USER_INFO_3)); + info->usri3_name = currentAccountName; // NT4 required inits for AddUser - userInfo->usri3_flags = UF_SCRIPT; - userInfo->usri3_primary_group_id = DOMAIN_GROUP_RID_USERS; + info->usri3_flags = UF_SCRIPT; + info->usri3_primary_group_id = DOMAIN_GROUP_RID_USERS; // Other inits - userInfo->usri3_acct_expires = (unsigned long)-1; + info->usri3_acct_expires = (unsigned long)-1; + + // Add user + result = NetUserAdd(NULL, USER_INFO_LEVEL, (unsigned char*)info, &badParam); + + // Free buffers + quickFree((char**)&info); + + return result; } // **************************************************************** @@ -316,14 +329,15 @@ void NTUser::NewUser(char* username) int NTUser::RetriveUserByAccountName(char* username) { int result; + unsigned long length = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) - { - NetApiBufferFree(userInfo); - userInfo = NULL; - } + quickFree((char**)¤tAccountName); + UTF8ToUTF16(username, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(username, currentAccountName, &length); - result = NetUserGetInfo(NULL, UTF8ToUTF16(username), USER_INFO_LEVEL, (unsigned char**)&userInfo); + result = NetUserGetInfo(NULL, currentAccountName, USER_INFO_LEVEL, (unsigned char**)&info); return result; } @@ -334,19 +348,23 @@ int NTUser::RetriveUserByAccountName(char* username) int NTUser::RetriveUserBySIDHexStr(char* sidHexStr) { int result = 0; + unsigned long length = 0; char* username; + char* sid; - if(userInfo != NULL) - { - NetApiBufferFree(userInfo); - userInfo = NULL; - } + quickFree((char**)¤tAccountName); + + HexStrToBin(sidHexStr, NULL, &length); + sid = (char*)malloc(length); + HexStrToBin(sidHexStr, sid, &length); - if(GetAccountNameBySIDHexStr(sidHexStr, &username) != 0) + if(GetAccountNameBySID(sid, NULL, &length) != 0) { result = -1; goto exit; } + username = (char*)malloc(length); + GetAccountNameBySID(sid, username, &length); if(RetriveUserByAccountName(username) != 0) { @@ -355,37 +373,8 @@ int NTUser::RetriveUserBySIDHexStr(char* sidHexStr) } exit: - return result; -} - -// **************************************************************** -// NTUser::StoreUser -// **************************************************************** -int NTUser::StoreUser() -{ - int result = 0; - - if(userInfo != NULL) - { - result = NetUserSetInfo(NULL, userInfo->usri3_name, USER_INFO_LEVEL, (unsigned char*)userInfo, NULL); - } - else - { - result = -1; - } - - return result; -} - -// **************************************************************** -// NTUser::AddUser -// **************************************************************** -int NTUser::AddUser() -{ - int result; - DWORD badParam = 0; - - result = NetUserAdd(NULL, USER_INFO_LEVEL, (unsigned char*)userInfo, &badParam); + quickFree(&sid); + quickFree(&username); return result; } @@ -393,34 +382,21 @@ int NTUser::AddUser() // **************************************************************** // NTUser::DeleteUser // **************************************************************** -int NTUser::DeleteUser(char* username) -{ - int result; - - result = NetUserDel(NULL, UTF8ToUTF16(username)); - - return result; -} - -// **************************************************************** -// NTUser::ChangeUsername -// **************************************************************** -int NTUser::ChangeUsername(char* oldUsername, char* newUsername) +int NTUser::DeleteUser() { int result; - if((result = RetriveUserByAccountName(oldUsername)) == 0) + if(currentAccountName == NULL) { - userInfo->usri3_name = UTF8ToUTF16(newUsername); - if((result = AddUser()) == 0) - { - if((result = DeleteUser(oldUsername)) != 0) - { - DeleteUser(newUsername); - } - } + result = -1; + goto exit; } + result = NetUserDel(NULL, currentAccountName); + + quickFree((char**)¤tAccountName); + +exit: return result; } @@ -430,12 +406,21 @@ int NTUser::ChangeUsername(char* oldUsername, char* newUsername) char* NTUser::GetAccountName() { char* result = NULL; + unsigned long length = 0; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(userInfo->usri3_name); + goto exit; + result = NULL; } + quickFree(&resultBuf); + UTF16ToUTF8(currentAccountName, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, resultBuf, &length); + result = resultBuf; + +exit: return result; } @@ -445,11 +430,38 @@ char* NTUser::GetAccountName() char* NTUser::GetSIDHexStr() { char* result = NULL; + unsigned long length = 0; + unsigned long binLength = 0; + char* username = NULL; + char* sid = NULL; + + if(currentAccountName == NULL) + { + result = NULL; + goto exit; + } - if(userInfo != NULL) + UTF16ToUTF8(currentAccountName, NULL, &length); + username = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, username, &length); + + if(GetSIDByAccountName(username, NULL, &binLength) != 0) { - GetSIDHexStrByAccountName(UTF16ToUTF8(userInfo->usri3_name), &result); + result = NULL; + goto exit; } + sid = (char*)malloc(binLength); + GetSIDByAccountName(username, sid, &binLength); + + quickFree(&resultBuf); + BinToHexStr(sid, binLength, NULL, &length); + resultBuf = (char*)malloc(length); + BinToHexStr(sid, binLength, resultBuf, &length); + result = resultBuf; + +exit: + quickFree(&username); + quickFree(&sid); return result; } @@ -460,12 +472,25 @@ char* NTUser::GetSIDHexStr() unsigned long NTUser::GetAccountExpires() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_acct_expires; + result = 0; + goto exit; + } + + if((result = NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info)) != NERR_Success) + { + result = 0; + goto exit; } + result = info->usri3_acct_expires; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -475,16 +500,18 @@ unsigned long NTUser::GetAccountExpires() int NTUser::SetAccountExpires(unsigned long accountExpires) { int result = 0; + USER_INFO_1017 info; - if(userInfo != NULL) - { - userInfo->usri3_acct_expires = accountExpires; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } - + + info.usri1017_acct_expires = accountExpires; + result = NetUserSetInfo(NULL, currentAccountName, 1017, (unsigned char*)&info, NULL); + +exit: return result; } @@ -494,12 +521,25 @@ int NTUser::SetAccountExpires(unsigned long accountExpires) unsigned long NTUser::GetBadPasswordCount() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_bad_pw_count; + result = 0; + goto exit; + } + + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; } + result = info->usri3_bad_pw_count; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -509,12 +549,25 @@ unsigned long NTUser::GetBadPasswordCount() unsigned long NTUser::GetCodePage() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_code_page; + result = 0; + goto exit; + } + + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; } + result = info->usri3_code_page; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -524,16 +577,18 @@ unsigned long NTUser::GetCodePage() int NTUser::SetCodePage(unsigned long codePage) { int result = 0; + USER_INFO_1025 info; - if(userInfo != NULL) - { - userInfo->usri3_code_page = codePage; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + info.usri1025_code_page = codePage; + result = NetUserSetInfo(NULL, currentAccountName, 1025, (unsigned char*)&info, NULL); + +exit: return result; } @@ -543,12 +598,30 @@ int NTUser::SetCodePage(unsigned long codePage) char* NTUser::GetComment() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(userInfo->usri3_comment); + result = NULL; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_comment, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_comment, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -558,16 +631,26 @@ char* NTUser::GetComment() int NTUser::SetComment(char* comment) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1007 info; - if(userInfo != NULL) - { - userInfo->usri3_comment = UTF8ToUTF16(comment); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(comment, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(comment, wideStr, &length); + + info.usri1007_comment = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1007, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -577,12 +660,25 @@ int NTUser::SetComment(char* comment) unsigned long NTUser::GetCountryCode() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_country_code; + result = 0; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; + } + + result = info->usri3_country_code; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -592,16 +688,18 @@ unsigned long NTUser::GetCountryCode() int NTUser::SetCountryCode(unsigned long countryCode) { int result = 0; + USER_INFO_1024 info; - if(userInfo != NULL) - { - userInfo->usri3_country_code = countryCode; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + info.usri1024_country_code = countryCode; + result = NetUserSetInfo(NULL, currentAccountName, 1024, (unsigned char*)&info, NULL); + +exit: return result; } @@ -611,12 +709,25 @@ int NTUser::SetCountryCode(unsigned long countryCode) unsigned long NTUser::GetFlags() { unsigned long result = 0; + PUSER_INFO_3 info; + + if(currentAccountName == NULL) + { + result = 0; + goto exit; + } - if(userInfo != NULL) + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) { - result = userInfo->usri3_flags; + result = 0; + goto exit; } + result = info->usri3_flags; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -626,16 +737,18 @@ unsigned long NTUser::GetFlags() int NTUser::SetFlags(unsigned long flags) { int result = 0; + USER_INFO_1008 info; - if(userInfo != NULL) - { - userInfo->usri3_flags = flags; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } - + + info.usri1008_flags = flags; + result = NetUserSetInfo(NULL, currentAccountName, 1008, (unsigned char*)&info, NULL); + +exit: return result; } @@ -645,12 +758,30 @@ int NTUser::SetFlags(unsigned long flags) char* NTUser::GetHomeDir() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; + + if(currentAccountName == NULL) + { + result = NULL; + goto exit; + } - if(userInfo != NULL) + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) { - result = UTF16ToUTF8(userInfo->usri3_home_dir); + result = NULL; + goto exit; } + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_home_dir, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_home_dir, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -660,16 +791,26 @@ char* NTUser::GetHomeDir() int NTUser::SetHomeDir(char* path) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1006 info; - if(userInfo != NULL) - { - userInfo->usri3_home_dir = UTF8ToUTF16(path); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(path, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(path, wideStr, &length); + + info.usri1006_home_dir = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1006, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -679,12 +820,30 @@ int NTUser::SetHomeDir(char* path) char* NTUser::GetHomeDirDrive() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(userInfo->usri3_home_dir_drive); + result = NULL; + goto exit; + } + + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; } + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_home_dir_drive, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_home_dir_drive, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -694,16 +853,26 @@ char* NTUser::GetHomeDirDrive() int NTUser::SetHomeDirDrive(char* path) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1053 info; - if(userInfo != NULL) - { - userInfo->usri3_home_dir_drive = UTF8ToUTF16(path); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(path, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(path, wideStr, &length); + + info.usri1053_home_dir_drive = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1053, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -713,12 +882,25 @@ int NTUser::SetHomeDirDrive(char* path) unsigned long NTUser::GetLastLogoff() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_last_logoff; + result = 0; + goto exit; + } + + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; } + result = info->usri3_last_logoff; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -728,12 +910,25 @@ unsigned long NTUser::GetLastLogoff() unsigned long NTUser::GetLastLogon() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_last_logon; + result = 0; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; + } + + result = info->usri3_last_logon; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -743,12 +938,30 @@ unsigned long NTUser::GetLastLogon() char* NTUser::GetLogonHours() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - BinToHexStr((char*)userInfo->usri3_logon_hours, 21, &result); + result = NULL; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + BinToHexStr((char*)info->usri3_logon_hours, 21, NULL, &length); + resultBuf = (char*)malloc(length); + BinToHexStr((char*)info->usri3_script_path, 21, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -758,19 +971,26 @@ char* NTUser::GetLogonHours() int NTUser::SetLogonHours(char* logonHours) { int result = 0; - char* binValue; - unsigned long binLen = 0; + unsigned long length; + char* bin = NULL; + USER_INFO_1020 info; - if(userInfo != NULL) - { - HexStrToBin(logonHours, &binValue, &binLen); - userInfo->usri3_logon_hours = (unsigned char*)binValue; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + HexStrToBin(logonHours, NULL, &length); + bin = (char*)malloc(length); + HexStrToBin(logonHours, bin, &length); + + info.usri1020_logon_hours = (unsigned char*)bin; + result = NetUserSetInfo(NULL, currentAccountName, 1020, (unsigned char*)&info, NULL); + +exit: + quickFree(&bin); + return result; } @@ -780,12 +1000,25 @@ int NTUser::SetLogonHours(char* logonHours) unsigned long NTUser::GetMaxStorage() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_max_storage; + result = 0; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; + } + + result = info->usri3_max_storage; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -795,16 +1028,18 @@ unsigned long NTUser::GetMaxStorage() int NTUser::SetMaxStorage(unsigned long maxStorage) { int result = 0; + USER_INFO_1018 info; - if(userInfo != NULL) - { - userInfo->usri3_max_storage = maxStorage; - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + info.usri1018_max_storage = maxStorage; + result = NetUserSetInfo(NULL, currentAccountName, 1018, (unsigned char*)&info, NULL); + +exit: return result; } @@ -814,12 +1049,25 @@ int NTUser::SetMaxStorage(unsigned long maxStorage) unsigned long NTUser::GetNumLogons() { unsigned long result = 0; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = userInfo->usri3_num_logons; + result = 0; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = 0; + goto exit; + } + + result = info->usri3_num_logons; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -829,12 +1077,30 @@ unsigned long NTUser::GetNumLogons() char* NTUser::GetProfile() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(userInfo->usri3_profile); + result = NULL; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_profile, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_profile, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -844,16 +1110,26 @@ char* NTUser::GetProfile() int NTUser::SetProfile(char* path) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1052 info; - if(userInfo != NULL) - { - userInfo->usri3_profile = UTF8ToUTF16(path); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(path, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(path, wideStr, &length); + + info.usri1052_profile = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1052, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -863,12 +1139,30 @@ int NTUser::SetProfile(char* path) char* NTUser::GetScriptPath() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; + + if(currentAccountName == NULL) + { + result = NULL; + goto exit; + } - if(userInfo != NULL) + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) { - result = UTF16ToUTF8(userInfo->usri3_script_path); + result = NULL; + goto exit; } + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_script_path, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_script_path, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -878,16 +1172,26 @@ char* NTUser::GetScriptPath() int NTUser::SetScriptPath(char* path) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1009 info; - if(userInfo != NULL) - { - userInfo->usri3_script_path = UTF8ToUTF16(path); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(path, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(path, wideStr, &length); + + info.usri1009_script_path = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1009, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -897,12 +1201,30 @@ int NTUser::SetScriptPath(char* path) char* NTUser::GetWorkstations() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; + + if(currentAccountName == NULL) + { + result = NULL; + goto exit; + } - if(userInfo != NULL) + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) { - result = UTF16ToUTF8(userInfo->usri3_workstations); + result = NULL; + goto exit; } + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_workstations, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_workstations, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -912,16 +1234,26 @@ char* NTUser::GetWorkstations() int NTUser::SetWorkstations(char* workstations) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1014 info; - if(userInfo != NULL) - { - userInfo->usri3_workstations = UTF8ToUTF16(workstations); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(workstations, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(workstations, wideStr, &length); + + info.usri1014_workstations = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1014, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -931,12 +1263,30 @@ int NTUser::SetWorkstations(char* workstations) char* NTUser::GetFullname() { char* result = NULL; + unsigned long length; + PUSER_INFO_3 info; - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(userInfo->usri3_full_name); + result = NULL; + goto exit; } + if(NetUserGetInfo(NULL, currentAccountName, 3, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + UTF16ToUTF8(info->usri3_full_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->usri3_full_name, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -946,16 +1296,26 @@ char* NTUser::GetFullname() int NTUser::SetFullname(char* fullname) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1011 info; - if(userInfo != NULL) - { - userInfo->usri3_full_name = UTF8ToUTF16(fullname); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(fullname, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(fullname, wideStr, &length); + + info.usri1011_full_name = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1011, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -965,16 +1325,26 @@ int NTUser::SetFullname(char* fullname) int NTUser::SetPassword(char* password) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + USER_INFO_1003 info; - if(userInfo != NULL) - { - userInfo->usri3_password = UTF8ToUTF16(password); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(password, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(password, wideStr, &length); + + info.usri1003_password = wideStr; + result = NetUserSetInfo(NULL, currentAccountName, 1003, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -984,16 +1354,24 @@ int NTUser::SetPassword(char* password) int NTUser::AddToGroup(char* groupName) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; - if(userInfo != NULL) - { - result = NetGroupAddUser(NULL, UTF8ToUTF16(groupName), userInfo->usri3_name); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(groupName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(groupName, wideStr, &length); + + result = NetGroupAddUser(NULL, wideStr, currentAccountName); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1003,16 +1381,24 @@ int NTUser::AddToGroup(char* groupName) int NTUser::RemoveFromGroup(char* groupName) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; - if(userInfo != NULL) - { - result = NetGroupDelUser(NULL, UTF8ToUTF16(groupName), userInfo->usri3_name); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(groupName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(groupName, wideStr, &length); + + result = NetGroupDelUser(NULL, wideStr, currentAccountName); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1023,23 +1409,24 @@ int NTUser::LoadGroups() { int result = 0; - if(userInfo != NULL) + if(currentAccountName == NULL) { - if(groupsInfo != NULL) - { - NetApiBufferFree(groupsInfo); - groupsInfo = NULL; - currentGroupEntry = 0; - groupEntriesRead = 0; - groupEntriesTotal = 0; - } - result = NetUserGetGroups(NULL, userInfo->usri3_name, USER_GROUPS_INFO_LEVEL, (unsigned char**)&groupsInfo, MAX_PREFERRED_LENGTH, &groupEntriesRead, &groupEntriesTotal); + result = -1; + goto exit; } - else + + if(groupsInfo != NULL) { - result = -1; + NetApiBufferFree(groupsInfo); + groupsInfo = NULL; + currentGroupEntry = 0; + groupEntriesRead = 0; + groupEntriesTotal = 0; } + result = NetUserGetGroups(NULL, currentAccountName, USER_GROUPS_INFO_LEVEL, (unsigned char**)&groupsInfo, MAX_PREFERRED_LENGTH, &groupEntriesRead, &groupEntriesTotal); + +exit: return result; } @@ -1067,17 +1454,21 @@ bool NTUser::HasMoreGroups() // **************************************************************** char* NTUser::NextGroupName() { - char* groupName = NULL; - GROUP_USERS_INFO_0* thisEntry; + char* result = NULL; + unsigned long length; if(currentGroupEntry < groupEntriesRead) { - thisEntry = &(groupsInfo[currentGroupEntry]); - groupName = UTF16ToUTF8(thisEntry->grui0_name); + quickFree(&resultBuf); + UTF16ToUTF8(groupsInfo[currentGroupEntry].grui0_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(groupsInfo[currentGroupEntry].grui0_name, resultBuf, &length); + result = resultBuf; + currentGroupEntry++; } - return groupName; + return result; } // **************************************************************** @@ -1086,6 +1477,8 @@ char* NTUser::NextGroupName() int NTUser::AddToLocalGroup(char* localGroupName) { int result = 0; + unsigned long length; + unsigned short* wideStr; char userSID[256]; wchar_t domain[256]; DWORD SIDLen = sizeof(userSID); @@ -1096,21 +1489,27 @@ int NTUser::AddToLocalGroup(char* localGroupName) memset(&domain, 0, sizeof(domain)); memset(&userSID, 0, sizeof(userSID)); - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = LookupAccountName(NULL, UTF16ToUTF8(userInfo->usri3_name), &userSID, &SIDLen, (LPTSTR)&domain, &domainLen, &SIDUseIndicator); - - if(result != 0) - { - membersbuf[0].lgrmi0_sid = &userSID; - result = NetLocalGroupAddMembers(NULL, UTF8ToUTF16(localGroupName), 0, (LPBYTE)&membersbuf, 1); - } + result = -1; + goto exit; } - else + + result = LookupAccountName(NULL, GetAccountName(), &userSID, &SIDLen, (LPTSTR)&domain, &domainLen, &SIDUseIndicator); + + if(result != 0) { - result = -1; + membersbuf[0].lgrmi0_sid = &userSID; + + UTF8ToUTF16(localGroupName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(localGroupName, wideStr, &length); + result = NetLocalGroupAddMembers(NULL, wideStr, 0, (LPBYTE)&membersbuf, 1); } +exit: + quickFree((char**)&wideStr); + return result; } @@ -1120,6 +1519,8 @@ int NTUser::AddToLocalGroup(char* localGroupName) int NTUser::RemoveFromLocalGroup(char* localGroupName) { int result = 0; + unsigned long length; + unsigned short* wideStr; char userSID[256]; wchar_t domain[256]; DWORD SIDLen = sizeof(userSID); @@ -1130,21 +1531,27 @@ int NTUser::RemoveFromLocalGroup(char* localGroupName) memset(&domain, 0, sizeof(domain)); memset(&userSID, 0, sizeof(userSID)); - if(userInfo != NULL) + if(currentAccountName == NULL) { - result = LookupAccountName(NULL, UTF16ToUTF8(userInfo->usri3_name), &userSID, &SIDLen, (LPTSTR)&domain, &domainLen, &SIDUseIndicator); - - if(result != 0) - { - membersbuf[0].lgrmi0_sid = &userSID; - result = NetLocalGroupDelMembers(NULL, UTF8ToUTF16(localGroupName), 0, (LPBYTE)&membersbuf, 1); - } + result = -1; + goto exit; } - else + + result = LookupAccountName(NULL, GetAccountName(), &userSID, &SIDLen, (LPTSTR)&domain, &domainLen, &SIDUseIndicator); + + if(result != 0) { - result = -1; + membersbuf[0].lgrmi0_sid = &userSID; + + UTF8ToUTF16(localGroupName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(localGroupName, wideStr, &length); + result = NetLocalGroupDelMembers(NULL, wideStr, 0, (LPBYTE)&membersbuf, 1); } +exit: + quickFree((char**)&wideStr); + return result; } @@ -1155,24 +1562,24 @@ int NTUser::LoadLocalGroups() { int result = 0; - if(userInfo != NULL) + if(currentAccountName == NULL) { - if(localGroupsInfo != NULL) - { - NetApiBufferFree(localGroupsInfo); - localGroupsInfo = NULL; - currentLocalGroupEntry = 0; - localGroupEntriesRead = 0; - localGroupEntriesTotal = 0; - } - - result = NetUserGetLocalGroups(NULL, userInfo->usri3_name, 0, USER_LOCALGROUPS_INFO_LEVEL, (unsigned char**)&localGroupsInfo, MAX_PREFERRED_LENGTH, &localGroupEntriesRead, &localGroupEntriesTotal); + result = -1; + goto exit; } - else + + if(localGroupsInfo != NULL) { - result = -1; + NetApiBufferFree(localGroupsInfo); + localGroupsInfo = NULL; + currentLocalGroupEntry = 0; + localGroupEntriesRead = 0; + localGroupEntriesTotal = 0; } + result = NetUserGetLocalGroups(NULL, currentAccountName, 0, USER_LOCALGROUPS_INFO_LEVEL, (unsigned char**)&localGroupsInfo, MAX_PREFERRED_LENGTH, &localGroupEntriesRead, &localGroupEntriesTotal); + +exit: return result; } @@ -1200,17 +1607,21 @@ bool NTUser::HasMoreLocalGroups() // **************************************************************** char* NTUser::NextLocalGroupName() { - char* localGroupName = NULL; - LOCALGROUP_USERS_INFO_0* thisEntry; + char* result = NULL; + unsigned long length; if(currentLocalGroupEntry < localGroupEntriesRead) { - thisEntry = &(localGroupsInfo[currentLocalGroupEntry]); - localGroupName = UTF16ToUTF8(thisEntry->lgrui0_name); + quickFree(&resultBuf); + UTF16ToUTF8(localGroupsInfo[currentLocalGroupEntry].lgrui0_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(localGroupsInfo[currentLocalGroupEntry].lgrui0_name, resultBuf, &length); + result = resultBuf; + currentLocalGroupEntry++; } - return localGroupName; + return result; } // **************************************************************** @@ -1218,11 +1629,10 @@ char* NTUser::NextLocalGroupName() // **************************************************************** NTUserList::NTUserList() { - entriesRead = 0; - totalEntries = 0; bufptr = NULL; currentEntry = 0; resumeHandle = 0; + resultBuf = NULL; } // **************************************************************** @@ -1235,6 +1645,7 @@ NTUserList::~NTUserList() NetApiBufferFree(bufptr); bufptr = NULL; } + quickFree(&resultBuf); } // **************************************************************** @@ -1273,17 +1684,21 @@ bool NTUserList::hasMore() // **************************************************************** char* NTUserList::nextUsername() { - char* username = NULL; - USER_INFO_3* thisEntry; + char* result = NULL; + unsigned long length; if(currentEntry < entriesRead) { - thisEntry = &(bufptr[currentEntry]); - username = UTF16ToUTF8(thisEntry->usri3_name); + quickFree(&resultBuf); + UTF16ToUTF8(bufptr[currentEntry].usri3_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(bufptr[currentEntry].usri3_name, resultBuf, &length); + result = resultBuf; + currentEntry++; } - return username; + return result; } // **************************************************************** @@ -1291,11 +1706,12 @@ char* NTUserList::nextUsername() // **************************************************************** NTGroup::NTGroup() { - groupInfo = NULL; + currentAccountName = NULL; usersInfo = NULL; currentUserEntry = 0; userEntriesRead = 0; userEntriesTotal = 0; + resultBuf = NULL; } // **************************************************************** @@ -1303,60 +1719,59 @@ NTGroup::NTGroup() // **************************************************************** NTGroup::~NTGroup() { - if(groupInfo != NULL) - { - NetApiBufferFree(groupInfo); - groupInfo = NULL; - } + quickFree((char**)¤tAccountName); if(usersInfo != NULL) { NetApiBufferFree(usersInfo); usersInfo = NULL; } + quickFree(&resultBuf); } // **************************************************************** // NTGroup::NewGroup // **************************************************************** -void NTGroup::NewGroup(char* groupName) +int NTGroup::NewGroup(char* groupName) { - if(groupInfo != NULL) - { - NetApiBufferFree(groupInfo); - groupInfo = NULL; - } + int result = 0; + unsigned long length; + PGROUP_INFO_2 info = NULL; + DWORD badParam = 0; - NetApiBufferAllocate(sizeof(GROUP_INFO_2),(LPVOID*)&groupInfo); - memset(groupInfo, 0, sizeof(GROUP_INFO_2)); - groupInfo->grpi2_name = UTF8ToUTF16(groupName); -} + quickFree((char**)¤tAccountName); -// **************************************************************** -// NTGroup::DeleteGroup -// **************************************************************** -int NTGroup::DeleteGroup(char* groupName) -{ - int result; + UTF8ToUTF16(groupName, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(groupName, currentAccountName, &length); + + info = (PGROUP_INFO_2)malloc(sizeof(GROUP_INFO_2)); + memset(info, 0, sizeof(GROUP_INFO_2)); + info->grpi2_name = currentAccountName; + + // Add group + result = NetGroupAdd(NULL, GROUP_INFO_LEVEL, (unsigned char*)info, &badParam); - result = NetGroupDel(NULL, UTF8ToUTF16(groupName)); + // Free buffers + quickFree((char**)&info); return result; } // **************************************************************** -// NTGroup::RetriveGroup +// NTGroup::RetriveGroupByAccountName // **************************************************************** int NTGroup::RetriveGroupByAccountName(char* groupName) { int result; + unsigned long length; + PGROUP_INFO_2 info = NULL; - if(groupInfo != NULL) - { - NetApiBufferFree(groupInfo); - groupInfo = NULL; - } + quickFree((char**)¤tAccountName); + UTF8ToUTF16(groupName, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(groupName, currentAccountName, &length); - result = NetGroupGetInfo(NULL, UTF8ToUTF16(groupName), GROUP_INFO_LEVEL, (unsigned char**)&groupInfo); + result = NetGroupGetInfo(NULL, currentAccountName, GROUP_INFO_LEVEL, (unsigned char**)&info); return result; } @@ -1367,19 +1782,23 @@ int NTGroup::RetriveGroupByAccountName(char* groupName) int NTGroup::RetriveGroupBySIDHexStr(char* sidHexStr) { int result = 0; + unsigned long length; char* groupName; + char* sid; - if(groupInfo != NULL) - { - NetApiBufferFree(groupInfo); - groupInfo = NULL; - } + quickFree((char**)¤tAccountName); + + HexStrToBin(sidHexStr, NULL, &length); + sid = (char*)malloc(length); + HexStrToBin(sidHexStr, sid, &length); - if(GetAccountNameBySIDHexStr(sidHexStr, &groupName) != 0) + if(GetAccountNameBySID(sid, NULL, &length) != 0) { result = -1; goto exit; } + groupName = (char*)malloc(length); + GetAccountNameBySID(sid, groupName, &length); if(RetriveGroupByAccountName(groupName) != 0) { @@ -1388,34 +1807,30 @@ int NTGroup::RetriveGroupBySIDHexStr(char* sidHexStr) } exit: - return result; -} - -// **************************************************************** -// NTGroup::AddGroup -// **************************************************************** -int NTGroup::AddGroup() -{ - int result; - DWORD badParam = 0; - - result = NetGroupAdd(NULL, GROUP_INFO_LEVEL, (unsigned char*)groupInfo, &badParam); + quickFree(&sid); + quickFree(&groupName); return result; } // **************************************************************** -// NTGroup::StoreGroup +// NTGroup::DeleteGroup // **************************************************************** -int NTGroup::StoreGroup() +int NTGroup::DeleteGroup() { - int result = -1; + int result; - if(groupInfo != NULL) + if(currentAccountName == NULL) { - result = NetGroupSetInfo(NULL, groupInfo->grpi2_name, GROUP_INFO_LEVEL, (unsigned char*)groupInfo, NULL); + result = -1; + goto exit; } + result = NetGroupDel(NULL, currentAccountName); + + quickFree((char**)¤tAccountName); + +exit: return result; } @@ -1425,12 +1840,21 @@ int NTGroup::StoreGroup() char* NTGroup::GetAccountName() { char* result = NULL; + unsigned long length = 0; - if(groupInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(groupInfo->grpi2_name); + goto exit; + result = NULL; } + quickFree(&resultBuf); + UTF16ToUTF8(currentAccountName, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, resultBuf, &length); + result = resultBuf; + +exit: return result; } @@ -1438,14 +1862,41 @@ char* NTGroup::GetAccountName() // NTGroup::GetSIDHexStr // **************************************************************** char* NTGroup::GetSIDHexStr() -{ +{ char* result = NULL; + unsigned long length = 0; + unsigned long binLength = 0; + char* groupName = NULL; + char* sid = NULL; - if(groupInfo != NULL) + if(currentAccountName == NULL) { - GetSIDHexStrByAccountName(UTF16ToUTF8(groupInfo->grpi2_name), &result); + result = NULL; + goto exit; } + UTF16ToUTF8(currentAccountName, NULL, &length); + groupName = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, groupName, &length); + + if(GetSIDByAccountName(groupName, NULL, &binLength) != 0) + { + result = NULL; + goto exit; + } + sid = (char*)malloc(binLength); + GetSIDByAccountName(groupName, sid, &binLength); + + quickFree(&resultBuf); + BinToHexStr(sid, binLength, NULL, &length); + resultBuf = (char*)malloc(length); + BinToHexStr(sid, binLength, resultBuf, &length); + result = resultBuf; + +exit: + quickFree(&groupName); + quickFree(&sid); + return result; } @@ -1455,12 +1906,30 @@ char* NTGroup::GetSIDHexStr() char* NTGroup::GetComment() { char* result = NULL; + unsigned long length; + PGROUP_INFO_2 info; - if(groupInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(groupInfo->grpi2_comment); + result = NULL; + goto exit; } + if(NetGroupGetInfo(NULL, currentAccountName, 2, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + UTF16ToUTF8(info->grpi2_comment, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->grpi2_comment, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -1470,16 +1939,26 @@ char* NTGroup::GetComment() int NTGroup::SetComment(char* comment) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + GROUP_INFO_1002 info; - if(groupInfo != NULL) - { - groupInfo->grpi2_comment = UTF8ToUTF16(comment); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(comment, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(comment, wideStr, &length); + + info.grpi1002_comment = wideStr; + result = NetGroupSetInfo(NULL, currentAccountName, 1002, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1489,16 +1968,24 @@ int NTGroup::SetComment(char* comment) int NTGroup::AddUser(char* userName) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; - if(groupInfo != NULL) - { - result = NetGroupAddUser(NULL, groupInfo->grpi2_name, UTF8ToUTF16(userName)); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(userName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(userName, wideStr, &length); + + result = NetGroupAddUser(NULL, currentAccountName, wideStr); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1508,16 +1995,24 @@ int NTGroup::AddUser(char* userName) int NTGroup::RemoveUser(char* userName) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; - if(groupInfo != NULL) - { - result = NetGroupDelUser(NULL, groupInfo->grpi2_name, UTF8ToUTF16(userName)); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(userName, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(userName, wideStr, &length); + + result = NetGroupDelUser(NULL, currentAccountName, wideStr); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1528,23 +2023,23 @@ int NTGroup::LoadUsers() { int result = 0; - if(groupInfo != NULL) + if(currentAccountName == NULL) { - if(usersInfo != NULL) - { - NetApiBufferFree(usersInfo); - usersInfo = NULL; - currentUserEntry = 0; - userEntriesRead = 0; - userEntriesTotal = 0; - } - result = NetGroupGetUsers(NULL, groupInfo->grpi2_name, GROUP_USERS_INFO_LEVEL, (unsigned char**)&usersInfo, MAX_PREFERRED_LENGTH, &userEntriesRead, &userEntriesTotal, NULL); + result = -1; + goto exit; } - else + + if(usersInfo != NULL) { - result = -1; + NetApiBufferFree(usersInfo); + usersInfo = NULL; + currentUserEntry = 0; + userEntriesRead = 0; + userEntriesTotal = 0; } + result = NetGroupGetUsers(NULL, currentAccountName, GROUP_USERS_INFO_LEVEL, (unsigned char**)&usersInfo, MAX_PREFERRED_LENGTH, &userEntriesRead, &userEntriesTotal, NULL); +exit: return result; } @@ -1572,17 +2067,21 @@ bool NTGroup::HasMoreUsers() // **************************************************************** char* NTGroup::NextUserName() { - char* userName = NULL; - LOCALGROUP_USERS_INFO_0* thisEntry; + char* result = NULL; + unsigned long length; if(currentUserEntry < userEntriesRead) { - thisEntry = &(usersInfo[currentUserEntry]); - userName = UTF16ToUTF8(thisEntry->lgrui0_name); + quickFree(&resultBuf); + UTF16ToUTF8(usersInfo[currentUserEntry].lgrui0_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(usersInfo[currentUserEntry].lgrui0_name, resultBuf, &length); + result = resultBuf; + currentUserEntry++; } - return userName; + return result; } // **************************************************************** @@ -1590,11 +2089,10 @@ char* NTGroup::NextUserName() // **************************************************************** NTGroupList::NTGroupList() { - entriesRead = 0; - totalEntries = 0; bufptr = NULL; currentEntry = 0; resumeHandle = 0; + resultBuf = NULL; } // **************************************************************** @@ -1607,6 +2105,7 @@ NTGroupList::~NTGroupList() NetApiBufferFree(bufptr); bufptr = NULL; } + quickFree(&resultBuf); } // **************************************************************** @@ -1645,17 +2144,21 @@ bool NTGroupList::hasMore() // **************************************************************** char* NTGroupList::nextGroupName() { - char* groupName = NULL; - GROUP_INFO_2* thisEntry; + char* result = NULL; + unsigned long length; if(currentEntry < entriesRead) { - thisEntry = &(bufptr[currentEntry]); - groupName = UTF16ToUTF8(thisEntry->grpi2_name); + quickFree(&resultBuf); + UTF16ToUTF8(bufptr[currentEntry].grpi2_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(bufptr[currentEntry].grpi2_name, resultBuf, &length); + result = resultBuf; + currentEntry++; } - return groupName; + return result; } // **************************************************************** @@ -1663,11 +2166,12 @@ char* NTGroupList::nextGroupName() // **************************************************************** NTLocalGroup::NTLocalGroup() { - localGroupInfo = NULL; + currentAccountName = NULL; usersInfo = NULL; currentUserEntry = 0; userEntriesRead = 0; userEntriesTotal = 0; + resultBuf = NULL; } // **************************************************************** @@ -1675,60 +2179,59 @@ NTLocalGroup::NTLocalGroup() // **************************************************************** NTLocalGroup::~NTLocalGroup() { - if(localGroupInfo != NULL) - { - NetApiBufferFree(localGroupInfo); - localGroupInfo = NULL; - } + quickFree((char**)¤tAccountName); if(usersInfo != NULL) { NetApiBufferFree(usersInfo); usersInfo = NULL; } + quickFree(&resultBuf); } // **************************************************************** // NTLocalGroup::NewLocalGroup // **************************************************************** -void NTLocalGroup::NewLocalGroup(char* localGroupName) +int NTLocalGroup::NewLocalGroup(char* localGroupName) { - if(localGroupInfo != NULL) - { - NetApiBufferFree(localGroupInfo); - localGroupInfo = NULL; - } - NetApiBufferAllocate(sizeof(LOCALGROUP_INFO_1),(LPVOID*)&localGroupInfo); - memset(localGroupInfo, 0, sizeof(LOCALGROUP_INFO_1)); - localGroupInfo->lgrpi1_name = UTF8ToUTF16(localGroupName); -} + int result = 0; + unsigned long length; + PLOCALGROUP_INFO_1 info = NULL; + DWORD badParam = 0; -// **************************************************************** -// NTLocalGroup::DeleteLocalGroup -// **************************************************************** -int NTLocalGroup::DeleteLocalGroup(char* localGroupName) -{ - int result; + quickFree((char**)¤tAccountName); + UTF8ToUTF16(localGroupName, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(localGroupName, currentAccountName, &length); + + info = (PLOCALGROUP_INFO_1)malloc(sizeof(LOCALGROUP_INFO_1)); + memset(info, 0, sizeof(LOCALGROUP_INFO_1)); + info->lgrpi1_name = currentAccountName; + + // Add group + result = NetLocalGroupAdd(NULL, LOCALGROUP_INFO_LEVEL, (unsigned char*)info, &badParam); - result = NetLocalGroupDel(NULL, UTF8ToUTF16(localGroupName)); + // Free buffers + quickFree((char**)&info); return result; } // **************************************************************** -// NTLocalGroup::RetriveLocalGroup +// NTLocalGroup::RetriveLocalGroupByAccountName // **************************************************************** int NTLocalGroup::RetriveLocalGroupByAccountName(char* localGroupName) { int result; + unsigned long length; + PLOCALGROUP_INFO_1 info = NULL; - if(localGroupInfo != NULL) - { - NetApiBufferFree(localGroupInfo); - localGroupInfo = NULL; - } + quickFree((char**)¤tAccountName); + UTF8ToUTF16(localGroupName, NULL, &length); + currentAccountName = (unsigned short*)malloc(length); + UTF8ToUTF16(localGroupName, currentAccountName, &length); - result = NetLocalGroupGetInfo(NULL, UTF8ToUTF16(localGroupName), LOCALGROUP_INFO_LEVEL, (unsigned char**)&localGroupInfo); + result = NetLocalGroupGetInfo(NULL, currentAccountName, LOCALGROUP_INFO_LEVEL, (unsigned char**)&info); return result; } @@ -1739,19 +2242,23 @@ int NTLocalGroup::RetriveLocalGroupByAccountName(char* localGroupName) int NTLocalGroup::RetriveLocalGroupBySIDHexStr(char* sidHexStr) { int result = 0; + unsigned long length; char* localGroupName; + char* sid; - if(localGroupInfo != NULL) - { - NetApiBufferFree(localGroupInfo); - localGroupInfo = NULL; - } + quickFree((char**)¤tAccountName); + + HexStrToBin(sidHexStr, NULL, &length); + sid = (char*)malloc(length); + HexStrToBin(sidHexStr, sid, &length); - if(GetAccountNameBySIDHexStr(sidHexStr, &localGroupName) != 0) + if(GetAccountNameBySID(sid, NULL, &length) != 0) { result = -1; goto exit; } + localGroupName = (char*)malloc(length); + GetAccountNameBySID(sid, localGroupName, &length); if(RetriveLocalGroupByAccountName(localGroupName) != 0) { @@ -1760,38 +2267,30 @@ int NTLocalGroup::RetriveLocalGroupBySIDHexStr(char* sidHexStr) } exit: - return result; -} - -// **************************************************************** -// NTLocalGroup::AddLocalGroup -// **************************************************************** -int NTLocalGroup::AddLocalGroup() -{ - int result; - DWORD badParam = 0; - - result = NetLocalGroupAdd(NULL, LOCALGROUP_INFO_LEVEL, (unsigned char*)localGroupInfo, &badParam); + quickFree(&sid); + quickFree(&localGroupName); return result; } // **************************************************************** -// NTLocalGroup::StoreLocalGroup +// NTLocalGroup::DeleteLocalGroup // **************************************************************** -int NTLocalGroup::StoreLocalGroup() +int NTLocalGroup::DeleteLocalGroup() { - int result = 0; + int result; - if(localGroupInfo != NULL) - { - result = NetLocalGroupSetInfo(NULL, localGroupInfo->lgrpi1_name, LOCALGROUP_INFO_LEVEL, (unsigned char*)localGroupInfo, NULL); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + result = NetLocalGroupDel(NULL, currentAccountName); + + quickFree((char**)¤tAccountName); + +exit: return result; } @@ -1801,12 +2300,21 @@ int NTLocalGroup::StoreLocalGroup() char* NTLocalGroup::GetAccountName() { char* result = NULL; + unsigned long length = 0; - if(localGroupInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(localGroupInfo->lgrpi1_name); + goto exit; + result = NULL; } + quickFree((char**)&resultBuf); + UTF16ToUTF8(currentAccountName, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, resultBuf, &length); + result = resultBuf; + +exit: return result; } @@ -1816,11 +2324,38 @@ char* NTLocalGroup::GetAccountName() char* NTLocalGroup::GetSIDHexStr() { char* result = NULL; + unsigned long length = 0; + unsigned long binLength = 0; + char* localGroupName = NULL; + char* sid = NULL; + + if(currentAccountName == NULL) + { + result = NULL; + goto exit; + } + + UTF16ToUTF8(currentAccountName, NULL, &length); + localGroupName = (char*)malloc(length); + UTF16ToUTF8(currentAccountName, localGroupName, &length); - if(localGroupInfo != NULL) + if(GetSIDByAccountName(localGroupName, NULL, &binLength) != 0) { - GetSIDHexStrByAccountName(UTF16ToUTF8(localGroupInfo->lgrpi1_name), &result); + result = NULL; + goto exit; } + sid = (char*)malloc(binLength); + GetSIDByAccountName(localGroupName, sid, &binLength); + + quickFree(&resultBuf); + BinToHexStr(sid, binLength, NULL, &length); + resultBuf = (char*)malloc(length); + BinToHexStr(sid, binLength, resultBuf, &length); + result = resultBuf; + +exit: + quickFree(&localGroupName); + quickFree(&sid); return result; } @@ -1831,12 +2366,30 @@ char* NTLocalGroup::GetSIDHexStr() char* NTLocalGroup::GetComment() { char* result = NULL; + unsigned long length; + PLOCALGROUP_INFO_1 info; - if(localGroupInfo != NULL) + if(currentAccountName == NULL) { - result = UTF16ToUTF8(localGroupInfo->lgrpi1_comment); + result = NULL; + goto exit; } + if(NetLocalGroupGetInfo(NULL, currentAccountName, 1, (unsigned char**)&info) != NERR_Success) + { + result = NULL; + goto exit; + } + + quickFree(&resultBuf); + UTF16ToUTF8(info->lgrpi1_comment, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(info->lgrpi1_comment, resultBuf, &length); + result = resultBuf; + +exit: + NetApiBufferFree((void*)info); + return result; } @@ -1846,16 +2399,26 @@ char* NTLocalGroup::GetComment() int NTLocalGroup::SetComment(char* comment) { int result = 0; + unsigned long length; + unsigned short* wideStr = NULL; + LOCALGROUP_INFO_1002 info; - if(localGroupInfo != NULL) - { - localGroupInfo->lgrpi1_comment = UTF8ToUTF16(comment); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + UTF8ToUTF16(comment, NULL, &length); + wideStr = (unsigned short*)malloc(length); + UTF8ToUTF16(comment, wideStr, &length); + + info.lgrpi1002_comment = wideStr; + result = NetLocalGroupSetInfo(NULL, currentAccountName, 1002, (unsigned char*)&info, NULL); + +exit: + quickFree((char**)&wideStr); + return result; } @@ -1865,19 +2428,26 @@ int NTLocalGroup::SetComment(char* comment) int NTLocalGroup::AddUser(char* username) { int result = 0; + unsigned long length; + char* sid; LOCALGROUP_MEMBERS_INFO_0 members[1]; - if(localGroupInfo != NULL) - { - GetSIDByAccountName(username, (char**)&members[0].lgrmi0_sid); - result = NetLocalGroupAddMembers(NULL, localGroupInfo->lgrpi1_name, 0, (unsigned char*)&members, 1); - free(members[0].lgrmi0_sid); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + GetSIDByAccountName(username, NULL, &length); + sid = (char*)malloc(length); + GetSIDByAccountName(username, sid, &length); + members[0].lgrmi0_sid = sid; + + result = NetLocalGroupAddMembers(NULL, currentAccountName, 0, (unsigned char*)&members, 1); + +exit: + quickFree(&sid); + return result; } @@ -1887,19 +2457,26 @@ int NTLocalGroup::AddUser(char* username) int NTLocalGroup::RemoveUser(char* username) { int result = 0; + unsigned long length; + char* sid; LOCALGROUP_MEMBERS_INFO_0 members[1]; - if(localGroupInfo != NULL) - { - GetSIDByAccountName(username, (char**)&members[0].lgrmi0_sid); - result = NetLocalGroupDelMembers(NULL, localGroupInfo->lgrpi1_name, 0, (unsigned char*)&members, 1); - free(members[0].lgrmi0_sid); - } - else + if(currentAccountName == NULL) { result = -1; + goto exit; } + GetSIDByAccountName(username, NULL, &length); + sid = (char*)malloc(length); + GetSIDByAccountName(username, sid, &length); + members[0].lgrmi0_sid = sid; + + result = NetLocalGroupDelMembers(NULL, currentAccountName, 0, (unsigned char*)&members, 1); + +exit: + quickFree(&sid); + return result; } @@ -1910,23 +2487,23 @@ int NTLocalGroup::LoadUsers() { int result = 0; - if(localGroupInfo != NULL) + if(currentAccountName == NULL) { - if(usersInfo != NULL) - { - NetApiBufferFree(usersInfo); - usersInfo = NULL; - currentUserEntry = 0; - userEntriesRead = 0; - userEntriesTotal = 0; - } - result = NetLocalGroupGetMembers(NULL, localGroupInfo->lgrpi1_name, LOCALGROUP_USERS_INFO_LEVEL, (unsigned char**)&usersInfo, MAX_PREFERRED_LENGTH, &userEntriesRead, &userEntriesTotal, NULL); + result = -1; + goto exit; } - else + + if(usersInfo != NULL) { - result = -1; + NetApiBufferFree(usersInfo); + usersInfo = NULL; + currentUserEntry = 0; + userEntriesRead = 0; + userEntriesTotal = 0; } + result = NetLocalGroupGetMembers(NULL, currentAccountName, LOCALGROUP_USERS_INFO_LEVEL, (unsigned char**)&usersInfo, MAX_PREFERRED_LENGTH, &userEntriesRead, &userEntriesTotal, NULL); +exit: return result; } @@ -1954,17 +2531,21 @@ bool NTLocalGroup::HasMoreUsers() // **************************************************************** char* NTLocalGroup::NextUserName() { - char* username = NULL; - LOCALGROUP_MEMBERS_INFO_0* thisEntry; + char* result = NULL; + unsigned long length; if(currentUserEntry < userEntriesRead) { - thisEntry = &(usersInfo[currentUserEntry]); - GetAccountNameBySID((char*)thisEntry->lgrmi0_sid, &username); + quickFree(&resultBuf); + GetAccountNameBySID((char*)usersInfo[currentUserEntry].lgrmi0_sid, NULL, &length); + resultBuf = (char*)malloc(length); + GetAccountNameBySID((char*)usersInfo[currentUserEntry].lgrmi0_sid, resultBuf, &length); + result = resultBuf; + currentUserEntry++; } - return username; + return result; } // **************************************************************** @@ -1972,11 +2553,10 @@ char* NTLocalGroup::NextUserName() // **************************************************************** NTLocalGroupList::NTLocalGroupList() { - entriesRead = 0; - totalEntries = 0; bufptr = NULL; currentEntry = 0; resumeHandle = 0; + resultBuf = NULL; } // **************************************************************** @@ -1989,6 +2569,7 @@ NTLocalGroupList::~NTLocalGroupList() NetApiBufferFree(bufptr); bufptr = NULL; } + quickFree(&resultBuf); } // **************************************************************** @@ -2027,15 +2608,19 @@ bool NTLocalGroupList::hasMore() // **************************************************************** char* NTLocalGroupList::nextLocalGroupName() { - char* localGroupName = NULL; - LOCALGROUP_INFO_1* thisEntry; + char* result = NULL; + unsigned long length; if(currentEntry < entriesRead) { - thisEntry = &(bufptr[currentEntry]); - localGroupName = UTF16ToUTF8(thisEntry->lgrpi1_name); + quickFree(&resultBuf); + UTF16ToUTF8(bufptr[currentEntry].lgrpi1_name, NULL, &length); + resultBuf = (char*)malloc(length); + UTF16ToUTF8(bufptr[currentEntry].lgrpi1_name, resultBuf, &length); + result = resultBuf; + currentEntry++; } - return localGroupName; + return result; } diff --git a/ldap/servers/ntds/netman/netman.h b/ldap/servers/ntds/netman/netman.h index 0771b16a..2bbd820d 100644 --- a/ldap/servers/ntds/netman/netman.h +++ b/ldap/servers/ntds/netman/netman.h @@ -63,13 +63,10 @@ public: NTUser(); ~NTUser(); - void NewUser(char* username); + int NewUser(char* username); int RetriveUserByAccountName(char* username); int RetriveUserBySIDHexStr(char* sidHexStr); - int StoreUser(); - int AddUser(); - int DeleteUser(char* username); - int ChangeUsername(char* oldUsername, char* newUsername); + int DeleteUser(); char* GetAccountName(); char* GetSIDHexStr(); @@ -118,7 +115,7 @@ public: char* NextLocalGroupName(); private: - USER_INFO_3* userInfo; + unsigned short* currentAccountName; GROUP_USERS_INFO_0* groupsInfo; DWORD currentGroupEntry; @@ -129,6 +126,8 @@ private: DWORD currentLocalGroupEntry; DWORD localGroupEntriesRead; DWORD localGroupEntriesTotal; + + char* resultBuf; }; // **************************************************************** @@ -150,6 +149,8 @@ private: DWORD totalEntries; DWORD resumeHandle; DWORD currentEntry; + + char* resultBuf; }; // **************************************************************** @@ -161,12 +162,10 @@ public: NTGroup(); ~NTGroup(); - void NewGroup(char* groupName); - int DeleteGroup(char* groupName); + int NewGroup(char* groupName); int RetriveGroupByAccountName(char* groupName); int RetriveGroupBySIDHexStr(char* sidHexStr); - int AddGroup(); - int StoreGroup(); + int DeleteGroup(); char* GetAccountName(); char* GetSIDHexStr(); @@ -180,13 +179,14 @@ public: char* NextUserName(); private: - GROUP_INFO_2* groupInfo; + unsigned short* currentAccountName; LOCALGROUP_USERS_INFO_0* usersInfo; DWORD currentUserEntry; DWORD userEntriesRead; DWORD userEntriesTotal; + char* resultBuf; }; // **************************************************************** @@ -208,6 +208,8 @@ private: DWORD totalEntries; DWORD resumeHandle; DWORD currentEntry; + + char* resultBuf; }; // **************************************************************** @@ -219,12 +221,10 @@ public: NTLocalGroup(); ~NTLocalGroup(); - void NewLocalGroup(char* localGroupName); - int DeleteLocalGroup(char* localGroupName); + int NewLocalGroup(char* localGroupName); int RetriveLocalGroupByAccountName(char* localGroupName); int RetriveLocalGroupBySIDHexStr(char* sidHexStr); - int AddLocalGroup(); - int StoreLocalGroup(); + int DeleteLocalGroup(); char* GetAccountName(); char* GetSIDHexStr(); @@ -238,12 +238,14 @@ public: char* NextUserName(); private: - LOCALGROUP_INFO_1* localGroupInfo; + unsigned short* currentAccountName; LOCALGROUP_MEMBERS_INFO_0* usersInfo; DWORD currentUserEntry; DWORD userEntriesRead; DWORD userEntriesTotal; + + char* resultBuf; }; // **************************************************************** @@ -265,4 +267,6 @@ private: DWORD totalEntries; DWORD resumeHandle; DWORD currentEntry; + + char* resultBuf; }; diff --git a/ldap/servers/ntds/wrapper/wrapper.conf b/ldap/servers/ntds/wrapper/wrapper.conf index 38fdbecb..34d7f017 100644 --- a/ldap/servers/ntds/wrapper/wrapper.conf +++ b/ldap/servers/ntds/wrapper/wrapper.conf @@ -63,10 +63,10 @@ wrapper.java.library.path.1=../lib #wrapper.java.additional.1= # Initial Java Heap Size (in MB) -#wrapper.java.initmemory=3 +wrapper.java.initmemory=4 # Maximum Java Heap Size (in MB) -#wrapper.java.maxmemory=64 +wrapper.java.maxmemory=256 # Application parameters. Add parameters as needed starting from 1 wrapper.app.parameter.1=org.apache.ldap.server.ServerMain |