ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

resman.c
Go to the documentation of this file.
00001 /*
00002  * ReactOS Authorization Framework
00003  * Copyright (C) 2005 - 2006 ReactOS Team
00004  *
00005  * This library is free software; you can redistribute it and/or
00006  * modify it under the terms of the GNU Lesser General Public
00007  * License as published by the Free Software Foundation; either
00008  * version 2.1 of the License, or (at your option) any later version.
00009  *
00010  * This library is distributed in the hope that it will be useful,
00011  * but WITHOUT ANY WARRANTY; without even the implied warranty of
00012  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00013  * Lesser General Public License for more details.
00014  *
00015  * You should have received a copy of the GNU Lesser General Public
00016  * License along with this library; if not, write to the Free Software
00017  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
00018  */
00019 /*
00020  * PROJECT:         ReactOS Authorization Framework
00021  * FILE:            lib/authz/resman.c
00022  * PURPOSE:         Authorization Framework
00023  * PROGRAMMER:      Thomas Weidenmueller <w3seek@reactos.com>
00024  *
00025  * UPDATE HISTORY:
00026  *      10/07/2005  Created
00027  */
00028 #include <precomp.h>
00029 
00030 
00031 static BOOL
00032 AuthzpQueryToken(IN OUT PAUTHZ_RESMAN ResMan,
00033                  IN HANDLE hToken)
00034 {
00035     TOKEN_USER User;
00036     TOKEN_STATISTICS Statistics;
00037     DWORD BufLen;
00038     PSID UserSid = NULL;
00039     BOOL Ret = FALSE;
00040 
00041     /* query information about the user */
00042     BufLen = sizeof(User);
00043     Ret = GetTokenInformation(hToken,
00044                               TokenUser,
00045                               &User,
00046                               BufLen,
00047                               &BufLen);
00048     if (Ret)
00049     {
00050         BufLen = GetLengthSid(User.User.Sid);
00051         if (BufLen != 0)
00052         {
00053             UserSid = (PSID)LocalAlloc(LMEM_FIXED,
00054                                        BufLen);
00055             if (UserSid != NULL)
00056             {
00057                 CopyMemory(UserSid,
00058                            User.User.Sid,
00059                            BufLen);
00060             }
00061             else
00062                 Ret = FALSE;
00063         }
00064         else
00065             Ret = FALSE;
00066     }
00067 
00068     if (Ret)
00069     {
00070         /* query general information */
00071         BufLen = sizeof(Statistics);
00072         Ret = GetTokenInformation(hToken,
00073                                   TokenUser,
00074                                   &Statistics,
00075                                   BufLen,
00076                                   &BufLen);
00077     }
00078 
00079     if (Ret)
00080     {
00081         ResMan->UserSid = UserSid;
00082         ResMan->AuthenticationId = Statistics.AuthenticationId;
00083         Ret = TRUE;
00084     }
00085     else
00086     {
00087         if (UserSid != NULL)
00088         {
00089             LocalFree((HLOCAL)UserSid);
00090         }
00091     }
00092 
00093     return Ret;
00094 }
00095 
00096 static BOOL
00097 AuthzpInitUnderImpersonation(IN OUT PAUTHZ_RESMAN ResMan)
00098 {
00099     HANDLE hToken;
00100     BOOL Ret;
00101 
00102     Ret = OpenThreadToken(GetCurrentThread(),
00103                           TOKEN_QUERY,
00104                           TRUE,
00105                           &hToken);
00106     if (Ret)
00107     {
00108         Ret = AuthzpQueryToken(ResMan,
00109                                hToken);
00110         CloseHandle(hToken);
00111     }
00112 
00113     return Ret;
00114 }
00115 
00116 static BOOL
00117 AuthzpInitSelf(IN OUT PAUTHZ_RESMAN ResMan)
00118 {
00119     HANDLE hToken;
00120     BOOL Ret;
00121 
00122     Ret = OpenProcessToken(GetCurrentProcess(),
00123                            TOKEN_QUERY,
00124                            &hToken);
00125     if (Ret)
00126     {
00127         Ret = AuthzpQueryToken(ResMan,
00128                                hToken);
00129         CloseHandle(hToken);
00130     }
00131 
00132     return Ret;
00133 }
00134 
00135 
00136 /*
00137  * @unimplemented
00138  */
00139 AUTHZAPI
00140 BOOL
00141 WINAPI
00142 AuthzInitializeResourceManager(IN DWORD flags,
00143                                IN PFN_AUTHZ_DYNAMIC_ACCESS_CHECK pfnAccessCheck  OPTIONAL,
00144                                IN PFN_AUTHZ_COMPUTE_DYNAMIC_GROUPS pfnComputeDynamicGroups  OPTIONAL,
00145                                IN PFN_AUTHZ_FREE_DYNAMIC_GROUPS pfnFreeDynamicGroups  OPTIONAL,
00146                                IN PCWSTR ResourceManagerName  OPTIONAL,
00147                                IN PAUTHZ_RESOURCE_MANAGER_HANDLE pAuthzResourceManager)
00148 {
00149     BOOL Ret = FALSE;
00150 
00151     if (pAuthzResourceManager != NULL &&
00152         !(flags & ~(AUTHZ_RM_FLAG_NO_AUDIT | AUTHZ_RM_FLAG_INITIALIZE_UNDER_IMPERSONATION)))
00153     {
00154         PAUTHZ_RESMAN ResMan;
00155         SIZE_T RequiredSize = sizeof(AUTHZ_RESMAN);
00156 
00157         if (ResourceManagerName != NULL)
00158         {
00159             RequiredSize += wcslen(ResourceManagerName) * sizeof(WCHAR);
00160         }
00161 
00162         ResMan = (PAUTHZ_RESMAN)LocalAlloc(LMEM_FIXED,
00163                                            RequiredSize);
00164         if (ResMan != NULL)
00165         {
00166             /* initialize the resource manager structure */
00167 #if DBG
00168             ResMan->Tag = RESMAN_TAG;
00169 #endif
00170 
00171             ResMan->flags = flags;
00172             ResMan->UserSid = NULL;
00173 
00174             if (ResourceManagerName != NULL)
00175             {
00176                 wcscpy(ResMan->ResourceManagerName,
00177                        ResourceManagerName);
00178             }
00179             else
00180                 ResMan->ResourceManagerName[0] = UNICODE_NULL;
00181 
00182             ResMan->pfnAccessCheck = pfnAccessCheck;
00183             ResMan->pfnComputeDynamicGroups = pfnComputeDynamicGroups;
00184             ResMan->pfnFreeDynamicGroups = pfnFreeDynamicGroups;
00185 
00186             if (!(flags & AUTHZ_RM_FLAG_NO_AUDIT))
00187             {
00188                 /* FIXME - initialize auditing */
00189                 DPRINT1("Auditing not implemented!\n");
00190             }
00191 
00192             if (flags & AUTHZ_RM_FLAG_INITIALIZE_UNDER_IMPERSONATION)
00193             {
00194                 Ret = AuthzpInitUnderImpersonation(ResMan);
00195             }
00196             else
00197             {
00198                 Ret = AuthzpInitSelf(ResMan);
00199             }
00200 
00201             if (Ret)
00202             {
00203                 /* finally return the handle */
00204                 *pAuthzResourceManager = (AUTHZ_RESOURCE_MANAGER_HANDLE)ResMan;
00205             }
00206             else
00207             {
00208                 DPRINT1("Querying the token failed!\n");
00209                 LocalFree((HLOCAL)ResMan);
00210             }
00211         }
00212     }
00213     else
00214         SetLastError(ERROR_INVALID_PARAMETER);
00215 
00216     return Ret;
00217 }
00218 
00219 
00220 /*
00221  * @unimplemented
00222  */
00223 AUTHZAPI
00224 BOOL
00225 WINAPI
00226 AuthzFreeResourceManager(IN AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager)
00227 {
00228     BOOL Ret = FALSE;
00229 
00230     if (AuthzResourceManager != NULL)
00231     {
00232         PAUTHZ_RESMAN ResMan = (PAUTHZ_RESMAN)AuthzResourceManager;
00233 
00234         VALIDATE_RESMAN_HANDLE(AuthzResourceManager);
00235 
00236         if (!(ResMan->flags & AUTHZ_RM_FLAG_NO_AUDIT))
00237         {
00238             /* FIXME - cleanup auditing */
00239         }
00240 
00241         if (ResMan->UserSid != NULL)
00242         {
00243             LocalFree((HLOCAL)ResMan->UserSid);
00244         }
00245 
00246         LocalFree((HLOCAL)AuthzResourceManager);
00247         Ret = TRUE;
00248     }
00249     else
00250         SetLastError(ERROR_INVALID_PARAMETER);
00251 
00252     return Ret;
00253 }
00254 

Generated on Sat May 26 2012 04:21:22 for ReactOS by doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.