Annotation of embedaddon/ntp/lib/isc/win32/ntgroups.c, revision 1.1
1.1 ! misho 1: /*
! 2: * Copyright (C) 2004, 2006, 2007 Internet Systems Consortium, Inc. ("ISC")
! 3: * Copyright (C) 2001 Internet Software Consortium.
! 4: *
! 5: * Permission to use, copy, modify, and/or distribute this software for any
! 6: * purpose with or without fee is hereby granted, provided that the above
! 7: * copyright notice and this permission notice appear in all copies.
! 8: *
! 9: * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH
! 10: * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY
! 11: * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT,
! 12: * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM
! 13: * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE
! 14: * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
! 15: * PERFORMANCE OF THIS SOFTWARE.
! 16: */
! 17:
! 18: /* $Id: ntgroups.c,v 1.10 2007/06/19 23:47:19 tbox Exp $ */
! 19:
! 20: /*
! 21: * The NT Groups have two groups that are not well documented and are
! 22: * not normally seen: None and Everyone. A user account belongs to
! 23: * any number of groups, but if it is not a member of any group then
! 24: * it is a member of the None Group. The None group is not listed
! 25: * anywhere. You cannot remove an account from the none group except
! 26: * by making it a member of some other group, The second group is the
! 27: * Everyone group. All accounts, no matter how many groups that they
! 28: * belong to, also belong to the Everyone group. You cannot remove an
! 29: * account from the Everyone group.
! 30: */
! 31:
! 32: #ifndef UNICODE
! 33: #define UNICODE
! 34: #endif /* UNICODE */
! 35:
! 36: /*
! 37: * Silence warnings.
! 38: */
! 39: #define _CRT_SECURE_NO_DEPRECATE 1
! 40:
! 41: #include <windows.h>
! 42: #include <assert.h>
! 43: #include <lm.h>
! 44:
! 45: #include <isc/ntgroups.h>
! 46: #include <isc/result.h>
! 47:
! 48: #define MAX_NAME_LENGTH 256
! 49:
! 50: isc_result_t
! 51: isc_ntsecurity_getaccountgroups(char *username, char **GroupList,
! 52: unsigned int maxgroups,
! 53: unsigned int *totalGroups) {
! 54: LPGROUP_USERS_INFO_0 pTmpBuf;
! 55: LPLOCALGROUP_USERS_INFO_0 pTmpLBuf;
! 56: DWORD i;
! 57: LPLOCALGROUP_USERS_INFO_0 pBuf = NULL;
! 58: LPGROUP_USERS_INFO_0 pgrpBuf = NULL;
! 59: DWORD dwLevel = 0;
! 60: DWORD dwFlags = LG_INCLUDE_INDIRECT;
! 61: DWORD dwPrefMaxLen = MAX_PREFERRED_LENGTH;
! 62: DWORD dwEntriesRead = 0;
! 63: DWORD dwTotalEntries = 0;
! 64: NET_API_STATUS nStatus;
! 65: DWORD dwTotalCount = 0;
! 66: int retlen;
! 67: wchar_t user[MAX_NAME_LENGTH];
! 68:
! 69: retlen = mbstowcs(user, username, MAX_NAME_LENGTH);
! 70:
! 71: *totalGroups = 0;
! 72: /*
! 73: * Call the NetUserGetLocalGroups function
! 74: * specifying information level 0.
! 75: *
! 76: * The LG_INCLUDE_INDIRECT flag specifies that the
! 77: * function should also return the names of the local
! 78: * groups in which the user is indirectly a member.
! 79: */
! 80: nStatus = NetUserGetLocalGroups(NULL,
! 81: user,
! 82: dwLevel,
! 83: dwFlags,
! 84: (LPBYTE *) &pBuf,
! 85: dwPrefMaxLen,
! 86: &dwEntriesRead,
! 87: &dwTotalEntries);
! 88: /*
! 89: * See if the call succeeds,
! 90: */
! 91: if (nStatus != NERR_Success) {
! 92: if (nStatus == ERROR_ACCESS_DENIED)
! 93: return (ISC_R_NOPERM);
! 94: if (nStatus == ERROR_MORE_DATA)
! 95: return (ISC_R_NOSPACE);
! 96: if (nStatus == NERR_UserNotFound)
! 97: dwEntriesRead = 0;
! 98: }
! 99:
! 100: dwTotalCount = 0;
! 101: if (pBuf != NULL) {
! 102: pTmpLBuf = pBuf;
! 103: /*
! 104: * Loop through the entries
! 105: */
! 106: for (i = 0;
! 107: (i < dwEntriesRead && *totalGroups < maxgroups); i++) {
! 108: assert(pTmpLBuf != NULL);
! 109: if (pTmpLBuf == NULL)
! 110: break;
! 111: retlen = wcslen(pTmpLBuf->lgrui0_name);
! 112: GroupList[*totalGroups] = (char *) malloc(retlen +1);
! 113: if (GroupList[*totalGroups] == NULL)
! 114: return (ISC_R_NOMEMORY);
! 115:
! 116: retlen = wcstombs(GroupList[*totalGroups],
! 117: pTmpLBuf->lgrui0_name, retlen);
! 118: GroupList[*totalGroups][retlen] = '\0';
! 119: if (strcmp(GroupList[*totalGroups], "None") == 0)
! 120: free(GroupList[*totalGroups]);
! 121: else
! 122: (*totalGroups)++;
! 123: pTmpLBuf++;
! 124: }
! 125: }
! 126: /* Free the allocated memory. */
! 127: if (pBuf != NULL)
! 128: NetApiBufferFree(pBuf);
! 129:
! 130:
! 131: /*
! 132: * Call the NetUserGetGroups function, specifying level 0.
! 133: */
! 134: nStatus = NetUserGetGroups(NULL,
! 135: user,
! 136: dwLevel,
! 137: (LPBYTE*)&pgrpBuf,
! 138: dwPrefMaxLen,
! 139: &dwEntriesRead,
! 140: &dwTotalEntries);
! 141: /*
! 142: * See if the call succeeds,
! 143: */
! 144: if (nStatus != NERR_Success) {
! 145: if (nStatus == ERROR_ACCESS_DENIED)
! 146: return (ISC_R_NOPERM);
! 147: if (nStatus == ERROR_MORE_DATA)
! 148: return (ISC_R_NOSPACE);
! 149: if (nStatus == NERR_UserNotFound)
! 150: dwEntriesRead = 0;
! 151: }
! 152:
! 153: if (pgrpBuf != NULL) {
! 154: pTmpBuf = pgrpBuf;
! 155: /*
! 156: * Loop through the entries
! 157: */
! 158: for (i = 0;
! 159: (i < dwEntriesRead && *totalGroups < maxgroups); i++) {
! 160: assert(pTmpBuf != NULL);
! 161:
! 162: if (pTmpBuf == NULL)
! 163: break;
! 164: retlen = wcslen(pTmpBuf->grui0_name);
! 165: GroupList[*totalGroups] = (char *) malloc(retlen +1);
! 166: if (GroupList[*totalGroups] == NULL)
! 167: return (ISC_R_NOMEMORY);
! 168:
! 169: retlen = wcstombs(GroupList[*totalGroups],
! 170: pTmpBuf->grui0_name, retlen);
! 171: GroupList[*totalGroups][retlen] = '\0';
! 172: if (strcmp(GroupList[*totalGroups], "None") == 0)
! 173: free(GroupList[*totalGroups]);
! 174: else
! 175: (*totalGroups)++;
! 176: pTmpBuf++;
! 177: }
! 178: }
! 179: /*
! 180: * Free the allocated memory.
! 181: */
! 182: if (pgrpBuf != NULL)
! 183: NetApiBufferFree(pgrpBuf);
! 184:
! 185: return (ISC_R_SUCCESS);
! 186: }
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>