Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenresman.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
1.7.6.1
|