summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Boreham <dboreham@redhat.com>2005-05-11 21:00:08 +0000
committerDavid Boreham <dboreham@redhat.com>2005-05-11 21:00:08 +0000
commit67730e723afaf37c3153a1e93e7224e306f155d1 (patch)
treeb5e872f33d04d6e6ee5dd239da5788a80ca9007b
parent37bff7c59f8cca09ba2a2e6eb3e6c852327bbb17 (diff)
downloadds-67730e723afaf37c3153a1e93e7224e306f155d1.tar.gz
ds-67730e723afaf37c3153a1e93e7224e306f155d1.tar.xz
ds-67730e723afaf37c3153a1e93e7224e306f155d1.zip
Fixes for memory leaks in ntds
-rw-r--r--ldap/servers/ntds/netman/netman.cpp1751
-rw-r--r--ldap/servers/ntds/netman/netman.h36
-rw-r--r--ldap/servers/ntds/wrapper/wrapper.conf4
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**)&currentAccountName);
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**)&currentAccountName);
+ 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**)&currentAccountName);
+ 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**)&currentAccountName);
+
+ 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**)&currentAccountName);
+
+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**)&currentAccountName);
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**)&currentAccountName);
-// ****************************************************************
-// 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**)&currentAccountName);
+ 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**)&currentAccountName);
+
+ 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**)&currentAccountName);
+
+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**)&currentAccountName);
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**)&currentAccountName);
+ 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**)&currentAccountName);
+ 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**)&currentAccountName);
+
+ 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**)&currentAccountName);
+
+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