Blame winpr/libwinpr/sspicli/sspicli.c

Packit 1fb8d4
/**
Packit 1fb8d4
 * WinPR: Windows Portable Runtime
Packit 1fb8d4
 * Security Support Provider Interface
Packit 1fb8d4
 *
Packit 1fb8d4
 * Copyright 2012 Marc-Andre Moreau <marcandre.moreau@gmail.com>
Packit 1fb8d4
 *
Packit 1fb8d4
 * Licensed under the Apache License, Version 2.0 (the "License");
Packit 1fb8d4
 * you may not use this file except in compliance with the License.
Packit 1fb8d4
 * You may obtain a copy of the License at
Packit 1fb8d4
 *
Packit 1fb8d4
 *     http://www.apache.org/licenses/LICENSE-2.0
Packit 1fb8d4
 *
Packit 1fb8d4
 * Unless required by applicable law or agreed to in writing, software
Packit 1fb8d4
 * distributed under the License is distributed on an "AS IS" BASIS,
Packit 1fb8d4
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
Packit 1fb8d4
 * See the License for the specific language governing permissions and
Packit 1fb8d4
 * limitations under the License.
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_CONFIG_H
Packit 1fb8d4
#include "config.h"
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/sspicli.h>
Packit 1fb8d4
Packit 1fb8d4
/**
Packit 1fb8d4
 * sspicli.dll:
Packit 1fb8d4
 *
Packit 1fb8d4
 * EnumerateSecurityPackagesA
Packit 1fb8d4
 * EnumerateSecurityPackagesW
Packit 1fb8d4
 * GetUserNameExW
Packit 1fb8d4
 * ImportSecurityContextA
Packit 1fb8d4
 * LogonUser
Packit 1fb8d4
 * LogonUserEx
Packit 1fb8d4
 * LogonUserExExW
Packit 1fb8d4
 * SspiCompareAuthIdentities
Packit 1fb8d4
 * SspiCopyAuthIdentity
Packit 1fb8d4
 * SspiDecryptAuthIdentity
Packit 1fb8d4
 * SspiEncodeAuthIdentityAsStrings
Packit 1fb8d4
 * SspiEncodeStringsAsAuthIdentity
Packit 1fb8d4
 * SspiEncryptAuthIdentity
Packit 1fb8d4
 * SspiExcludePackage
Packit 1fb8d4
 * SspiFreeAuthIdentity
Packit 1fb8d4
 * SspiGetTargetHostName
Packit 1fb8d4
 * SspiIsAuthIdentityEncrypted
Packit 1fb8d4
 * SspiLocalFree
Packit 1fb8d4
 * SspiMarshalAuthIdentity
Packit 1fb8d4
 * SspiPrepareForCredRead
Packit 1fb8d4
 * SspiPrepareForCredWrite
Packit 1fb8d4
 * SspiUnmarshalAuthIdentity
Packit 1fb8d4
 * SspiValidateAuthIdentity
Packit 1fb8d4
 * SspiZeroAuthIdentity
Packit 1fb8d4
 */
Packit 1fb8d4
Packit 1fb8d4
#ifndef _WIN32
Packit 1fb8d4
Packit 1fb8d4
#include <winpr/crt.h>
Packit 1fb8d4
Packit 1fb8d4
#ifdef HAVE_UNISTD_H
Packit 1fb8d4
#include <unistd.h>
Packit 1fb8d4
#endif
Packit 1fb8d4
Packit 1fb8d4
#include <pthread.h>
Packit 1fb8d4
Packit 1fb8d4
#include <pwd.h>
Packit 1fb8d4
#include <grp.h>
Packit 1fb8d4
Packit 1fb8d4
#include "../handle/handle.h"
Packit 1fb8d4
Packit 1fb8d4
#include "../security/security.h"
Packit 1fb8d4
Packit 1fb8d4
static BOOL LogonUserCloseHandle(HANDLE handle);
Packit 1fb8d4
Packit 1fb8d4
static BOOL LogonUserIsHandled(HANDLE handle)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_ACCESS_TOKEN* pLogonUser = (WINPR_ACCESS_TOKEN*) handle;
Packit 1fb8d4
Packit 1fb8d4
	if (!pLogonUser || (pLogonUser->Type != HANDLE_TYPE_ACCESS_TOKEN))
Packit 1fb8d4
	{
Packit 1fb8d4
		SetLastError(ERROR_INVALID_HANDLE);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static int LogonUserGetFd(HANDLE handle)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_ACCESS_TOKEN* pLogonUser = (WINPR_ACCESS_TOKEN*)handle;
Packit 1fb8d4
Packit 1fb8d4
	if (!LogonUserIsHandled(handle))
Packit 1fb8d4
		return -1;
Packit 1fb8d4
Packit 1fb8d4
	/* TODO: File fd not supported */
Packit 1fb8d4
	(void)pLogonUser;
Packit 1fb8d4
	return -1;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL LogonUserCloseHandle(HANDLE handle)
Packit 1fb8d4
{
Packit 1fb8d4
	WINPR_ACCESS_TOKEN* token = (WINPR_ACCESS_TOKEN*) handle;
Packit 1fb8d4
Packit 1fb8d4
	if (!handle || !LogonUserIsHandled(handle))
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	free(token->Username);
Packit 1fb8d4
	free(token->Domain);
Packit 1fb8d4
	free(token);
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
static HANDLE_OPS ops =
Packit 1fb8d4
{
Packit 1fb8d4
	LogonUserIsHandled,
Packit 1fb8d4
	LogonUserCloseHandle,
Packit 1fb8d4
	LogonUserGetFd,
Packit 1fb8d4
	NULL, /* CleanupHandle */
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL,
Packit 1fb8d4
	NULL
Packit 1fb8d4
};
Packit 1fb8d4
Packit 1fb8d4
BOOL LogonUserA(LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword,
Packit 1fb8d4
                DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken)
Packit 1fb8d4
{
Packit 1fb8d4
	struct passwd* pw;
Packit 1fb8d4
	WINPR_ACCESS_TOKEN* token;
Packit 1fb8d4
Packit 1fb8d4
	if (!lpszUsername)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	token = (WINPR_ACCESS_TOKEN*) calloc(1, sizeof(WINPR_ACCESS_TOKEN));
Packit 1fb8d4
Packit 1fb8d4
	if (!token)
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
Packit 1fb8d4
	WINPR_HANDLE_SET_TYPE_AND_MODE(token, HANDLE_TYPE_ACCESS_TOKEN, WINPR_FD_READ);
Packit 1fb8d4
	token->ops = &ops;
Packit 1fb8d4
	token->Username = _strdup(lpszUsername);
Packit 1fb8d4
Packit 1fb8d4
	if (!token->Username)
Packit 1fb8d4
	{
Packit 1fb8d4
		free(token);
Packit 1fb8d4
		return FALSE;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	if (lpszDomain)
Packit 1fb8d4
	{
Packit 1fb8d4
		token->Domain = _strdup(lpszDomain);
Packit 1fb8d4
Packit 1fb8d4
		if (!token->Domain)
Packit 1fb8d4
		{
Packit 1fb8d4
			free(token->Username);
Packit 1fb8d4
			free(token);
Packit 1fb8d4
			return FALSE;
Packit 1fb8d4
		}
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	pw = getpwnam(lpszUsername);
Packit 1fb8d4
Packit 1fb8d4
	if (pw)
Packit 1fb8d4
	{
Packit 1fb8d4
		token->UserId = (DWORD) pw->pw_uid;
Packit 1fb8d4
		token->GroupId = (DWORD) pw->pw_gid;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	*((ULONG_PTR*) phToken) = (ULONG_PTR) token;
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL LogonUserW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword,
Packit 1fb8d4
                DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken)
Packit 1fb8d4
{
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL LogonUserExA(LPCSTR lpszUsername, LPCSTR lpszDomain, LPCSTR lpszPassword,
Packit 1fb8d4
                  DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken, PSID* ppLogonSid,
Packit 1fb8d4
                  PVOID* ppProfileBuffer, LPDWORD pdwProfileLength, PQUOTA_LIMITS pQuotaLimits)
Packit 1fb8d4
{
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL LogonUserExW(LPCWSTR lpszUsername, LPCWSTR lpszDomain, LPCWSTR lpszPassword,
Packit 1fb8d4
                  DWORD dwLogonType, DWORD dwLogonProvider, PHANDLE phToken, PSID* ppLogonSid,
Packit 1fb8d4
                  PVOID* ppProfileBuffer, LPDWORD pdwProfileLength, PQUOTA_LIMITS pQuotaLimits)
Packit 1fb8d4
{
Packit 1fb8d4
	return TRUE;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL GetUserNameExA(EXTENDED_NAME_FORMAT NameFormat, LPSTR lpNameBuffer, PULONG nSize)
Packit 1fb8d4
{
Packit 1fb8d4
	int length;
Packit 1fb8d4
	char* login;
Packit 1fb8d4
Packit 1fb8d4
	switch (NameFormat)
Packit 1fb8d4
	{
Packit 1fb8d4
		case NameSamCompatible:
Packit 1fb8d4
			login = getlogin();
Packit 1fb8d4
			length = strlen(login);
Packit 1fb8d4
Packit 1fb8d4
			if (*nSize >= length)
Packit 1fb8d4
			{
Packit 1fb8d4
				CopyMemory(lpNameBuffer, login, length + 1);
Packit 1fb8d4
				return 1;
Packit 1fb8d4
			}
Packit 1fb8d4
			else
Packit 1fb8d4
			{
Packit 1fb8d4
				*nSize = length + 1;
Packit 1fb8d4
			}
Packit 1fb8d4
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		case NameFullyQualifiedDN:
Packit 1fb8d4
		case NameDisplay:
Packit 1fb8d4
		case NameUniqueId:
Packit 1fb8d4
		case NameCanonical:
Packit 1fb8d4
		case NameUserPrincipal:
Packit 1fb8d4
		case NameCanonicalEx:
Packit 1fb8d4
		case NameServicePrincipal:
Packit 1fb8d4
		case NameDnsDomain:
Packit 1fb8d4
			break;
Packit 1fb8d4
Packit 1fb8d4
		default:
Packit 1fb8d4
			break;
Packit 1fb8d4
	}
Packit 1fb8d4
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
BOOL GetUserNameExW(EXTENDED_NAME_FORMAT NameFormat, LPWSTR lpNameBuffer, PULONG nSize)
Packit 1fb8d4
{
Packit 1fb8d4
	return 0;
Packit 1fb8d4
}
Packit 1fb8d4
Packit 1fb8d4
#endif
Packit 1fb8d4