|
|
//+---------------------------------------------------------------------------
//
// Microsoft Windows
// Copyright (C) Microsoft Corporation, 1992 - 1997.
//
// File: credapi.c
//
// Contents: Credential related API
//
// Classes:
//
// Functions:
//
// History: 2-24-97 RichardW Created
//
//----------------------------------------------------------------------------
#include "xtcbpkg.h"
//+---------------------------------------------------------------------------
//
// Function: XtcbAcceptCredentials
//
// Synopsis: Accept credentials stored during a prior logon session.
//
// Arguments: [LogonType] -- Type of logon
// [UserName] -- name logged on with
// [PrimaryCred] -- Primary credential data
// [SupplementalCreds] -- supplemental credential data
//
// History: 2-19-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY XtcbAcceptCredentials( IN SECURITY_LOGON_TYPE LogonType, IN PUNICODE_STRING UserName, IN PSECPKG_PRIMARY_CRED PrimaryCred, IN PSECPKG_SUPPLEMENTAL_CRED SupplementalCreds) { PXTCB_CREDS Creds ;
DebugLog(( DEB_TRACE_CALLS, "AcceptCredentials( %d, %ws, ...)\n", LogonType, UserName->Buffer ));
Creds = XtcbCreateCreds( &PrimaryCred->LogonId );
if ( Creds ) { return SEC_E_OK ; }
return SEC_E_INSUFFICIENT_MEMORY ; }
//+---------------------------------------------------------------------------
//
// Function: XtcbAcquireCredentialsHandle
//
// Synopsis: Acquire a handle representing the user.
//
// Arguments: [psPrincipal] -- claimed name of user
// [fCredentials] -- credential use
// [pLogonID] -- logon id of the calling thread
// [pvAuthData] -- provided auth data pointer (unmapped)
// [pvGetKeyFn] -- function in calling process for key data
// [pvGetKeyArgument] -- argument to be passed
// [pdwHandle] -- returned handle
// [ptsExpiry] -- expiration time
//
// History: 2-19-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY XtcbAcquireCredentialsHandle( PSECURITY_STRING psPrincipal, ULONG fCredentials, PLUID pLogonId, PVOID pvAuthData, PVOID pvGetKeyFn, PVOID pvGetKeyArgument, PLSA_SEC_HANDLE pCredHandle, PTimeStamp ptsExpiry) { PXTCB_CREDS Creds; PXTCB_CRED_HANDLE Handle ; SECPKG_CLIENT_INFO Info ; PSEC_WINNT_AUTH_IDENTITY AuthData ;
DebugLog(( DEB_TRACE_CALLS, "AcquireCredentialsHandle(..., %x:%x, %x, ...)\n", pLogonId->HighPart, pLogonId->LowPart, pvAuthData ));
Creds = NULL ;
if ( pvAuthData == NULL ) {
if ( (pLogonId->LowPart == 0) && (pLogonId->HighPart == 0) ) { LsaTable->GetClientInfo( &Info );
*pLogonId = Info.LogonId ;
} Creds = XtcbFindCreds( pLogonId, TRUE );
if ( !Creds ) { //
// Time to create credentials for this user
//
Creds = XtcbCreateCreds( pLogonId );
if ( !Creds ) { return SEC_E_INSUFFICIENT_MEMORY ; }
if ( Creds->Pac == NULL ) { Creds->Pac = XtcbCreatePacForCaller(); } } } else { return SEC_E_UNKNOWN_CREDENTIALS ; }
Handle = XtcbAllocateCredHandle( Creds );
XtcbDerefCreds( Creds );
*pCredHandle = (LSA_SEC_HANDLE) Handle ;
*ptsExpiry = XtcbNever ;
if ( Handle ) { Handle->Usage = fCredentials ;
return SEC_E_OK ; } else { return SEC_E_INSUFFICIENT_MEMORY ; } }
//+---------------------------------------------------------------------------
//
// Function: XtcbQueryCredentialsAttributes
//
// Synopsis: Return information about credentials
//
// Arguments: [dwCredHandle] -- Handle to check
// [dwAttribute] -- attribute to return
// [Buffer] -- Buffer to fill with attribute
//
// History: 2-20-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY XtcbQueryCredentialsAttributes( LSA_SEC_HANDLE CredHandle, ULONG dwAttribute, PVOID Buffer) { NTSTATUS Status ; PXTCB_CRED_HANDLE Handle ; SecPkgCredentials_NamesW Names;
DebugLog(( DEB_TRACE_CALLS, "QueryCredentialsAttribute( %p, %d, ... )\n", CredHandle, dwAttribute ));
Handle = (PXTCB_CRED_HANDLE) CredHandle ;
#if DBG
if ( Handle->Check != XTCB_CRED_HANDLE_CHECK ) { return SEC_E_INVALID_HANDLE ; } #endif
//
// We only know about one credential attribute right now:
//
if ( dwAttribute != SECPKG_CRED_ATTR_NAMES ) { return SEC_E_UNSUPPORTED_FUNCTION ; }
Status = SEC_E_UNSUPPORTED_FUNCTION ; return Status ;
}
//+---------------------------------------------------------------------------
//
// Function: XtcbFreeCredentialsHandle
//
// Synopsis: Dereferences a credential handle from AcquireCredHandle
//
// Arguments: [dwHandle] --
//
// History: 2-20-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY XtcbFreeCredentialsHandle( LSA_SEC_HANDLE CredHandle ) { PXTCB_CRED_HANDLE Handle ;
DebugLog(( DEB_TRACE_CALLS, "FreeCredentialsHandle( %p )\n", CredHandle ));
Handle = (PXTCB_CRED_HANDLE) CredHandle ;
if ( Handle->Check == XTCB_CRED_HANDLE_CHECK ) { XtcbDerefCredHandle( Handle );
return SEC_E_OK ; }
return( SEC_E_INVALID_HANDLE ); }
//+---------------------------------------------------------------------------
//
// Function: XtcbLogonTerminated
//
// Synopsis: Called when the logon session has terminated (all tokens closed)
//
// Arguments: [pLogonId] -- Logon session that has terminated
//
// History: 2-20-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
VOID SEC_ENTRY XtcbLogonTerminated(PLUID pLogonId) { PXTCB_CREDS Creds ;
DebugLog(( DEB_TRACE_CALLS, "LogonTerminated( %x:%x )\n", pLogonId->HighPart, pLogonId->LowPart ));
Creds = XtcbFindCreds( pLogonId, FALSE );
if ( Creds ) { Creds->Flags |= XTCB_CRED_TERMINATED ;
XtcbDerefCreds( Creds ); }
return; }
//+---------------------------------------------------------------------------
//
// Function: XtcbGetUserInfo
//
// Synopsis: Return information about a user to the LSA
//
// Arguments: [pLogonId] --
// [fFlags] --
// [ppUserInfo] --
//
// History: 2-20-97 RichardW Created
//
// Notes:
//
//----------------------------------------------------------------------------
SECURITY_STATUS SEC_ENTRY XtcbGetUserInfo( PLUID pLogonId, ULONG fFlags, PSecurityUserData * ppUserInfo) { PSecurityUserData pInfo ; PXTCB_CREDS Creds ; SECURITY_STATUS Status ;
DebugLog(( DEB_TRACE_CALLS, "GetUserInfo( %x:%x, %x, ...)\n", pLogonId->HighPart, pLogonId->LowPart, fFlags ));
return SEC_E_UNSUPPORTED_FUNCTION ;
}
|