Annotation of embedaddon/ntp/lib/isc/win32/ntgroups.c, revision 1.1.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>