Author: ekohl
Date: Sat Jan 12 15:30:28 2013
New Revision: 58159

URL: http://svn.reactos.org/svn/reactos?rev=58159&view=rev
Log:
[SAMSRV]
- Implement SamrAddMemberToGroup and SamrRemoveMemberFromGroup partially.
- Constify some parameters.

Added:
    trunk/reactos/dll/win32/samsrv/group.c   (with props)
Modified:
    trunk/reactos/dll/win32/samsrv/CMakeLists.txt
    trunk/reactos/dll/win32/samsrv/database.c
    trunk/reactos/dll/win32/samsrv/registry.c
    trunk/reactos/dll/win32/samsrv/samrpc.c
    trunk/reactos/dll/win32/samsrv/samsrv.h

Modified: trunk/reactos/dll/win32/samsrv/CMakeLists.txt
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/CMakeLists.txt?rev=58159&r1=58158&r2=58159&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/CMakeLists.txt [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/CMakeLists.txt [iso-8859-1] Sat Jan 12 
15:30:28 2013
@@ -9,6 +9,7 @@
 
 list(APPEND SOURCE
     database.c
+    group.c
     registry.c
     samrpc.c
     samsrv.c

Modified: trunk/reactos/dll/win32/samsrv/database.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/database.c?rev=58159&r1=58158&r2=58159&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/database.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/database.c [iso-8859-1] Sat Jan 12 15:30:28 
2013
@@ -555,7 +555,7 @@
 
 NTSTATUS
 SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
-                             IN LPWSTR lpAccountName)
+                             IN LPCWSTR lpAccountName)
 {
     HANDLE AccountKey;
     HANDLE NamesKey;

Added: trunk/reactos/dll/win32/samsrv/group.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/group.c?rev=58159&view=auto
==============================================================================
--- trunk/reactos/dll/win32/samsrv/group.c (added)
+++ trunk/reactos/dll/win32/samsrv/group.c [iso-8859-1] Sat Jan 12 15:30:28 2013
@@ -1,0 +1,154 @@
+/*
+ * PROJECT:     Local Security Authority Server DLL
+ * LICENSE:     GPL - See COPYING in the top level directory
+ * FILE:        dll/win32/samsrv/group.c
+ * PURPOSE:     Group specific helper functions
+ * COPYRIGHT:   Copyright 2013 Eric Kohl
+ */
+
+/* INCLUDES ****************************************************************/
+
+#include "samsrv.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(samsrv);
+
+
+/* FUNCTIONS ***************************************************************/
+
+
+NTSTATUS
+SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
+                     IN ULONG MemberId)
+{
+    PULONG MembersBuffer = NULL;
+    ULONG MembersCount = 0;
+    ULONG Length = 0;
+    ULONG i;
+    NTSTATUS Status;
+
+    Status = SampGetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    NULL,
+                                    NULL,
+                                    &Length);
+    if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_NOT_FOUND)
+        goto done;
+
+    MembersBuffer = midl_user_allocate(Length + sizeof(ULONG));
+    if (MembersBuffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    if (Status != STATUS_OBJECT_NAME_NOT_FOUND)
+    {
+        Status = SampGetObjectAttribute(GroupObject,
+                                        L"Members",
+                                        NULL,
+                                        MembersBuffer,
+                                        &Length);
+        if (!NT_SUCCESS(Status))
+            goto done;
+
+        MembersCount = Length / sizeof(ULONG);
+    }
+
+    for (i = 0; i < MembersCount; i++)
+    {
+        if (MembersBuffer[i] == MemberId)
+        {
+            Status = STATUS_MEMBER_IN_GROUP;
+            goto done;
+        }
+    }
+
+    MembersBuffer[MembersCount] = MemberId;
+    Length += sizeof(ULONG);
+
+    Status = SampSetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    REG_BINARY,
+                                    MembersBuffer,
+                                    Length);
+
+done:
+    if (MembersBuffer != NULL)
+        midl_user_free(MembersBuffer);
+
+    return Status;
+}
+
+
+NTSTATUS
+SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
+                          IN ULONG MemberId)
+{
+    PULONG MembersBuffer = NULL;
+    ULONG MembersCount = 0;
+    ULONG Length = 0;
+    ULONG i;
+    NTSTATUS Status;
+
+    Status = SampGetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    NULL,
+                                    NULL,
+                                    &Length);
+
+    if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
+        return STATUS_MEMBER_NOT_IN_GROUP;
+
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    MembersBuffer = midl_user_allocate(Length);
+    if (MembersBuffer == NULL)
+    {
+        Status = STATUS_INSUFFICIENT_RESOURCES;
+        goto done;
+    }
+
+    Status = SampGetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    NULL,
+                                    MembersBuffer,
+                                    &Length);
+    if (!NT_SUCCESS(Status))
+        goto done;
+
+    Status = STATUS_MEMBER_NOT_IN_GROUP;
+
+    MembersCount = Length / sizeof(ULONG);
+    for (i = 0; i < MembersCount; i++)
+    {
+        if (MembersBuffer[i] == MemberId)
+        {
+            Length -= sizeof(ULONG);
+            Status = STATUS_SUCCESS;
+            break;
+        }
+
+        if (Status == STATUS_SUCCESS && i < MembersCount - 1)
+        {
+            MembersBuffer[i] = MembersBuffer[i + 1];
+        }
+    }
+
+    if (!NT_SUCCESS(Status))
+        goto done;
+
+    Status = SampSetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    REG_BINARY,
+                                    MembersBuffer,
+                                    Length);
+
+done:
+    if (MembersBuffer != NULL)
+        midl_user_free(MembersBuffer);
+
+    return Status;
+}
+
+/* EOF */

Propchange: trunk/reactos/dll/win32/samsrv/group.c
------------------------------------------------------------------------------
    svn:eol-style = native

Propchange: trunk/reactos/dll/win32/samsrv/group.c
------------------------------------------------------------------------------
    svn:keywords = author date id revision

Modified: trunk/reactos/dll/win32/samsrv/registry.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/registry.c?rev=58159&r1=58158&r2=58159&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/registry.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/registry.c [iso-8859-1] Sat Jan 12 15:30:28 
2013
@@ -202,7 +202,7 @@
 
 NTSTATUS
 SampRegDeleteValue(IN HANDLE KeyHandle,
-                   IN LPWSTR ValueName)
+                   IN LPCWSTR ValueName)
 {
     UNICODE_STRING Name;
 
@@ -322,7 +322,7 @@
 
 NTSTATUS
 SampRegQueryValue(IN HANDLE KeyHandle,
-                  IN LPWSTR ValueName,
+                  IN LPCWSTR ValueName,
                   OUT PULONG Type OPTIONAL,
                   OUT PVOID Data OPTIONAL,
                   IN OUT PULONG DataLength OPTIONAL)
@@ -392,7 +392,7 @@
 
 NTSTATUS
 SampRegSetValue(HANDLE KeyHandle,
-                LPWSTR ValueName,
+                LPCWSTR ValueName,
                 ULONG Type,
                 LPVOID Data,
                 ULONG DataLength)

Modified: trunk/reactos/dll/win32/samsrv/samrpc.c
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samrpc.c?rev=58159&r1=58158&r2=58159&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/samrpc.c [iso-8859-1] Sat Jan 12 15:30:28 
2013
@@ -191,7 +191,7 @@
 NTAPI
 SamrQuerySecurityObject(IN SAMPR_HANDLE ObjectHandle,
                         IN SECURITY_INFORMATION SecurityInformation,
-                        OUT PSAMPR_SR_SECURITY_DESCRIPTOR * SecurityDescriptor)
+                        OUT PSAMPR_SR_SECURITY_DESCRIPTOR *SecurityDescriptor)
 {
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
@@ -3593,8 +3593,8 @@
                       PSAMPR_GROUP_INFO_BUFFER *Buffer)
 {
     PSAMPR_GROUP_INFO_BUFFER InfoBuffer = NULL;
-    HANDLE MembersKeyHandle = NULL;
     SAM_GROUP_FIXED_DATA FixedData;
+    ULONG MembersLength = 0;
     ULONG Length = 0;
     NTSTATUS Status;
 
@@ -3633,33 +3633,22 @@
 
     InfoBuffer->General.Attributes = FixedData.Attributes;
 
-    /* Open the Members subkey */
-    Status = SampRegOpenKey(GroupObject->KeyHandle,
-                            L"Members",
-                            KEY_READ,
-                            &MembersKeyHandle);
-    if (!NT_SUCCESS(Status))
-    {
-        TRACE("Status 0x%08lx\n", Status);
-        goto done;
-    }
-
-    /* Retrieve the number of members of the alias */
-    Status = SampRegQueryKeyInfo(MembersKeyHandle,
-                                 NULL,
-                                 &InfoBuffer->General.MemberCount);
-    if (!NT_SUCCESS(Status))
-    {
-        TRACE("Status 0x%08lx\n", Status);
-        goto done;
-    }
+    Status = SampGetObjectAttribute(GroupObject,
+                                    L"Members",
+                                    NULL,
+                                    NULL,
+                                    &MembersLength);
+    if (!NT_SUCCESS(Status) && Status != STATUS_OBJECT_NAME_NOT_FOUND)
+        goto done;
+
+    if (Status == STATUS_OBJECT_NAME_NOT_FOUND)
+        InfoBuffer->General.MemberCount = 0;
+    else
+        InfoBuffer->General.MemberCount = MembersLength / sizeof(ULONG);
 
     *Buffer = InfoBuffer;
 
 done:
-    if (MembersKeyHandle != NULL)
-        SampRegCloseKey(MembersKeyHandle);
-
     if (!NT_SUCCESS(Status))
     {
         if (InfoBuffer != NULL)
@@ -3941,18 +3930,38 @@
                      IN unsigned long MemberId,
                      IN unsigned long Attributes)
 {
+    PSAM_DB_OBJECT GroupObject;
+    NTSTATUS Status;
+
+    TRACE("(%p %lu %lx)\n",
+          GroupHandle, MemberId, Attributes);
+
+    /* Validate the group handle */
+    Status = SampValidateDbObject(GroupHandle,
+                                  SamDbGroupObject,
+                                  GROUP_ADD_MEMBER,
+                                  &GroupObject);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    /* FIXME: Add group membership to the user object */
+
+    Status = SampAddMemberToGroup(GroupObject,
+                                  MemberId);
+
+    return Status;
+}
+
+
+/* Function 21 */
+NTSTATUS
+NTAPI
+SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle)
+{
     UNIMPLEMENTED;
     return STATUS_NOT_IMPLEMENTED;
 }
 
-/* Function 21 */
-NTSTATUS
-NTAPI
-SamrDeleteGroup(IN OUT SAMPR_HANDLE *GroupHandle)
-{
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
 
 /* Function 24 */
 NTSTATUS
@@ -3960,9 +3969,28 @@
 SamrRemoveMemberFromGroup(IN SAMPR_HANDLE GroupHandle,
                           IN unsigned long MemberId)
 {
-    UNIMPLEMENTED;
-    return STATUS_NOT_IMPLEMENTED;
-}
+    PSAM_DB_OBJECT GroupObject;
+    NTSTATUS Status;
+
+    TRACE("(%p %lu)\n",
+          GroupHandle, MemberId);
+
+    /* Validate the group handle */
+    Status = SampValidateDbObject(GroupHandle,
+                                  SamDbGroupObject,
+                                  GROUP_REMOVE_MEMBER,
+                                  &GroupObject);
+    if (!NT_SUCCESS(Status))
+        return Status;
+
+    /* FIXME: Remove group membership from the user object */
+
+    Status = SampRemoveMemberFromGroup(GroupObject,
+                                       MemberId);
+
+    return Status;
+}
+
 
 /* Function 25 */
 NTSTATUS

Modified: trunk/reactos/dll/win32/samsrv/samsrv.h
URL: 
http://svn.reactos.org/svn/reactos/trunk/reactos/dll/win32/samsrv/samsrv.h?rev=58159&r1=58158&r2=58159&view=diff
==============================================================================
--- trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] (original)
+++ trunk/reactos/dll/win32/samsrv/samsrv.h [iso-8859-1] Sat Jan 12 15:30:28 
2013
@@ -1,6 +1,6 @@
 /*
  * COPYRIGHT:       See COPYING in the top level directory
- * PROJECT:         Security Account Manager (LSA) Server
+ * PROJECT:         Security Account Manager (SAM) Server
  * FILE:            reactos/dll/win32/samsrv/samsrv.h
  * PURPOSE:         Common header file
  *
@@ -109,6 +109,7 @@
     USHORT OperatorCount;
 } SAM_USER_FIXED_DATA, *PSAM_USER_FIXED_DATA;
 
+
 /* database.c */
 
 NTSTATUS
@@ -143,7 +144,7 @@
 
 NTSTATUS
 SampCheckAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
-                             IN LPWSTR lpAccountName);
+                             IN LPCWSTR lpAccountName);
 
 NTSTATUS
 SampSetAccountNameInDomain(IN PSAM_DB_OBJECT DomainObject,
@@ -170,7 +171,20 @@
                              LPWSTR AttributeName,
                              RPC_UNICODE_STRING *String);
 
+
+/* group.h */
+
+NTSTATUS
+SampAddMemberToGroup(IN PSAM_DB_OBJECT GroupObject,
+                     IN ULONG MemberId);
+
+NTSTATUS
+SampRemoveMemberFromGroup(IN PSAM_DB_OBJECT GroupObject,
+                          IN ULONG MemberId);
+
+
 /* registry.h */
+
 NTSTATUS
 SampRegCloseKey(IN HANDLE KeyHandle);
 
@@ -203,7 +217,7 @@
 
 NTSTATUS
 SampRegDeleteValue(IN HANDLE KeyHandle,
-                   IN LPWSTR ValueName);
+                   IN LPCWSTR ValueName);
 
 NTSTATUS
 SampRegEnumerateValue(IN HANDLE KeyHandle,
@@ -216,21 +230,27 @@
 
 NTSTATUS
 SampRegQueryValue(IN HANDLE KeyHandle,
-                  IN LPWSTR ValueName,
+                  IN LPCWSTR ValueName,
                   OUT PULONG Type OPTIONAL,
                   OUT LPVOID Data OPTIONAL,
                   IN OUT PULONG DataLength OPTIONAL);
 
 NTSTATUS
 SampRegSetValue(IN HANDLE KeyHandle,
-                IN LPWSTR ValueName,
+                IN LPCWSTR ValueName,
                 IN ULONG Type,
                 IN LPVOID Data,
                 IN ULONG DataLength);
 
+
 /* samspc.c */
+
 VOID SampStartRpcServer(VOID);
 
+
 /* setup.c */
+
 BOOL SampIsSetupRunning(VOID);
-BOOL SampInitializeSAM(VOID);
+BOOL SampInitializeSAM(VOID);
+
+/* EOF */


Reply via email to