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
14 #include <afsconfig.h>
15 #include <afs/param.h>
20 #include "TaAfsAdmSvrInternal.h"
24 * ROUTINES ___________________________________________________________________
29 // AfsAdmSvr_ChangeGroup
30 // ...changes a group account's properties.
32 extern "C" int AfsAdmSvr_ChangeGroup (UINT_PTR idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus)
35 Action.Action = ACTION_GROUP_CHANGE;
36 Action.idClient = idClient;
37 Action.idCell = idCell;
38 Action.u.Group_Change.idGroup = idGroup;
39 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
41 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup (idGroup=0x%08lX)"), idClient, idGroup);
43 if (!AfsAdmSvr_fIsValidClient (idClient))
44 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
46 // Find this group's current properties
48 LPASOBJPROP pCurrentProperties;
49 if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idGroup, pStatus)) == NULL)
51 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; no properties"), idClient);
52 AfsAdmSvr_EndOperation (iOp);
56 // Build an AFSCLASS-style GROUPPROPERTIES structure that reflects the
57 // new properties for the user; mark the structure's dwMask bit to indicate
58 // what we're changing.
60 GROUPPROPERTIES NewProperties;
61 memset (&NewProperties, 0x00, sizeof(NewProperties));
63 if (!pChange->szOwner[0])
64 lstrcpy (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner);
67 lstrcpy (NewProperties.szOwner, pChange->szOwner);
68 if (lstrcmpi (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner))
69 NewProperties.dwMask |= MASK_GROUPPROP_szOwner;
72 if ((NewProperties.aaListStatus = pChange->aaListStatus) != pCurrentProperties->u.GroupProperties.aaListStatus)
73 NewProperties.dwMask |= MASK_GROUPPROP_aaListStatus;
74 if ((NewProperties.aaListGroupsOwned = pChange->aaListGroupsOwned) != pCurrentProperties->u.GroupProperties.aaListGroupsOwned)
75 NewProperties.dwMask |= MASK_GROUPPROP_aaListGroupsOwned;
76 if ((NewProperties.aaListMembers = pChange->aaListMembers) != pCurrentProperties->u.GroupProperties.aaListMembers)
77 NewProperties.dwMask |= MASK_GROUPPROP_aaListMembers;
78 if ((NewProperties.aaAddMember = pChange->aaAddMember) != pCurrentProperties->u.GroupProperties.aaAddMember)
79 NewProperties.dwMask |= MASK_GROUPPROP_aaAddMember;
80 if ((NewProperties.aaDeleteMember = pChange->aaDeleteMember) != pCurrentProperties->u.GroupProperties.aaDeleteMember)
81 NewProperties.dwMask |= MASK_GROUPPROP_aaDeleteMember;
83 // If we've decided to change anything, call AfsClass to actually do it
85 if (NewProperties.dwMask == 0)
87 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded (nothing to do)"), idClient);
92 if (!AfsClass_SetGroupProperties ((LPIDENT)idGroup, &NewProperties, &status))
94 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; error 0x%08lX"), idClient, status);
95 return FALSE_(status,pStatus,iOp);
98 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded"), idClient);
101 AfsAdmSvr_EndOperation (iOp);
106 // AfsAdmSvr_GetGroupMembers
107 // ...retrieves the list of users which belong to a group
109 extern "C" int AfsAdmSvr_GetGroupMembers (UINT_PTR idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus)
111 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
113 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers (idGroup=0x%08lX)"), idClient, idGroup);
115 if (!AfsAdmSvr_fIsValidClient (idClient))
116 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
118 // Use AfsClass to get the list of group members
120 if (GetAsidType (idGroup) != itGROUP)
121 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
125 if ((lpGroup = ((LPIDENT)idGroup)->OpenGroup (&status)) == NULL)
126 return FALSE_(status,pStatus,iOp);
128 LPTSTR pmszUsers = NULL;
129 lpGroup->GetMembers (&pmszUsers);
132 // Then translate those user names into an ASID list
134 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
137 FreeString (pmszUsers);
138 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
143 for (LPTSTR psz = pmszUsers; psz && *psz; psz += 1+lstrlen(psz))
146 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
148 TCHAR szName[ cchNAME ];
149 TCHAR szInstance[ cchNAME ];
150 USER::SplitUserName (psz, szName, szInstance);
152 if ((lpi = IDENT::FindUser ((LPIDENT)idCell, szName, szInstance)) == NULL)
158 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
160 FreeString (pmszUsers);
163 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers succeeded"), idClient);
164 AfsAdmSvr_EndOperation (iOp);
169 // AfsAdmSvr_GetGroupMembership
170 // ...retrieves the list of groups to which a user or group belongs
172 extern "C" int AfsAdmSvr_GetGroupMembership (UINT_PTR idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus)
174 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
176 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership (idMember=0x%08lX)"), idClient, idMember);
178 if (!AfsAdmSvr_fIsValidClient (idClient))
179 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
181 // Use AfsClass to get the appropriate list of groups
184 LPTSTR pmszGroups = NULL;
186 if (GetAsidType (idMember) == itUSER)
189 if ((lpUser = ((LPIDENT)idMember)->OpenUser (&status)) == NULL)
190 return FALSE_(status,pStatus,iOp);
191 lpUser->GetMemberOf (&pmszGroups);
194 else if (GetAsidType (idMember) == itGROUP)
197 if ((lpGroup = ((LPIDENT)idMember)->OpenGroup (&status)) == NULL)
198 return FALSE_(status,pStatus,iOp);
199 lpGroup->GetMemberOf (&pmszGroups);
204 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
207 // Then translate those group names into an ASID list
209 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
212 FreeString (pmszGroups);
213 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
218 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
221 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
223 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
225 FreeString (pmszGroups);
228 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership succeeded"), idClient);
229 AfsAdmSvr_EndOperation (iOp);
234 // AfsAdmSvr_GetGroupOwnership
235 // ...retrieves the list of groups which a user owns
237 extern "C" int AfsAdmSvr_GetGroupOwnership (UINT_PTR idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus)
239 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
241 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership (idOwner=0x%08lX)"), idClient, idOwner);
243 if (!AfsAdmSvr_fIsValidClient (idClient))
244 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
246 // Use AfsClass to get the appropriate list of groups
249 LPTSTR pmszGroups = NULL;
251 if (GetAsidType (idOwner) == itUSER)
254 if ((lpUser = ((LPIDENT)idOwner)->OpenUser (&status)) == NULL)
255 return FALSE_(status,pStatus,iOp);
256 lpUser->GetOwnerOf (&pmszGroups);
259 else if (GetAsidType (idOwner) == itGROUP)
262 if ((lpGroup = ((LPIDENT)idOwner)->OpenGroup (&status)) == NULL)
263 return FALSE_(status,pStatus,iOp);
264 lpGroup->GetOwnerOf (&pmszGroups);
269 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
272 // Then translate those group names into an ASID list
274 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
277 FreeString (pmszGroups);
278 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
283 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
286 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
288 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
290 FreeString (pmszGroups);
293 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership succeeded"), idClient);
294 AfsAdmSvr_EndOperation (iOp);
299 // AfsAdmSvr_AddGroupMember
300 // ...adds a member to the specified group
302 extern "C" int AfsAdmSvr_AddGroupMember (UINT_PTR idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
305 Action.Action = ACTION_GROUP_MEMBER_ADD;
306 Action.idClient = idClient;
307 Action.idCell = idCell;
308 Action.u.Group_Member_Add.idGroup = idGroup;
309 Action.u.Group_Member_Add.idUser = idMember;
310 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
312 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
314 if (!AfsAdmSvr_fIsValidClient (idClient))
315 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
317 // Modify the group as requested
320 if (!AfsClass_AddUserToGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
321 return FALSE_(status,pStatus,iOp);
323 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember succeeded"), idClient);
324 AfsAdmSvr_EndOperation (iOp);
329 // AfsAdmSvr_RemoveGroupMember
330 // ...removes a member from the specified group
332 extern "C" int AfsAdmSvr_RemoveGroupMember (UINT_PTR idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
335 Action.Action = ACTION_GROUP_MEMBER_REMOVE;
336 Action.idClient = idClient;
337 Action.idCell = idCell;
338 Action.u.Group_Member_Remove.idGroup = idGroup;
339 Action.u.Group_Member_Remove.idUser = idMember;
340 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
342 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
344 if (!AfsAdmSvr_fIsValidClient (idClient))
345 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
347 // Modify the group as requested
350 if (!AfsClass_RemoveUserFromGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
351 return FALSE_(status,pStatus,iOp);
353 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember succeeded"), idClient);
354 AfsAdmSvr_EndOperation (iOp);
359 // AfsAdmSvr_RenameGroup
360 // ...changes a group's name
362 extern "C" int AfsAdmSvr_RenameGroup (UINT_PTR idClient, ASID idCell, ASID idGroup, STRING szNewGroupName, ULONG *pStatus)
365 Action.Action = ACTION_GROUP_RENAME;
366 Action.idClient = idClient;
367 Action.idCell = idCell;
368 Action.u.Group_Rename.idGroup = idGroup;
369 lstrcpy (Action.u.Group_Rename.szNewName, szNewGroupName);
370 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
372 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup (idGroup=0x%08lX, szNewName=%s)"), idClient, idGroup, szNewGroupName);
374 if (!AfsAdmSvr_fIsValidClient (idClient))
375 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
377 // Modify the group as requested
380 if (!AfsClass_RenameGroup ((LPIDENT)idGroup, szNewGroupName, &status))
381 return FALSE_(status,pStatus,iOp);
383 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup succeeded"), idClient);
384 AfsAdmSvr_EndOperation (iOp);
389 // AfsAdmSvr_CreateGroup
390 // ...creates a new PTS group
392 extern "C" int AfsAdmSvr_CreateGroup (UINT_PTR idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus)
395 Action.Action = ACTION_GROUP_CREATE;
396 Action.idClient = idClient;
397 Action.idCell = idCell;
398 lstrcpy (Action.u.Group_Create.szGroup, pCreate->szName);
399 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
401 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup (szGroup=%s)"), idClient, pCreate->szName);
403 if (!AfsAdmSvr_fIsValidClient (idClient))
404 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
406 // Find the owner (if we can)
409 if ((lpiOwner = IDENT::FindUser ((LPIDENT)idCell, pCreate->szOwner)) == NULL)
410 lpiOwner = IDENT::FindGroup ((LPIDENT)idCell, pCreate->szOwner);
412 // Create the group account
416 if ((lpiGroup = AfsClass_CreateGroup ((LPIDENT)idCell, pCreate->szName, lpiOwner, pCreate->idGroup, &status)) == NULL)
418 Print (dlERROR, TEXT("Client 0x%08lX: CreateGroup failed; error 0x%08lX"), idClient, status);
419 return FALSE_(status,pStatus,iOp);
423 *pidGroup = (ASID)lpiGroup;
425 // Creating a group account may change the max group ID
426 AfsAdmSvr_TestProperties (idCell);
428 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup succeeded"), idClient);
429 AfsAdmSvr_EndOperation (iOp);
434 // AfsAdmSvr_DeleteGroup
435 // ...deletes a PTS group
437 extern "C" int AfsAdmSvr_DeleteGroup (UINT_PTR idClient, ASID idCell, ASID idGroup, ULONG *pStatus)
440 Action.Action = ACTION_GROUP_DELETE;
441 Action.idClient = idClient;
442 Action.idCell = idCell;
443 Action.u.Group_Delete.idGroup = idGroup;
444 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
446 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup (idGroup=0x%08lX)"), idClient, idGroup);
448 if (!AfsAdmSvr_fIsValidClient (idClient))
449 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
454 if (!AfsClass_DeleteGroup ((LPIDENT)idGroup, &status))
456 Print (dlERROR, TEXT("Client 0x%08lX: DeleteGroup failed; error 0x%08lX"), idClient, status);
457 return FALSE_(status,pStatus,iOp);
460 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup succeeded"), idClient);
461 AfsAdmSvr_EndOperation (iOp);