#include "main.h" #include #include #include #include DWORD NWAPICheckSchemaExtension( PWSTR szServer, PWSTR szContext, PWSTR szUser, PWSTR szPasswd, BOOL *pfExtended ) { DWORD dwStatus = NO_ERROR; HANDLE hAttrOperationData = NULL; HANDLE hTree = NULL; DWORD dwNumEntries = 0L; DWORD dwInfoType; LPNDS_ATTR_DEF lpAttrDef = NULL; DWORD WinError = 0; BOOL fSchemaExtended = FALSE; DWORD dwSize; PWSTR pszUserName = NULL; PWSTR pszServerName = NULL; if (!(szServer && pfExtended)) { ERR(("Invalid parameters.\n")); WinError = ERROR_INVALID_PARAMETER; BAIL(); } dwSize = (wcslen((PWSTR)g_szServerPrefix) + wcslen(szServer) + 1) * sizeof(WCHAR); pszServerName = (PWSTR)MemAlloc(dwSize); if (pszServerName== NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszServerName,(PWSTR)g_szServerPrefix); wcscat(pszServerName,szServer); if (szContext) { dwSize = wcslen(szContext) + wcslen(szUser) + wcslen((PWSTR)g_szDot) + 1; dwSize *= sizeof(WCHAR); pszUserName = (PWSTR)MemAlloc(dwSize); if (pszUserName == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszUserName,szUser); wcscat(pszUserName,g_szDot); wcscat(pszUserName,szContext); } dwStatus = NwNdsOpenObject(pszServerName, pszUserName, szPasswd, &hTree, NULL, NULL, NULL, NULL, NULL); if ( dwStatus ) { WinError = GetLastError(); ERR(( "Error: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus)); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsCreateBuffer( NDS_SCHEMA_READ_ATTR_DEF, &hAttrOperationData ); if ( dwStatus ) { WinError = GetLastError(); ERR(( "Error: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus)); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsPutInBuffer( (PWSTR)g_szAttributeName, 0, NULL, 0, 0, hAttrOperationData ); if ( dwStatus ) { WinError = GetLastError(); ERR(( "Error: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus)); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsReadAttrDef( hTree, NDS_INFO_NAMES_DEFS, & hAttrOperationData ); if (dwStatus == NDS_ERR_NO_SUCH_ATTRIBUTE) { dwStatus = 0; goto error; } else if ( dwStatus ) { WinError = GetLastError(); ERR(( "Error: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus)); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsGetAttrDefListFromBuffer( hAttrOperationData, & dwNumEntries, & dwInfoType, (void **)& lpAttrDef ); if ( dwStatus ) { WinError = GetLastError(); ERR(( "Error: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus)); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } if (dwNumEntries == 1 && dwInfoType == 1) { if (wcscmp(lpAttrDef->szAttributeName,g_szAttributeName) == 0) { fSchemaExtended = TRUE; } DEBUGOUT(("Successfully retrieved information off GSNW/CSNW.\n")); } error: *pfExtended = fSchemaExtended; if (dwStatus && dwStatus != -1) { SelectivePrint(MSG_NETWARE_ERROR,dwStatus); } if(hTree){ dwStatus = NwNdsCloseObject(hTree); } if(hAttrOperationData){ dwStatus = NwNdsFreeBuffer(hAttrOperationData); } if (pszUserName) MemFree(pszUserName); if (pszServerName) MemFree(pszServerName); return WinError; } DWORD NWAPIExtendSchema( PWSTR szServer, PWSTR szContext, PWSTR szUser, PWSTR szPasswd ) { DWORD dwSyntaxId; DWORD dwMinValue = 0; DWORD dwMaxValue = -1; ASN1_ID asn1Id; DWORD dwStatus = NO_ERROR; HANDLE hTree; HANDLE hClasses = NULL; DWORD WinError = NO_ERROR; DWORD dwSize; PWSTR pszUserName = NULL; PWSTR pszServerName = NULL; if (!(szServer)) { ERR(("Invalid parameters.\n")); WinError = ERROR_INVALID_PARAMETER; BAIL(); } dwSize = (wcslen((PWSTR)g_szServerPrefix) + wcslen(szServer) + 1) * sizeof(WCHAR); pszServerName = (PWSTR)MemAlloc(dwSize); if (pszServerName== NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszServerName,(PWSTR)g_szServerPrefix); wcscat(pszServerName,szServer); if (szContext) { dwSize = wcslen(szContext) + wcslen(szUser) + wcslen((PWSTR)g_szDot) + 1; dwSize *= sizeof(WCHAR); pszUserName = (PWSTR)MemAlloc(dwSize); if (pszUserName == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszUserName,szUser); wcscat(pszUserName,g_szDot); wcscat(pszUserName,szContext); } asn1Id.length = 32; memset(asn1Id.data,0,32); memcpy(asn1Id.data,g_pbASN,g_dwASN); dwStatus = NwNdsOpenObject(pszServerName, pszUserName, szPasswd, &hTree, NULL, NULL, NULL, NULL, NULL ); if (dwStatus) { WinError = GetLastError(); ERR(( "\nError: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus )); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsDefineAttribute(hTree, (PWSTR)g_szAttributeName, NDS_SINGLE_VALUED_ATTR, NDS_SYNTAX_ID_9, dwMinValue, dwMaxValue, asn1Id ); if ( dwStatus ) { if (dwStatus == NDS_ERR_ATTRIBUTE_ALREADY_EXISTS) { DEBUGOUT(("The attribute exists already!\n")); dwStatus = 0; WinError = 1; BAIL(); } WinError = GetLastError(); ERR(( "\nError: NwNdsDefineAttribute returned dwStatus 0x%.8X\n", dwStatus )); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsAddAttributeToClass(hTree, (PWSTR)g_szClass, (PWSTR)g_szAttributeName); if ( dwStatus ) { WinError = GetLastError(); ERR(( "\nError: NwNdsAddAttributeToClass returned dwStatus 0x%.8X\n", dwStatus )); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } error: if(hTree) dwStatus = NwNdsCloseObject(hTree); if (pszUserName) MemFree(pszUserName); if (pszServerName) MemFree(pszServerName); if (dwStatus && dwStatus != -1) { SelectivePrint(MSG_NETWARE_ERROR,dwStatus); } return WinError; } DWORD NWAPIUnextendSchema( PWSTR szServer, PWSTR szContext, PWSTR szUser, PWSTR szPasswd ) { DWORD dwStatus = NO_ERROR; HANDLE hTree = NULL; DWORD dwSize; PWSTR pszUserName = NULL; PWSTR pszServerName = NULL; DWORD WinError = NO_ERROR; if (!(szServer && szContext && szUser && szPasswd)) { ERR(("Invalid parameters.\n")); WinError = ERROR_INVALID_PARAMETER; BAIL(); } dwSize = wcslen(szContext) + wcslen(szUser) + wcslen((PWSTR)g_szDot) + 1; dwSize *= sizeof(WCHAR); pszUserName = (PWSTR)MemAlloc(dwSize); if (pszUserName == NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszUserName,szUser); wcscat(pszUserName,g_szDot); wcscat(pszUserName,szContext); dwSize = (wcslen((PWSTR)g_szServerPrefix) + wcslen(szServer) + 1) * sizeof(WCHAR); pszServerName = (PWSTR)MemAlloc(dwSize); if (pszServerName== NULL) { WinError = ERROR_NO_SYSTEM_RESOURCES; BAIL(); } wcscpy(pszServerName,(PWSTR)g_szServerPrefix); wcscat(pszServerName,szServer); dwStatus = NwNdsOpenObject( pszServerName, pszUserName, szPasswd, &hTree, NULL, NULL, NULL, NULL, NULL ); if (dwStatus) { WinError = GetLastError(); ERR(( "\nError: NwNdsOpenObject returned dwStatus 0x%.8X\n", dwStatus )); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } dwStatus = NwNdsDeleteAttrDef( hTree, (PWSTR)g_szAttributeName ); if (dwStatus) { WinError = GetLastError(); ERR(( "\nError: NwNdsDeleteAttrDef returned dwStatus 0x%.8X\n", dwStatus )); ERR(( "Error: GetLastError returned: 0x%.8X\n\n",WinError)); BAIL(); } error: if(hTree) dwStatus = NwNdsCloseObject(hTree); if (pszUserName) MemFree(pszUserName); if (pszServerName) MemFree(pszServerName); return WinError; }