Author: ekohl Date: Mon Jan 14 21:56:45 2013 New Revision: 58176
URL: http://svn.reactos.org/svn/reactos?rev=58176&view=rev Log: [SAMSRV] Implement SamrSetMemberAttributesOfGroup.
Modified: trunk/reactos/dll/win32/samsrv/samrpc.c trunk/reactos/dll/win32/samsrv/samsrv.h trunk/reactos/dll/win32/samsrv/user.c
Modified: trunk/reactos/dll/win32/samsrv/samrpc.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samrpc.c?r... ============================================================================== --- trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] Mon Jan 14 21:56:45 2013 @@ -4158,8 +4158,30 @@ IN unsigned long MemberId, IN unsigned long Attributes) { - UNIMPLEMENTED; - return STATUS_NOT_IMPLEMENTED; + PSAM_DB_OBJECT GroupObject; + NTSTATUS Status; + + /* Validate the group handle */ + Status = SampValidateDbObject(GroupHandle, + SamDbGroupObject, + GROUP_ADD_MEMBER, + &GroupObject); + if (!NT_SUCCESS(Status)) + { + TRACE("SampValidateDbObject failed with status 0x%08lx\n", Status); + return Status; + } + + Status = SampSetUserGroupAttributes(GroupObject->ParentObject, + MemberId, + GroupObject->RelativeId, + Attributes); + if (!NT_SUCCESS(Status)) + { + TRACE("SampSetUserGroupAttributes failed with status 0x%08lx\n", Status); + } + + return Status; }
Modified: trunk/reactos/dll/win32/samsrv/samsrv.h URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samsrv.h?r... ============================================================================== --- trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] (original) +++ trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] Mon Jan 14 21:56:45 2013 @@ -285,4 +285,10 @@ IN ULONG GroupId, OUT PULONG GroupAttributes);
+NTSTATUS +SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, + IN ULONG UserId, + IN ULONG GroupId, + IN ULONG GroupAttributes); + /* EOF */
Modified: trunk/reactos/dll/win32/samsrv/user.c URL: http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/user.c?rev... ============================================================================== --- trunk/reactos/dll/win32/samsrv/user.c [iso-8859-1] (original) +++ trunk/reactos/dll/win32/samsrv/user.c [iso-8859-1] Mon Jan 14 21:56:45 2013 @@ -214,10 +214,7 @@ &Length);
if (Length == 0) - { - *GroupAttributes = 0; - return STATUS_SUCCESS; - } + return STATUS_UNSUCCESSFUL; /* FIXME */
GroupsBuffer = midl_user_allocate(Length); if (GroupsBuffer == NULL) @@ -253,4 +250,75 @@ return Status; }
+ +NTSTATUS +SampSetUserGroupAttributes(IN PSAM_DB_OBJECT DomainObject, + IN ULONG UserId, + IN ULONG GroupId, + IN ULONG GroupAttributes) +{ + PSAM_DB_OBJECT UserObject = NULL; + PGROUP_MEMBERSHIP GroupsBuffer = NULL; + ULONG Length = 0; + ULONG i; + NTSTATUS Status; + + Status = SampOpenUserObject(DomainObject, + UserId, + 0, + &UserObject); + if (!NT_SUCCESS(Status)) + { + return Status; + } + + SampGetObjectAttribute(UserObject, + L"Groups", + NULL, + NULL, + &Length); + + if (Length == 0) + return STATUS_UNSUCCESSFUL; /* FIXME */ + + GroupsBuffer = midl_user_allocate(Length); + if (GroupsBuffer == NULL) + { + Status = STATUS_INSUFFICIENT_RESOURCES; + goto done; + } + + Status = SampGetObjectAttribute(UserObject, + L"Groups", + NULL, + GroupsBuffer, + &Length); + if (!NT_SUCCESS(Status)) + goto done; + + for (i = 0; i < (Length / sizeof(GROUP_MEMBERSHIP)); i++) + { + if (GroupsBuffer[i].RelativeId == GroupId) + { + GroupsBuffer[i].Attributes = GroupAttributes; + break; + } + } + + Status = SampSetObjectAttribute(UserObject, + L"Groups", + REG_BINARY, + GroupsBuffer, + Length); + +done: + if (GroupsBuffer != NULL) + midl_user_free(GroupsBuffer); + + if (UserObject != NULL) + SampCloseDbObject(UserObject); + + return Status; +} + /* EOF */