partial implementation of AuthzInitializeContextFromSid(), AuthzGetInformationFromContext() and AuthzFreeContext()
Modified: trunk/reactos/lib/authz/authz.c
Modified: trunk/reactos/lib/authz/authz.xml
Added: trunk/reactos/lib/authz/clictx.c
Modified: trunk/reactos/lib/authz/precomp.h
Modified: trunk/reactos/lib/authz/resman.c

Modified: trunk/reactos/lib/authz/authz.c
--- trunk/reactos/lib/authz/authz.c	2006-01-12 00:19:35 UTC (rev 20797)
+++ trunk/reactos/lib/authz/authz.c	2006-01-12 00:23:47 UTC (rev 20798)
@@ -122,19 +122,6 @@
 AUTHZAPI
 BOOL
 WINAPI
-AuthzFreeContext(IN AUTHZ_CLIENT_CONTEXT_HANDLE AuthzClientContext)
-{
-    UNIMPLEMENTED;
-    return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-AUTHZAPI
-BOOL
-WINAPI
 AuthzFreeHandle(IN AUTHZ_ACCESS_CHECK_RESULTS_HANDLE AuthzHandle)
 {
     UNIMPLEMENTED;
@@ -148,23 +135,6 @@
 AUTHZAPI
 BOOL
 WINAPI
-AuthzGetInformationFromContext(IN AUTHZ_CLIENT_CONTEXT_HANDLE hAuthzClientContext,
-                               IN AUTHZ_CONTEXT_INFORMATION_CLASS InfoClass,
-                               IN DWORD BufferSize,
-                               OUT PDWORD pSizeRequired,
-                               OUT PVOID Buffer)
-{
-    UNIMPLEMENTED;
-    return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-AUTHZAPI
-BOOL
-WINAPI
 AuthzInitializeContextFromAuthzContext(IN DWORD flags,
                                        IN AUTHZ_CLIENT_CONTEXT_HANDLE AuthzHandle,
                                        IN PLARGE_INTEGER ExpirationTime,
@@ -183,25 +153,6 @@
 AUTHZAPI
 BOOL
 WINAPI
-AuthzInitializeContextFromSid(IN DWORD Flags,
-                              IN PSID UserSid,
-                              IN AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager,
-                              IN PLARGE_INTEGER pExpirationTime,
-                              IN LUID Identifier,
-                              IN PVOID DynamicGroupArgs,
-                              OUT PAUTHZ_CLIENT_CONTEXT_HANDLE pAuthzClientContext)
-{
-    UNIMPLEMENTED;
-    return FALSE;
-}
-
-
-/*
- * @unimplemented
- */
-AUTHZAPI
-BOOL
-WINAPI
 AuthzInitializeContextFromToken(IN DWORD Flags,
                                 IN HANDLE TokenHandle,
                                 IN AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager,

Modified: trunk/reactos/lib/authz/authz.xml
--- trunk/reactos/lib/authz/authz.xml	2006-01-12 00:19:35 UTC (rev 20797)
+++ trunk/reactos/lib/authz/authz.xml	2006-01-12 00:23:47 UTC (rev 20798)
@@ -11,6 +11,7 @@
 	<library>kernel32</library>
 	<library>advapi32</library>
 	<file>authz.c</file>
+	<file>clictx.c</file>
 	<file>resman.c</file>
 	<file>authz.rc</file>
 	<pch>precomp.h</pch>

Added: trunk/reactos/lib/authz/clictx.c
--- trunk/reactos/lib/authz/clictx.c	2006-01-12 00:19:35 UTC (rev 20797)
+++ trunk/reactos/lib/authz/clictx.c	2006-01-12 00:23:47 UTC (rev 20798)
@@ -0,0 +1,233 @@
+/*
+ * ReactOS Authorization Framework
+ * Copyright (C) 2005 - 2006 ReactOS Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
+ */
+/* $Id: aclui.c 18173 2005-09-30 18:54:48Z weiden $
+ *
+ * PROJECT:         ReactOS Authorization Framework
+ * FILE:            lib/authz/clictx.c
+ * PURPOSE:         Authorization Framework
+ * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
+ *
+ * UPDATE HISTORY:
+ *      10/07/2005  Created
+ */
+#include <precomp.h>
+
+
+/*
+ * @unimplemented
+ */
+AUTHZAPI
+BOOL
+WINAPI
+AuthzInitializeContextFromSid(IN DWORD Flags,
+                              IN PSID UserSid,
+                              IN AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager,
+                              IN PLARGE_INTEGER pExpirationTime,
+                              IN LUID Identifier,
+                              IN PVOID DynamicGroupArgs,
+                              OUT PAUTHZ_CLIENT_CONTEXT_HANDLE pAuthzClientContext)
+{
+    BOOL Ret = FALSE;
+
+    if (AuthzResourceManager != NULL && pExpirationTime != NULL && pAuthzClientContext != NULL &&
+        UserSid != NULL && IsValidSid(UserSid) && !(Flags & (AUTHZ_SKIP_TOKEN_GROUPS | AUTHZ_REQUIRE_S4U_LOGON)))
+    {
+        PAUTHZ_CLIENT_CONTEXT ClientCtx;
+        //PAUTHZ_RESMAN ResMan = (PAUTHZ_RESMAN)AuthzResourceManager;
+        
+        VALIDATE_RESMAN_HANDLE(AuthzResourceManager);
+
+        ClientCtx = (PAUTHZ_CLIENT_CONTEXT)LocalAlloc(LMEM_FIXED,
+                                                      sizeof(AUTHZ_CLIENT_CONTEXT));
+        if (ClientCtx != NULL)
+        {
+            DWORD SidLen;
+
+            /* initialize the client context structure */
+#if DBG
+            ClientCtx->Tag = CLIENTCTX_TAG;
+#endif
+
+            /* simply copy the SID */
+            SidLen = GetLengthSid(UserSid);
+            ClientCtx->UserSid = (PSID)LocalAlloc(LMEM_FIXED,
+                                                  SidLen);
+            if (ClientCtx->UserSid == NULL)
+            {
+                LocalFree((HLOCAL)ClientCtx);
+                goto FailNoMemory;
+            }
+            CopySid(SidLen,
+                    ClientCtx->UserSid,
+                    UserSid);
+
+            ClientCtx->AuthzResourceManager = AuthzResourceManager;
+            ClientCtx->Luid = Identifier;
+            ClientCtx->ExpirationTime.QuadPart = (pExpirationTime != NULL ? pExpirationTime->QuadPart : 0);
+            ClientCtx->ServerContext = NULL; /* FIXME */
+            ClientCtx->DynamicGroupArgs = DynamicGroupArgs;
+
+            /* return the client context handle */
+            *pAuthzClientContext = (AUTHZ_CLIENT_CONTEXT_HANDLE)ClientCtx;
+            Ret = TRUE;
+        }
+        else
+        {
+FailNoMemory:
+            SetLastError(ERROR_NOT_ENOUGH_MEMORY);
+        }
+    }
+    else
+        SetLastError(ERROR_INVALID_PARAMETER);
+
+    return Ret;
+}
+
+
+/*
+ * @unimplemented
+ */
+AUTHZAPI
+BOOL
+WINAPI
+AuthzGetInformationFromContext(IN AUTHZ_CLIENT_CONTEXT_HANDLE hAuthzClientContext,
+                               IN AUTHZ_CONTEXT_INFORMATION_CLASS InfoClass,
+                               IN DWORD BufferSize,
+                               OUT PDWORD pSizeRequired,
+                               OUT PVOID Buffer)
+{
+    BOOL Ret = FALSE;
+
+    if (hAuthzClientContext != NULL && pSizeRequired != NULL)
+    {
+        PAUTHZ_CLIENT_CONTEXT ClientCtx = (PAUTHZ_CLIENT_CONTEXT)hAuthzClientContext;
+        
+        VALIDATE_CLIENTCTX_HANDLE(hAuthzClientContext);
+        
+        switch (InfoClass)
+        {
+            case AuthzContextInfoUserSid:
+            {
+                DWORD SidLen = GetLengthSid(ClientCtx->UserSid);
+                *pSizeRequired = SidLen;
+                if (BufferSize < SidLen)
+                {
+                    SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                }
+                else
+                {
+                    Ret = CopySid(SidLen,
+                                  (PSID)Buffer,
+                                  ClientCtx->UserSid);
+                }
+                break;
+            }
+
+            case AuthzContextInfoGroupsSids:
+                SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+                break;
+
+            case AuthzContextInfoRestrictedSids:
+                SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+                break;
+
+            case AuthzContextInfoPrivileges:
+                SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
+                break;
+
+            case AuthzContextInfoExpirationTime:
+                *pSizeRequired = sizeof(LARGE_INTEGER);
+                if (BufferSize < sizeof(LARGE_INTEGER) || Buffer == NULL)
+                {
+                    SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                }
+                else
+                {
+                    *((PLARGE_INTEGER)Buffer) = ClientCtx->ExpirationTime;
+                    Ret = TRUE;
+                }
+                break;
+
+            case AuthzContextInfoServerContext:
+                *pSizeRequired = sizeof(AUTHZ_CLIENT_CONTEXT_HANDLE);
+                if (BufferSize < sizeof(AUTHZ_CLIENT_CONTEXT_HANDLE) || Buffer == NULL)
+                {
+                    SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                }
+                else
+                {
+                    *((PAUTHZ_CLIENT_CONTEXT_HANDLE)Buffer) = ClientCtx->ServerContext;
+                    Ret = TRUE;
+                }
+                break;
+
+            case AuthzContextInfoIdentifier:
+                *pSizeRequired = sizeof(LUID);
+                if (BufferSize < sizeof(LUID) || Buffer == NULL)
+                {
+                    SetLastError(ERROR_INSUFFICIENT_BUFFER);
+                }
+                else
+                {
+                    *((PLUID)Buffer) = ClientCtx->Luid;
+                    Ret = TRUE;
+                }
+                break;
+
+            default:
+                SetLastError(ERROR_INVALID_PARAMETER);
+                break;
+        }
+    }
+    else
+        SetLastError(ERROR_INVALID_PARAMETER);
+
+    return Ret;
+}
+
+
+/*
+ * @implemented
+ */
+AUTHZAPI
+BOOL
+WINAPI
+AuthzFreeContext(IN AUTHZ_CLIENT_CONTEXT_HANDLE AuthzClientContext)
+{
+    BOOL Ret = FALSE;
+
+    if (AuthzClientContext != NULL)
+    {
+        PAUTHZ_CLIENT_CONTEXT ClientCtx = (PAUTHZ_CLIENT_CONTEXT)AuthzClientContext;
+
+        VALIDATE_CLIENTCTX_HANDLE(AuthzClientContext);
+
+        if (ClientCtx->UserSid != NULL)
+        {
+            LocalFree((HLOCAL)ClientCtx->UserSid);
+        }
+
+        LocalFree((HLOCAL)ClientCtx);
+        Ret = TRUE;
+    }
+    else
+        SetLastError(ERROR_INVALID_PARAMETER);
+
+    return Ret;
+}
Property changes on: trunk/reactos/lib/authz/clictx.c
___________________________________________________________________
Name: svn:keywords
   + author date revision
Name: svn:eol-style
   + native

Modified: trunk/reactos/lib/authz/precomp.h
--- trunk/reactos/lib/authz/precomp.h	2006-01-12 00:19:35 UTC (rev 20797)
+++ trunk/reactos/lib/authz/precomp.h	2006-01-12 00:23:47 UTC (rev 20798)
@@ -1,3 +1,6 @@
+#ifndef __AUTHZ_PRECOMP_H
+#define __AUTHZ_PRECOMP_H
+
 #define _AUTHZ_
 #include <windows.h>
 #include <authz.h>
@@ -14,19 +17,54 @@
 #if DBG
 
 #define RESMAN_TAG  0x89ABCDEF
-#define VALID_RESMAN_HANDLE(handle) ASSERT(((PAUTHZ_RESMAN)handle)->Tag == RESMAN_TAG)
+#define CLIENTCTX_TAG  0x789ABCDE
+#define VALIDATE_RESMAN_HANDLE(handle) ASSERT(((PAUTHZ_RESMAN)handle)->Tag == RESMAN_TAG)
+#define VALIDATE_CLIENTCTX_HANDLE(handle) ASSERT(((PAUTHZ_CLIENT_CONTEXT)handle)->Tag == CLIENTCTX_TAG)
 #ifndef ASSERT
 #define ASSERT(cond) if (!(cond)) { DbgPrint("%s:%i: ASSERTION %s failed!\n", __FILE__, __LINE__, #cond ); }
 #endif
 
 #else
 
-#define VALID_RESMAN_HANDLE(handle)
+#define VALIDATE_RESMAN_HANDLE(handle)
+#define VALIDATE_CLIENTCTX_HANDLE(handle)
 #ifndef ASSERT
 #define ASSERT(cond)
 #endif
 
 #endif
 
+typedef struct _AUTHZ_RESMAN
+{
+#if DBG
+    DWORD Tag;
+#endif
 
+    PFN_AUTHZ_DYNAMIC_ACCESS_CHECK pfnAccessCheck;
+    PFN_AUTHZ_COMPUTE_DYNAMIC_GROUPS pfnComputeDynamicGroups;
+    PFN_AUTHZ_FREE_DYNAMIC_GROUPS pfnFreeDynamicGroups;
+    
+    DWORD flags;
+    PSID UserSid;
+    LUID AuthenticationId;
+
+    WCHAR ResourceManagerName[1];
+} AUTHZ_RESMAN, *PAUTHZ_RESMAN;
+
+typedef struct _AUTHZ_CLIENT_CONTEXT
+{
+#if DBG
+    DWORD Tag;
+#endif
+
+    PSID UserSid;
+
+    AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager;
+    LUID Luid;
+    LARGE_INTEGER ExpirationTime;
+    AUTHZ_CLIENT_CONTEXT_HANDLE ServerContext;
+    PVOID DynamicGroupArgs;
+} AUTHZ_CLIENT_CONTEXT, *PAUTHZ_CLIENT_CONTEXT;
+
+#endif /* __AUTHZ_PRECOMP_H */
 /* EOF */

Modified: trunk/reactos/lib/authz/resman.c
--- trunk/reactos/lib/authz/resman.c	2006-01-12 00:19:35 UTC (rev 20797)
+++ trunk/reactos/lib/authz/resman.c	2006-01-12 00:23:47 UTC (rev 20798)
@@ -1,6 +1,6 @@
 /*
  * ReactOS Authorization Framework
- * Copyright (C) 2005 ReactOS Team
+ * Copyright (C) 2005 - 2006 ReactOS Team
  *
  * This library is free software; you can redistribute it and/or
  * modify it under the terms of the GNU Lesser General Public
@@ -28,23 +28,7 @@
  */
 #include <precomp.h>
 
-typedef struct _AUTHZ_RESMAN
-{
-#if DBG
-    DWORD Tag;
-#endif
 
-    PFN_AUTHZ_DYNAMIC_ACCESS_CHECK pfnAccessCheck;
-    PFN_AUTHZ_COMPUTE_DYNAMIC_GROUPS pfnComputeDynamicGroups;
-    PFN_AUTHZ_FREE_DYNAMIC_GROUPS pfnFreeDynamicGroups;
-    
-    DWORD flags;
-    PSID UserSid;
-    LUID AuthenticationId;
-
-    WCHAR ResourceManagerName[1];
-} AUTHZ_RESMAN, *PAUTHZ_RESMAN;
-
 static BOOL
 AuthzpQueryToken(IN OUT PAUTHZ_RESMAN ResMan,
                  IN HANDLE hToken)
@@ -248,7 +232,7 @@
     {
         PAUTHZ_RESMAN ResMan = (PAUTHZ_RESMAN)AuthzResourceManager;
         
-        VALID_RESMAN_HANDLE(AuthzResourceManager);
+        VALIDATE_RESMAN_HANDLE(AuthzResourceManager);
         
         if (!(ResMan->flags & AUTHZ_RM_FLAG_NO_AUDIT))
         {