2 * ReactOS Authorization Framework
3 * Copyright (C) 2005 - 2006 ReactOS Team
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 * PROJECT: ReactOS Authorization Framework
21 * FILE: lib/authz/resman.c
22 * PURPOSE: Authorization Framework
23 * PROGRAMMER: Thomas Weidenmueller <w3seek@reactos.com>
32 AuthzpQueryToken(IN OUT PAUTHZ_RESMAN ResMan
,
36 TOKEN_STATISTICS Statistics
;
41 /* query information about the user */
42 BufLen
= sizeof(User
);
43 Ret
= GetTokenInformation(hToken
,
50 BufLen
= GetLengthSid(User
.User
.Sid
);
53 UserSid
= (PSID
)LocalAlloc(LMEM_FIXED
,
70 /* query general information */
71 BufLen
= sizeof(Statistics
);
72 Ret
= GetTokenInformation(hToken
,
81 ResMan
->UserSid
= UserSid
;
82 ResMan
->AuthenticationId
= Statistics
.AuthenticationId
;
89 LocalFree((HLOCAL
)UserSid
);
97 AuthzpInitUnderImpersonation(IN OUT PAUTHZ_RESMAN ResMan
)
102 Ret
= OpenThreadToken(GetCurrentThread(),
108 Ret
= AuthzpQueryToken(ResMan
,
117 AuthzpInitSelf(IN OUT PAUTHZ_RESMAN ResMan
)
122 Ret
= OpenProcessToken(GetCurrentProcess(),
127 Ret
= AuthzpQueryToken(ResMan
,
142 AuthzInitializeResourceManager(IN DWORD flags
,
143 IN PFN_AUTHZ_DYNAMIC_ACCESS_CHECK pfnAccessCheck OPTIONAL
,
144 IN PFN_AUTHZ_COMPUTE_DYNAMIC_GROUPS pfnComputeDynamicGroups OPTIONAL
,
145 IN PFN_AUTHZ_FREE_DYNAMIC_GROUPS pfnFreeDynamicGroups OPTIONAL
,
146 IN PCWSTR ResourceManagerName OPTIONAL
,
147 IN PAUTHZ_RESOURCE_MANAGER_HANDLE pAuthzResourceManager
)
151 if (pAuthzResourceManager
!= NULL
&&
152 !(flags
& ~(AUTHZ_RM_FLAG_NO_AUDIT
| AUTHZ_RM_FLAG_INITIALIZE_UNDER_IMPERSONATION
)))
154 PAUTHZ_RESMAN ResMan
;
155 SIZE_T RequiredSize
= sizeof(AUTHZ_RESMAN
);
157 if (ResourceManagerName
!= NULL
)
159 RequiredSize
+= wcslen(ResourceManagerName
) * sizeof(WCHAR
);
162 ResMan
= (PAUTHZ_RESMAN
)LocalAlloc(LMEM_FIXED
,
166 /* initialize the resource manager structure */
168 ResMan
->Tag
= RESMAN_TAG
;
171 ResMan
->flags
= flags
;
172 ResMan
->UserSid
= NULL
;
174 if (ResourceManagerName
!= NULL
)
176 wcscpy(ResMan
->ResourceManagerName
,
177 ResourceManagerName
);
180 ResMan
->ResourceManagerName
[0] = UNICODE_NULL
;
182 ResMan
->pfnAccessCheck
= pfnAccessCheck
;
183 ResMan
->pfnComputeDynamicGroups
= pfnComputeDynamicGroups
;
184 ResMan
->pfnFreeDynamicGroups
= pfnFreeDynamicGroups
;
186 if (!(flags
& AUTHZ_RM_FLAG_NO_AUDIT
))
188 /* FIXME - initialize auditing */
189 DPRINT1("Auditing not implemented!\n");
192 if (flags
& AUTHZ_RM_FLAG_INITIALIZE_UNDER_IMPERSONATION
)
194 Ret
= AuthzpInitUnderImpersonation(ResMan
);
198 Ret
= AuthzpInitSelf(ResMan
);
203 /* finally return the handle */
204 *pAuthzResourceManager
= (AUTHZ_RESOURCE_MANAGER_HANDLE
)ResMan
;
208 DPRINT1("Querying the token failed!\n");
209 LocalFree((HLOCAL
)ResMan
);
214 SetLastError(ERROR_INVALID_PARAMETER
);
226 AuthzFreeResourceManager(IN AUTHZ_RESOURCE_MANAGER_HANDLE AuthzResourceManager
)
230 if (AuthzResourceManager
!= NULL
)
232 PAUTHZ_RESMAN ResMan
= (PAUTHZ_RESMAN
)AuthzResourceManager
;
234 VALIDATE_RESMAN_HANDLE(AuthzResourceManager
);
236 if (!(ResMan
->flags
& AUTHZ_RM_FLAG_NO_AUDIT
))
238 /* FIXME - cleanup auditing */
241 if (ResMan
->UserSid
!= NULL
)
243 LocalFree((HLOCAL
)ResMan
->UserSid
);
246 LocalFree((HLOCAL
)AuthzResourceManager
);
250 SetLastError(ERROR_INVALID_PARAMETER
);