6 #include "TaAfsAdmSvrInternal.h"
10 * ROUTINES ___________________________________________________________________
15 // AfsAdmSvr_ChangeGroup
16 // ...changes a group account's properties.
18 int AfsAdmSvr_ChangeGroup (DWORD idClient, ASID idCell, ASID idGroup, LPAFSADMSVR_CHANGEGROUP_PARAMS pChange, ULONG *pStatus)
21 Action.Action = ACTION_GROUP_CHANGE;
22 Action.idClient = idClient;
23 Action.idCell = idCell;
24 Action.u.Group_Change.idGroup = idGroup;
25 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
27 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup (idGroup=0x%08lX)"), idClient, idGroup);
29 if (!AfsAdmSvr_fIsValidClient (idClient))
30 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
32 // Find this group's current properties
34 LPASOBJPROP pCurrentProperties;
35 if ((pCurrentProperties = AfsAdmSvr_GetCurrentProperties (idGroup, pStatus)) == NULL)
37 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; no properties"), idClient);
38 AfsAdmSvr_EndOperation (iOp);
42 // Build an AFSCLASS-style GROUPPROPERTIES structure that reflects the
43 // new properties for the user; mark the structure's dwMask bit to indicate
44 // what we're changing.
46 GROUPPROPERTIES NewProperties;
47 memset (&NewProperties, 0x00, sizeof(NewProperties));
49 if (!pChange->szOwner[0])
50 lstrcpy (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner);
53 lstrcpy (NewProperties.szOwner, pChange->szOwner);
54 if (lstrcmpi (NewProperties.szOwner, pCurrentProperties->u.GroupProperties.szOwner))
55 NewProperties.dwMask |= MASK_GROUPPROP_szOwner;
58 if ((NewProperties.aaListStatus = pChange->aaListStatus) != pCurrentProperties->u.GroupProperties.aaListStatus)
59 NewProperties.dwMask |= MASK_GROUPPROP_aaListStatus;
60 if ((NewProperties.aaListGroupsOwned = pChange->aaListGroupsOwned) != pCurrentProperties->u.GroupProperties.aaListGroupsOwned)
61 NewProperties.dwMask |= MASK_GROUPPROP_aaListGroupsOwned;
62 if ((NewProperties.aaListMembers = pChange->aaListMembers) != pCurrentProperties->u.GroupProperties.aaListMembers)
63 NewProperties.dwMask |= MASK_GROUPPROP_aaListMembers;
64 if ((NewProperties.aaAddMember = pChange->aaAddMember) != pCurrentProperties->u.GroupProperties.aaAddMember)
65 NewProperties.dwMask |= MASK_GROUPPROP_aaAddMember;
66 if ((NewProperties.aaDeleteMember = pChange->aaDeleteMember) != pCurrentProperties->u.GroupProperties.aaDeleteMember)
67 NewProperties.dwMask |= MASK_GROUPPROP_aaDeleteMember;
69 // If we've decided to change anything, call AfsClass to actually do it
71 if (NewProperties.dwMask == 0)
73 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded (nothing to do)"), idClient);
78 if (!AfsClass_SetGroupProperties ((LPIDENT)idGroup, &NewProperties, &status))
80 Print (dlERROR, TEXT("Client 0x%08lX: ChangeGroup failed; error 0x%08lX"), idClient, status);
81 return FALSE_(status,pStatus,iOp);
84 Print (dlDETAIL, TEXT("Client 0x%08lX: ChangeGroup succeeded"), idClient);
87 AfsAdmSvr_EndOperation (iOp);
92 // AfsAdmSvr_GetGroupMembers
93 // ...retrieves the list of users which belong to a group
95 int AfsAdmSvr_GetGroupMembers (DWORD idClient, ASID idCell, ASID idGroup, LPASIDLIST *ppAsidList, ULONG *pStatus)
97 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
99 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers (idGroup=0x%08lX)"), idClient, idGroup);
101 if (!AfsAdmSvr_fIsValidClient (idClient))
102 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
104 // Use AfsClass to get the list of group members
106 if (GetAsidType (idGroup) != itGROUP)
107 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
111 if ((lpGroup = ((LPIDENT)idGroup)->OpenGroup (&status)) == NULL)
112 return FALSE_(status,pStatus,iOp);
114 LPTSTR pmszUsers = NULL;
115 lpGroup->GetMembers (&pmszUsers);
118 // Then translate those user names into an ASID list
120 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
123 FreeString (pmszUsers);
124 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
129 for (LPTSTR psz = pmszUsers; psz && *psz; psz += 1+lstrlen(psz))
132 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
134 TCHAR szName[ cchNAME ];
135 TCHAR szInstance[ cchNAME ];
136 USER::SplitUserName (psz, szName, szInstance);
138 if ((lpi = IDENT::FindUser ((LPIDENT)idCell, szName, szInstance)) == NULL)
144 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
146 FreeString (pmszUsers);
149 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembers succeeded"), idClient);
150 AfsAdmSvr_EndOperation (iOp);
155 // AfsAdmSvr_GetGroupMembership
156 // ...retrieves the list of groups to which a user or group belongs
158 int AfsAdmSvr_GetGroupMembership (DWORD idClient, ASID idCell, ASID idMember, LPASIDLIST *ppAsidList, ULONG *pStatus)
160 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
162 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership (idMember=0x%08lX)"), idClient, idMember);
164 if (!AfsAdmSvr_fIsValidClient (idClient))
165 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
167 // Use AfsClass to get the appropriate list of groups
170 LPTSTR pmszGroups = NULL;
172 if (GetAsidType (idMember) == itUSER)
175 if ((lpUser = ((LPIDENT)idMember)->OpenUser (&status)) == NULL)
176 return FALSE_(status,pStatus,iOp);
177 lpUser->GetMemberOf (&pmszGroups);
180 else if (GetAsidType (idMember) == itGROUP)
183 if ((lpGroup = ((LPIDENT)idMember)->OpenGroup (&status)) == NULL)
184 return FALSE_(status,pStatus,iOp);
185 lpGroup->GetMemberOf (&pmszGroups);
190 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
193 // Then translate those group names into an ASID list
195 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
198 FreeString (pmszGroups);
199 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
204 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
207 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
209 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
211 FreeString (pmszGroups);
214 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupMembership succeeded"), idClient);
215 AfsAdmSvr_EndOperation (iOp);
220 // AfsAdmSvr_GetGroupOwnership
221 // ...retrieves the list of groups which a user owns
223 int AfsAdmSvr_GetGroupOwnership (DWORD idClient, ASID idCell, ASID idOwner, LPASIDLIST *ppAsidList, ULONG *pStatus)
225 size_t iOp = AfsAdmSvr_BeginOperation (idClient);
227 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership (idOwner=0x%08lX)"), idClient, idOwner);
229 if (!AfsAdmSvr_fIsValidClient (idClient))
230 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
232 // Use AfsClass to get the appropriate list of groups
235 LPTSTR pmszGroups = NULL;
237 if (GetAsidType (idOwner) == itUSER)
240 if ((lpUser = ((LPIDENT)idOwner)->OpenUser (&status)) == NULL)
241 return FALSE_(status,pStatus,iOp);
242 lpUser->GetOwnerOf (&pmszGroups);
245 else if (GetAsidType (idOwner) == itGROUP)
248 if ((lpGroup = ((LPIDENT)idOwner)->OpenGroup (&status)) == NULL)
249 return FALSE_(status,pStatus,iOp);
250 lpGroup->GetOwnerOf (&pmszGroups);
255 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
258 // Then translate those group names into an ASID list
260 if ((*ppAsidList = AfsAdmSvr_CreateAsidList()) == NULL)
263 FreeString (pmszGroups);
264 return FALSE_(ERROR_NOT_ENOUGH_MEMORY,pStatus,iOp);
269 for (LPTSTR psz = pmszGroups; psz && *psz; psz += 1+lstrlen(psz))
272 if ((lpi = IDENT::FindGroup ((LPIDENT)idCell, psz)) == NULL)
274 AfsAdmSvr_AddToAsidList (ppAsidList, (ASID)lpi, 0);
276 FreeString (pmszGroups);
279 Print (dlDETAIL, TEXT("Client 0x%08lX: GetGroupOwnership succeeded"), idClient);
280 AfsAdmSvr_EndOperation (iOp);
285 // AfsAdmSvr_AddGroupMember
286 // ...adds a member to the specified group
288 int AfsAdmSvr_AddGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
291 Action.Action = ACTION_GROUP_MEMBER_ADD;
292 Action.idClient = idClient;
293 Action.idCell = idCell;
294 Action.u.Group_Member_Add.idGroup = idGroup;
295 Action.u.Group_Member_Add.idUser = idMember;
296 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
298 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
300 if (!AfsAdmSvr_fIsValidClient (idClient))
301 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
303 // Modify the group as requested
306 if (!AfsClass_AddUserToGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
307 return FALSE_(status,pStatus,iOp);
309 Print (dlDETAIL, TEXT("Client 0x%08lX: AddGroupMember succeeded"), idClient);
310 AfsAdmSvr_EndOperation (iOp);
315 // AfsAdmSvr_RemoveGroupMember
316 // ...removes a member from the specified group
318 int AfsAdmSvr_RemoveGroupMember (DWORD idClient, ASID idCell, ASID idGroup, ASID idMember, ULONG *pStatus)
321 Action.Action = ACTION_GROUP_MEMBER_REMOVE;
322 Action.idClient = idClient;
323 Action.idCell = idCell;
324 Action.u.Group_Member_Remove.idGroup = idGroup;
325 Action.u.Group_Member_Remove.idUser = idMember;
326 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
328 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember (idGroup=0x%08lX, idUser=0x%08lX)"), idClient, idGroup, idMember);
330 if (!AfsAdmSvr_fIsValidClient (idClient))
331 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
333 // Modify the group as requested
336 if (!AfsClass_RemoveUserFromGroup ((LPIDENT)idGroup, (LPIDENT)idMember, &status))
337 return FALSE_(status,pStatus,iOp);
339 Print (dlDETAIL, TEXT("Client 0x%08lX: RemoveGroupMember succeeded"), idClient);
340 AfsAdmSvr_EndOperation (iOp);
345 // AfsAdmSvr_RenameGroup
346 // ...changes a group's name
348 int AfsAdmSvr_RenameGroup (DWORD idClient, ASID idCell, ASID idGroup, STRING szNewGroupName, ULONG *pStatus)
351 Action.Action = ACTION_GROUP_RENAME;
352 Action.idClient = idClient;
353 Action.idCell = idCell;
354 Action.u.Group_Rename.idGroup = idGroup;
355 lstrcpy (Action.u.Group_Rename.szNewName, szNewGroupName);
356 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
358 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup (idGroup=0x%08lX, szNewName=%s)"), idClient, idGroup, szNewGroupName);
360 if (!AfsAdmSvr_fIsValidClient (idClient))
361 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
363 // Modify the group as requested
366 if (!AfsClass_RenameGroup ((LPIDENT)idGroup, szNewGroupName, &status))
367 return FALSE_(status,pStatus,iOp);
369 Print (dlDETAIL, TEXT("Client 0x%08lX: RenameGroup succeeded"), idClient);
370 AfsAdmSvr_EndOperation (iOp);
375 // AfsAdmSvr_CreateGroup
376 // ...creates a new PTS group
378 int AfsAdmSvr_CreateGroup (DWORD idClient, ASID idCell, LPAFSADMSVR_CREATEGROUP_PARAMS pCreate, ASID *pidGroup, ULONG *pStatus)
381 Action.Action = ACTION_GROUP_CREATE;
382 Action.idClient = idClient;
383 Action.idCell = idCell;
384 lstrcpy (Action.u.Group_Create.szGroup, pCreate->szName);
385 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
387 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup (szGroup=%s)"), idClient, pCreate->szName);
389 if (!AfsAdmSvr_fIsValidClient (idClient))
390 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
392 // Find the owner (if we can)
395 if ((lpiOwner = IDENT::FindUser ((LPIDENT)idCell, pCreate->szOwner)) == NULL)
396 lpiOwner = IDENT::FindGroup ((LPIDENT)idCell, pCreate->szOwner);
398 // Create the group account
402 if ((lpiGroup = AfsClass_CreateGroup ((LPIDENT)idCell, pCreate->szName, lpiOwner, pCreate->idGroup, &status)) == NULL)
404 Print (dlERROR, TEXT("Client 0x%08lX: CreateGroup failed; error 0x%08lX"), idClient, status);
405 return FALSE_(status,pStatus,iOp);
409 *pidGroup = (ASID)lpiGroup;
411 // Creating a group account may change the max group ID
412 AfsAdmSvr_TestProperties (idCell);
414 Print (dlDETAIL, TEXT("Client 0x%08lX: CreateGroup succeeded"), idClient);
415 AfsAdmSvr_EndOperation (iOp);
420 // AfsAdmSvr_DeleteGroup
421 // ...deletes a PTS group
423 int AfsAdmSvr_DeleteGroup (DWORD idClient, ASID idCell, ASID idGroup, ULONG *pStatus)
426 Action.Action = ACTION_GROUP_DELETE;
427 Action.idClient = idClient;
428 Action.idCell = idCell;
429 Action.u.Group_Delete.idGroup = idGroup;
430 size_t iOp = AfsAdmSvr_BeginOperation (idClient, &Action);
432 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup (idGroup=0x%08lX)"), idClient, idGroup);
434 if (!AfsAdmSvr_fIsValidClient (idClient))
435 return FALSE_(ERROR_INVALID_PARAMETER,pStatus,iOp);
440 if (!AfsClass_DeleteGroup ((LPIDENT)idGroup, &status))
442 Print (dlERROR, TEXT("Client 0x%08lX: DeleteGroup failed; error 0x%08lX"), idClient, status);
443 return FALSE_(status,pStatus,iOp);
446 Print (dlDETAIL, TEXT("Client 0x%08lX: DeleteGroup succeeded"), idClient);
447 AfsAdmSvr_EndOperation (iOp);