#include "main.h" #include #include #include #include "typedef.h" DWORD LoadNetwareDLLs(); PF_NWCallsInit pfNWCallsInit = NULL; PF_NWFreeUnicodeTables pfNWFreeUnicodeTables= NULL; PF_NWInitUnicodeTables pfNWInitUnicodeTables= NULL; PF_NWLlocaleconv pfNWLlocaleconv= NULL; PF_NWDSFreeContext pfNWDSFreeContext= NULL; PF_NWDSFreeBuf pfNWDSFreeBuf= NULL; PF_NWDSLogout pfNWDSLogout= NULL; PF_NWDSGetAttrDef pfNWDSGetAttrDef= NULL; PF_NWDSGetAttrCount pfNWDSGetAttrCount= NULL; PF_NWDSReadAttrDef pfNWDSReadAttrDef= NULL; PF_NWDSPutAttrName pfNWDSPutAttrName= NULL; PF_NWDSInitBuf pfNWDSInitBuf= NULL; PF_NWDSAllocBuf pfNWDSAllocBuf= NULL; PF_NWDSLogin pfNWDSLogin= NULL; PF_NWDSSetContext pfNWDSSetContext= NULL; PF_NWDSGetContext pfNWDSGetContext= NULL; PF_NWIsDSAuthenticated pfNWIsDSAuthenticated= NULL; PF_NWDSCreateContext pfNWDSCreateContext= NULL; PF_NWDSModifyClassDef pfNWDSModifyClassDef = NULL; PF_NWDSDefineAttr pfNWDSDefineAttr = NULL; HINSTANCE calwin32LibraryHandle = NULL; HINSTANCE locwin32LibraryHandle = NULL; HINSTANCE netwin32LibraryHandle = NULL; DWORD Client32CheckSchemaExtension( PWSTR szServer, PWSTR szContext, PWSTR szUser, PWSTR szPasswd, BOOL *pfExtended ) { NWDSContextHandle context = NULL; pBuf_T pInBuf = NULL; pBuf_T pOutBuf = NULL; BOOL fFreeUnicodeTable = FALSE; BOOL fLoggedIn= FALSE; BOOL fLogout = TRUE; nint32 lIterationHandle; Attr_Info_T attrInfo; NWDSCCODE ccode; nuint32 luTotalAttr; nstr8 strAttrName[MAX_SCHEMA_NAME_CHARS]; nuint i; LCONV lConvInfo; nstr8 treeName[MAX_DN_CHARS+1]; nstr8 strName[MAX_DN_CHARS+1]; BOOL fSchemaExtended = FALSE; DWORD WinError; PSTR pszServer = NULL; PSTR pszContext = NULL; PSTR pszUser = NULL; PSTR pszPasswd = NULL; // // We only check server and extended because they are the only must-have // parameters // if (!(szServer && pfExtended)) { ERR(("Invalid parameters.\n")); WinError = ERROR_INVALID_PARAMETER; BAIL(); } // // Basic initialization // WinError = LoadNetwareDLLs(); if (WinError) { BAIL(); } ccode = pfNWCallsInit(NULL,NULL); if (ccode) { ERR(("NWCallsInit returned %X\n", ccode)); BAIL(); } pfNWLlocaleconv(&lConvInfo); ccode = pfNWInitUnicodeTables(lConvInfo.country_id, lConvInfo.code_page); if (ccode) { ERR(("NWInitUnicodeTables returned %X\n", ccode)); BAIL(); } fFreeUnicodeTable = TRUE; context = pfNWDSCreateContext(); if (context == (NWDSContextHandle)ERR_CONTEXT_CREATION) { ERR(("NWDSCreateContext failed\n")); BAIL(); } pszServer = AllocateAnsiString(szServer); if (pszServer == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } if (szContext == NULL) { goto doit; } pszContext = AllocateAnsiString(szContext); if (pszContext == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } pszUser = AllocateAnsiString(szUser); if (pszUser == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } pszPasswd = AllocateAnsiString(szPasswd); if (pszPasswd == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } if(!pfNWIsDSAuthenticated()) { DEBUGOUT(("The system is not authenticated.\n")); } else { DEBUGOUT(("The system has been authenticated already\n")); // // Get Current tree's name // ccode = pfNWDSGetContext(context, DCK_TREE_NAME, &treeName); if(ccode) { ERR(("Get context returned %X\n", ccode)); BAIL(); } DEBUGOUT(("Current Tree is %s.\n",treeName)); // // Get current context's name // ccode = pfNWDSGetContext(context, DCK_NAME_CONTEXT, &strName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current Context is %s.\n",strName)); // // If the current tree and context is the same as the desired tree // and context, we do not need to logout. Because that would blow out // the connection. // if ((_stricmp(treeName,pszServer) == 0) && (_stricmp(strName,pszContext) == 0)) { DEBUGOUT(("Will not logout.\n",strName)); fLogout = FALSE; } } // // Set context to another tree // ccode = pfNWDSSetContext(context, DCK_TREE_NAME, pszServer ); if(ccode) { ERR(("\nSet context returned %X", ccode)); BAIL(); } // // Set context to another context // ccode = pfNWDSSetContext( context, DCK_NAME_CONTEXT, pszContext ); if(ccode) { ERR(("\nSet context returned %X", ccode)); BAIL(); } // // Get Current tree's name // ccode = pfNWDSGetContext(context, DCK_TREE_NAME, &treeName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current tree is %s.\n",treeName)); ccode = pfNWDSGetContext(context, DCK_NAME_CONTEXT, &strName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current conext is now %s.\n",strName)); // // Logging into new tree // DEBUGOUT(("Logging in...\n")); ccode = pfNWDSLogin(context, 0, pszUser, pszPasswd, 0); if(ccode) { ERR(("\nNWDSLogin returned %X\n", ccode)); BAIL(); } else { fLoggedIn = TRUE; DEBUGOUT(("Logged in successfully.\n")); } doit: if(pfNWIsDSAuthenticated()) DEBUGOUT(("The system has been authenticated already\n")); else DEBUGOUT(("The system is not authenticated.\n")); ccode = pfNWDSAllocBuf(DEFAULT_MESSAGE_LEN, &pInBuf); if(ccode) { ERR(("\nNWDSAllocBuf returned %X", ccode)); BAIL(); } ccode = pfNWDSAllocBuf(DEFAULT_MESSAGE_LEN, &pOutBuf); if(ccode) { ERR(("\nNWDSAllocBuf returned %X", ccode)); BAIL(); } ccode = pfNWDSInitBuf(context, DSV_READ_ATTR_DEF, pInBuf); if(ccode) { ERR(("\nNWDSInitBuf returned %X", ccode)); BAIL(); } ccode = pfNWDSPutAttrName(context, pInBuf, (PSTR)g_szAttributeNameA); if(ccode) { ERR(("\nNWDSPutAttrName returned %X", ccode)); BAIL(); } lIterationHandle = NO_MORE_ITERATIONS; ccode = pfNWDSReadAttrDef(context, DS_ATTR_DEFS, /* infoType, attribute definitions */ FALSE, /* allAttrs = false, passing in one */ pInBuf, /* through this buffer (strAttrNames) */ &lIterationHandle, pOutBuf); if (ccode == ERR_NO_SUCH_ATTRIBUTE) { ccode = 0; BAIL(); } else if (ccode) { ERR(("\nNWDSReadAttrDef returned %X", ccode)); BAIL(); } ccode = pfNWDSGetAttrCount(context, pOutBuf, &luTotalAttr); if(ccode) { ERR(("\nNWDSGetAttrCount returned %X", ccode)); BAIL(); } if (luTotalAttr == 1) { ccode = pfNWDSGetAttrDef(context, pOutBuf, strAttrName, &attrInfo); if(ccode) { ERR(("\nNWDSGetAttrCount returned %X", ccode)); BAIL(); } if (strcmp(strAttrName,(PSTR)g_szAttributeNameA) == 0) { fSchemaExtended = TRUE; } DEBUGOUT(("Successfully retrieved information off Client32.\n")); } error: if (fLogout & fLoggedIn) { DEBUGOUT(("We are logging out.\n",strName)); pfNWDSLogout(context); } if (pInBuf) pfNWDSFreeBuf(pInBuf); if (pOutBuf) pfNWDSFreeBuf(pOutBuf); if (context) pfNWDSFreeContext(context); if (fFreeUnicodeTable) pfNWFreeUnicodeTables(); if (pszServer) MemFree(pszServer); if (pszContext) MemFree(pszContext); if (pszUser) MemFree(pszUser); if (pszPasswd) MemFree(pszPasswd); *pfExtended = fSchemaExtended; if (WinError == 0 && (ccode != 0)) { WinError = ERROR_EXTENDED_ERROR; SelectivePrint(MSG_NETWARE_ERROR,ccode); } return WinError; } DWORD Client32ExtendSchema( PWSTR szServer, PWSTR szContext, PWSTR szUser, PWSTR szPasswd ) { NWDSContextHandle context = NULL; pBuf_T pInBuf = NULL; pBuf_T pOutBuf = NULL; BOOL fFreeUnicodeTable = FALSE; BOOL fLoggedIn= FALSE; BOOL fLogout = TRUE; NWDSCCODE ccode; nstr8 strAttrName[MAX_SCHEMA_NAME_CHARS]; nuint i; LCONV lConvInfo; DWORD dwSyntaxId; DWORD dwMinValue = 0; DWORD dwMaxValue = -1; Asn1ID_T *pasn1ID; Attr_Info_T AttrInfo; nstr8 treeName[MAX_DN_CHARS+1]; nstr8 strName[MAX_DN_CHARS+1]; DWORD WinError; PSTR pszServer = NULL; PSTR pszContext = NULL; PSTR pszUser = NULL; PSTR pszPasswd = NULL; // // We only check server and extended because they are the only must-have // parameters // if (!(szServer)) { ERR(("Invalid parameters.\n")); WinError = ERROR_INVALID_PARAMETER; BAIL(); } WinError = LoadNetwareDLLs(); if (WinError) { BAIL(); } ccode = pfNWCallsInit(NULL,NULL); if (ccode) { ERR(("NWCallsInit returned %X\n", ccode)); BAIL(); } pfNWLlocaleconv(&lConvInfo); ccode = pfNWInitUnicodeTables(lConvInfo.country_id, lConvInfo.code_page); if (ccode) { ERR(("NWInitUnicodeTables returned %X\n", ccode)); BAIL(); } fFreeUnicodeTable = TRUE; context = pfNWDSCreateContext(); if (context == (NWDSContextHandle)ERR_CONTEXT_CREATION) { ERR(("NWDSCreateContext failed\n")); BAIL(); } pszServer = AllocateAnsiString(szServer); if (pszServer == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } if (szContext == NULL) { goto extendnow; } pszContext = AllocateAnsiString(szContext); if (pszContext == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } pszUser = AllocateAnsiString(szUser); if (pszUser == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } pszPasswd = AllocateAnsiString(szPasswd); if (pszPasswd == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } if(!pfNWIsDSAuthenticated()) { DEBUGOUT(("The system is not authenticated.\n")); } else { DEBUGOUT(("The system has been authenticated already\n")); // // Get Current tree's name // ccode = pfNWDSGetContext(context, DCK_TREE_NAME, &treeName); if(ccode) { ERR(("Get context returned %X\n", ccode)); BAIL(); } DEBUGOUT(("Current Tree is %s.\n",treeName)); // // Get current context's name // ccode = pfNWDSGetContext(context, DCK_NAME_CONTEXT, &strName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current Context is %s.\n",strName)); // // If the current tree and context is the same as the desired tree // and context, we do not need to logout. Because that would blow out // the connection. // if ((_stricmp(treeName,pszServer) == 0) && (_stricmp(strName,pszContext) == 0)) { DEBUGOUT(("Will not logout.\n",strName)); fLogout = FALSE; } } // // Set context to another tree // ccode = pfNWDSSetContext(context, DCK_TREE_NAME, pszServer ); if(ccode) { ERR(("\nSet context returned %X", ccode)); BAIL(); } // // Set context to another context // ccode = pfNWDSSetContext( context, DCK_NAME_CONTEXT, pszContext ); if(ccode) { ERR(("\nSet context returned %X", ccode)); BAIL(); } // // Get Current tree's name // ccode = pfNWDSGetContext(context, DCK_TREE_NAME, &treeName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current tree is %s.\n",treeName)); ccode = pfNWDSGetContext(context, DCK_NAME_CONTEXT, &strName); if(ccode) { ERR(("\nGet context returned %X", ccode)); BAIL(); } DEBUGOUT(("Current conext is now %s.\n",strName)); // // Logging into new tree // DEBUGOUT(("Logging in...\n")); ccode = pfNWDSLogin(context, 0, pszUser, pszPasswd, 0); if(ccode) { ERR(("\nNWDSLogin returned %X\n", ccode)); BAIL(); } else { fLoggedIn = TRUE; DEBUGOUT(("Logged in successfully.\n")); } extendnow: if(pfNWIsDSAuthenticated()) DEBUGOUT(("The system has been authenticated already\n")); else DEBUGOUT(("The system is not authenticated.\n")); AttrInfo.attrFlags = DS_SINGLE_VALUED_ATTR; AttrInfo.attrSyntaxID = SYN_OCTET_STRING; AttrInfo.attrLower = dwMinValue; AttrInfo.attrUpper = dwMaxValue; pasn1ID = &(AttrInfo.asn1ID); memset(pasn1ID->data,0,32); pasn1ID->length = 32; memcpy(pasn1ID->data,g_pbASN,g_dwASN); ccode = pfNWDSDefineAttr(context, (PSTR)g_szAttributeNameA, &AttrInfo); if(ccode) { if (ccode == ERR_ATTRIBUTE_ALREADY_EXISTS) { ERR(("\nNWDSDefineAttr returned %X", ccode)); ERR(("The schema has been extended already\n", ccode)); WinError = 1; BAIL(); } ERR(("\nNWDSDefineAttr returned %X", ccode)); BAIL(); } ccode = pfNWDSAllocBuf(DEFAULT_MESSAGE_LEN, &pInBuf); if(ccode) { ERR(("\nNWDSAllocBuf returned %X", ccode)); BAIL(); } ccode = pfNWDSInitBuf(context, DSV_MODIFY_CLASS_DEF, pInBuf); if(ccode) { ERR(("\nNWDSInitBuf returned %X", ccode)); BAIL(); } ccode = pfNWDSPutAttrName(context, pInBuf, (PSTR)g_szAttributeNameA); if(ccode) { ERR(("\nNWDSPutAttrName returned %X", ccode)); BAIL(); } ccode = pfNWDSModifyClassDef(context, (PSTR)g_szClassA, pInBuf); if(ccode) { if (ccode == ERR_DUPLICATE_OPTIONAL) { ERR(("\nNWDSPutAttrName returned %X\n",ccode)); ERR(("The schema has been extended already\n", ccode)); WinError = 1; BAIL(); } ERR(("\nNWDSPutAttrName returned %X", ccode)); BAIL(); } error: if (fLogout & fLoggedIn) { DEBUGOUT(("We are logging out.\n",strName)); pfNWDSLogout(context); } if (pInBuf) pfNWDSFreeBuf(pInBuf); if (context) pfNWDSFreeContext(context); if (fFreeUnicodeTable) pfNWFreeUnicodeTables(); if (pszServer) MemFree(pszServer); if (pszContext) MemFree(pszContext); if (pszUser) MemFree(pszUser); if (pszPasswd) MemFree(pszPasswd); if (WinError == 0 && (ccode != 0)) { WinError = ERROR_EXTENDED_ERROR; SelectivePrint(MSG_NETWARE_ERROR,ccode); } return WinError; } DWORD LoadNetwareDLLs() { DWORD WinError = 0; calwin32LibraryHandle = LoadLibraryA("calwin32.DLL"); if (calwin32LibraryHandle == NULL) { WinError = GetLastError(); ERR(("loadlib failed with %d\n,WinError")); BAIL(); } locwin32LibraryHandle = LoadLibraryA("locwin32.DLL"); if (locwin32LibraryHandle == NULL) { WinError = GetLastError(); ERR(("loadlib failed with %d\n,WinError")); BAIL(); } netwin32LibraryHandle = LoadLibraryA("netwin32.DLL"); if (netwin32LibraryHandle == NULL) { WinError = GetLastError(); ERR(("loadlib failed with %d\n,WinError")); BAIL(); } pfNWCallsInit = (PF_NWCallsInit) GetProcAddress( calwin32LibraryHandle, "NWCallsInit"); if (pfNWCallsInit == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWFreeUnicodeTables = (PF_NWFreeUnicodeTables) GetProcAddress( locwin32LibraryHandle, "NWFreeUnicodeTables"); if (pfNWFreeUnicodeTables == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWInitUnicodeTables = (PF_NWInitUnicodeTables) GetProcAddress( locwin32LibraryHandle, "NWInitUnicodeTables"); if (pfNWInitUnicodeTables == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWLlocaleconv = (PF_NWLlocaleconv) GetProcAddress( locwin32LibraryHandle, "NWLlocaleconv"); if (pfNWLlocaleconv == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSFreeContext = (PF_NWDSFreeContext) GetProcAddress( netwin32LibraryHandle, "NWDSFreeContext"); if (pfNWDSFreeContext == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSFreeBuf = (PF_NWDSFreeBuf) GetProcAddress( netwin32LibraryHandle, "NWDSFreeBuf"); if (pfNWDSFreeBuf == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSLogout = (PF_NWDSLogout) GetProcAddress( netwin32LibraryHandle, "NWDSLogout"); if (pfNWDSLogout == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSGetAttrDef = (PF_NWDSGetAttrDef) GetProcAddress( netwin32LibraryHandle, "NWDSGetAttrDef"); if (pfNWDSGetAttrDef == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSGetAttrCount = (PF_NWDSGetAttrCount) GetProcAddress( netwin32LibraryHandle, "NWDSGetAttrCount"); if (pfNWDSGetAttrCount == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSReadAttrDef = (PF_NWDSReadAttrDef) GetProcAddress( netwin32LibraryHandle, "NWDSReadAttrDef"); if (pfNWDSReadAttrDef == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSPutAttrName = (PF_NWDSPutAttrName) GetProcAddress( netwin32LibraryHandle, "NWDSPutAttrName"); if (pfNWDSPutAttrName == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSInitBuf = (PF_NWDSInitBuf) GetProcAddress( netwin32LibraryHandle, "NWDSInitBuf"); if (pfNWDSInitBuf == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSAllocBuf = (PF_NWDSAllocBuf) GetProcAddress( netwin32LibraryHandle, "NWDSAllocBuf"); if (pfNWDSAllocBuf == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSLogin = (PF_NWDSLogin) GetProcAddress( netwin32LibraryHandle, "NWDSLogin"); if (pfNWDSLogin == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSSetContext = (PF_NWDSSetContext) GetProcAddress( netwin32LibraryHandle, "NWDSSetContext"); if (pfNWDSSetContext == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSGetContext = (PF_NWDSGetContext) GetProcAddress( netwin32LibraryHandle, "NWDSGetContext"); if (pfNWDSGetContext == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWIsDSAuthenticated = (PF_NWIsDSAuthenticated) GetProcAddress( netwin32LibraryHandle, "NWIsDSAuthenticated"); if (pfNWIsDSAuthenticated == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSCreateContext = (PF_NWDSCreateContext) GetProcAddress( netwin32LibraryHandle, "NWDSCreateContext"); if (pfNWDSCreateContext == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSModifyClassDef = (PF_NWDSModifyClassDef) GetProcAddress( netwin32LibraryHandle, "NWDSModifyClassDef"); if (pfNWDSModifyClassDef == NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } pfNWDSDefineAttr = (PF_NWDSDefineAttr) GetProcAddress( netwin32LibraryHandle, "NWDSDefineAttr"); if (pfNWDSDefineAttr== NULL) { WinError = GetLastError(); ERR(("getprocaddress failed with %d\n,WinError")); BAIL(); } error: return WinError; }