2 * Copyright 2000, International Business Machines Corporation and others.
5 * This software has been released under the terms of the IBM Public
6 * License. For details, see the LICENSE file in the top-level source
7 * directory or online at http://www.openafs.org/dl/license10.html
11 #include <afs/param.h>
15 #include "TaAfsAdmSvrInternal.h"
19 * ROUTINES ___________________________________________________________________
24 // AfsAdmSvr_ChangeGroup
25 // ...changes a group account's properties.
27 int AfsAdmSvr_ChangeGroup (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus)
30 Action.Action = ACTION_GROUP_CHANGE;
31 Action.idClient = idClient;
32 Action.idCell = idCell;
33 Action.u.Group_Change.idGroup = idGroup;
34 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
36 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup (idGroup=0x%08lX)"), idClient, idGroup);
38 if (!AfsAdmSvr_fIsValidClient (idClient))
39 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
41 // Find this group's current properties
43 LPASOBJPROP pCurrentProperties;
44 if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idGroup, pStatus)) == NULL)
46 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; no properties"), idClient);
47 AfsAdmSvr_EndOperation (iOp);
51 // Build an AFSCLASS-style GROUPPROPERTIES structure that reflects the
52 // new properties for the user; mark the structure's dwMask bit to indicate
53 // what we're changing.
55 GROUPPROPERTIES NewProperties;
56 memset (&NewProperties, 0x00, sizeof(NewProperties));
58 if (!pChange->szOwner[0])
59 lstrcpy (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner);
62 lstrcpy (NewProperties.szOwner, pChange->szOwner);
63 if (lstrcmpi (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner))
64 NewProperties.dwMask |= MASK_GROUPPROP_szOwner;
67 if ((NewProperties.aaListStatus = pChange->aaListStatus) != pCurrentProperties->u.GroupProperties.aaListStatus)
68 NewProperties.dwMask |= MASK_GROUPPROP_aaListStatus;
69 if ((NewProperties.aaListGroupsOwned = pChange->aaListGroupsOwned) != pCurrentProperties->u.GroupProperties.aaListGroupsOwned)
70 NewProperties.dwMask |= MASK_GROUPPROP_aaListGroupsOwned;
71 if ((NewProperties.aaListMembers = pChange->aaListMembers) != pCurrentProperties->u.GroupProperties.aaListMembers)
72 NewProperties.dwMask |= MASK_GROUPPROP_aaListMembers;
73 if ((NewProperties.aaAddMember = pChange->aaAddMember) != pCurrentProperties->u.GroupProperties.aaAddMember)
74 NewProperties.dwMask |= MASK_GROUPPROP_aaAddMember;
75 if ((NewProperties.aaDeleteMember = pChange->aaDeleteMember) != pCurrentProperties->u.GroupProperties.aaDeleteMember)
76 NewProperties.dwMask |= MASK_GROUPPROP_aaDeleteMember;
78 // If we've decided to change anything, call AfsClass to actually do it
80 if (NewProperties.dwMask == 0)
82 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded (nothing to do)"), idClient);
87 if (!AfsClass_SetGroupProperties ((LPIDENT)idGroup, &NewProperties, &status))
89 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; error 0x%08lX"), idClient, status);
90 return FALSE_(status,pStatus,iOp);
93 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded"), idClient);
96 AfsAdmSvr_EndOperation (iOp);
101 // AfsAdmSvr_GetGroupMembers
102 // ...retrieves the list of users which belong to a group
104 int AfsAdmSvr_GetGroupMembers (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus)
106 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
108 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers (idGroup=0x%08lX)"), idClient, idGroup);
110 if (!AfsAdmSvr_fIsValidClient (idClient))
111 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
113 // Use AfsClass to get the list of group members
115 if (GetAsidType (idGroup) != itGROUP)
116 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
120 if ((lpGroup = ((LPIDENT)idGroup)->OpenGroup (&status)) == NULL)
121 return FALSE_(status,pStatus,iOp);
123 LPTSTR pmszUsers = NULL;
124 lpGroup->GetMembers (&pmszUsers);
127 // Then translate those user names into an ASID list
129 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
132 FreeString (pmszUsers);
133 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
138 for (LPTSTR psz = pmszUsers; psz && *psz; psz += 1+lstrlen(psz))
141 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
143 TCHAR szName[ cchNAME ];
144 TCHAR szInstance[ cchNAME ];
145 USER::SplitUserName (psz, szName, szInstance);
147 if ((lpi = IDENT::FindUser ((LPIDENT)idCell, szName, szInstance)) == NULL)
153 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
155 FreeString (pmszUsers);
158 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers succeeded"), idClient);
159 AfsAdmSvr_EndOperation (iOp);
164 // AfsAdmSvr_GetGroupMembership
165 // ...retrieves the list of groups to which a user or group belongs
167 int AfsAdmSvr_GetGroupMembership (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus)
169 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
171 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership (idMember=0x%08lX)"), idClient, idMember);
173 if (!AfsAdmSvr_fIsValidClient (idClient))
174 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
176 // Use AfsClass to get the appropriate list of groups
179 LPTSTR pmszGroups = NULL;
181 if (GetAsidType (idMember) == itUSER)
184 if ((lpUser = ((LPIDENT)idMember)->OpenUser (&status)) == NULL)
185 return FALSE_(status,pStatus,iOp);
186 lpUser->GetMemberOf (&pmszGroups);
189 else if (GetAsidType (idMember) == itGROUP)
192 if ((lpGroup = ((LPIDENT)idMember)->OpenGroup (&status)) == NULL)
193 return FALSE_(status,pStatus,iOp);
194 lpGroup->GetMemberOf (&pmszGroups);
199 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
202 // Then translate those group names into an ASID list
204 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
207 FreeString (pmszGroups);
208 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
213 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
216 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
218 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
220 FreeString (pmszGroups);
223 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership succeeded"), idClient);
224 AfsAdmSvr_EndOperation (iOp);
229 // AfsAdmSvr_GetGroupOwnership
230 // ...retrieves the list of groups which a user owns
232 int AfsAdmSvr_GetGroupOwnership (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus)
234 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
236 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership (idOwner=0x%08lX)"), idClient, idOwner);
238 if (!AfsAdmSvr_fIsValidClient (idClient))
239 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
241 // Use AfsClass to get the appropriate list of groups
244 LPTSTR pmszGroups = NULL;
246 if (GetAsidType (idOwner) == itUSER)
249 if ((lpUser = ((LPIDENT)idOwner)->OpenUser (&status)) == NULL)
250 return FALSE_(status,pStatus,iOp);
251 lpUser->GetOwnerOf (&pmszGroups);
254 else if (GetAsidType (idOwner) == itGROUP)
257 if ((lpGroup = ((LPIDENT)idOwner)->OpenGroup (&status)) == NULL)
258 return FALSE_(status,pStatus,iOp);
259 lpGroup->GetOwnerOf (&pmszGroups);
264 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
267 // Then translate those group names into an ASID list
269 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
272 FreeString (pmszGroups);
273 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
278 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
281 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
283 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
285 FreeString (pmszGroups);
288 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership succeeded"), idClient);
289 AfsAdmSvr_EndOperation (iOp);
294 // AfsAdmSvr_AddGroupMember
295 // ...adds a member to the specified group
297 int AfsAdmSvr_AddGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
300 Action.Action = ACTION_GROUP_MEMBER_ADD;
301 Action.idClient = idClient;
302 Action.idCell = idCell;
303 Action.u.Group_Member_Add.idGroup = idGroup;
304 Action.u.Group_Member_Add.idUser = idMember;
305 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
307 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
309 if (!AfsAdmSvr_fIsValidClient (idClient))
310 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
312 // Modify the group as requested
315 if (!AfsClass_AddUserToGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
316 return FALSE_(status,pStatus,iOp);
318 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember succeeded"), idClient);
319 AfsAdmSvr_EndOperation (iOp);
324 // AfsAdmSvr_RemoveGroupMember
325 // ...removes a member from the specified group
327 int AfsAdmSvr_RemoveGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
330 Action.Action = ACTION_GROUP_MEMBER_REMOVE;
331 Action.idClient = idClient;
332 Action.idCell = idCell;
333 Action.u.Group_Member_Remove.idGroup = idGroup;
334 Action.u.Group_Member_Remove.idUser = idMember;
335 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
337 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
339 if (!AfsAdmSvr_fIsValidClient (idClient))
340 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
342 // Modify the group as requested
345 if (!AfsClass_RemoveUserFromGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
346 return FALSE_(status,pStatus,iOp);
348 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember succeeded"), idClient);
349 AfsAdmSvr_EndOperation (iOp);
354 // AfsAdmSvr_RenameGroup
355 // ...changes a group's name
357 int AfsAdmSvr_RenameGroup (DWORD idClient, ASID idCell, ASID idGroup, STRING szNewGroupName, ULONG *pStatus)
360 Action.Action = ACTION_GROUP_RENAME;
361 Action.idClient = idClient;
362 Action.idCell = idCell;
363 Action.u.Group_Rename.idGroup = idGroup;
364 lstrcpy (Action.u.Group_Rename.szNewName, szNewGroupName);
365 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
367 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup (idGroup=0x%08lX, szNewName=%s)"), idClient, idGroup, szNewGroupName);
369 if (!AfsAdmSvr_fIsValidClient (idClient))
370 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
372 // Modify the group as requested
375 if (!AfsClass_RenameGroup ((LPIDENT)idGroup, szNewGroupName, &status))
376 return FALSE_(status,pStatus,iOp);
378 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup succeeded"), idClient);
379 AfsAdmSvr_EndOperation (iOp);
384 // AfsAdmSvr_CreateGroup
385 // ...creates a new PTS group
387 int AfsAdmSvr_CreateGroup (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus)
390 Action.Action = ACTION_GROUP_CREATE;
391 Action.idClient = idClient;
392 Action.idCell = idCell;
393 lstrcpy (Action.u.Group_Create.szGroup, pCreate->szName);
394 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
396 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup (szGroup=%s)"), idClient, pCreate->szName);
398 if (!AfsAdmSvr_fIsValidClient (idClient))
399 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
401 // Find the owner (if we can)
404 if ((lpiOwner = IDENT::FindUser ((LPIDENT)idCell, pCreate->szOwner)) == NULL)
405 lpiOwner = IDENT::FindGroup ((LPIDENT)idCell, pCreate->szOwner);
407 // Create the group account
411 if ((lpiGroup = AfsClass_CreateGroup ((LPIDENT)idCell, pCreate->szName, lpiOwner, pCreate->idGroup, &status)) == NULL)
413 Print (dlERROR, TEXT("Client 0x%08lX: CreateGroup failed; error 0x%08lX"), idClient, status);
414 return FALSE_(status,pStatus,iOp);
418 *pidGroup = (ASID)lpiGroup;
420 // Creating a group account may change the max group ID
421 AfsAdmSvr_TestProperties (idCell);
423 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup succeeded"), idClient);
424 AfsAdmSvr_EndOperation (iOp);
429 // AfsAdmSvr_DeleteGroup
430 // ...deletes a PTS group
432 int AfsAdmSvr_DeleteGroup (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus)
435 Action.Action = ACTION_GROUP_DELETE;
436 Action.idClient = idClient;
437 Action.idCell = idCell;
438 Action.u.Group_Delete.idGroup = idGroup;
439 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
441 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup (idGroup=0x%08lX)"), idClient, idGroup);
443 if (!AfsAdmSvr_fIsValidClient (idClient))
444 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
449 if (!AfsClass_DeleteGroup ((LPIDENT)idGroup, &status))
451 Print (dlERROR, TEXT("Client 0x%08lX: DeleteGroup failed; error 0x%08lX"), idClient, status);
452 return FALSE_(status,pStatus,iOp);
455 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup succeeded"), idClient);
456 AfsAdmSvr_EndOperation (iOp);