/* * 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ /* * PROJECT: ReactOS Authorization Framework * FILE: lib/authz/clictx.c * PURPOSE: Authorization Framework * PROGRAMMER: Thomas Weidenmueller * * UPDATE HISTORY: * 10/07/2005 Created */ #include "precomp.h" #define NDEBUG #include /* * @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; }