Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

2381 lines
72 KiB

/*
+-------------------------------------------------------------------------+
| Netware to Windows NT Transfer Loop |
+-------------------------------------------------------------------------+
| (c) Copyright 1993-1994 |
| Microsoft Corp. |
| All rights reserved |
| |
| Program : [Transfer.c] |
| Programmer : Arthur Hanson |
| Original Program Date : [Jul 27, 1993] |
| Last Update : [Jun 16, 1994] |
| |
| Version: 1.00 |
| |
| Description: |
| |
| History: |
| arth June 16, 1994 1.00 Original Version. |
| |
+-------------------------------------------------------------------------+
*/
#include "globals.h"
#include <stdio.h>
#include <stdarg.h>
#include <limits.h>
#include <time.h>
#include "nwconv.h"
#include "convapi.h"
#include "ntnetapi.h"
#include "nwnetapi.h"
#include "userdlg.h"
#include "statbox.h"
#include "filedlg.h"
#include "map.h"
#define NWC_ERR_IGNORE 1
#define NWC_ERR_NAMELONG 2
#define NWC_ERR_DUPLICATE 3
#define NWC_ERR_NAMEINVALID 4
#define ILLEGAL_CHARS TEXT("\"\\/[]:;=,+*?<>")
// define for routines in fcopy.c
void ConvertFiles(HWND hDlg, BOOL TConversion, USER_LIST *Users, GROUP_LIST *Groups);
void ConvertFilesInit(HWND hDlg);
void VSharesCreate(DEST_SERVER_BUFFER *DServ, BOOL TConversion);
// Cache of user and group lists
typedef struct _LIST_CACHE {
struct _LIST_CACHE *next;
ULONG Count;
void *ul;
} LIST_CACHE;
static LIST_CACHE *UserCacheHead = NULL;
static LIST_CACHE *GroupCacheHead = NULL;
// Misc string holders
static LPTSTR LocalName = NULL;
static LPTSTR SourceServer, DestServer;
TCHAR UserServerName[MAX_SERVER_NAME_LEN + 3];
static TCHAR tmpStr[80];
static TCHAR tmpStr2[60];
static TCHAR ErrorText[256];
static TCHAR NewName[256];
static TCHAR pLine[256];
static CONVERT_OPTIONS *ConvOpt = NULL;
static FILE_OPTIONS *FileOptions = NULL;
static BOOL TConversion;
static BOOL WarningDlgForNTFS;
// Totals for stat box
static UINT TotErrors;
static UINT TotGroups;
static UINT TotUsers;
static UINT TotConversions;
UINT TotFiles;
time_t StartTime;
time_t CurrTime;
// User and Group list pointers
static USER_LIST *Users = NULL;
static USER_LIST *NTUsers = NULL;
static GROUP_LIST *Groups = NULL;
static GROUP_LIST *NTGroups = NULL;
static DWORD UserCount, NTUserCount;
static DWORD GroupCount, NTGroupCount;
static BOOL TransferCancel = FALSE;
static MAP_FILE *hMap;
// All of this is used for transfer lists in the conversion
#define USER_SERVER 0
#define USER_SERVER_PDC 1
#define USER_SERVER_TRUSTED 2
typedef struct _TRANSFER_BUFFER {
LPTSTR ServerName;
UINT UserServerType;
CONVERT_LIST *ConvertList;
} TRANSFER_BUFFER;
typedef struct _TRANSFER_LIST {
ULONG Count;
TRANSFER_BUFFER TList[];
} TRANSFER_LIST;
/*+-------------------------------------------------------------------------+
| ErrorIt()
|
+-------------------------------------------------------------------------+*/
void ErrorIt(LPTSTR szFormat, ...) {
static TCHAR tmpStr[1024];
va_list marker;
va_start(marker, szFormat);
wvsprintf(tmpStr, szFormat, marker);
#ifdef DEBUG
dprintf(TEXT("Errorit: %s\n"), tmpStr);
#endif
TotErrors++;
Status_TotErrors(TotErrors);
LogWriteErr(TEXT("%s"),tmpStr);
va_end(marker);
} // ErrorIt
/*+-------------------------------------------------------------------------+
| NTFS Check Routines |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| ShareListNTFSCheck()
|
+-------------------------------------------------------------------------+*/
BOOL ShareListNTFSCheck() {
CONVERT_LIST *ConvList;
DEST_SERVER_BUFFER *DServ;
SOURCE_SERVER_BUFFER *SServ;
SHARE_LIST *ShareList;
SHARE_BUFFER *SList;
VIRTUAL_SHARE_BUFFER *VShare;
DRIVE_BUFFER *Drive;
ULONG i;
FILE_OPTIONS *FileOptions;
// Go through the convert list checking for any shares to non NTFS drives
ConvList = ConvertListStart;
while (ConvList != NULL) {
DServ = ConvList->FileServ;
SServ = ConvList->SourceServ;
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
if (FileOptions->TransferFileInfo) {
ShareList = SServ->ShareList;
if (ShareList != NULL) {
SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) {
// if not flagged as okay for going to fat, then must check
if (SList[i].Convert && !SList[i].ToFat)
if (SList[i].DestShare != NULL)
if (SList[i].Virtual) {
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
Drive = VShare->Drive;
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS))
return FALSE;
} else {
Drive = SList[i].DestShare->Drive;
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS))
return FALSE;
}
} // for loop through shares
}
} // if FileOptions
ConvList = ConvList->next;
}
return TRUE;
} // ShareListNTFSCheck
/*+-------------------------------------------------------------------------+
| ShareListNTFSListboxFill()
|
+-------------------------------------------------------------------------+*/
void ShareListNTFSListboxFill(HWND hDlg) {
TCHAR AddLine[256];
CONVERT_LIST *ConvList;
DEST_SERVER_BUFFER *DServ;
SOURCE_SERVER_BUFFER *SServ;
SHARE_LIST *ShareList;
SHARE_BUFFER *SList;
VIRTUAL_SHARE_BUFFER *VShare;
DRIVE_BUFFER *Drive;
ULONG i;
HWND hCtrl;
FILE_OPTIONS *FileOptions;
// Go through the convert list checking for any shares to non NTFS drives
ConvList = ConvertListStart;
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
while (ConvList != NULL) {
DServ = ConvList->FileServ;
SServ = ConvList->SourceServ;
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
if (FileOptions->TransferFileInfo) {
ShareList = SServ->ShareList;
if (ShareList != NULL) {
SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) {
// if not flagged as okay for going to fat, then must check
if (SList[i].Convert && !SList[i].ToFat)
if (SList[i].DestShare != NULL)
if (SList[i].Virtual) {
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
Drive = VShare->Drive;
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS)) {
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
} else {
Drive = SList[i].DestShare->Drive;
if ((Drive == NULL) || (Drive->Type != DRIVE_TYPE_NTFS)) {
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
}
} // for loop through shares
}
} // if FileOptions
ConvList = ConvList->next;
}
} // ShareListNTFSListboxFill
/*+-------------------------------------------------------------------------+
| ShareListFATOK()
|
+-------------------------------------------------------------------------+*/
void ShareListFATOK() {
CONVERT_LIST *ConvList;
DEST_SERVER_BUFFER *DServ;
SOURCE_SERVER_BUFFER *SServ;
SHARE_LIST *ShareList;
SHARE_BUFFER *SList;
ULONG i;
FILE_OPTIONS *FileOptions;
// Go through the convert list checking for any shares to non NTFS drives
ConvList = ConvertListStart;
while (ConvList != NULL) {
DServ = ConvList->FileServ;
SServ = ConvList->SourceServ;
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
if (FileOptions->TransferFileInfo) {
ShareList = SServ->ShareList;
if (ShareList != NULL) {
SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) {
if (SList[i].Convert)
SList[i].ToFat = TRUE;
}
}
} // if FileOptions
ConvList = ConvList->next;
}
} // ShareListFATOK
/*+-------------------------------------------------------------------------+
| Space Check Routines |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| ShareListSpaceCheck()
|
+-------------------------------------------------------------------------+*/
BOOL ShareListSpaceCheck() {
CONVERT_LIST *ConvList;
DEST_SERVER_BUFFER *DServ;
SOURCE_SERVER_BUFFER *SServ;
SHARE_LIST *ShareList;
SHARE_BUFFER *SList;
VIRTUAL_SHARE_BUFFER *VShare;
DRIVE_BUFFER *Drive;
ULONG i;
FILE_OPTIONS *FileOptions;
// Go through the convert list checking for any shares to non NTFS drives
ConvList = ConvertListStart;
while (ConvList != NULL) {
DServ = ConvList->FileServ;
SServ = ConvList->SourceServ;
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
if (FileOptions->TransferFileInfo) {
ShareList = SServ->ShareList;
if (ShareList != NULL) {
SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) {
if (SList[i].Convert && (SList[i].DestShare != NULL))
if (SList[i].Virtual) {
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
Drive = VShare->Drive;
if ((Drive == NULL) || (Drive->AllocSpace > Drive->FreeSpace))
return FALSE;
} else {
Drive = SList[i].DestShare->Drive;
if ((Drive == NULL) || (Drive->AllocSpace > Drive->FreeSpace))
return FALSE;
}
} // for loop through shares
}
} // if FileOptions
ConvList = ConvList->next;
}
return TRUE;
} // ShareListSpaceCheck
/*+-------------------------------------------------------------------------+
| ShareListSpaceListboxFill()
|
+-------------------------------------------------------------------------+*/
void ShareListSpaceListboxFill(HWND hDlg) {
TCHAR AddLine[256];
TCHAR Free[25];
CONVERT_LIST *ConvList;
DEST_SERVER_BUFFER *DServ;
SOURCE_SERVER_BUFFER *SServ;
SHARE_LIST *ShareList;
SHARE_BUFFER *SList;
VIRTUAL_SHARE_BUFFER *VShare;
DRIVE_BUFFER *Drive;
ULONG i;
HWND hCtrl;
FILE_OPTIONS *FileOptions;
// Go through the convert list checking for any shares to non NTFS drives
ConvList = ConvertListStart;
hCtrl = GetDlgItem(hDlg, IDC_LIST1);
while (ConvList != NULL) {
DServ = ConvList->FileServ;
SServ = ConvList->SourceServ;
FileOptions = (FILE_OPTIONS *) ConvList->FileOptions;
if (FileOptions->TransferFileInfo) {
ShareList = SServ->ShareList;
if (ShareList != NULL) {
SList = ShareList->SList;
for (i = 0; i < ShareList->Count; i++) {
if (SList[i].Convert && (SList[i].DestShare != NULL))
if (SList[i].Virtual) {
VShare = (VIRTUAL_SHARE_BUFFER *) SList[i].DestShare;
Drive = VShare->Drive;
if (Drive != NULL) {
if (Drive->AllocSpace > Drive->FreeSpace) {
// List shares then space
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
lstrcpy(Free, lToStr(Drive->FreeSpace));
wsprintf(AddLine, Lids(IDS_D_13), Free, lToStr(Drive->AllocSpace));
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
} else {
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, VShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
wsprintf(AddLine, Lids(IDS_D_14));
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
} else {
Drive = SList[i].DestShare->Drive;
if (Drive != NULL) {
if (Drive->AllocSpace > Drive->FreeSpace) {
// List shares then space
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
lstrcpy(Free, lToStr(Drive->FreeSpace));
wsprintf(AddLine, Lids(IDS_D_13), Free, lToStr(Drive->AllocSpace));
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
} else {
wsprintf(AddLine, TEXT("%s\\%s: -> \\\\%s\\%s"), SServ->Name, SList[i].Name, DServ->Name, SList[i].DestShare->Name);
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
wsprintf(AddLine, Lids(IDS_D_14));
SendMessage(hCtrl, LB_ADDSTRING, (WPARAM) 0, (LPARAM) AddLine);
}
} // if Virtual
} // for loop through shares
}
} // if FileOptions
ConvList = ConvList->next;
}
} // ShareListSpaceListboxFill
/*+-------------------------------------------------------------------------+
| Conversion Warning Dialog |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| DlgConversionWarning()
|
+-------------------------------------------------------------------------+*/
LRESULT CALLBACK DlgConversionWarning(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
int wmId, wmEvent;
switch (message) {
case WM_INITDIALOG:
// Center the dialog over the application window
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
if (WarningDlgForNTFS) {
SendDlgItemMessage(hDlg, IDC_PANEL1, WM_SETTEXT, 0, (LPARAM) Lids(IDS_D_15));
ShareListNTFSListboxFill(hDlg);
} else {
SendDlgItemMessage(hDlg, IDC_PANEL1, WM_SETTEXT, 0, (LPARAM) Lids(IDS_D_16));
ShareListSpaceListboxFill(hDlg);
}
return (TRUE);
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId) {
case IDYES:
if (WarningDlgForNTFS)
ShareListFATOK();
EndDialog(hDlg, 0);
return (TRUE);
break;
case IDNO:
TransferCancel = TRUE;
EndDialog(hDlg, 0);
return (TRUE);
break;
}
break;
}
return (FALSE); // Didn't process the message
lParam;
} // DlgConversionWarning
/*+-------------------------------------------------------------------------+
| ConversionWarningDlg_Do()
|
+-------------------------------------------------------------------------+*/
void ConversionWarningDlg_Do(HWND hDlg) {
DLGPROC lpfnDlg;
lpfnDlg = MakeProcInstance((DLGPROC) DlgConversionWarning, hInst);
DialogBox(hInst, TEXT("AlertSel"), hDlg, lpfnDlg) ;
FreeProcInstance(lpfnDlg);
} // ConversionWarningDlg_Do
/*+-------------------------------------------------------------------------+
| NTFSCheck()
|
+-------------------------------------------------------------------------+*/
void NTFSCheck(HWND hDlg) {
WarningDlgForNTFS = TRUE;
if (!ShareListNTFSCheck())
ConversionWarningDlg_Do(hDlg);
} // NTFSCheck
/*+-------------------------------------------------------------------------+
| SpaceCheck()
|
+-------------------------------------------------------------------------+*/
void SpaceCheck(HWND hDlg) {
WarningDlgForNTFS = FALSE;
if (!ShareListSpaceCheck())
ConversionWarningDlg_Do(hDlg);
} // SpaceCheck
/*+-------------------------------------------------------------------------+
| End of Conversion Dialog |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| DlgConversionEnd()
|
+-------------------------------------------------------------------------+*/
LRESULT CALLBACK DlgConversionEnd(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam) {
HANDLE hFile;
int wmId, wmEvent;
static char CmdLine[256];
HWND hCtrl;
switch (message) {
case WM_INITDIALOG:
// Center the dialog over the application window
CenterWindow (hDlg, GetWindow (hDlg, GW_OWNER));
hCtrl = GetDlgItem(hDlg, IDC_VIEWLOG);
// check if logfile exists, if it does allow log file viewing...
hFile = CreateFileA( "LogFile.LOG", GENERIC_READ, 0, NULL, OPEN_EXISTING,
FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile != (HANDLE) INVALID_HANDLE_VALUE)
CloseHandle( hFile );
else
EnableWindow(hCtrl, FALSE);
SendDlgItemMessage(hDlg, IDC_S_TOT_COMP, WM_SETTEXT, 0, (LPARAM) lToStr(TotConversions));
SendDlgItemMessage(hDlg, IDC_S_TOT_GROUPS, WM_SETTEXT, 0, (LPARAM) lToStr(TotGroups));
SendDlgItemMessage(hDlg, IDC_S_TOT_USERS, WM_SETTEXT, 0, (LPARAM) lToStr(TotUsers));
SendDlgItemMessage(hDlg, IDC_S_TOT_FILES, WM_SETTEXT, 0, (LPARAM) lToStr(TotFiles));
SendDlgItemMessage(hDlg, IDC_S_TOT_ERRORS, WM_SETTEXT, 0, (LPARAM) lToStr(TotErrors));
if (TransferCancel)
SendMessage(hDlg, WM_SETTEXT, (WPARAM) 0, (LPARAM) Lids(IDS_D_17));
return (TRUE);
case WM_COMMAND:
wmId = LOWORD(wParam);
wmEvent = HIWORD(wParam);
switch (wmId) {
case IDOK:
case IDCANCEL:
EndDialog(hDlg, 0);
return (TRUE);
break;
case IDC_VIEWLOG:
lstrcpyA(CmdLine, "LogView ");
lstrcatA(CmdLine, "Error.LOG Summary.LOG LogFile.LOG");
WinExec(CmdLine, SW_SHOW);
return (TRUE);
break;
}
break;
}
return (FALSE); // Didn't process the message
lParam;
} // DlgConversionEnd
/*+-------------------------------------------------------------------------+
| ConversionEndDlg_Do()
|
+-------------------------------------------------------------------------+*/
void ConversionEndDlg_Do(HWND hDlg) {
DLGPROC lpfnDlg;
lpfnDlg = MakeProcInstance((DLGPROC) DlgConversionEnd, hInst);
DialogBox(hInst, TEXT("ConversionEnd"), hDlg, lpfnDlg) ;
FreeProcInstance(lpfnDlg);
} // ConversionEndDlg_Do
/*+-------------------------------------------------------------------------+
| User / Group lists and Cache routines |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| FindUserMatch()
|
| Searches through the user list using a binary search. Returns a
| pointer to the found user record or NULL if no match.
|
+-------------------------------------------------------------------------+*/
USER_BUFFER *FindUserMatch(LPTSTR Name, USER_LIST *UserList, BOOL NewName) {
LONG begin = 0;
LONG end;
LONG cur;
int match;
USER_BUFFER *UserBuffer;
if (UserList == NULL)
return NULL;
UserBuffer = UserList->UserBuffer;
end = UserList->Count - 1;
while (end >= begin) {
// go halfway in-between
cur = (begin + end) / 2;
// compare the two result into match
if (NewName)
match = lstrcmpi(Name, UserBuffer[cur].NewName);
else
match = lstrcmpi(Name, UserBuffer[cur].Name);
if (match < 0)
// move new begin
end = cur - 1;
else
begin = cur + 1;
if (match == 0)
return &UserBuffer[cur];
}
return NULL;
} // FindUserMatch
/*+-------------------------------------------------------------------------+
| FindGroupMatch()
|
| Searches through the group list using a binary search. Returns a
| pointer to the found group record or NULL if no match.
|
+-------------------------------------------------------------------------+*/
GROUP_BUFFER *FindGroupMatch(LPTSTR Name, GROUP_LIST *GroupList, BOOL NewName) {
LONG begin = 0;
LONG end;
LONG cur;
int match;
GROUP_BUFFER *GroupBuffer;
if (GroupList == NULL)
return NULL;
GroupBuffer = GroupList->GroupBuffer;
end = GroupList->Count - 1;
while (end >= begin) {
// go halfway in-between
cur = (begin + end) / 2;
// compare the two result into match
if (NewName)
match = lstrcmpi(Name, GroupBuffer[cur].NewName);
else
match = lstrcmpi(Name, GroupBuffer[cur].Name);
if (match < 0)
// move new begin
end = cur - 1;
else
begin = cur + 1;
if (match == 0)
return &GroupBuffer[cur];
}
return NULL;
} // FindGroupMatch
/*+-------------------------------------------------------------------------+
| The List Cache's are a linked list of previously converted user and
| group lists. This is mostly for when running trial conversions you can
| check if a previously transferred name conflicts with a new name (since
| the name won't actually be out on the destination server).
|
| The Cache is kept around while working with the same destination server
| or domain. Once a new domain/server is selected the cache and all lists
| should be freed.
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| ListCachePut()
|
+-------------------------------------------------------------------------+*/
BOOL ListCachePut(LIST_CACHE **CacheHead, void *ul, ULONG Count) {
LIST_CACHE *cc;
LIST_CACHE *pc;
cc = (LIST_CACHE *) AllocMemory(sizeof(LIST_CACHE));
if (cc == NULL)
return FALSE;
// Init the cache entry
cc->next = NULL;
cc->Count = Count;
cc->ul = ul;
// Now put it at the end of the chain
if (*CacheHead == NULL) {
*CacheHead = cc;
return TRUE;
}
pc = *CacheHead;
while (pc->next)
pc = pc->next;
pc->next = cc;
return TRUE;
} // ListCachePut
/*+-------------------------------------------------------------------------+
| ListCacheFree()
|
+-------------------------------------------------------------------------+*/
void ListCacheFree(LIST_CACHE **CacheHead) {
LIST_CACHE *cc;
LIST_CACHE *pc;
cc = *CacheHead;
while (cc) {
// Free the user list attached to this cache entry
FreeMemory(cc->ul);
// Save next cache entry
pc = cc->next;
// Free up the cache entry and loop
FreeMemory(cc);
cc = pc;
}
*CacheHead = NULL;
} // ListCacheFree
/*+-------------------------------------------------------------------------+
| UserCacheMatch()
|
+-------------------------------------------------------------------------+*/
BOOL UserCacheMatch(LPTSTR UserName) {
LIST_CACHE *cc;
BOOL match = FALSE;
cc = UserCacheHead;
// loop through the cache entries and try to match with each user list
while (cc && !match) {
if (FindUserMatch(UserName, (USER_LIST *) cc->ul, TRUE))
match = TRUE;
else
cc = cc->next;
}
return match;
} // UserCacheMatch
/*+-------------------------------------------------------------------------+
| GroupCacheMatch()
|
+-------------------------------------------------------------------------+*/
BOOL GroupCacheMatch(LPTSTR GroupName) {
LIST_CACHE *cc;
BOOL match = FALSE;
cc = GroupCacheHead;
// loop through the cache entries and try to match with each user list
while (cc && !match) {
if (FindGroupMatch(GroupName, (GROUP_LIST *) cc->ul, TRUE))
match = TRUE;
else
cc = cc->next;
}
return match;
} // GroupCacheMatch
/*+-------------------------------------------------------------------------+
| Logging Garbage |
+-------------------------------------------------------------------------+*/
/*+-------------------------------------------------------------------------+
| ConvertOptionsLog()
|
| Writes all the admin selected conversion options to the log file.
|
+-------------------------------------------------------------------------+*/
void ConvertOptionsLog() {
LogWriteLog(0, Lids(IDS_L_136));
if (ConvOpt->TransferUserInfo)
LogWriteLog(1, Lids(IDS_L_137), Lids(IDS_YES));
else
LogWriteLog(1, Lids(IDS_L_137), Lids(IDS_NO));
LogWriteLog(0, Lids(IDS_CRLF));
if (ConvOpt->TransferUserInfo) {
LogWriteLog(1, Lids(IDS_L_140));
if (ConvOpt->UseMappingFile) {
LogWriteLog(2, Lids(IDS_L_138), Lids(IDS_YES));
LogWriteLog(3, Lids(IDS_L_139), ConvOpt->MappingFile);
} else {
LogWriteLog(2, Lids(IDS_L_138), Lids(IDS_NO));
// Password Options
LogWriteLog(2, Lids(IDS_L_141));
switch (ConvOpt->PasswordOption) {
case 0: // Use NULL
LogWriteLog(0, Lids(IDS_L_142));
break;
case 1: // Password is username
LogWriteLog(0, Lids(IDS_L_143));
break;
case 2: // Use constant
LogWriteLog(0, Lids(IDS_L_144), ConvOpt->PasswordConstant);
break;
}
}
if (ConvOpt->ForcePasswordChange)
LogWriteLog(3, Lids(IDS_L_145), Lids(IDS_YES));
else
LogWriteLog(3, Lids(IDS_L_145), Lids(IDS_NO));
if (!ConvOpt->UseMappingFile) {
// User Names Options
LogWriteLog(2, Lids(IDS_L_146));
switch (ConvOpt->UserNameOption) {
case 0: // Don't transfer - log failures
LogWriteLog(0, Lids(IDS_L_148));
break;
case 1: // Ignore
LogWriteLog(0, Lids(IDS_L_149));
break;
case 2: // Overwrite with new info
LogWriteLog(0, Lids(IDS_L_151));
break;
case 3: // Pre-Pend constant
LogWriteLog(0, Lids(IDS_L_150), ConvOpt->UserConstant);
break;
}
LogWriteLog(0, Lids(IDS_CRLF));
// Group Names Options
LogWriteLog(2, Lids(IDS_L_147));
switch (ConvOpt->GroupNameOption) {
case 0: // Don't transfer - log failures
LogWriteLog(0, Lids(IDS_L_148));
break;
case 1: // Overwrite with new info
LogWriteLog(0, Lids(IDS_L_149));
break;
case 2: // Pre-Pend constant
LogWriteLog(0, Lids(IDS_L_150), ConvOpt->GroupConstant);
break;
}
LogWriteLog(0, Lids(IDS_CRLF));
}
if (ConvOpt->SupervisorDefaults)
LogWriteLog(2, Lids(IDS_L_152), Lids(IDS_YES));
else
LogWriteLog(2, Lids(IDS_L_152), Lids(IDS_NO));
if (ConvOpt->AdminAccounts)
LogWriteLog(2, Lids(IDS_L_153), Lids(IDS_YES));
else
LogWriteLog(2, Lids(IDS_L_153), Lids(IDS_NO));
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL))
LogWriteLog(2, Lids(IDS_L_154), ConvOpt->TrustedDomain->Name);
LogWriteLog(0, Lids(IDS_CRLF));
}
LogWriteLog(0, Lids(IDS_CRLF));
} // ConvertOptionsLog
/*+-------------------------------------------------------------------------+
| OptionsFileLog()
|
+-------------------------------------------------------------------------+*/
void OptionsFileLog() {
LogWriteLog(0, Lids(IDS_L_155));
if (FileOptions->TransferFileInfo)
LogWriteLog(1, Lids(IDS_L_156), Lids(IDS_YES));
else
LogWriteLog(1, Lids(IDS_L_156), Lids(IDS_NO));
LogWriteLog(0, Lids(IDS_CRLF));
} // OptionsFileLog
/*+-------------------------------------------------------------------------+
| ConvertPairLog()
|
+-------------------------------------------------------------------------+*/
void ConvertPairLog() {
LogWriteLog(0, Lids(IDS_LINE));
wsprintf(tmpStr, Lids(IDS_L_157), SourceServer);
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
wsprintf(tmpStr, Lids(IDS_L_158), DestServer);
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
LogWriteLog(0, Lids(IDS_LINE));
GetTime(tmpStr2);
wsprintf(tmpStr, Lids(IDS_L_159), tmpStr2);
LogWriteLog(0, Lids(IDS_BRACE), tmpStr);
LogWriteLog(0, Lids(IDS_LINE));
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteSummary(0, Lids(IDS_CRLF));
LogWriteSummary(0, TEXT("[%s -> %s]\r\n"), SourceServer, DestServer);
ErrorContextSet(TEXT("[%s -> %s]\r\n"), SourceServer, DestServer);
} // ConvertPairLog
/*+-------------------------------------------------------------------------+
| UsersLogNames()
|
+-------------------------------------------------------------------------+*/
void UsersLogNames(USER_LIST *Users) {
ULONG i;
DWORD UserCount;
USER_BUFFER *UserBuffer;
if (Users == NULL)
return;
UserCount = Users->Count;
UserBuffer = Users->UserBuffer;
if (UserCount) {
LogWriteLog(1, Lids(IDS_L_160));
LogWriteLog(1, Lids(IDS_L_161));
// Check Mapping File
for (i = 0; i < UserCount; i++) {
if (UserBuffer[i].IsNewName)
wsprintf(pLine, TEXT("%s -> %s"), UserBuffer[i].Name, UserBuffer[i].NewName);
else
wsprintf(pLine, TEXT("%s"), UserBuffer[i].NewName);
LogWriteLog(1, TEXT(" %-50s"), pLine);
if (UserBuffer[i].err) {
if (UserBuffer[i].err == NWC_ERR_NAMELONG)
LogWriteLog(0, Lids(IDS_L_162));
if (UserBuffer[i].err == NWC_ERR_DUPLICATE)
LogWriteLog(0, Lids(IDS_L_163));
if (UserBuffer[i].err == NWC_ERR_NAMEINVALID)
LogWriteLog(0, Lids(IDS_L_164));
}
// Need to check this seperatly - as it's not an error
if (UserBuffer[i].Overwrite)
LogWriteLog(0, Lids(IDS_L_163));
LogWriteLog(0, Lids(IDS_CRLF));
}
LogWriteLog(0, Lids(IDS_CRLF));
}
} // UsersLogNames
/*+-------------------------------------------------------------------------+
| UserNewName_Check()
|
+-------------------------------------------------------------------------+*/
void UserNewName_Check(USER_BUFFER *Users) {
// We have done any mappings that need to be done, now check for
// name validity if there is a new name...
if (Users->IsNewName)
if (UserCacheMatch(Users->NewName)) {
Users->err = NWC_ERR_DUPLICATE;
}
if (lstrlen(Users->NewName) > MAX_NT_USER_NAME_LEN) {
// Name is too long
Users->err = NWC_ERR_NAMELONG;
}
// Check if a valid name (no illegal characters)...
if ((int) wcscspn(Users->NewName, ILLEGAL_CHARS) < (int) lstrlen(Users->NewName))
Users->err = NWC_ERR_NAMEINVALID;
} // UserNewName_Check
/*+-------------------------------------------------------------------------+
| UserNames_Resolve()
|
+-------------------------------------------------------------------------+*/
void UserNames_Resolve(USER_BUFFER *Users) {
LPTSTR TheName;
LPTSTR ErrorText;
ULONG RetType;
// Figure out which name to use
if (Users->IsNewName)
TheName = Users->Name;
else
TheName = Users->NewName;
// If using mapping file then map the name appropriatly
if (ConvOpt->UseMappingFile) {
if (UserCacheMatch(TheName))
Users->err = NWC_ERR_DUPLICATE;
} else {
// check if the user name is in the destination list (duplicate)
if (UserCacheMatch(TheName)) {
// There was - so figure out based on conversion options what
// to do with it...
switch (ConvOpt->UserNameOption) {
case 0: // Log Errors
Users->err = NWC_ERR_DUPLICATE;
break;
case 1: // ignore
Users->err = NWC_ERR_IGNORE;
break;
case 2: // Overwrite
Users->Overwrite = TRUE;
break;
case 3: // Pre-Pend constant
lstrcpy(NewName, ConvOpt->UserConstant);
lstrcat(NewName, Users->Name);
lstrcpy(Users->NewName, NewName);
Users->IsNewName = TRUE;
break;
} // switch
}
}
do {
RetType = IDIGNORE;
UserNewName_Check(Users);
if (Users->err && (Users->err != NWC_ERR_IGNORE) && PopupOnError()) {
switch(Users->err) {
case NWC_ERR_NAMELONG:
ErrorText = Lids(IDS_L_165);
break;
case NWC_ERR_DUPLICATE:
ErrorText = Lids(IDS_L_166);
break;
case NWC_ERR_NAMEINVALID:
ErrorText = Lids(IDS_L_167);
break;
}
RetType = UserNameErrorDlg_Do(Lids(IDS_L_168), ErrorText, Users);
}
} while (RetType == IDRETRY);
if (RetType == IDABORT)
TransferCancel = TRUE;
} // UserNames_Resolve
/*+-------------------------------------------------------------------------+
| UserSave()
|
| Given a user-name, moves their account information from the source
| to the destination server.
|
+-------------------------------------------------------------------------+*/
BOOL UserSave(BOOL *NWInfo, LPTSTR origUserName, LPTSTR newUserName, NT_USER_INFO *NTInfo, void **OldInfo, BOOL Replace) {
NET_API_STATUS ret = 0;
void *NWUInfo;
FPNW_INFO fpnw;
static TCHAR ServerName[MAX_SERVER_NAME_LEN+3]; // +3 for leading slashes and ending NULL
*NWInfo = FALSE;
// Overlay NetWare info into record
NWUserInfoGet(origUserName, OldInfo);
NWUInfo = *OldInfo;
if (NWUInfo == NULL)
return FALSE;
*NWInfo = TRUE;
NWNetUserMapInfo(origUserName, NWUInfo, NTInfo);
// Force user to change password if required
if (ConvOpt->ForcePasswordChange)
NTInfo->password_expired = (DWORD) (-1L);
// Now get/map special FPNW info
if (ConvOpt->NetWareInfo) {
NWFPNWMapInfo(NWUInfo, &fpnw);
}
if (!TConversion)
if (Replace)
if (ConvOpt->NetWareInfo)
ret = NTUserInfoSet(NTInfo, &fpnw);
else
ret = NTUserInfoSet(NTInfo, NULL);
else
if (ConvOpt->NetWareInfo)
ret = NTUserInfoSave(NTInfo, &fpnw);
else
ret = NTUserInfoSave(NTInfo, NULL);
if (ret)
return FALSE;
else {
// now save out FPNW Info
if (ConvOpt->NetWareInfo)
NTSAMParmsSet(newUserName, fpnw, NTInfo->password, ConvOpt->ForcePasswordChange);
return TRUE;
}
} // UserSave
/*+-------------------------------------------------------------------------+
| UsersConvert()
|
+-------------------------------------------------------------------------+*/
void UsersConvert() {
static TCHAR Password[MAX_PW_LEN + 1];
USER_BUFFER *UserBuffer = NULL;
BOOL NWInfo;
DWORD status = 0;
DWORD i;
void *NW_UInfo;
static NT_USER_INFO NT_UInfo;
ULONG TotConv = 0;
Status_ConvTxt(Lids(IDS_D_18));
Status_ItemLabel(Lids(IDS_D_19));
Status_CurTot((UINT) UserCount);
LogWriteLog(0, Lids(IDS_L_169));
LogWriteLog(1, Lids(IDS_L_170), UserCount);
ErrorCategorySet(Lids(IDS_L_171));
if (Users == NULL)
return;
UserBuffer = Users->UserBuffer;
// This will update the status pane - but we will reset it afterwards
for (i = 0; i < UserCount; i++) {
// Don't update totals yet, but update item ref incase this takes
// awhile
Status_CurNum((UINT) i + 1);
Status_Item(UserBuffer[i].Name);
UserNames_Resolve(&UserBuffer[i]);
if (TransferCancel)
return;
}
UsersLogNames(Users);
i = 0;
while (i < UserCount) {
Status_CurNum((UINT) i + 1);
Status_Item(UserBuffer[i].Name);
lstrcpy(pLine, UserBuffer[i].Name);
if (UserBuffer[i].IsNewName)
wsprintf(pLine, TEXT("[%s -> %s]"), UserBuffer[i].Name, UserBuffer[i].NewName);
else
wsprintf(pLine, TEXT("[%s]"), UserBuffer[i].NewName);
LogWriteLog(1, TEXT("%-50s"), pLine);
ErrorItemSet(TEXT("%s\r\n"), pLine);
// If duplicate or other type error just do logging - don't try to save
if (UserBuffer[i].err) {
if (UserBuffer[i].err == NWC_ERR_DUPLICATE) {
LogWriteLog(0, Lids(IDS_L_172));
ErrorIt(Lids(IDS_L_173));
}
if (UserBuffer[i].err == NWC_ERR_NAMELONG) {
LogWriteLog(0, Lids(IDS_L_174));
ErrorIt(Lids(IDS_L_175));
}
if (UserBuffer[i].err == NWC_ERR_NAMEINVALID) {
LogWriteLog(0, Lids(IDS_L_176));
ErrorIt(Lids(IDS_L_177));
}
} else {
// Init the user record
NTUserRecInit(UserBuffer[i].NewName, &NT_UInfo);
// +-------------------------------------------------------------+
// | User name figured out - now map password |
// +-------------------------------------------------------------+
memset(Password, 0, sizeof(Password));
if (ConvOpt->UseMappingFile)
// If using map file, password is already set
lstrcpy(Password, UserBuffer[i].Password);
else
if (lstrlen(Password) == 0) {
// Didn't map password - so find what to use
switch (ConvOpt->PasswordOption) {
case 0: // No Password
// Don't need to do anything
break;
case 1: // Username
// BUGBUG: Name can be longer then password!!!
lstrcpy(Password, UserBuffer[i].NewName);
break;
case 2: // Constant
lstrcpy(Password, ConvOpt->PasswordConstant);
break;
} // switch
}
NT_UInfo.password = Password;
#ifdef DEBUG
dprintf(TEXT("User: %s\n"), UserBuffer[i].Name);
#endif
if (!UserSave(&NWInfo, UserBuffer[i].Name, UserBuffer[i].NewName, &NT_UInfo, &NW_UInfo, UserBuffer[i].Overwrite )) {
LogWriteLog(0, Lids(IDS_L_178));
ErrorIt(Lids(IDS_L_179));
} else {
// only increment total if actually converted...
TotUsers++;
TotConv++;
Status_TotUsers(TotUsers);
LogWriteLog(0, Lids(IDS_L_180));
LogWriteLog(0, Lids(IDS_CRLF));
// Converted - now need to save info to logs...
if (NWInfo) {
if (VerboseUserLogging())
NWUserInfoLog(UserBuffer[i].Name, NW_UInfo);
if (VerboseUserLogging())
NTUserRecLog(NT_UInfo);
}
}
LogWriteLog(0, Lids(IDS_CRLF));
}
i++;
}
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteSummary(1, Lids(IDS_L_181), lToStr(TotConv));
} // UsersConvert
/*+-------------------------------------------------------------------------+
| GroupSave()
|
+-------------------------------------------------------------------------+*/
BOOL GroupSave(LPTSTR Name, DWORD *Status) {
*Status = 0;
if (!TConversion)
if ((*Status = NTGroupSave(Name)))
return FALSE;
return TRUE;
} // GroupSave
/*+-------------------------------------------------------------------------+
| GroupNewName_Check()
|
+-------------------------------------------------------------------------+*/
void GroupNewName_Check(GROUP_BUFFER *Groups) {
// We have done any mappings that need to be done, now check for
// name validity if there is a new name...
if (Groups->IsNewName)
if (GroupCacheMatch(Groups->NewName)) {
Groups->err = NWC_ERR_DUPLICATE;
}
// make sure not too long
if (lstrlen(Groups->NewName) > MAX_NT_GROUP_NAME_LEN) {
// Name is too long
Groups->err = NWC_ERR_NAMELONG;
}
// Check if a valid name (no illegal characters)...
if ((int) wcscspn(Groups->NewName, ILLEGAL_CHARS) < (int) lstrlen(Groups->NewName))
Groups->err = NWC_ERR_NAMEINVALID;
} // GroupNewName_Check
/*+-------------------------------------------------------------------------+
| GroupNames_Resolve()
|
+-------------------------------------------------------------------------+*/
void GroupNames_Resolve(GROUP_BUFFER *Groups) {
LPTSTR TheName;
LPTSTR ErrorText;
ULONG RetType;
// Figure out which name to use
if (Groups->IsNewName)
TheName = Groups->Name;
else
TheName = Groups->NewName;
// If using mapping file then map the name appropriatly
if (ConvOpt->UseMappingFile) {
if (GroupCacheMatch(TheName))
Groups->err = NWC_ERR_DUPLICATE;
} else {
// check if the user name is in the destination list (duplicate)
if (GroupCacheMatch(TheName)) {
// There was - so figure out based on conversion options what
// to do with it...
switch (ConvOpt->GroupNameOption) {
case 0: // Log Errors
Groups->err = NWC_ERR_DUPLICATE;
break;
case 1: // ignore
Groups->err = NWC_ERR_IGNORE;
break;
case 2: // Pre-Pend constant
lstrcpy(NewName, ConvOpt->GroupConstant);
lstrcat(NewName, Groups->Name);
lstrcpy(Groups->NewName, NewName);
Groups->IsNewName = TRUE;
break;
} // switch
}
}
do {
RetType = IDIGNORE;
GroupNewName_Check(Groups);
if (Groups->err && (Groups->err != NWC_ERR_IGNORE) && PopupOnError()) {
switch(Groups->err) {
case NWC_ERR_NAMELONG:
ErrorText = Lids(IDS_L_182);
break;
case NWC_ERR_DUPLICATE:
ErrorText = Lids(IDS_L_183);
break;
case NWC_ERR_NAMEINVALID:
ErrorText = Lids(IDS_L_184);
break;
}
RetType = GroupNameErrorDlg_Do(Lids(IDS_L_185), ErrorText, Groups);
}
} while (RetType == IDRETRY);
if (RetType == IDABORT)
TransferCancel = TRUE;
} // GroupNames_Resolve
/*+-------------------------------------------------------------------------+
| GroupsConvert()
|
+-------------------------------------------------------------------------+*/
void GroupsConvert() {
USER_LIST *GUsers = NULL;
USER_BUFFER *GUserBuffer;
USER_BUFFER *pUser;
GROUP_BUFFER *pGroup;
GROUP_BUFFER *GroupBuffer = NULL;
DWORD GUserCount;
DWORD status = 0;
ULONG Count, i;
ULONG TotConv = 0;
LPTSTR NewName;
BOOL SecEquivTitle = FALSE;
BOOL SecEquivUser = FALSE;
TCHAR GroupTitle[TMP_STR_LEN_256];
// update status pane
Status_ConvTxt(Lids(IDS_D_20));
Status_ItemLabel(Lids(IDS_D_21));
ErrorCategorySet(Lids(IDS_L_186));
Status_CurTot((UINT) GroupCount);
LogWriteLog(0, Lids(IDS_L_187));
LogWriteLog(1, Lids(IDS_L_188), GroupCount);
if (Groups == NULL)
return;
GroupBuffer = Groups->GroupBuffer;
for (i = 0; i < GroupCount; i++) {
// Don't update totals yet, but update item ref incase this takes
// awhile
Status_CurNum((UINT) i + 1);
Status_Item(GroupBuffer[i].Name);
GroupNames_Resolve(&GroupBuffer[i]);
if (TransferCancel)
return;
}
i = 0;
while (i < GroupCount) {
// update status pane for this group
Status_CurNum((UINT) i + 1);
Status_Item(GroupBuffer[i].Name);
lstrcpy(pLine, GroupBuffer[i].Name);
#ifdef DEBUG
dprintf(TEXT("Working on Group: %s\r\n"), GroupBuffer[i].Name);
#endif
if (GroupBuffer[i].IsNewName)
wsprintf(pLine, TEXT("%s -> %s"), GroupBuffer[i].Name, GroupBuffer[i].NewName);
else
wsprintf(pLine, TEXT("%s"), GroupBuffer[i].NewName);
LogWriteLog(1, TEXT("%-50s"), pLine);
ErrorItemSet(TEXT("[%s]\r\n"), pLine);
// If duplicate or other type error just do logging - don't try
// to save...
if (GroupBuffer[i].err) {
if (GroupBuffer[i].err == NWC_ERR_DUPLICATE) {
LogWriteLog(0, Lids(IDS_L_163));
ErrorIt(Lids(IDS_L_189));
}
if (GroupBuffer[i].err == NWC_ERR_NAMELONG) {
LogWriteLog(0, Lids(IDS_L_162));
ErrorIt(Lids(IDS_L_190));
}
if (GroupBuffer[i].err == NWC_ERR_NAMEINVALID) {
LogWriteLog(0, Lids(IDS_L_164));
ErrorIt(Lids(IDS_L_191));
}
} else {
// Try to save it and get any errors...
if (!GroupSave(GroupBuffer[i].NewName, &status)) {
LogWriteLog(0, Lids(IDS_L_192));
ErrorIt(Lids(IDS_L_193));
} else {
// only increment total if actually converted...
TotGroups++;
TotConv++;
Status_TotGroups(TotGroups);
LogWriteLog(0, Lids(IDS_L_180));
}
}
LogWriteLog(0, Lids(IDS_CRLF));
i++;
}
LogWriteLog(0, Lids(IDS_CRLF));
ErrorCategorySet(Lids(IDS_L_194));
// +-------------------------------------------------------------+
// | Go through and add users to the groups |
// +-------------------------------------------------------------+
for (Count = 0; Count < GroupCount; Count++) {
GUserCount = 0;
if (!(status = NWGroupUsersEnum(GroupBuffer[Count].Name, &GUsers)) && (GUsers != NULL)) {
GUserCount = GUsers->Count;
GUserBuffer = GUsers->UserBuffer;
if (GUserCount > 0) {
wsprintf(GroupTitle, Lids(IDS_S_46), GroupBuffer[Count].NewName);
EscapeFormattingChars(GroupTitle,
sizeof(GroupTitle)/sizeof(GroupTitle[0])) ;
Status_ItemLabel(GroupTitle);
LogWriteLog(1, TEXT("[%s]\r\n"), GroupBuffer[Count].NewName);
}
for (i = 0; i < GUserCount; i++) {
pUser = FindUserMatch(GUserBuffer[i].Name, Users, FALSE);
if (pUser == NULL)
NewName = NWSpecialNamesMap(GUserBuffer[i].Name);
else
NewName = pUser->NewName;
LogWriteLog(2, TEXT("%-20s"), NewName);
Status_Item(NewName);
#ifdef DEBUG
dprintf(TEXT("Adding User [%s] to Group: %s\n"), NewName, GroupBuffer[Count].NewName );
#endif
if (!TConversion)
if (NTGroupUserAdd(GroupBuffer[Count].NewName, NewName, FALSE)) {
LogWriteLog(0, Lids(IDS_L_196));
ErrorIt(Lids(IDS_L_195), NewName, GroupBuffer[Count].NewName);
}
LogWriteLog(0, Lids(IDS_CRLF));
}
LogWriteLog(0, Lids(IDS_CRLF));
FreeMemory((LPBYTE) GUsers);
} else {
LogWriteLog(1, Lids(IDS_L_197), GroupBuffer[Count].Name);
ErrorIt(Lids(IDS_L_197), GroupBuffer[Count].Name);
}
} // loop adding users to groups
ErrorCategorySet(Lids(IDS_L_198));
// +-------------------------------------------------------------+
// | Convert Security Equivalences to Group Names |
// +-------------------------------------------------------------+
SecEquivTitle = FALSE;
for (Count = 0; Count < UserCount; Count++) {
GUserCount = 0;
SecEquivUser = FALSE;
if (!(status = NWUserEquivalenceEnum(Users->UserBuffer[Count].Name, &GUsers)) && (GUsers != NULL)) {
GUserCount = GUsers->Count;
GUserBuffer = GUsers->UserBuffer;
if (GUserCount > 0) {
for (i = 0; i < GUserCount; i++) {
pGroup = FindGroupMatch(GUserBuffer[i].Name, Groups, FALSE);
if (pGroup != NULL) {
if ((pGroup->err != NWC_ERR_NAMELONG) && (pGroup->err != NWC_ERR_NAMEINVALID))
if (!SecEquivTitle) {
SecEquivTitle = TRUE;
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_L_199));
}
if (!SecEquivUser) {
SecEquivUser = TRUE;
wsprintf(GroupTitle, Lids(IDS_S_47), Users->UserBuffer[Count].NewName);
EscapeFormattingChars(GroupTitle,
sizeof(GroupTitle)/sizeof(GroupTitle[0])) ;
Status_ItemLabel(GroupTitle);
LogWriteLog(1, TEXT("[%s]\r\n"), Users->UserBuffer[Count].NewName);
}
LogWriteLog(2, TEXT("%-20s"), pGroup->NewName);
Status_Item(pGroup->NewName);
#ifdef DEBUG
dprintf(TEXT("User [%s] Security Equivalence: %s\n"), Users->UserBuffer[Count].NewName, pGroup->NewName );
#endif
if (!TConversion)
if (NTGroupUserAdd(pGroup->NewName, Users->UserBuffer[Count].NewName, FALSE)) {
LogWriteLog(0, Lids(IDS_L_196));
ErrorIt(Lids(IDS_L_195), Users->UserBuffer[Count].NewName, pGroup->NewName);
}
LogWriteLog(0, Lids(IDS_CRLF));
} else {
// There was not a group match - check if this is supervisor
// equivalence
if (!lstrcmpi(GUserBuffer[i].Name, Lids(IDS_S_28))) {
// Check if we should add them
if (ConvOpt->AdminAccounts) {
if (!SecEquivTitle) {
SecEquivTitle = TRUE;
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_L_199));
}
if (!SecEquivUser) {
SecEquivUser = TRUE;
LogWriteLog(1, TEXT("[%s]\r\n"), Users->UserBuffer[Count].NewName);
}
LogWriteLog(2, TEXT("%-20s"), Lids(IDS_S_42));
if (!TConversion)
if (NTGroupUserAdd(Lids(IDS_S_42), Users->UserBuffer[Count].NewName, FALSE)) {
LogWriteLog(0, Lids(IDS_L_196));
ErrorIt(Lids(IDS_L_195), Users->UserBuffer[Count].NewName, Lids(IDS_S_42));
}
LogWriteLog(0, Lids(IDS_CRLF));
}
}
}
}
// Only put blank line if we logged this user
if (SecEquivUser)
LogWriteLog(0, Lids(IDS_CRLF));
}
FreeMemory((LPBYTE) GUsers);
}
} // Loop converting security equivalences
// Synchronize the domain - we need to synch as Print Operators are a
// local group
NTDomainSynch(CurrentConvertList->FileServ);
// Now set server to appropriate dest server (local group - so must
// be on dest server and not PDC or trusted domain)...
if ((status = NTServerSet(CurrentConvertList->FileServ->Name))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
ErrorIt(Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
return;
}
ErrorCategorySet(Lids(IDS_L_200));
// +-------------------------------------------------------------+
// | Do Print Operators |
// +-------------------------------------------------------------+
SecEquivTitle = FALSE;
if (!(status = NWPrintOpsEnum(&GUsers)) && (GUsers != NULL)) {
GUserCount = GUsers->Count;
GUserBuffer = GUsers->UserBuffer;
if (GUserCount > 0) {
for (i = 0; i < GUserCount; i++) {
if (!SecEquivTitle) {
SecEquivTitle = TRUE;
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_L_201));
}
pUser = FindUserMatch(GUserBuffer[i].Name, Users, FALSE);
if ((pUser == NULL) || ((pUser->err != NWC_ERR_NAMELONG) && (pUser->err != NWC_ERR_NAMEINVALID))) {
if (pUser == NULL)
NewName = NWSpecialNamesMap(GUserBuffer[i].Name);
else
NewName = pUser->NewName;
LogWriteLog(2, TEXT("%-20s"), NewName);
#ifdef DEBUG
dprintf(TEXT("Adding User [%s] to Group: %s\n"), NewName, Lids(IDS_S_43) );
#endif
if (!TConversion)
if (NTGroupUserAdd(Lids(IDS_S_43), NewName, TRUE)) {
LogWriteLog(0, Lids(IDS_L_196));
ErrorIt(Lids(IDS_L_195), NewName, Lids(IDS_S_43));
}
LogWriteLog(0, Lids(IDS_CRLF));
}
}
}
}
LogWriteSummary(1, Lids(IDS_L_202), lToStr(TotConv));
} // GroupsConvert
/*+-------------------------------------------------------------------------+
| SupervisorDefaultsConvert()
|
+-------------------------------------------------------------------------+*/
void SupervisorDefaultsConvert(TRANSFER_LIST *tl) {
ULONG i;
void *Defaults;
BOOL ConvertDefaults = FALSE;
NT_DEFAULTS *NTDefaults = NULL;
NT_DEFAULTS CDefaults;
DEST_SERVER_BUFFER *oDServ = NULL;
TRANSFER_BUFFER *TList;
CONVERT_OPTIONS *ConvOpt;
if (tl == NULL)
return;
TList = tl->TList;
memset(&CDefaults, 0, sizeof(CDefaults));
LogWriteLog(0, Lids(IDS_LINE));
LogWriteLog(0, Lids(IDS_BRACE), Lids(IDS_L_203));
LogWriteLog(0, Lids(IDS_LINE));
// Loop through the server pairs for conversion - this is sorted in order of
// destination users servers.
for (i = 0; i < tl->Count; i++) {
CurrentConvertList = TList[i].ConvertList;
ConvOpt = (CONVERT_OPTIONS *) CurrentConvertList->ConvertOptions;
if (CurrentConvertList->FileServ != oDServ) {
// if this is not the first time through the loop, then we need to save
// off the converted defaults
if (ConvertDefaults && (oDServ != NULL)) {
ConvertDefaults = FALSE;
LogWriteLog(0, Lids(IDS_L_204), oDServ->Name);
if (NTDefaults != NULL) {
NTUserDefaultsLog(*NTDefaults);
if (!TConversion)
NTUserDefaultsSet(*NTDefaults);
}
}
oDServ = CurrentConvertList->FileServ;
// Point to dest server and get defaults
NTServerSet(CurrentConvertList->FileServ->Name);
NTUserDefaultsGet(&NTDefaults);
memset(&CDefaults, 0, sizeof(CDefaults));
if (NTDefaults != NULL)
memcpy(&CDefaults, NTDefaults, sizeof(CDefaults));
}
// Supervisor defaults
if (ConvOpt->SupervisorDefaults) {
// if not flagged for this dest server, then flag and write out original
// values
if (!ConvertDefaults) {
ConvertDefaults = TRUE;
if (NTDefaults != NULL) {
LogWriteLog(0, Lids(IDS_L_205), CurrentConvertList->FileServ->Name);
NTUserDefaultsLog(*NTDefaults);
}
}
NWServerSet(CurrentConvertList->SourceServ->Name);
NWUserDefaultsGet(&Defaults);
if (Defaults != NULL) {
LogWriteLog(0, Lids(IDS_L_206), CurrentConvertList->SourceServ->Name);
NWUserDefaultsLog(Defaults);
NWUserDefaultsMap(Defaults, &CDefaults);
// Now map in least restrictive values to the NT one
if (NTDefaults != NULL) {
if (CDefaults.min_passwd_len < NTDefaults->min_passwd_len)
NTDefaults->min_passwd_len = CDefaults.min_passwd_len;
if (CDefaults.max_passwd_age < NTDefaults->max_passwd_age)
NTDefaults->max_passwd_age = CDefaults.max_passwd_age;
if (CDefaults.force_logoff < NTDefaults->force_logoff)
NTDefaults->force_logoff = CDefaults.force_logoff;
}
FreeMemory(Defaults);
Defaults = NULL;
}
}
}
// Need to catch the last one through the loop
if (ConvertDefaults && (oDServ != NULL)) {
ConvertDefaults = FALSE;
LogWriteLog(0, Lids(IDS_L_204), oDServ->Name);
if (NTDefaults != NULL) {
NTUserDefaultsLog(*NTDefaults);
if (!TConversion)
NTUserDefaultsSet(*NTDefaults);
}
}
} // SupervisorDefaultsConvert
/*+-------------------------------------------------------------------------+
| TransferListCompare()
|
+-------------------------------------------------------------------------+*/
int __cdecl TransferListCompare(const void *arg1, const void *arg2) {
TRANSFER_BUFFER *TBarg1, *TBarg2;
TBarg1 = (TRANSFER_BUFFER *) arg1;
TBarg2 = (TRANSFER_BUFFER *) arg2;
return lstrcmpi( TBarg1->ServerName, TBarg2->ServerName);
} // TransferListCompare
/*+-------------------------------------------------------------------------+
| TransferListCreate()
|
+-------------------------------------------------------------------------+*/
TRANSFER_LIST *TransferListCreate() {
CONVERT_OPTIONS *ConvOpt;
static TRANSFER_LIST *tl;
TRANSFER_BUFFER *TList;
CONVERT_LIST *CList;
ULONG Count = 0;
tl = NULL;
CList = ConvertListStart;
while (CList != NULL) {
Count++;
CList = CList->next;
}
if (Count == 0)
return NULL;
tl = AllocMemory(sizeof(TRANSFER_LIST) + (sizeof(TRANSFER_BUFFER) * Count));
if (tl == NULL)
return NULL;
tl->Count = Count;
TList = tl->TList;
// init it all to NULL
memset(TList, 0, sizeof(TRANSFER_BUFFER) * Count);
Count = 0;
CList = ConvertListStart;
while (CList != NULL) {
TList[Count].ConvertList = CList;
// If going to a trusted domain then point to it's PDC for user transfers
ConvOpt = (CONVERT_OPTIONS *) CList->ConvertOptions;
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL) && (ConvOpt->TrustedDomain->PDCName != NULL)) {
TList[Count].UserServerType = USER_SERVER_TRUSTED;
TList[Count].ServerName = ConvOpt->TrustedDomain->PDCName;
} else
// If in a domain then point to the PDC for user transfers
if (CList->FileServ->InDomain && CList->FileServ->Domain) {
TList[Count].UserServerType = USER_SERVER_PDC;
TList[Count].ServerName = CList->FileServ->Domain->PDCName;
} else {
TList[Count].UserServerType = USER_SERVER;
TList[Count].ServerName = CList->FileServ->Name;
}
Count++;
CList = CList->next;
}
// Have setup the main transfer list - now need to sort it in order of the
// server names that users are being transfered to.
qsort((void *) TList, (size_t) tl->Count, sizeof(TRANSFER_BUFFER), TransferListCompare);
#ifdef DEBUG
dprintf(TEXT("\nTransfer List:\n"));
for (Count = 0; Count < tl->Count; Count++) {
dprintf(TEXT(" Name: %s "), TList[Count].ServerName);
switch (TList[Count].UserServerType) {
case USER_SERVER:
dprintf(TEXT("(Normal)\n"));
break;
case USER_SERVER_PDC:
dprintf(TEXT("(PDC)\n"));
break;
case USER_SERVER_TRUSTED:
dprintf(TEXT("(TRUSTED)\n"));
break;
}
}
dprintf(TEXT("\n"));
#endif
return tl;
} // TransferListCreate
/*+-------------------------------------------------------------------------+
| DoConversion()
|
| Main program that does the actuall conversion. Loops through the
| convert list and transfer the information.
|
+-------------------------------------------------------------------------+*/
void DoConversion(HWND hDlg, BOOL TrialConversion) {
TRANSFER_LIST *tl = NULL;
TRANSFER_BUFFER *TList;
LPTSTR oDServ = NULL;
DWORD status = 0;
UINT i;
BOOL GotUserList;
TCHAR sztime[40];
LPTSTR DomainName;
time(&StartTime);
TransferCancel = FALSE;
TConversion = TrialConversion;
// Check if going to non NTFS drives - if so, let user abort
NTFSCheck(hDlg);
if (TransferCancel)
return;
CursorHourGlass();
PanelDlg_Do(hDlg, Lids(IDS_D_22));
ConvertFilesInit(hDlg);
if (Panel_Cancel()) {
PanelDlgKill();
TransferCancel = TRUE;
CursorNormal();
return;
}
PanelDlgKill();
// Check if enough space on destination drives, if not allow user to abort
CursorNormal();
SpaceCheck(hDlg);
if (TransferCancel)
return;
CursorHourGlass();
tl = TransferListCreate();
TList = tl->TList;
DoStatusDlg(hDlg);
Status_TotConv((UINT) NumServerPairs);
Users = NULL;
NTUsers = NULL;
Groups = NULL;
NTGroups = NULL;
UserCount = 0;
NTUserCount = 0;
GroupCount = 0;
NTGroupCount= 0;
// Initialize global statistics
TotErrors = 0;
TotGroups = 0;
TotUsers = 0;
TotFiles = 0;
// Update statistics window
Status_TotComplete(0);
Status_TotGroups(TotGroups);
Status_TotUsers(TotUsers);
Status_TotFiles(TotFiles);
Status_TotErrors(TotErrors);
// Set up logs and do all the header stuff
LogInit();
if (TrialConversion) {
LogWriteLog(0, Lids(IDS_L_207));
} else {
LogWriteLog(0, Lids(IDS_L_208));
}
LogWriteSummary(0, Lids(IDS_CRLF));
LogWriteErr(Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_CRLF));
// Log the list of servers to be converted
ErrorResetAll();
ConvertListLog();
// Loop through source servers and conglomerate defaults into dest servers
// and log the results
SupervisorDefaultsConvert(tl);
// +---------------------------------------------------------------------+
// | Done with init - loop through server pairs and do conversion |
// +---------------------------------------------------------------------+
// Get Local computer name
GetLocalName(&LocalName);
// Loop through the server pairs for conversion
for (i = 0; ((i < tl->Count) && !TransferCancel); i++) {
CurrentConvertList = TList[i].ConvertList;
// Get source and destination server - update logs and status window
Status_CurConv(i + 1);
SourceServer = CurrentConvertList->SourceServ->Name;
DestServer = CurrentConvertList->FileServ->Name;
Status_SrcServ(SourceServer);
Status_DestServ(DestServer);
// Log this server pair - section heading
ConvertPairLog();
// SetConvert options and log them out.
ConvOpt = (CONVERT_OPTIONS *) CurrentConvertList->ConvertOptions;
FileOptions = (FILE_OPTIONS *) CurrentConvertList->FileOptions;
ConvertOptionsLog();
OptionsFileLog();
// If our destination server has changed then update the caches
if (TList[i].ServerName != oDServ) {
oDServ = TList[i].ServerName;
GotUserList = TRUE;
ListCacheFree(&UserCacheHead);
ListCacheFree(&GroupCacheHead);
if ((status = NTServerSet(DestServer))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), DestServer);
ErrorIt(Lids(IDS_L_209), DestServer);
goto ConvDo_Loop;
}
// Put VShares here so it doesn't get lost in user info
if (FileOptions->TransferFileInfo)
VSharesCreate(CurrentConvertList->FileServ, TConversion);
// Get users on NT server and put in cache
if (status = NTUsersEnum(&NTUsers)) {
// Failed - make sure we don't try to convert users and log err
NTUsers = NULL;
NTUserCount = 0;
LogWriteLog(0, Lids(IDS_L_210), DestServer);
ErrorIt(Lids(IDS_L_210), DestServer);
GotUserList = FALSE;
} else
NTUserCount = NTUsers->Count;
if (!ListCachePut(&UserCacheHead, (void *) NTUsers, NTUserCount)) {
// Failed - but clean up NT List first
GotUserList = FALSE;
FreeMemory(NTUsers);
} else {
// Now get Groups (if users succeded) and put in group cache
if (status = NTGroupsEnum(&NTGroups)) {
// Failed - make sure we don't try to convert users and log err
NTGroupCount = 0;
NTGroups = NULL;
LogWriteLog(0, Lids(IDS_L_211), DestServer);
ErrorIt(Lids(IDS_L_211), DestServer);
FreeMemory(NTUsers);
GotUserList = FALSE;
} else
NTGroupCount = NTGroups->Count;
if (!ListCachePut(&GroupCacheHead, (void *) NTGroups, NTGroupCount)) {
// Failed - but clean up NT List first
GotUserList = FALSE;
FreeMemory(NTUsers);
FreeMemory(NTGroups);
}
}
}
wsprintf(UserServerName, TEXT("\\\\%s"), TList[i].ServerName);
if ((status = NTServerSet(TList[i].ServerName))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), TList[i].ServerName);
ErrorIt(Lids(IDS_L_209), TList[i].ServerName);
goto ConvDo_Loop;
}
if (ConvOpt->NetWareInfo) {
NTSAMClose();
if (ConvOpt->UseTrustedDomain && (ConvOpt->TrustedDomain != NULL))
DomainName = ConvOpt->TrustedDomain->Name;
else
if ((CurrentConvertList->FileServ->InDomain) && (CurrentConvertList->FileServ->Domain != NULL))
DomainName = CurrentConvertList->FileServ->Domain->Name;
else
DomainName = TEXT("");
if ((status = NTSAMConnect(TList[i].ServerName, DomainName))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), TList[i].ServerName);
ErrorIt(Lids(IDS_L_209), TList[i].ServerName);
goto ConvDo_Loop;
}
}
if ((status = NWServerSet(SourceServer))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), SourceServer);
ErrorIt(Lids(IDS_L_209), SourceServer);
goto ConvDo_Loop;
}
//
// If we are using mapping file then don't enum users and groups off
// the server. Get them from the mapping file instead.
//
hMap = NULL;
if (ConvOpt->UseMappingFile) {
//
// This is mapping file stuff
//
hMap = map_Open(ConvOpt->MappingFile);
if (hMap == NULL) {
ErrorIt(Lids(IDS_L_217), ConvOpt->MappingFile);
goto ConvDo_Loop;
}
if ((status = map_GroupsEnum(hMap, &Groups))) {
// Failed - make sure we don't try to convert users and log err
Groups = NULL;
GroupCount = 0;
LogWriteLog(0, Lids(IDS_L_219), ConvOpt->MappingFile);
ErrorIt(Lids(IDS_L_219), ConvOpt->MappingFile);
GotUserList = FALSE;
} else
GroupCount = Groups->Count;
if ((status = map_UsersEnum(hMap, &Users))) {
// Failed - make sure we don't try to convert users and log err
Users = NULL;
UserCount = 0;
LogWriteLog(0, Lids(IDS_L_218), ConvOpt->MappingFile);
ErrorIt(Lids(IDS_L_218), ConvOpt->MappingFile);
GotUserList = FALSE;
} else
UserCount = Users->Count;
} else {
//
// Enuming users and groups from NetWare Server instead of map file
//
if ((status = NWGroupsEnum(&Groups, TRUE))) {
// Failed - make sure we don't try to convert users and log err
Groups = NULL;
GroupCount = 0;
LogWriteLog(0, Lids(IDS_L_211), SourceServer);
ErrorIt(Lids(IDS_L_211), SourceServer);
GotUserList = FALSE;
} else
GroupCount = Groups->Count;
if ((status = NWUsersEnum(&Users, TRUE))) {
// Failed - make sure we don't try to convert users and log err
Users = NULL;
UserCount = 0;
LogWriteLog(0, Lids(IDS_L_210), SourceServer);
ErrorIt(Lids(IDS_L_210), SourceServer);
GotUserList = FALSE;
} else
UserCount = Users->Count;
}
if (GotUserList) {
// User and Groups
if (ConvOpt->TransferUserInfo) {
UsersConvert();
if (!TransferCancel)
GroupsConvert();
}
}
// Note GroupsConvert switches servers for Print Operators to the
// destination server (and not the PDC).
// Files
if (!(TransferCancel) && FileOptions->TransferFileInfo) {
ErrorCategorySet(Lids(IDS_L_212));
// Now set server to appropriate file dest server
if ((status = NTServerSet(CurrentConvertList->FileServ->Name))) {
// Failed to set server so log it and loop to next server
LogWriteLog(0, Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
ErrorIt(Lids(IDS_L_209), CurrentConvertList->FileServ->Name);
goto ConvDo_Loop;
}
Status_BytesTxt(Lids(IDS_L_213));
Status_Bytes(TEXT("0"));
Status_TotBytes(TEXT("0"));
Status_BytesSep(Lids(IDS_L_214));
ConvertFiles(hDlg, TConversion, Users, Groups);
Status_BytesTxt(TEXT(""));
Status_Bytes(TEXT(""));
Status_TotBytes(TEXT(""));
Status_BytesSep(TEXT(""));
}
NWServerFree();
ConvDo_Loop:
Status_TotComplete(i);
if (Users) {
FreeMemory(Users);
UserCount = 0;
}
if (Groups) {
FreeMemory(Groups);
GroupCount = 0;
}
if (hMap != NULL)
map_Close(hMap);
} // for loop through transfer list
// Free up our caches
ListCacheFree(&UserCacheHead);
ListCacheFree(&GroupCacheHead);
// Log out the finish time
LogWriteSummary(0, Lids(IDS_CRLF));
LogWriteSummary(0, Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_CRLF));
LogWriteLog(0, Lids(IDS_CRLF));
GetTime(sztime);
if (TransferCancel) {
LogWriteLog(0, Lids(IDS_L_215), sztime);
LogWriteSummary(0, Lids(IDS_L_215), sztime);
} else {
LogWriteLog(0, Lids(IDS_L_216), sztime);
LogWriteSummary(0, Lids(IDS_L_216), sztime);
}
if (tl != NULL)
FreeMemory(tl);
NTSAMClose();
StatusDlgKill();
CursorNormal();
TotConversions = i;
ConversionEndDlg_Do(hDlg);
} // DoConversion
/*+-------------------------------------------------------------------------+
| ConversionSuccessful()
|
+-------------------------------------------------------------------------+*/
BOOL ConversionSuccessful() {
if (TotErrors || TransferCancel)
return FALSE;
else
return TRUE;
} // ConversionSuccesful