Temporarily deleting folder.
This commit is contained in:
parent
bb9f421dff
commit
0b6c143ba3
@ -1,67 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* README for libcasa_c_authtoken
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
libcasa_c_authtoken is the client auth_token engine. It is responsible for
|
|
||||||
interacting with ATSs, invoking the authentication mechanism plug-ins, and
|
|
||||||
managing the authentication token cache. libcasa_c_authtoken also provides
|
|
||||||
the Get Authentication Token API.
|
|
||||||
|
|
||||||
CONFIGURING ADDITIONAL AUTHENTICATION MECHANISM MODULES
|
|
||||||
|
|
||||||
libcasa_c_authtoken utilizes mechanism plug-ins for authenticating to ATSs.
|
|
||||||
The client auth_token package installs mechanisms for the support of Kerberos5
|
|
||||||
and Username/Password authentication. To configure additional authentication mechanism
|
|
||||||
plug-ins, place their configuration file in the folder for CASA Authentication Token module
|
|
||||||
configuration. The path to this folder under linux is /etc/opt/novell/CASA/authtoken.d/modules.d.
|
|
||||||
The path to this folder under Windows is \Program Files\novell\CASA\auth\mechanisms. The name of
|
|
||||||
the plug-in configuration file is related to the authentication mechanism type in the following
|
|
||||||
manner: AuthenticationMechanismTypeName.conf.
|
|
||||||
|
|
||||||
Authentication Mechanism plug-in configuration files must must contain a directive indicating the
|
|
||||||
path to the library implementing the Authentication Mechanism (See the configuration file
|
|
||||||
for the Kr5Authenticate plug-in for an example).
|
|
||||||
|
|
||||||
CLIENT APPLICATION PROGRAMMING NOTES
|
|
||||||
|
|
||||||
The Get CASA Authentication Token API is defined in casa_c_authtoken.h.
|
|
||||||
|
|
||||||
The API consists of a call to obtain authentication tokens. The caller must supply the name of the
|
|
||||||
service to which it wants to authenticate along with the name of the host where it resides. The
|
|
||||||
returned authentication token is a Base64 encoded string.
|
|
||||||
|
|
||||||
Applications utilizing CASA Authentication Tokens as passwords in protocols that require the
|
|
||||||
transfer of user name and password credentials should verify or remove any password length limits
|
|
||||||
as the length of CASA Authentication Tokens may be over 1K bytes. The size of the CASA Authentication
|
|
||||||
Tokens is directly dependent on the amount of identity information configured as required by the
|
|
||||||
consuming service. These applications should also set the user name to "CasaPrincipal".
|
|
||||||
|
|
||||||
For examples of code which uses the Get CASA Authentication Token API look at the test application
|
|
||||||
under the test folder.
|
|
||||||
|
|
||||||
AUTHENTICATION MECHANISM PROGRAMMING NOTES
|
|
||||||
|
|
||||||
The Authentication Mechanism API is defined in mech_if.h.
|
|
||||||
|
|
||||||
For example implementations see the code for the krb5 and the pwd mechanisms.
|
|
||||||
|
|
||||||
SECURITY CONSIDERATIONS
|
|
||||||
|
|
||||||
CASA Authentication Tokens when compromised can be used to either impersonate
|
|
||||||
a user or to obtain identity information about the user. Because of this it is
|
|
||||||
important that the tokens be secured by applications making use of them. It is
|
|
||||||
recommended that the tokens be transmitted using SSL.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,18 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* TODO for libcasa_c_authtoken
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
This file contains a list of the items still outstanding for libcasa_c_authtoken.
|
|
||||||
|
|
||||||
OUTSTANDING ITEMS
|
|
||||||
|
|
||||||
- Implementation of Linux specific code.
|
|
||||||
- Re-structure the token cache to differentiate between Session Tokens and Authentication Tokens.
|
|
||||||
- Use the CASA cache as the token store.
|
|
||||||
- Switch Client/Server protocol to use SOAP Messages.
|
|
||||||
- Enable communications over HTTPS instead of over HTTP.
|
|
||||||
|
|
@ -1,339 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// AuthMechMod definition
|
|
||||||
//
|
|
||||||
typedef struct _AuthMechMod
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
char *pAuthTypeName;
|
|
||||||
int authTypeNameLen;
|
|
||||||
LIB_HANDLE libHandle;
|
|
||||||
AuthTokenIf *pAuthTokenIf;
|
|
||||||
|
|
||||||
} AuthMechMod, *PAuthMechMod;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// AuthMechModule List and syncronizing mutex
|
|
||||||
static
|
|
||||||
LIST_ENTRY g_authMechModuleListHead = {&g_authMechModuleListHead,
|
|
||||||
&g_authMechModuleListHead};
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
GetAuthTokenIf(
|
|
||||||
IN const char *pAuthTypeName,
|
|
||||||
INOUT AuthTokenIf **ppAuthTokenIf)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// Environment:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
ConfigIf *pModuleConfigIf;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthTokenIf- Start\n", 0);
|
|
||||||
|
|
||||||
// Get the configuration for the module
|
|
||||||
retStatus = GetConfigInterface(mechConfigFolder,
|
|
||||||
pAuthTypeName,
|
|
||||||
&pModuleConfigIf);
|
|
||||||
if (CASA_SUCCESS(retStatus)
|
|
||||||
&& CasaStatusCode(retStatus) != CASA_STATUS_OBJECT_NOT_FOUND)
|
|
||||||
{
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
AuthMechMod *pAuthMechMod = NULL;
|
|
||||||
int authTypeNameLen = strlen(pAuthTypeName);
|
|
||||||
|
|
||||||
// Look if we already have the module in our list
|
|
||||||
pListEntry = g_authMechModuleListHead.Flink;
|
|
||||||
while (pListEntry != &g_authMechModuleListHead)
|
|
||||||
{
|
|
||||||
// Get pointer to the current entry
|
|
||||||
pAuthMechMod = CONTAINING_RECORD(pListEntry, AuthMechMod, listEntry);
|
|
||||||
|
|
||||||
// Check if this is the module that we need
|
|
||||||
if (pAuthMechMod->authTypeNameLen == authTypeNameLen
|
|
||||||
&& memcmp(pAuthTypeName, pAuthMechMod->pAuthTypeName, authTypeNameLen) == 0)
|
|
||||||
{
|
|
||||||
// This is the module that we need, stop looking.
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// This is not the module that we are looking for
|
|
||||||
pAuthMechMod = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on whether or not a module was found
|
|
||||||
if (pAuthMechMod)
|
|
||||||
{
|
|
||||||
// Module found in our list, provide the caller with its AuthTokenIf
|
|
||||||
// instance after we have incremented its reference count.
|
|
||||||
pAuthMechMod->pAuthTokenIf->addReference(pAuthMechMod->pAuthTokenIf);
|
|
||||||
*ppAuthTokenIf = pAuthMechMod->pAuthTokenIf;
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Needed module not found in our list, create an entry.
|
|
||||||
pAuthMechMod = (AuthMechMod*) malloc(sizeof(*pAuthMechMod));
|
|
||||||
if (pAuthMechMod)
|
|
||||||
{
|
|
||||||
// Allocate buffer to contain the authentication type name within the module entry
|
|
||||||
pAuthMechMod->pAuthTypeName = (char*) malloc(authTypeNameLen + 1);
|
|
||||||
if (pAuthMechMod->pAuthTypeName)
|
|
||||||
{
|
|
||||||
char *pLibraryName;
|
|
||||||
|
|
||||||
// Initialize the library handle field
|
|
||||||
pAuthMechMod->libHandle = NULL;
|
|
||||||
|
|
||||||
// Save the auth type name within the entry
|
|
||||||
strcpy(pAuthMechMod->pAuthTypeName, pAuthTypeName);
|
|
||||||
pAuthMechMod->authTypeNameLen = authTypeNameLen;
|
|
||||||
|
|
||||||
// Obtain the name of the library that we must load
|
|
||||||
pLibraryName = pModuleConfigIf->getEntryValue(pModuleConfigIf, "LibraryName");
|
|
||||||
if (pLibraryName)
|
|
||||||
{
|
|
||||||
// Load the library
|
|
||||||
pAuthMechMod->libHandle = OpenLibrary(pLibraryName);
|
|
||||||
if (pAuthMechMod->libHandle)
|
|
||||||
{
|
|
||||||
PFN_GetAuthTokenIfRtn pGetAuthTokenIfRtn;
|
|
||||||
|
|
||||||
// Library has been loaded, now get a pointer to its GetAuthTokenInterface routine
|
|
||||||
pGetAuthTokenIfRtn = (PFN_GetAuthTokenIfRtn) GetFunctionPtr(pAuthMechMod->libHandle,
|
|
||||||
GET_AUTH_TOKEN_INTERFACE_RTN_SYMBOL);
|
|
||||||
if (pGetAuthTokenIfRtn)
|
|
||||||
{
|
|
||||||
// Now, obtain the modules AuthTokenIf.
|
|
||||||
retStatus = (pGetAuthTokenIfRtn)(pModuleConfigIf, &pAuthMechMod->pAuthTokenIf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenIf- GetFunctionPtr\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_LIBRARY_LOAD_FAILURE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenIf- OpenLibrary error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the buffer holding the library name
|
|
||||||
free(pLibraryName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenIf- Library name not configured\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_CONFIGURATION_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if we were successful at obtaining the AuthTokenIf instance for the
|
|
||||||
// module.
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Insert the entry in the list, provide the caller with its AuthTokenIf
|
|
||||||
// instance after we have incremented its reference count.
|
|
||||||
InsertTailList(&g_authMechModuleListHead, &pAuthMechMod->listEntry);
|
|
||||||
pAuthMechMod->pAuthTokenIf->addReference(pAuthMechMod->pAuthTokenIf);
|
|
||||||
*ppAuthTokenIf = pAuthMechMod->pAuthTokenIf;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Failed, free resources.
|
|
||||||
free(pAuthMechMod->pAuthTypeName);
|
|
||||||
if (pAuthMechMod->libHandle)
|
|
||||||
CloseLibrary(pAuthMechMod->libHandle);
|
|
||||||
free(pAuthMechMod);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "GetAuthTokenIf-GetAuthTokenIf- Unable to allocate buffer\n", 0);
|
|
||||||
|
|
||||||
// Free buffer allocated for entry
|
|
||||||
free(pAuthMechMod);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenIf- Unable to allocate buffer\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release config interface instance
|
|
||||||
pModuleConfigIf->releaseReference(pModuleConfigIf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenIf- Unable to obtain config interface\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_CONFIGURATION_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthTokenIf- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
GetAuthMechToken(
|
|
||||||
IN AuthContext *pAuthContext,
|
|
||||||
INOUT char **ppAuthToken)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
AuthTokenIf *pAuthTokenIf;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthMechToken- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize output parameter
|
|
||||||
*ppAuthToken = NULL;
|
|
||||||
|
|
||||||
// Obtain the appropriate token interface for the authentication type
|
|
||||||
retStatus = GetAuthTokenIf(pAuthContext->pMechanism,
|
|
||||||
&pAuthTokenIf);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
char *pAuthToken = NULL;
|
|
||||||
int authTokenBufLen = 0;
|
|
||||||
|
|
||||||
// We found a provider for the service, query it for the buffer size
|
|
||||||
// needed to obtain the authentication token.
|
|
||||||
retStatus = pAuthTokenIf->getAuthToken(pAuthTokenIf,
|
|
||||||
pAuthContext->pContext,
|
|
||||||
pAuthContext->pMechInfo,
|
|
||||||
pAuthToken,
|
|
||||||
&authTokenBufLen);
|
|
||||||
if (CasaStatusCode(retStatus) == CASA_STATUS_BUFFER_OVERFLOW)
|
|
||||||
{
|
|
||||||
// Allocate buffer to hold the authentication token
|
|
||||||
pAuthToken = (char*) malloc(authTokenBufLen);
|
|
||||||
if (pAuthToken)
|
|
||||||
{
|
|
||||||
// Request the token from the provider
|
|
||||||
retStatus = pAuthTokenIf->getAuthToken(pAuthTokenIf,
|
|
||||||
pAuthContext->pContext,
|
|
||||||
pAuthContext->pMechInfo,
|
|
||||||
pAuthToken,
|
|
||||||
&authTokenBufLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Return the buffer containing the token to the caller
|
|
||||||
*ppAuthToken = pAuthToken;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Free the allocated buffer
|
|
||||||
free(pAuthToken);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthMechToken- Buffer allocation failure\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release token interface
|
|
||||||
pAuthTokenIf->releaseReference(pAuthTokenIf);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// No authentication token interface available for authentication type
|
|
||||||
DbgTrace(0, "-GetAuthMechToken- Failed to obtain auth mech token interface\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthMechToken- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,803 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parse states
|
|
||||||
//
|
|
||||||
#define AWAITING_ROOT_ELEMENT_START 0x0
|
|
||||||
#define AWAITING_ROOT_ELEMENT_END 0x1
|
|
||||||
#define AWAITING_STATUS_ELEMENT_START 0x2
|
|
||||||
#define AWAITING_STATUS_ELEMENT_END 0x3
|
|
||||||
#define AWAITING_STATUS_DATA 0x4
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_START 0x5
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_END 0x6
|
|
||||||
#define AWAITING_DESCRIPTION_DATA 0x7
|
|
||||||
#define AWAITING_SESSION_TOKEN_ELEMENT_START 0x8
|
|
||||||
#define AWAITING_SESSION_TOKEN_ELEMENT_END 0x9
|
|
||||||
#define AWAITING_SESSION_TOKEN_DATA 0xA
|
|
||||||
#define AWAITING_LIFETIME_DATA 0xB
|
|
||||||
#define AWAITING_LIFETIME_ELEMENT_START 0xC
|
|
||||||
#define AWAITING_LIFETIME_ELEMENT_END 0xD
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_START 0xE
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_END 0xF
|
|
||||||
#define AWAITING_AUTH_TOKEN_DATA 0x10
|
|
||||||
#define AWAITING_REALM_DATA 0x12
|
|
||||||
#define AWAITING_REALM_ELEMENT_END 0x13
|
|
||||||
#define DONE_PARSING 0x14
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Response Parse Structure
|
|
||||||
//
|
|
||||||
typedef struct _AuthRespParse
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
int state;
|
|
||||||
int elementDataProcessed;
|
|
||||||
AuthenticateResp *pAuthenticateResp;
|
|
||||||
CasaStatus status;
|
|
||||||
|
|
||||||
} AuthRespParse, *PAuthRespParse;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
char*
|
|
||||||
BuildAuthenticateMsg(
|
|
||||||
IN AuthContext *pAuthContext,
|
|
||||||
IN char *pAuthMechToken)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pMsg = NULL;
|
|
||||||
int bufferSize;
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildAuthenticateMsg- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The format of the authentication request message is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <auth_req>
|
|
||||||
* <realm>realm value</realm>
|
|
||||||
* <mechanism>mechanism id value</mechanism>
|
|
||||||
* <auth_mech_token>authentication mechanism token data</auth_mech_token>
|
|
||||||
* </auth_req>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Determine the buffer size necessary to hold the msg
|
|
||||||
bufferSize = strlen(XML_DECLARATION)
|
|
||||||
+ 2 // crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(AUTH_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(REALM_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pAuthContext->pContext)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(REALM_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(MECHANISM_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pAuthContext->pMechanism)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(MECHANISM_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(AUTH_MECH_TOKEN_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pAuthMechToken)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(AUTH_MECH_TOKEN_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(AUTH_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 2; // >null
|
|
||||||
|
|
||||||
// Allocate the msg buffer
|
|
||||||
pMsg = (char*) malloc(bufferSize);
|
|
||||||
if (pMsg)
|
|
||||||
{
|
|
||||||
// Now build the message
|
|
||||||
memset(pMsg, 0, bufferSize);
|
|
||||||
strcat(pMsg, XML_DECLARATION);
|
|
||||||
strcat(pMsg, "\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, AUTH_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, REALM_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pAuthContext->pContext);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, REALM_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, MECHANISM_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pAuthContext->pMechanism);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, MECHANISM_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, AUTH_MECH_TOKEN_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pAuthMechToken);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, AUTH_MECH_TOKEN_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, AUTH_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-BuildAuthenticateMsg- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildAuthenticateMsg- End, pMsg = %08X\n", pMsg);
|
|
||||||
|
|
||||||
return pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthRespStartElementHandler(
|
|
||||||
IN AuthRespParse *pAuthRespParse,
|
|
||||||
IN const XML_Char *name,
|
|
||||||
IN const XML_Char **atts)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-AuthRespStartElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication
|
|
||||||
// Response Element.
|
|
||||||
if (strcmp(name, AUTH_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_STATUS_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_DESCRIPTION_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_DESCRIPTION_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_SESSION_TOKEN_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Session Token Element.
|
|
||||||
if (strcmp(name, SESSION_TOKEN_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_LIFETIME_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Lifetime Element.
|
|
||||||
if (strcmp(name, LIFETIME_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_LIFETIME_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthRespStartElementHandler- Un-expected state = %d\n", pAuthRespParse->state);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthRespStartElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ConsumeElementData(
|
|
||||||
IN AuthRespParse *pAuthRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len,
|
|
||||||
INOUT char **ppElementData,
|
|
||||||
INOUT int *pElementDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on whether or not we have already consumed data
|
|
||||||
// for this element.
|
|
||||||
if (*ppElementData == NULL)
|
|
||||||
{
|
|
||||||
// We have not yet consumed data for this element
|
|
||||||
pAuthRespParse->elementDataProcessed = len;
|
|
||||||
|
|
||||||
// Allocate a buffer to hold this element data (null terminated).
|
|
||||||
*ppElementData = (char*) malloc(len + 1);
|
|
||||||
if (*ppElementData)
|
|
||||||
{
|
|
||||||
memset(*ppElementData, 0, len + 1);
|
|
||||||
memcpy(*ppElementData, s, len);
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pAuthRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pNewBuf;
|
|
||||||
|
|
||||||
// We have already received token data, append this data to it.
|
|
||||||
pNewBuf = (char*) malloc(pAuthRespParse->elementDataProcessed + len + 1);
|
|
||||||
if (pNewBuf)
|
|
||||||
{
|
|
||||||
memset(pNewBuf,
|
|
||||||
0,
|
|
||||||
pAuthRespParse->elementDataProcessed + len + 1);
|
|
||||||
memcpy(pNewBuf,
|
|
||||||
*ppElementData,
|
|
||||||
pAuthRespParse->elementDataProcessed);
|
|
||||||
memcpy(pNewBuf + pAuthRespParse->elementDataProcessed, s, len);
|
|
||||||
pAuthRespParse->elementDataProcessed += len;
|
|
||||||
|
|
||||||
// Swap the buffers
|
|
||||||
free(*ppElementData);
|
|
||||||
*ppElementData = pNewBuf;
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pAuthRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthRespCharDataHandler(
|
|
||||||
IN AuthRespParse *pAuthRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-AuthRespCharDataHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Just exit if being called to process white space
|
|
||||||
if (*s == '\n' || *s == '\r' || *s == '\t' || *s == ' ')
|
|
||||||
{
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_DESCRIPTION_DATA:
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// Ignore the status description data for now.
|
|
||||||
// tbd
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthRespParse->state = AWAITING_DESCRIPTION_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_DATA:
|
|
||||||
|
|
||||||
// Set the appropriate status in the AuthenticationResp based on the
|
|
||||||
// returned status.
|
|
||||||
if (strncmp(HTTP_OK_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pAuthRespParse->status = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_UNAUTHORIZED_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pAuthRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_AUTHENTICATION_FAILURE);
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_NOT_FOUND_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pAuthRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_CONFIGURATION_ERROR);
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_SERVER_ERROR_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pAuthRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_SERVER_ERROR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespCharDataHandler- Un-expected status\n", 0);
|
|
||||||
pAuthRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthRespParse->state = AWAITING_STATUS_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_DATA:
|
|
||||||
|
|
||||||
// Convert the lifetime string to a numeric value
|
|
||||||
pAuthRespParse->pAuthenticateResp->tokenLifetime = dtoul(s, len);
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthRespParse->state = AWAITING_LIFETIME_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_SESSION_TOKEN_DATA:
|
|
||||||
case AWAITING_SESSION_TOKEN_ELEMENT_END:
|
|
||||||
|
|
||||||
// Consume the data
|
|
||||||
pAuthRespParse->status = ConsumeElementData(pAuthRespParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pAuthRespParse->pAuthenticateResp->pToken,
|
|
||||||
&pAuthRespParse->pAuthenticateResp->tokenLen);
|
|
||||||
if (CASA_SUCCESS(pAuthRespParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthRespParse->state = AWAITING_SESSION_TOKEN_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthRespCharDataHandler- Un-expected state = %d\n", pAuthRespParse->state);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthRespCharDataHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthRespEndElementHandler(
|
|
||||||
IN AuthRespParse *pAuthRespParse,
|
|
||||||
IN const XML_Char *name)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-AuthRespEndElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication
|
|
||||||
// Response Element.
|
|
||||||
if (strcmp(name, AUTH_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Done.
|
|
||||||
pAuthRespParse->state = DONE_PARSING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespEndHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_STATUS_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state based on the status code.
|
|
||||||
if (CASA_SUCCESS(pAuthRespParse->status))
|
|
||||||
{
|
|
||||||
// The request completed successfully
|
|
||||||
pAuthRespParse->state = AWAITING_SESSION_TOKEN_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pAuthRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Lifetime Element.
|
|
||||||
if (strcmp(name, LIFETIME_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_SESSION_TOKEN_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_SESSION_TOKEN_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Session Token Element.
|
|
||||||
if (strcmp(name, SESSION_TOKEN_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthRespEndElementHandler- Un-expected state = %d\n", pAuthRespParse->state);
|
|
||||||
XML_StopParser(pAuthRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthRespEndElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
CreateAuthenticateResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT AuthenticateResp **ppAuthenticateResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
AuthRespParse authRespParse = {0};
|
|
||||||
AuthenticateResp *pAuthenticateResp;
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateAuthenticateResp- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When an authentication request is processed successfully, the server replies to
|
|
||||||
* the client with a message with the following format:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <auth_resp>
|
|
||||||
* <status><description>ok</description>200</status>
|
|
||||||
* <session_token><lifetime>lifetime value</lifetime>session token data</session_token>
|
|
||||||
* </auth_resp>
|
|
||||||
*
|
|
||||||
* When an authentication request fails to be successfully processed, the server
|
|
||||||
* responds with an error and an error description string. The message format of
|
|
||||||
* an unsuccessful reply is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <auth_resp>
|
|
||||||
* <status><description>status description</description>status code</status>
|
|
||||||
* </auth_resp>
|
|
||||||
*
|
|
||||||
* Plase note that the protocol utilizes the status codes defined
|
|
||||||
* in the HTTP 1.1 Specification.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Allocate AuthenticateResp object
|
|
||||||
pAuthenticateResp = malloc(sizeof(*pAuthenticateResp));
|
|
||||||
if (pAuthenticateResp)
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
|
|
||||||
// Initialize the AuthenticateResp object and set it in the
|
|
||||||
// authentication response parse oject.
|
|
||||||
memset(pAuthenticateResp, 0, sizeof(*pAuthenticateResp));
|
|
||||||
authRespParse.pAuthenticateResp = pAuthenticateResp;
|
|
||||||
|
|
||||||
// Create parser
|
|
||||||
p = XML_ParserCreate(NULL);
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
// Keep track of the parser in our parse object
|
|
||||||
authRespParse.p = p;
|
|
||||||
|
|
||||||
// Initialize the status within the parse object
|
|
||||||
authRespParse.status = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
// Set the start and end element handlers
|
|
||||||
XML_SetElementHandler(p,
|
|
||||||
AuthRespStartElementHandler,
|
|
||||||
AuthRespEndElementHandler);
|
|
||||||
|
|
||||||
// Set the character data handler
|
|
||||||
XML_SetCharacterDataHandler(p, AuthRespCharDataHandler);
|
|
||||||
|
|
||||||
|
|
||||||
// Set our user data
|
|
||||||
XML_SetUserData(p, &authRespParse);
|
|
||||||
|
|
||||||
// Parse the document
|
|
||||||
if (XML_Parse(p, pRespMsg, respLen, 1) == XML_STATUS_OK)
|
|
||||||
{
|
|
||||||
// Verify that the parse operation completed successfully
|
|
||||||
if (authRespParse.state == DONE_PARSING)
|
|
||||||
{
|
|
||||||
// The parse operation succeded, obtain the status returned
|
|
||||||
// by the server.
|
|
||||||
retStatus = authRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthenticateResp- Parse operation did not complete\n", 0);
|
|
||||||
|
|
||||||
// Check if a status has been recorded
|
|
||||||
if (authRespParse.status != CASA_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
retStatus = authRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthenticateResp- Parse error %d\n", XML_GetErrorCode(p));
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the parser
|
|
||||||
XML_ParserFree(p);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthenticateResp- Parser creation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the AuthenticationResp object to the caller if necessary
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
*ppAuthenticateResp = pAuthenticateResp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(pAuthenticateResp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthenticateResp- Memory allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateAuthenticateResp- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
RelAuthenticateResp(
|
|
||||||
IN AuthenticateResp *pAuthenticateResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-RelAuthenticateResp- Start\n", 0);
|
|
||||||
|
|
||||||
// Free the resources associated with the object
|
|
||||||
if (pAuthenticateResp->pToken)
|
|
||||||
free(pAuthenticateResp->pToken);
|
|
||||||
|
|
||||||
free(pAuthenticateResp);
|
|
||||||
|
|
||||||
DbgTrace(1, "-RelAuthenticateResp- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,801 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parse states
|
|
||||||
//
|
|
||||||
#define AWAITING_ROOT_ELEMENT_START 0x0
|
|
||||||
#define AWAITING_ROOT_ELEMENT_END 0x1
|
|
||||||
#define AWAITING_AUTH_POLICY_ELEMENT_START 0x2
|
|
||||||
#define AWAITING_AUTH_POLICY_ELEMENT_END 0x3
|
|
||||||
#define AWAITING_AUTH_POLICY_DATA 0x4
|
|
||||||
#define AWAITING_AUTH_SOURCE_ELEMENT_START 0x5
|
|
||||||
#define AWAITING_AUTH_SOURCE_ELEMENT_END 0x6
|
|
||||||
#define AWAITING_AUTH_SOURCE_CHILD_START 0x7
|
|
||||||
#define AWAITING_REALM_DATA 0x8
|
|
||||||
#define AWAITING_REALM_ELEMENT_END 0x9
|
|
||||||
#define AWAITING_MECHANISM_DATA 0xA
|
|
||||||
#define AWAITING_MECHANISM_ELEMENT_END 0xB
|
|
||||||
#define AWAITING_MECHANISM_INFO_DATA 0xC
|
|
||||||
#define AWAITING_MECHANISM_INFO_ELEMENT_END 0xD
|
|
||||||
#define AWAITING_UNKNOWN_DATA 0xE
|
|
||||||
#define AWAITING_UNKNOWN_ELEMENT_END 0xF
|
|
||||||
#define DONE_PARSING 0x10
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Policy Parse Structure
|
|
||||||
//
|
|
||||||
typedef struct _AuthPolicyParse
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
int state;
|
|
||||||
int elementDataProcessed;
|
|
||||||
AuthPolicy *pAuthPolicy;
|
|
||||||
CasaStatus status;
|
|
||||||
|
|
||||||
} AuthPolicyParse, *PAuthPolicyParse;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthPolicyStartElementHandler(
|
|
||||||
IN AuthPolicyParse *pAuthPolicyParse,
|
|
||||||
IN const XML_Char *name,
|
|
||||||
IN const XML_Char **atts)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-AuthPolicyStartElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthPolicyParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication
|
|
||||||
// Policy Element.
|
|
||||||
if (strcmp(name, AUTH_POLICY_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_SOURCE_ELEMENT_START:
|
|
||||||
case AWAITING_ROOT_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the start of an Authentication
|
|
||||||
// Source Element.
|
|
||||||
if (strcmp(name, AUTH_SOURCE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
// Create an authentication context structure
|
|
||||||
pAuthContext = (AuthContext*) malloc(sizeof(AuthContext));
|
|
||||||
if (pAuthContext)
|
|
||||||
{
|
|
||||||
// Initialize the allocated AuthContext structure and associate it
|
|
||||||
// with the AuthPolicy structure.
|
|
||||||
memset(pAuthContext, 0, sizeof(*pAuthContext));
|
|
||||||
InsertTailList(&pAuthPolicyParse->pAuthPolicy->authContextListHead, &pAuthContext->listEntry);
|
|
||||||
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_CHILD_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyStartElementHandler- Buffer allocation error\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_SOURCE_CHILD_START:
|
|
||||||
|
|
||||||
// Proceed based on the name of the element
|
|
||||||
if (strcmp(name, REALM_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_REALM_DATA;
|
|
||||||
}
|
|
||||||
else if (strcmp(name, MECHANISM_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_MECHANISM_DATA;
|
|
||||||
}
|
|
||||||
else if (strcmp(name, MECHANISM_INFO_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_MECHANISM_INFO_DATA;
|
|
||||||
}
|
|
||||||
else if (strcmp(name, AUTH_SOURCE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// We are starting a new auth source entry, create an authentication
|
|
||||||
// context structure to hold its information.
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
// Create an authentication context structure
|
|
||||||
pAuthContext = (AuthContext*) malloc(sizeof(AuthContext));
|
|
||||||
if (pAuthContext)
|
|
||||||
{
|
|
||||||
// Initialize the allocated AuthContext structure and associate it
|
|
||||||
// with the AuthPolicy structure.
|
|
||||||
memset(pAuthContext, 0, sizeof(*pAuthContext));
|
|
||||||
InsertTailList(&pAuthPolicyParse->pAuthPolicy->authContextListHead, &pAuthContext->listEntry);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyStartElementHandler- Buffer allocation error\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_UNKNOWN_DATA;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthPolicyStartElementHandler- Un-expected state = %d\n", pAuthPolicyParse->state);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthPolicyStartElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ConsumeElementData(
|
|
||||||
IN AuthPolicyParse *pAuthPolicyParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len,
|
|
||||||
INOUT char **ppElementData,
|
|
||||||
INOUT int *pElementDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on whether or not we have already consumed data
|
|
||||||
// for this element.
|
|
||||||
if (*ppElementData == NULL)
|
|
||||||
{
|
|
||||||
// We have not yet consumed data for this element
|
|
||||||
pAuthPolicyParse->elementDataProcessed = len;
|
|
||||||
|
|
||||||
// Allocate a buffer to hold this element data (null terminated).
|
|
||||||
*ppElementData = (char*) malloc(len + 1);
|
|
||||||
if (*ppElementData)
|
|
||||||
{
|
|
||||||
memset(*ppElementData, 0, len + 1);
|
|
||||||
memcpy(*ppElementData, s, len);
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pAuthPolicyParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pNewBuf;
|
|
||||||
|
|
||||||
// We have already received token data, append this data to it.
|
|
||||||
pNewBuf = (char*) malloc(pAuthPolicyParse->elementDataProcessed + len + 1);
|
|
||||||
if (pNewBuf)
|
|
||||||
{
|
|
||||||
memset(pNewBuf,
|
|
||||||
0,
|
|
||||||
pAuthPolicyParse->elementDataProcessed + len + 1);
|
|
||||||
memcpy(pNewBuf,
|
|
||||||
*ppElementData,
|
|
||||||
pAuthPolicyParse->elementDataProcessed);
|
|
||||||
memcpy(pNewBuf + pAuthPolicyParse->elementDataProcessed, s, len);
|
|
||||||
pAuthPolicyParse->elementDataProcessed += len;
|
|
||||||
|
|
||||||
// Swap the buffers
|
|
||||||
free(*ppElementData);
|
|
||||||
*ppElementData = pNewBuf;
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pAuthPolicyParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthPolicyCharDataHandler(
|
|
||||||
IN AuthPolicyParse *pAuthPolicyParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthPolicyCharDataHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Just exit if being called to process white space
|
|
||||||
if (*s == '\n' || *s == '\r' || *s == '\t' || *s == ' ')
|
|
||||||
{
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthPolicyParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_REALM_DATA:
|
|
||||||
|
|
||||||
// Get access to the AuthContext at the tail of the list
|
|
||||||
pAuthContext = CONTAINING_RECORD(pAuthPolicyParse->pAuthPolicy->authContextListHead.Blink,
|
|
||||||
AuthContext,
|
|
||||||
listEntry);
|
|
||||||
|
|
||||||
// Consume the data
|
|
||||||
pAuthPolicyParse->status = ConsumeElementData(pAuthPolicyParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pAuthContext->pContext,
|
|
||||||
&pAuthContext->contextLen);
|
|
||||||
if (CASA_SUCCESS(pAuthPolicyParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthPolicyParse->state = AWAITING_REALM_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_MECHANISM_DATA:
|
|
||||||
|
|
||||||
// Get access to the AuthContext at the tail of the list
|
|
||||||
pAuthContext = CONTAINING_RECORD(pAuthPolicyParse->pAuthPolicy->authContextListHead.Blink,
|
|
||||||
AuthContext,
|
|
||||||
listEntry);
|
|
||||||
|
|
||||||
// Consume the data
|
|
||||||
pAuthPolicyParse->status = ConsumeElementData(pAuthPolicyParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pAuthContext->pMechanism,
|
|
||||||
&pAuthContext->mechanismLen);
|
|
||||||
if (CASA_SUCCESS(pAuthPolicyParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthPolicyParse->state = AWAITING_MECHANISM_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_MECHANISM_INFO_DATA:
|
|
||||||
|
|
||||||
// Get access to the AuthContext at the tail of the list
|
|
||||||
pAuthContext = CONTAINING_RECORD(pAuthPolicyParse->pAuthPolicy->authContextListHead.Blink,
|
|
||||||
AuthContext,
|
|
||||||
listEntry);
|
|
||||||
|
|
||||||
// Consume the data
|
|
||||||
pAuthPolicyParse->status = ConsumeElementData(pAuthPolicyParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pAuthContext->pMechInfo,
|
|
||||||
&pAuthContext->mechInfoLen);
|
|
||||||
if (CASA_SUCCESS(pAuthPolicyParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pAuthPolicyParse->state = AWAITING_MECHANISM_INFO_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_UNKNOWN_DATA:
|
|
||||||
|
|
||||||
// Just advance the state
|
|
||||||
pAuthPolicyParse->state = AWAITING_UNKNOWN_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthPolicyCharDataHandler- Un-expected state = %d\n", pAuthPolicyParse->state);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthPolicyCharDataHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
AuthPolicyEndElementHandler(
|
|
||||||
IN AuthPolicyParse *pAuthPolicyParse,
|
|
||||||
IN const XML_Char *name)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthPolicyEndElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pAuthPolicyParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication
|
|
||||||
// Policy Element.
|
|
||||||
if (strcmp(name, AUTH_POLICY_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Done.
|
|
||||||
pAuthPolicyParse->state = DONE_PARSING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_SOURCE_CHILD_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication
|
|
||||||
// Source Response Element.
|
|
||||||
if (strcmp(name, AUTH_SOURCE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_REALM_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Realm Element.
|
|
||||||
if (strcmp(name, REALM_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_CHILD_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_MECHANISM_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Mechanism Element.
|
|
||||||
if (strcmp(name, MECHANISM_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_CHILD_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_MECHANISM_INFO_DATA:
|
|
||||||
|
|
||||||
// Get access to the AuthContext at the tail of the list
|
|
||||||
pAuthContext = CONTAINING_RECORD(pAuthPolicyParse->pAuthPolicy->authContextListHead.Blink,
|
|
||||||
AuthContext,
|
|
||||||
listEntry);
|
|
||||||
|
|
||||||
// There was no mechanism info data. Set it to an empty string.
|
|
||||||
pAuthContext->pMechInfo = (char*) malloc(1);
|
|
||||||
if (pAuthContext->pMechInfo)
|
|
||||||
{
|
|
||||||
*pAuthContext->pMechInfo = '\0';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Buffer allocation failure\n", 0);
|
|
||||||
pAuthPolicyParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// Fall through
|
|
||||||
|
|
||||||
case AWAITING_MECHANISM_INFO_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Mechanism Info Element.
|
|
||||||
if (strcmp(name, MECHANISM_INFO_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_CHILD_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_UNKNOWN_ELEMENT_END:
|
|
||||||
|
|
||||||
// Advance to the next state.
|
|
||||||
pAuthPolicyParse->state = AWAITING_AUTH_SOURCE_CHILD_START;
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-AuthPolicyEndElementHandler- Un-expected state = %d\n", pAuthPolicyParse->state);
|
|
||||||
XML_StopParser(pAuthPolicyParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthPolicyEndElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
CreateAuthPolicy(
|
|
||||||
IN char *pEncodedData,
|
|
||||||
IN int encodedDataLen,
|
|
||||||
INOUT AuthPolicy **ppAuthPolicy)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
AuthPolicy *pAuthPolicy = NULL;
|
|
||||||
AuthPolicyParse authPolicyParse = {0};
|
|
||||||
char *pData = NULL;
|
|
||||||
int dataLen = 0;
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateAuthPolicy- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* An authentication policy document has the following format:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <auth_policy>
|
|
||||||
* <auth_source>
|
|
||||||
* <realm>realm name</realm>
|
|
||||||
* <mechanism>authentication mechanism type</mechanism>
|
|
||||||
* <mechanism_info>authentication mechanism context data</mechanism_info>
|
|
||||||
* </auth_source>
|
|
||||||
* ...
|
|
||||||
* </auth_policy>
|
|
||||||
*
|
|
||||||
* The authentication policy document can contain multiple auth_source
|
|
||||||
* elements. These auth_source elements can be for different authentication
|
|
||||||
* sources or for the same authentication source but specifying a different
|
|
||||||
* authentication mechanism.
|
|
||||||
*
|
|
||||||
* The following is a sample authentication policy document:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <auth_policy>
|
|
||||||
* <auth_source>
|
|
||||||
* <realm>Corp_eDirTree</realm>
|
|
||||||
* <mechanism>Krb5Authenticate</mechanism>
|
|
||||||
* <mechanism_info>host/hostname</mechanism_info>
|
|
||||||
* </auth_source>
|
|
||||||
* <auth_source>
|
|
||||||
* <realm>Corp_eDirTree</realm>
|
|
||||||
* <mechanism>PwdAuthenticate</mechanism>
|
|
||||||
* <mechanism_info></mechanism_info>
|
|
||||||
* </auth_source>
|
|
||||||
* </auth_policy>
|
|
||||||
*
|
|
||||||
* This authentication policy would tell the CASA client that it can
|
|
||||||
* authenticate to the CASA Authentication Token Service using
|
|
||||||
* credentials for the Corp_eDirTree and utilizing either the
|
|
||||||
* Krb5 authentication mechanism or the Pwd authentication mechanism.
|
|
||||||
* The Krb5 authentication mechanism context data specifies the
|
|
||||||
* name of the Kerberos service principal.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Initialize output parameter
|
|
||||||
*ppAuthPolicy = NULL;
|
|
||||||
|
|
||||||
// Decode the data
|
|
||||||
retStatus = DecodeData(pEncodedData,
|
|
||||||
encodedDataLen,
|
|
||||||
&pData,
|
|
||||||
&dataLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Allocate space for the AuthPolicy structure
|
|
||||||
pAuthPolicy = (AuthPolicy*) malloc(sizeof(*pAuthPolicy));
|
|
||||||
if (pAuthPolicy)
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
|
|
||||||
// Initialize the AuthPolicy object
|
|
||||||
memset(pAuthPolicy, 0, sizeof(*pAuthPolicy));
|
|
||||||
InitializeListHead(&pAuthPolicy->authContextListHead);
|
|
||||||
|
|
||||||
// Set the AuthPolicy object in the parse object
|
|
||||||
authPolicyParse.pAuthPolicy = pAuthPolicy;
|
|
||||||
|
|
||||||
// Create parser
|
|
||||||
p = XML_ParserCreate(NULL);
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
// Keep track of the parser in our parse object
|
|
||||||
authPolicyParse.p = p;
|
|
||||||
|
|
||||||
// Initialize the status within the parse object
|
|
||||||
authPolicyParse.status = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
// Set the start and end element handlers
|
|
||||||
XML_SetElementHandler(p,
|
|
||||||
AuthPolicyStartElementHandler,
|
|
||||||
AuthPolicyEndElementHandler);
|
|
||||||
|
|
||||||
// Set the character data handler
|
|
||||||
XML_SetCharacterDataHandler(p, AuthPolicyCharDataHandler);
|
|
||||||
|
|
||||||
// Set our user data
|
|
||||||
XML_SetUserData(p, &authPolicyParse);
|
|
||||||
|
|
||||||
// Parse the document
|
|
||||||
if (XML_Parse(p, pData, dataLen, 1) == XML_STATUS_OK)
|
|
||||||
{
|
|
||||||
// Verify that the parse operation completed successfully
|
|
||||||
if (authPolicyParse.state == DONE_PARSING)
|
|
||||||
{
|
|
||||||
// The parse operation succeded
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthPolicy- Parse operation did not complete\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthPolicy- Parse error %d\n", XML_GetErrorCode(p));
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the parser
|
|
||||||
XML_ParserFree(p);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthPolicy- Parser creation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the AuthPolicy object to the caller if necessary
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
*ppAuthPolicy = pAuthPolicy;
|
|
||||||
|
|
||||||
// Forget about the AuthPolicy object so that it is not release down below
|
|
||||||
pAuthPolicy = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthPolicy- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateAuthPolicy- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release necessary allocated resources
|
|
||||||
if (pAuthPolicy)
|
|
||||||
RelAuthPolicy(pAuthPolicy);
|
|
||||||
|
|
||||||
if (pData)
|
|
||||||
free(pData);
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateAuthPolicy- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
RelAuthPolicy(
|
|
||||||
IN AuthPolicy *pAuthPolicy)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
|
|
||||||
DbgTrace(1, "-RelAuthPolicy- Start\n", 0);
|
|
||||||
|
|
||||||
// Free all of the associated AuthContexts
|
|
||||||
pListEntry = pAuthPolicy->authContextListHead.Flink;
|
|
||||||
while (pListEntry != &pAuthPolicy->authContextListHead)
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
// Get pointer to AuthContext structure
|
|
||||||
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
|
|
||||||
|
|
||||||
// Free associated buffers
|
|
||||||
if (pAuthContext->pContext)
|
|
||||||
free(pAuthContext->pContext);
|
|
||||||
|
|
||||||
if (pAuthContext->pMechanism)
|
|
||||||
free(pAuthContext->pMechanism);
|
|
||||||
|
|
||||||
if (pAuthContext->pMechInfo)
|
|
||||||
free(pAuthContext->pMechInfo);
|
|
||||||
|
|
||||||
// Remove the entry from the list
|
|
||||||
RemoveEntryList(&pAuthContext->listEntry);
|
|
||||||
|
|
||||||
// Free the AuthContext
|
|
||||||
free(pAuthContext);
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pAuthPolicy->authContextListHead.Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the AuthPolicy
|
|
||||||
free(pAuthPolicy);
|
|
||||||
|
|
||||||
DbgTrace(1, "-RelAuthPolicy- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,694 +0,0 @@
|
|||||||
"DeployProject"
|
|
||||||
{
|
|
||||||
"VSVersion" = "3:701"
|
|
||||||
"ProjectType" = "8:{2C2AF0D9-9B47-4FE5-BEF2-169778172667}"
|
|
||||||
"IsWebType" = "8:FALSE"
|
|
||||||
"ProjectName" = "8:authtokenclient_msi"
|
|
||||||
"LanguageId" = "3:1033"
|
|
||||||
"CodePage" = "3:1252"
|
|
||||||
"UILanguageId" = "3:1033"
|
|
||||||
"SccProjectName" = "8:"
|
|
||||||
"SccLocalPath" = "8:"
|
|
||||||
"SccAuxPath" = "8:"
|
|
||||||
"SccProvider" = "8:"
|
|
||||||
"Hierarchy"
|
|
||||||
{
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_C9C2CAF6FE7A41938101D843D18673B7"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Configurations"
|
|
||||||
{
|
|
||||||
"Debug"
|
|
||||||
{
|
|
||||||
"DisplayName" = "8:Debug"
|
|
||||||
"IsDebugOnly" = "11:TRUE"
|
|
||||||
"IsReleaseOnly" = "11:FALSE"
|
|
||||||
"OutputFilename" = "8:Debug\\authtokenclient_msi.msi"
|
|
||||||
"PackageFilesAs" = "3:2"
|
|
||||||
"PackageFileSize" = "3:-2147483648"
|
|
||||||
"CabType" = "3:1"
|
|
||||||
"Compression" = "3:2"
|
|
||||||
"SignOutput" = "11:FALSE"
|
|
||||||
"CertificateFile" = "8:"
|
|
||||||
"PrivateKeyFile" = "8:"
|
|
||||||
"TimeStampServer" = "8:"
|
|
||||||
"InstallerBootstrapper" = "3:2"
|
|
||||||
}
|
|
||||||
"Release"
|
|
||||||
{
|
|
||||||
"DisplayName" = "8:Release"
|
|
||||||
"IsDebugOnly" = "11:FALSE"
|
|
||||||
"IsReleaseOnly" = "11:TRUE"
|
|
||||||
"OutputFilename" = "8:Release\\authtokenclient_msi.msi"
|
|
||||||
"PackageFilesAs" = "3:2"
|
|
||||||
"PackageFileSize" = "3:-2147483648"
|
|
||||||
"CabType" = "3:1"
|
|
||||||
"Compression" = "3:2"
|
|
||||||
"SignOutput" = "11:FALSE"
|
|
||||||
"CertificateFile" = "8:"
|
|
||||||
"PrivateKeyFile" = "8:"
|
|
||||||
"TimeStampServer" = "8:"
|
|
||||||
"InstallerBootstrapper" = "3:2"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Deployable"
|
|
||||||
{
|
|
||||||
"CustomAction"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"DefaultFeature"
|
|
||||||
{
|
|
||||||
"Name" = "8:DefaultFeature"
|
|
||||||
"Title" = "8:"
|
|
||||||
"Description" = "8:"
|
|
||||||
}
|
|
||||||
"ExternalPersistence"
|
|
||||||
{
|
|
||||||
"LaunchCondition"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Feature"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"File"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"FileType"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Folder"
|
|
||||||
{
|
|
||||||
"{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_5822614DE62647039F8AF6B0781851A7"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1916"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:DesktopFolder"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{58C0ADA3-3CEA-43BD-A3B3-2EA121BC8217}:_BADBE39F262C4F79B42417C62DF02E55"
|
|
||||||
{
|
|
||||||
"DefaultLocation" = "8:[ProgramFilesFolder][Manufacturer]\\[ProductName]"
|
|
||||||
"Name" = "8:#1925"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:TARGETDIR"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_CA7A8DC7331A4C47A8C7CDE8C53FE9FA"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1919"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:ProgramMenuFolder"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"LaunchCondition"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Locator"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"MsiBootstrapper"
|
|
||||||
{
|
|
||||||
"LangId" = "3:1033"
|
|
||||||
}
|
|
||||||
"Product"
|
|
||||||
{
|
|
||||||
"Name" = "8:Microsoft Visual Studio"
|
|
||||||
"ProductName" = "8:authtokenclient"
|
|
||||||
"ProductCode" = "8:{6D3AAA36-871A-4427-9311-FC3FE2F17511}"
|
|
||||||
"PackageCode" = "8:{197B9AC3-1D6A-4EA8-AC8A-C7695F57A28F}"
|
|
||||||
"UpgradeCode" = "8:{69C5F129-788A-4487-9397-331C0A313A2D}"
|
|
||||||
"RestartWWWService" = "11:FALSE"
|
|
||||||
"RemovePreviousVersions" = "11:FALSE"
|
|
||||||
"DetectNewerInstalledVersion" = "11:TRUE"
|
|
||||||
"ProductVersion" = "8:1.0.0"
|
|
||||||
"Manufacturer" = "8:Novell"
|
|
||||||
"ARPHELPTELEPHONE" = "8:"
|
|
||||||
"ARPHELPLINK" = "8:"
|
|
||||||
"Title" = "8:authtokenclient"
|
|
||||||
"Subject" = "8:"
|
|
||||||
"ARPCONTACT" = "8:Novell"
|
|
||||||
"Keywords" = "8:"
|
|
||||||
"ARPCOMMENTS" = "8:"
|
|
||||||
"ARPURLINFOABOUT" = "8:"
|
|
||||||
"ARPPRODUCTICON" = "8:"
|
|
||||||
"ARPIconIndex" = "3:0"
|
|
||||||
"SearchPath" = "8:"
|
|
||||||
"UseSystemSearchPath" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Registry"
|
|
||||||
{
|
|
||||||
"HKLM"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
"{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_3C4408A91276415C99DB57B858A91555"
|
|
||||||
{
|
|
||||||
"Name" = "8:Software"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"DeleteAtUninstall" = "11:FALSE"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
"{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_22714EABC4F3412BB3230B8EA95CFB08"
|
|
||||||
{
|
|
||||||
"Name" = "8:[Manufacturer]"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"DeleteAtUninstall" = "11:FALSE"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Values"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Values"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKCU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
"{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_93C508CBDBB34C95B9C890F165C081F1"
|
|
||||||
{
|
|
||||||
"Name" = "8:Software"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"DeleteAtUninstall" = "11:FALSE"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
"{6A471EEF-D31B-40F8-BCF6-C9E8EC783F36}:_B7A9FC8108DB4E249F31D12A434C1844"
|
|
||||||
{
|
|
||||||
"Name" = "8:[Manufacturer]"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"DeleteAtUninstall" = "11:FALSE"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Values"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Values"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKCR"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKPU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Sequences"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Shortcut"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"UserInterface"
|
|
||||||
{
|
|
||||||
"{B654A020-6903-4E6A-A86C-75DC463DB54B}:_1240F250BDDA45B084738491D53CCA13"
|
|
||||||
{
|
|
||||||
"UseDynamicProperties" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdUserInterface.wim"
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_2873941BB49A4737AF72ED5E788318F7"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1902"
|
|
||||||
"Sequence" = "3:1"
|
|
||||||
"Attributes" = "3:3"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_10695426506044F6B667E02B3E33A00E"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Finished"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdFinishedDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"UpdateText"
|
|
||||||
{
|
|
||||||
"Name" = "8:UpdateText"
|
|
||||||
"DisplayName" = "8:#1058"
|
|
||||||
"Description" = "8:#1158"
|
|
||||||
"Type" = "3:15"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1258"
|
|
||||||
"DefaultValue" = "8:#1258"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_353966B93CCA47F89005110A192B33E0"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1900"
|
|
||||||
"Sequence" = "3:2"
|
|
||||||
"Attributes" = "3:1"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_A41DEF6D91134F42BA300A817856F7C2"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:300"
|
|
||||||
"DisplayName" = "8:Confirm Installation"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminConfirmDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_D915672F6CE04B29A5482A7E9297CE42"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Welcome"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminWelcomeDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"CopyrightWarning"
|
|
||||||
{
|
|
||||||
"Name" = "8:CopyrightWarning"
|
|
||||||
"DisplayName" = "8:#1002"
|
|
||||||
"Description" = "8:#1102"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1202"
|
|
||||||
"DefaultValue" = "8:#1202"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Welcome"
|
|
||||||
{
|
|
||||||
"Name" = "8:Welcome"
|
|
||||||
"DisplayName" = "8:#1003"
|
|
||||||
"Description" = "8:#1103"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1203"
|
|
||||||
"DefaultValue" = "8:#1203"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_E8BB0C75759A4ECA9292D5EB62A4B1DD"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:200"
|
|
||||||
"DisplayName" = "8:Installation Folder"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFolderDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_72EFC743AB3B42B6994F5EC55E41631F"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1901"
|
|
||||||
"Sequence" = "3:1"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_9D455462808342AE837694F103194C3E"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Progress"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdProgressDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"ShowProgress"
|
|
||||||
{
|
|
||||||
"Name" = "8:ShowProgress"
|
|
||||||
"DisplayName" = "8:#1009"
|
|
||||||
"Description" = "8:#1109"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:1"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{B654A020-6903-4E6A-A86C-75DC463DB54B}:_A0A8360C0E0D46ACB472E47806B666D5"
|
|
||||||
{
|
|
||||||
"UseDynamicProperties" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdBasicDialogs.wim"
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_D708D6BFB2C946BB9BCCC9F6F2CAE0FA"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1902"
|
|
||||||
"Sequence" = "3:2"
|
|
||||||
"Attributes" = "3:3"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_964E18CF17534E789061E20F26EE5EDA"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Finished"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminFinishedDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_E294259CC9424A6EB901523FCAD0D0CC"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1900"
|
|
||||||
"Sequence" = "3:1"
|
|
||||||
"Attributes" = "3:1"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_7F0506CDE05C426E9A69E1F0F6A1B9A4"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:200"
|
|
||||||
"DisplayName" = "8:Installation Folder"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdFolderDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_E227037047AF41C394E3138699F6DD62"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:300"
|
|
||||||
"DisplayName" = "8:Confirm Installation"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdConfirmDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_EF6CBFADEBBA4F4BA427709FD0C72385"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Welcome"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdWelcomeDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"CopyrightWarning"
|
|
||||||
{
|
|
||||||
"Name" = "8:CopyrightWarning"
|
|
||||||
"DisplayName" = "8:#1002"
|
|
||||||
"Description" = "8:#1102"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1202"
|
|
||||||
"DefaultValue" = "8:#1202"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"Welcome"
|
|
||||||
{
|
|
||||||
"Name" = "8:Welcome"
|
|
||||||
"DisplayName" = "8:#1003"
|
|
||||||
"Description" = "8:#1103"
|
|
||||||
"Type" = "3:3"
|
|
||||||
"ContextData" = "8:"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"Value" = "8:#1203"
|
|
||||||
"DefaultValue" = "8:#1203"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8D9DEE8B-DD8B-4F48-9072-C4364E4F4011}:_FC54039B5B444B8C8D7C64B693C25B14"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1901"
|
|
||||||
"Sequence" = "3:2"
|
|
||||||
"Attributes" = "3:2"
|
|
||||||
"Dialogs"
|
|
||||||
{
|
|
||||||
"{18ADD6EC-89FE-4ED7-AD3E-211C40278470}:_E79C486A92E54E4881FBD841C4649B83"
|
|
||||||
{
|
|
||||||
"Sequence" = "3:100"
|
|
||||||
"DisplayName" = "8:Progress"
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:<VsdDialogDir>\\VsdAdminProgressDlg.wid"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"BannerBitmap"
|
|
||||||
{
|
|
||||||
"Name" = "8:BannerBitmap"
|
|
||||||
"DisplayName" = "8:#1001"
|
|
||||||
"Description" = "8:#1101"
|
|
||||||
"Type" = "3:8"
|
|
||||||
"ContextData" = "8:Bitmap"
|
|
||||||
"Attributes" = "3:4"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"ShowProgress"
|
|
||||||
{
|
|
||||||
"Name" = "8:ShowProgress"
|
|
||||||
"DisplayName" = "8:#1009"
|
|
||||||
"Description" = "8:#1109"
|
|
||||||
"Type" = "3:5"
|
|
||||||
"ContextData" = "8:1;True=1;False=0"
|
|
||||||
"Attributes" = "3:0"
|
|
||||||
"Setting" = "3:0"
|
|
||||||
"Value" = "3:1"
|
|
||||||
"DefaultValue" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:TRUE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"MergeModule"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"ProjectOutput"
|
|
||||||
{
|
|
||||||
"{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_C9C2CAF6FE7A41938101D843D18673B7"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\authtokenclient_msm\\Debug\\authtokenclient_msm.msm"
|
|
||||||
"TargetName" = "8:"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_BADBE39F262C4F79B42417C62DF02E55"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
"ProjectOutputGroupRegister" = "3:1"
|
|
||||||
"OutputConfiguration" = "8:"
|
|
||||||
"OutputGroupCanonicalName" = "8:Built"
|
|
||||||
"OutputProjectGuid" = "8:{70ED319E-F496-4F07-878C-1921426DD399}"
|
|
||||||
"ShowKeyOutput" = "11:TRUE"
|
|
||||||
"ExcludeFilters"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"KeyOutputModule"
|
|
||||||
{
|
|
||||||
"UseDynamicProperties" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"SourcePath" = "8:..\\authtokenclient_msm\\Release\\authtokenclient_msm.msm"
|
|
||||||
"Properties"
|
|
||||||
{
|
|
||||||
"_F5F5F604B81645F8B6463F7A7D6A53AD.375AEECA1C3A4EC3AF37E3E5BE6711DD"
|
|
||||||
{
|
|
||||||
"Name" = "8:_F5F5F604B81645F8B6463F7A7D6A53AD.375AEECA1C3A4EC3AF37E3E5BE6711DD"
|
|
||||||
"DisplayName" = "8:Module Retargetable Folder"
|
|
||||||
"Description" = "8:"
|
|
||||||
"Type" = "3:32769"
|
|
||||||
"ContextData" = "8:_RetargetableFolder"
|
|
||||||
"Attributes" = "3:6"
|
|
||||||
"Setting" = "3:1"
|
|
||||||
"UsePlugInResources" = "11:FALSE"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"LanguageId" = "3:1033"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"Folder" = "8:_BADBE39F262C4F79B42417C62DF02E55"
|
|
||||||
"Feature" = "8:"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"VJSharpPlugin"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,542 +0,0 @@
|
|||||||
"DeployProject"
|
|
||||||
{
|
|
||||||
"VSVersion" = "3:701"
|
|
||||||
"ProjectType" = "8:{DD7A5B58-C2F9-40FF-B2EF-0773356FB978}"
|
|
||||||
"IsWebType" = "8:FALSE"
|
|
||||||
"ProjectName" = "8:authtokenclient_msm"
|
|
||||||
"LanguageId" = "3:1033"
|
|
||||||
"CodePage" = "3:1252"
|
|
||||||
"UILanguageId" = "3:1033"
|
|
||||||
"SccProjectName" = "8:"
|
|
||||||
"SccLocalPath" = "8:"
|
|
||||||
"SccAuxPath" = "8:"
|
|
||||||
"SccProvider" = "8:"
|
|
||||||
"Hierarchy"
|
|
||||||
{
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_0C000CB7C5FA4E2BB6A6CB1C204EABA6"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_0C0B5ECE6E9C47F1A1F13B58141B5DC8"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_1231718055D14020BF756DCF44D2BF22"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_313DE095D13281AF91A64E3F3D472413"
|
|
||||||
"OwnerKey" = "8:_DB9D7F0710B44F858325E4EFCCB2EEB3"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_677B016062384F4C8A73EC952CBCFD76"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_753EBE1EB0DC420C88ED02E5A978FF35"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_767D1F0838D74B6C86C5E9C14643AE48"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_92336612AC7D083F97ED302BB7674A2D"
|
|
||||||
"OwnerKey" = "8:_9A2FC85FE99C48E8AD1E4813BE33A03A"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_9A2FC85FE99C48E8AD1E4813BE33A03A"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_DB9D7F0710B44F858325E4EFCCB2EEB3"
|
|
||||||
"OwnerKey" = "8:_UNDEFINED"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
"Entry"
|
|
||||||
{
|
|
||||||
"MsmKey" = "8:_FE85A5D48B5A23F3077871E9FD2378DE"
|
|
||||||
"OwnerKey" = "8:_0C0B5ECE6E9C47F1A1F13B58141B5DC8"
|
|
||||||
"MsmSig" = "8:_UNDEFINED"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Configurations"
|
|
||||||
{
|
|
||||||
"Debug"
|
|
||||||
{
|
|
||||||
"DisplayName" = "8:Debug"
|
|
||||||
"IsDebugOnly" = "11:TRUE"
|
|
||||||
"IsReleaseOnly" = "11:FALSE"
|
|
||||||
"OutputFilename" = "8:Debug\\authtokenclient_msm.msm"
|
|
||||||
"PackageFilesAs" = "3:2"
|
|
||||||
"PackageFileSize" = "3:-2147483648"
|
|
||||||
"CabType" = "3:1"
|
|
||||||
"Compression" = "3:2"
|
|
||||||
"SignOutput" = "11:FALSE"
|
|
||||||
"CertificateFile" = "8:"
|
|
||||||
"PrivateKeyFile" = "8:"
|
|
||||||
"TimeStampServer" = "8:"
|
|
||||||
"InstallerBootstrapper" = "3:1"
|
|
||||||
}
|
|
||||||
"Release"
|
|
||||||
{
|
|
||||||
"DisplayName" = "8:Release"
|
|
||||||
"IsDebugOnly" = "11:FALSE"
|
|
||||||
"IsReleaseOnly" = "11:TRUE"
|
|
||||||
"OutputFilename" = "8:Release\\authtokenclient_msm.msm"
|
|
||||||
"PackageFilesAs" = "3:2"
|
|
||||||
"PackageFileSize" = "3:-2147483648"
|
|
||||||
"CabType" = "3:1"
|
|
||||||
"Compression" = "3:2"
|
|
||||||
"SignOutput" = "11:FALSE"
|
|
||||||
"CertificateFile" = "8:"
|
|
||||||
"PrivateKeyFile" = "8:"
|
|
||||||
"TimeStampServer" = "8:"
|
|
||||||
"InstallerBootstrapper" = "3:1"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Deployable"
|
|
||||||
{
|
|
||||||
"CustomAction"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"DefaultFeature"
|
|
||||||
{
|
|
||||||
"Name" = "8:DefaultFeature"
|
|
||||||
"Title" = "8:"
|
|
||||||
"Description" = "8:"
|
|
||||||
}
|
|
||||||
"File"
|
|
||||||
{
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_0C000CB7C5FA4E2BB6A6CB1C204EABA6"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\mechanisms\\pwd\\PwdAuthenticate.conf"
|
|
||||||
"TargetName" = "8:PwdAuthenticate.conf"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_DEA051CA331E4FEA83D99711FB584664"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_1231718055D14020BF756DCF44D2BF22"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\mechanisms\\krb5\\Krb5Authenticate.conf"
|
|
||||||
"TargetName" = "8:Krb5Authenticate.conf"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_DEA051CA331E4FEA83D99711FB584664"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_313DE095D13281AF91A64E3F3D472413"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:Secur32.dll"
|
|
||||||
"TargetName" = "8:Secur32.dll"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_F5F5F604B81645F8B6463F7A7D6A53AD"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:TRUE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_677B016062384F4C8A73EC952CBCFD76"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\windows\\authtoken.lib"
|
|
||||||
"TargetName" = "8:authtoken.lib"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_01897726E7804A3B875B67A1C2692147"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_753EBE1EB0DC420C88ED02E5A978FF35"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\..\\..\\include\\casa_c_authtoken.h"
|
|
||||||
"TargetName" = "8:casa_c_authtoken.h"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_9568FCF514C14B54BAB7D1D5D183D3C5"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_767D1F0838D74B6C86C5E9C14643AE48"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\..\\..\\include\\casa_status.h"
|
|
||||||
"TargetName" = "8:casa_status.h"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_9568FCF514C14B54BAB7D1D5D183D3C5"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_92336612AC7D083F97ED302BB7674A2D"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:micasa.dll"
|
|
||||||
"TargetName" = "8:micasa.dll"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_F5F5F604B81645F8B6463F7A7D6A53AD"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:TRUE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
"{A582A373-4685-4296-BEFE-614B80A702C3}:_FE85A5D48B5A23F3077871E9FD2378DE"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:WINHTTP.dll"
|
|
||||||
"TargetName" = "8:WINHTTP.dll"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_01897726E7804A3B875B67A1C2692147"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:TRUE"
|
|
||||||
"IsDependency" = "11:TRUE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"FileType"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Folder"
|
|
||||||
{
|
|
||||||
"{78BAF5CE-F2E5-45BE-83BC-DB6AF387E941}:_DB481DA18FE347988F44E459AD84EDE9"
|
|
||||||
{
|
|
||||||
"Name" = "8:#1912"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:ProgramFilesFolder"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_00A3E8736D134835AD0537E00F100987"
|
|
||||||
{
|
|
||||||
"Name" = "8:Novell"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_6F4D982C87CA4DF991766D49335B6669"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_7911DA52FBB24F3DB6BAF4B8BD9E57BF"
|
|
||||||
{
|
|
||||||
"Name" = "8:CASA"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_5C00DF0C10DE42D887AF2473050E45C9"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_01897726E7804A3B875B67A1C2692147"
|
|
||||||
{
|
|
||||||
"Name" = "8:lib"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_9CB2846430C044D4A85E07E79ED81EC6"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_9568FCF514C14B54BAB7D1D5D183D3C5"
|
|
||||||
{
|
|
||||||
"Name" = "8:include"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_E75CE2ED8E574BD6BDBF415E739623A2"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_B639068B7BE1480495ADAF8B2461A075"
|
|
||||||
{
|
|
||||||
"Name" = "8:etc"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_B04A2882FFAA4A959983F9D9750066CB"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_24DA90392089420889094EC07EB4F28C"
|
|
||||||
{
|
|
||||||
"Name" = "8:auth"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_AE09329FDCD54A98A0A90DDD67FE7E50"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
"{F27BD5C5-A65D-4608-96D4-7C5DA1F76302}:_DEA051CA331E4FEA83D99711FB584664"
|
|
||||||
{
|
|
||||||
"Name" = "8:mechanisms"
|
|
||||||
"AlwaysCreate" = "11:FALSE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Property" = "8:_DA97A45985F64232A6DEAD78C88EDEE5"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{29CD8198-A6F0-4B93-8B90-AC03CFEAD328}:_F5F5F604B81645F8B6463F7A7D6A53AD"
|
|
||||||
{
|
|
||||||
"DefaultLocation" = "8:[ProgramFilesFolder]\\novell\\casa\\lib"
|
|
||||||
"DisplayName" = "8:Module Retargetable Folder"
|
|
||||||
"Description" = "8:"
|
|
||||||
"Name" = "8:Module Retargetable Folder"
|
|
||||||
"AlwaysCreate" = "11:TRUE"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:TRUE"
|
|
||||||
"Property" = "8:NEWRETARGETABLEPROPERTY1"
|
|
||||||
"Folders"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Sequences"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"MergeModule"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
"Module"
|
|
||||||
{
|
|
||||||
"ModuleSignature" = "8:MergeModule.375AEECA1C3A4EC3AF37E3E5BE6711DD"
|
|
||||||
"Version" = "8:1.0.0.0"
|
|
||||||
"Title" = "8:authtokenclient_msm"
|
|
||||||
"Subject" = "8:"
|
|
||||||
"Author" = "8:Novell"
|
|
||||||
"Keywords" = "8:"
|
|
||||||
"Comments" = "8:"
|
|
||||||
"SearchPath" = "8:"
|
|
||||||
"UseSystemSearchPath" = "11:TRUE"
|
|
||||||
}
|
|
||||||
"ProjectOutput"
|
|
||||||
{
|
|
||||||
"{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_0C0B5ECE6E9C47F1A1F13B58141B5DC8"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\windows\\Debug\\authtoken.dll"
|
|
||||||
"TargetName" = "8:"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_01897726E7804A3B875B67A1C2692147"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
"ProjectOutputGroupRegister" = "3:1"
|
|
||||||
"OutputConfiguration" = "8:"
|
|
||||||
"OutputGroupCanonicalName" = "8:Built"
|
|
||||||
"OutputProjectGuid" = "8:{7BD9A5DB-DE7D-40B7-A397-04182DC2F632}"
|
|
||||||
"ShowKeyOutput" = "11:FALSE"
|
|
||||||
"ExcludeFilters"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_9A2FC85FE99C48E8AD1E4813BE33A03A"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\mechanisms\\pwd\\windows\\Debug\\pwmech.dll"
|
|
||||||
"TargetName" = "8:"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_F5F5F604B81645F8B6463F7A7D6A53AD"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
"ProjectOutputGroupRegister" = "3:1"
|
|
||||||
"OutputConfiguration" = "8:"
|
|
||||||
"OutputGroupCanonicalName" = "8:Built"
|
|
||||||
"OutputProjectGuid" = "8:{5499F624-F371-4559-B4C2-A484BCE892FD}"
|
|
||||||
"ShowKeyOutput" = "11:FALSE"
|
|
||||||
"ExcludeFilters"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"{8062640A-2EEE-46E9-AB67-688E9A886E9F}:_DB9D7F0710B44F858325E4EFCCB2EEB3"
|
|
||||||
{
|
|
||||||
"SourcePath" = "8:..\\mechanisms\\krb5\\windows\\Debug\\krb5mech.dll"
|
|
||||||
"TargetName" = "8:"
|
|
||||||
"Tag" = "8:"
|
|
||||||
"Folder" = "8:_F5F5F604B81645F8B6463F7A7D6A53AD"
|
|
||||||
"Condition" = "8:"
|
|
||||||
"Transitive" = "11:FALSE"
|
|
||||||
"Vital" = "11:TRUE"
|
|
||||||
"ReadOnly" = "11:FALSE"
|
|
||||||
"Hidden" = "11:FALSE"
|
|
||||||
"System" = "11:FALSE"
|
|
||||||
"Permanent" = "11:FALSE"
|
|
||||||
"SharedLegacy" = "11:FALSE"
|
|
||||||
"PackageAs" = "3:1"
|
|
||||||
"Register" = "3:1"
|
|
||||||
"Exclude" = "11:FALSE"
|
|
||||||
"IsDependency" = "11:FALSE"
|
|
||||||
"IsolateTo" = "8:"
|
|
||||||
"ProjectOutputGroupRegister" = "3:1"
|
|
||||||
"OutputConfiguration" = "8:"
|
|
||||||
"OutputGroupCanonicalName" = "8:Built"
|
|
||||||
"OutputProjectGuid" = "8:{5499F624-F371-4559-B4C2-A484BCE892FD}"
|
|
||||||
"ShowKeyOutput" = "11:FALSE"
|
|
||||||
"ExcludeFilters"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Registry"
|
|
||||||
{
|
|
||||||
"HKLM"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKCU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKCR"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"HKPU"
|
|
||||||
{
|
|
||||||
"Keys"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
"Shortcut"
|
|
||||||
{
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,209 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="client"
|
|
||||||
ProjectGUID="{7BD9A5DB-DE7D-40B7-A397-04182DC2F632}"
|
|
||||||
RootNamespace="client"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="/D "XML_STATIC""
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories=".;windows;..\include;..\..\include;..\..\..\Expat-2.0.0\source\lib"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
IgnoreImportLibrary="FALSE"
|
|
||||||
AdditionalOptions="/EXPORT:ObtainAuthToken"
|
|
||||||
AdditionalDependencies="ws2_32.lib winhttp.lib libexpatml.lib"
|
|
||||||
OutputFile="$(OutDir)/authtoken.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""..\..\..\Expat-2.0.0\StaticLibs""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/client.pdb"
|
|
||||||
SubSystem="0"
|
|
||||||
ImportLibrary="$(SolutionDir)client\windows/$(TargetName).lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
copy $(OutDir)\authtoken.dll \"Program Files"\novell\casa\lib\authtoken.dll
|
|
||||||
copy $(SolutionDir)client\windows\authtoken.lib \"Program Files"\novell\casa\lib\authtoken.lib
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="/D "XML_STATIC""
|
|
||||||
AdditionalIncludeDirectories=".;windows;..\include;..\..\include;..\..\..\Expat-2.0.0\source\lib"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/EXPORT:ObtainAuthToken"
|
|
||||||
AdditionalDependencies="ws2_32.lib winhttp.lib libexpatml.lib"
|
|
||||||
OutputFile="$(OutDir)/authtoken.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""..\..\..\Expat-2.0.0\StaticLibs""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="0"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
ImportLibrary="$(SolutionDir)client\windows\$(TargetName).lib"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
copy $(OutDir)\authtoken.dll \"Program Files"\novell\casa\lib\authtoken.dll
|
|
||||||
copy $(SolutionDir)client\windows\authtoken.lib \"Program Files"\novell\casa\lib\authtoken.lib
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\authmech.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\authmsg.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\authpolicy.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\win32\authtoken.def">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\cache.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\config.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\dllsup.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\engine.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\getpolicymsg.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\gettokenmsg.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\rpc.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\util.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\internal.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\list_entry.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\mech_if.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath="..\include\proto.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -1,685 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Config Key object
|
|
||||||
//
|
|
||||||
typedef struct _ConfigKey
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
char *pKeyName;
|
|
||||||
int keyNameLen;
|
|
||||||
char *pValue;
|
|
||||||
int valueLen;
|
|
||||||
|
|
||||||
} ConfigKey, *pConfigKey;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Config Interface instance data
|
|
||||||
//
|
|
||||||
typedef struct _ConfigIfInstance
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
int refCount;
|
|
||||||
char *pConfigFolder;
|
|
||||||
int configFolderLen;
|
|
||||||
char *pConfigName;
|
|
||||||
int configNameLen;
|
|
||||||
LIST_ENTRY configKeyListHead;
|
|
||||||
ConfigIf configIf;
|
|
||||||
|
|
||||||
} ConfigIfInstance, *PConfigIfInstance;
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// ConfigIf variables
|
|
||||||
static
|
|
||||||
LIST_ENTRY g_configIfListHead = {&g_configIfListHead, &g_configIfListHead};
|
|
||||||
|
|
||||||
static
|
|
||||||
int g_numConfigIfObjs = 0;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static void
|
|
||||||
RemoveWhiteSpaceFromTheEnd(
|
|
||||||
IN const char *pInString)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pLineEnd = (char*) pInString + strlen(pInString) - 1;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(3, "-RemoveWhiteSpaceFromTheEnd- Start\n", 0);
|
|
||||||
|
|
||||||
while (pLineEnd != pInString)
|
|
||||||
{
|
|
||||||
if (*pLineEnd == '\n'
|
|
||||||
|| *pLineEnd == ' '
|
|
||||||
|| *pLineEnd == '\t')
|
|
||||||
{
|
|
||||||
// Strike this character
|
|
||||||
*pLineEnd = '\0';
|
|
||||||
pLineEnd --;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Found a non-white character
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-RemoveWhiteSpaceFromTheEnd- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static char*
|
|
||||||
SkipWhiteSpace(
|
|
||||||
IN const char *pInString)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pOutString = (char*) pInString;
|
|
||||||
|
|
||||||
DbgTrace(3, "-SkipWhiteSpace- Start\n", 0);
|
|
||||||
|
|
||||||
while (*pOutString != '\0')
|
|
||||||
{
|
|
||||||
if (*pOutString == '\n'
|
|
||||||
|| *pOutString == ' '
|
|
||||||
|| *pOutString == '\t')
|
|
||||||
{
|
|
||||||
// Skip this character
|
|
||||||
pOutString ++;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Found a non-white character
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-SkipWhiteSpace- End\n", 0);
|
|
||||||
|
|
||||||
return pOutString;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static char*
|
|
||||||
SkipNonWhiteSpace(
|
|
||||||
IN const char *pInString)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pOutString = (char*) pInString;
|
|
||||||
|
|
||||||
DbgTrace(3, "-SkipNonWhiteSpace- Start\n", 0);
|
|
||||||
|
|
||||||
while (*pOutString != '\0')
|
|
||||||
{
|
|
||||||
if (*pOutString == '\n'
|
|
||||||
|| *pOutString == ' '
|
|
||||||
|| *pOutString == '\t')
|
|
||||||
{
|
|
||||||
// Found a white character
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Skip this character
|
|
||||||
pOutString ++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-SkipNonWhiteSpace- End\n", 0);
|
|
||||||
|
|
||||||
return pOutString;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static void
|
|
||||||
LowerCaseString(
|
|
||||||
IN char *pDestString,
|
|
||||||
IN const char *pSrcString)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int i;
|
|
||||||
|
|
||||||
DbgTrace(3, "-LowerCaseString- Start\n", 0);
|
|
||||||
|
|
||||||
// Copy the string as lower case
|
|
||||||
for (i = 0; pSrcString[i] != '\0'; i++)
|
|
||||||
{
|
|
||||||
if (isalpha(pSrcString[i]))
|
|
||||||
pDestString[i] = tolower(pSrcString[i]);
|
|
||||||
else
|
|
||||||
pDestString[i] = pSrcString[i];
|
|
||||||
}
|
|
||||||
|
|
||||||
// Null terminate the destination string
|
|
||||||
pDestString[i] = '\0';
|
|
||||||
|
|
||||||
DbgTrace(3, "-LowerCaseString- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
int SSCS_CALL
|
|
||||||
ConfigIf_AddReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Interface reference count.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Increases interface reference count.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int refCount;
|
|
||||||
ConfigIfInstance *pConfigIfInstance = CONTAINING_RECORD(pIfInstance, ConfigIfInstance, configIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_AddReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Increment the reference count on the object
|
|
||||||
pConfigIfInstance->refCount ++;
|
|
||||||
refCount = pConfigIfInstance->refCount;
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_AddReference- End, refCount = %08X\n", refCount);
|
|
||||||
|
|
||||||
return refCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void SSCS_CALL
|
|
||||||
ConfigIf_ReleaseReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Nothing.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Decreases interface reference count. The interface is deallocated if
|
|
||||||
// the reference count becomes zero.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
bool freeObj = false;
|
|
||||||
ConfigIfInstance *pConfigIfInstance = CONTAINING_RECORD(pIfInstance, ConfigIfInstance, configIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_ReleaseReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Decrement the reference count on the object and determine if it needs to
|
|
||||||
// be released.
|
|
||||||
pConfigIfInstance->refCount --;
|
|
||||||
if (pConfigIfInstance->refCount == 0)
|
|
||||||
{
|
|
||||||
// The object needs to be released, forget about it.
|
|
||||||
freeObj = true;
|
|
||||||
g_numConfigIfObjs --;
|
|
||||||
RemoveEntryList(&pConfigIfInstance->listEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free object if necessary
|
|
||||||
if (freeObj)
|
|
||||||
{
|
|
||||||
// Free all of the config key objects associated with this configuration
|
|
||||||
// interface instance.
|
|
||||||
while (!IsListEmpty(&pConfigIfInstance->configKeyListHead))
|
|
||||||
{
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
ConfigKey *pConfigKey;
|
|
||||||
|
|
||||||
// Get reference to entry at the head of the list
|
|
||||||
pListEntry = pConfigIfInstance->configKeyListHead.Flink;
|
|
||||||
pConfigKey = CONTAINING_RECORD(pListEntry, ConfigKey, listEntry);
|
|
||||||
|
|
||||||
// Free the buffers associated with the ConfigKey
|
|
||||||
free(pConfigKey->pKeyName);
|
|
||||||
free(pConfigKey->pValue);
|
|
||||||
|
|
||||||
// Remove the entry from the list
|
|
||||||
RemoveEntryList(&pConfigKey->listEntry);
|
|
||||||
|
|
||||||
// Finish freeing the ConfigKey
|
|
||||||
free(pConfigKey);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the rest of the buffers associated with the interface instance data
|
|
||||||
free(pConfigIfInstance->pConfigFolder);
|
|
||||||
free(pConfigIfInstance->pConfigName);
|
|
||||||
free(pConfigIfInstance);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_ReleaseReference- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
char* SSCS_CALL
|
|
||||||
ConfigIf_GetEntryValue(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pKeyName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// pKeyName -
|
|
||||||
// Pointer to NULL terminated string that contains the
|
|
||||||
// name of the key whose value is being requested.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Pointer to NULL terminated string with value being requested or NULL.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Gets value associated with a key for the configuration object.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
ConfigIfInstance *pConfigIfInstance = CONTAINING_RECORD(pIfInstance, ConfigIfInstance, configIf);
|
|
||||||
char *pValue = NULL;
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
ConfigKey *pConfigKey;
|
|
||||||
int keyNameLen = (int) strlen(pKeyName);
|
|
||||||
char *pKeyNameLowercase;
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_GetEntryValue- Start\n", 0);
|
|
||||||
|
|
||||||
// Allocate enough space to hold lower case version of the key name
|
|
||||||
pKeyNameLowercase = (char*) malloc(keyNameLen + 1);
|
|
||||||
if (pKeyNameLowercase)
|
|
||||||
{
|
|
||||||
// Lower case the key name
|
|
||||||
LowerCaseString(pKeyNameLowercase, pKeyName);
|
|
||||||
|
|
||||||
// Try to find matching ConfigKey
|
|
||||||
pListEntry = pConfigIfInstance->configKeyListHead.Flink;
|
|
||||||
while (pListEntry != &pConfigIfInstance->configKeyListHead)
|
|
||||||
{
|
|
||||||
// Get pointer to the current entry
|
|
||||||
pConfigKey = CONTAINING_RECORD(pListEntry, ConfigKey, listEntry);
|
|
||||||
|
|
||||||
// Check if we have a match
|
|
||||||
if (pConfigKey->keyNameLen == keyNameLen
|
|
||||||
&& memcmp(pKeyNameLowercase, pConfigKey->pKeyName, keyNameLen) == 0)
|
|
||||||
{
|
|
||||||
// We found it, return its value.
|
|
||||||
pValue = (char*) malloc(pConfigKey->valueLen + 1);
|
|
||||||
if (pValue)
|
|
||||||
{
|
|
||||||
strcpy(pValue, pConfigKey->pValue);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConfigIf_GetEntryValue- Buffer allocation failure\n", 0);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the lower case version of the key name
|
|
||||||
free(pKeyNameLowercase);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConfigIf_GetEntryValue- Buffer allocation failure\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-ConfigIf_GetEntryValue- End, pValue = %08X\n", (unsigned int) pValue);
|
|
||||||
|
|
||||||
return pValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
GetConfigInterface(
|
|
||||||
IN const char *pConfigFolder,
|
|
||||||
IN const char *pConfigName,
|
|
||||||
INOUT ConfigIf **ppConfigIf)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pConfigFolder -
|
|
||||||
// Pointer to NULL terminated string that contains the name of
|
|
||||||
// the folder containing the configuration file.
|
|
||||||
//
|
|
||||||
// pConfigName -
|
|
||||||
// Pointer to NULL terminated string containing the name of the
|
|
||||||
// configuration entry.
|
|
||||||
//
|
|
||||||
// ppConfigIf -
|
|
||||||
// Pointer to variable that will receive pointer to ConfigIf
|
|
||||||
// instance.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get configuration interface to specified configuration entry.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int configFolderLen = (int) strlen(pConfigFolder);
|
|
||||||
int configNameLen = (int)strlen(pConfigName);
|
|
||||||
ConfigIfInstance *pConfigIfInstance;
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
CasaStatus retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_OBJECT_NOT_FOUND);
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetConfigInterface- Start\n", 0);
|
|
||||||
|
|
||||||
// Check if we already have an entry in our list for the configuration
|
|
||||||
pListEntry = g_configIfListHead.Flink;
|
|
||||||
while (pListEntry != &g_configIfListHead)
|
|
||||||
{
|
|
||||||
// Get pointer to the current entry
|
|
||||||
pConfigIfInstance = CONTAINING_RECORD(pListEntry, ConfigIfInstance, listEntry);
|
|
||||||
|
|
||||||
// Check if we have a match
|
|
||||||
if (pConfigIfInstance->configFolderLen == configFolderLen
|
|
||||||
&& pConfigIfInstance->configNameLen == configNameLen
|
|
||||||
&& memcmp(pConfigFolder, pConfigIfInstance->pConfigFolder, configFolderLen) == 0
|
|
||||||
&& memcmp(pConfigName, pConfigIfInstance->pConfigName, configNameLen) == 0)
|
|
||||||
{
|
|
||||||
// We found it, return the ConfigIf associated with the instance data
|
|
||||||
// after incrementing its reference count.
|
|
||||||
pConfigIfInstance->refCount ++;
|
|
||||||
*ppConfigIf = &pConfigIfInstance->configIf;
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed to create interface instance data for the configuration if none was found
|
|
||||||
if (retStatus != CASA_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
char *pFilePath;
|
|
||||||
|
|
||||||
// Build a string containing the configuration file path
|
|
||||||
pFilePath = (char*) malloc(configFolderLen + 1 + configNameLen + sizeof(".conf"));
|
|
||||||
if (pFilePath)
|
|
||||||
{
|
|
||||||
FILE *pConfigFile;
|
|
||||||
|
|
||||||
strcpy(pFilePath, pConfigFolder);
|
|
||||||
strcat(pFilePath, pathCharString);
|
|
||||||
strcat(pFilePath, pConfigName);
|
|
||||||
strcat(pFilePath, ".conf");
|
|
||||||
|
|
||||||
// Open the configuration file for reading
|
|
||||||
pConfigFile = fopen(pFilePath, "r");
|
|
||||||
if (pConfigFile)
|
|
||||||
{
|
|
||||||
// Opened the file, create a ConfigIfInstance object for it.
|
|
||||||
pConfigIfInstance = (ConfigIfInstance*) malloc(sizeof(*pConfigIfInstance));
|
|
||||||
if (pConfigIfInstance)
|
|
||||||
{
|
|
||||||
// Initialize the list head within the instance data
|
|
||||||
InitializeListHead(&pConfigIfInstance->configKeyListHead);
|
|
||||||
|
|
||||||
// Initialize the ConfigIf within the instance data
|
|
||||||
pConfigIfInstance->configIf.addReference = ConfigIf_AddReference;
|
|
||||||
pConfigIfInstance->configIf.releaseReference = ConfigIf_ReleaseReference;
|
|
||||||
pConfigIfInstance->configIf.getEntryValue = ConfigIf_GetEntryValue;
|
|
||||||
|
|
||||||
// Save the ConfigFolder and ConfigName information within the instance data
|
|
||||||
pConfigIfInstance->pConfigFolder = (char*) malloc(configFolderLen + 1);
|
|
||||||
if (pConfigIfInstance->pConfigFolder)
|
|
||||||
{
|
|
||||||
strcpy(pConfigIfInstance->pConfigFolder, pConfigFolder);
|
|
||||||
pConfigIfInstance->configFolderLen = configFolderLen;
|
|
||||||
|
|
||||||
pConfigIfInstance->pConfigName = (char*) malloc(configNameLen + 1);
|
|
||||||
if (pConfigIfInstance->pConfigName)
|
|
||||||
{
|
|
||||||
strcpy(pConfigIfInstance->pConfigName, pConfigName);
|
|
||||||
pConfigIfInstance->configNameLen = configNameLen;
|
|
||||||
|
|
||||||
// Add the instance data into our list and bump up its reference count
|
|
||||||
// since we did that.
|
|
||||||
InsertTailList(&g_configIfListHead, &pConfigIfInstance->listEntry);
|
|
||||||
pConfigIfInstance->refCount = 1;
|
|
||||||
|
|
||||||
// At this point we want to return success to the caller even if we
|
|
||||||
// experience a read error.
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
// Return the ConfigIf associated with the instance data after
|
|
||||||
// incrementing its reference count.
|
|
||||||
pConfigIfInstance->refCount ++;
|
|
||||||
*ppConfigIf = &pConfigIfInstance->configIf;
|
|
||||||
|
|
||||||
// Now update the instance data with the information present in the file
|
|
||||||
if (fseek(pConfigFile, 0, SEEK_SET) == 0)
|
|
||||||
{
|
|
||||||
char line[512];
|
|
||||||
|
|
||||||
while (fgets(line, sizeof(line), pConfigFile) != NULL)
|
|
||||||
{
|
|
||||||
int lineLength;
|
|
||||||
|
|
||||||
RemoveWhiteSpaceFromTheEnd(line);
|
|
||||||
|
|
||||||
lineLength = (int) strlen(line);
|
|
||||||
if (lineLength != 0)
|
|
||||||
{
|
|
||||||
char *pKey;
|
|
||||||
char *pKeyEnd;
|
|
||||||
char *pValue;
|
|
||||||
ConfigKey *pConfigKey;
|
|
||||||
|
|
||||||
// Attempt to find the key
|
|
||||||
pKey = SkipWhiteSpace(line);
|
|
||||||
|
|
||||||
// Make sure that we are not dealing with an empty line or a comment
|
|
||||||
if (*pKey == '\0' || *pKey == '#')
|
|
||||||
continue;
|
|
||||||
|
|
||||||
// Go past the key
|
|
||||||
pKeyEnd = SkipNonWhiteSpace(pKey);
|
|
||||||
|
|
||||||
// Protect against a malformed line
|
|
||||||
if (*pKeyEnd == '\0')
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Key found without value\n", 0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Attempt to find the value
|
|
||||||
pValue = SkipWhiteSpace(pKeyEnd);
|
|
||||||
|
|
||||||
// Protect against a malformed line
|
|
||||||
if (*pValue == '\0')
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Key found without value\n", 0);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delineate the key
|
|
||||||
*pKeyEnd = '\0';
|
|
||||||
|
|
||||||
// Create a ConfigKey object for this key/value pair
|
|
||||||
pConfigKey = (ConfigKey*) malloc(sizeof(*pConfigKey));
|
|
||||||
if (pConfigKey)
|
|
||||||
{
|
|
||||||
pConfigKey->keyNameLen = (int) strlen(pKey);
|
|
||||||
pConfigKey->pKeyName = (char*) malloc(pConfigKey->keyNameLen + 1);
|
|
||||||
if (pConfigKey->pKeyName)
|
|
||||||
{
|
|
||||||
// Save the key name in lower case
|
|
||||||
LowerCaseString(pConfigKey->pKeyName, pKey);
|
|
||||||
|
|
||||||
pConfigKey->valueLen = (int) strlen(pValue);
|
|
||||||
pConfigKey->pValue = (char*) malloc(pConfigKey->valueLen + 1);
|
|
||||||
if (pConfigKey->pValue)
|
|
||||||
{
|
|
||||||
strcpy(pConfigKey->pValue, pValue);
|
|
||||||
|
|
||||||
// The entry is ready, now associate it with the instance data.
|
|
||||||
InsertTailList(&pConfigIfInstance->configKeyListHead, &pConfigKey->listEntry);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
free(pConfigKey->pKeyName);
|
|
||||||
free(pConfigKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
free(pConfigKey);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- File seek error, errno = %d\n", errno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
// Free the buffers associated with the instance data
|
|
||||||
free(pConfigIfInstance->pConfigFolder);
|
|
||||||
free(pConfigIfInstance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
// Free the buffer allocated for the instance data
|
|
||||||
free(pConfigIfInstance);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation failure\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the file
|
|
||||||
fclose(pConfigFile);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-GetConfigInterface- Unable to open config file, errno = %d\n", errno);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetConfigInterface- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetConfigInterface- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,120 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _CONFIG_IF_H_
|
|
||||||
#define _CONFIG_IF_H_
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
** **
|
|
||||||
** Configuration Object Interface Definitions **
|
|
||||||
** **
|
|
||||||
***************************************************************************
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
int
|
|
||||||
(SSCS_CALL *PFNConfiglIf_AddReference)(
|
|
||||||
IN const void *pIfInstance);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Interface reference count.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Increases interface reference count.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
void
|
|
||||||
(SSCS_CALL *PFNConfiglIf_ReleaseReference)(
|
|
||||||
IN const void *pIfInstance);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Nothing.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Decreases interface reference count. The interface is deallocated if
|
|
||||||
// the reference count becomes zero.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
char*
|
|
||||||
(SSCS_CALL *PFNConfiglIf_GetEntryValue)(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pKeyName);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// pKeyName -
|
|
||||||
// Pointer to NULL terminated string that contains the
|
|
||||||
// name of the key whose value is being requested.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Pointer to NULL terminated string with value being requested or NULL.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Gets value associated with a key for the configuration object.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Config Interface Object
|
|
||||||
//
|
|
||||||
typedef struct _ConfigIf
|
|
||||||
{
|
|
||||||
PFNConfiglIf_AddReference addReference;
|
|
||||||
PFNConfiglIf_ReleaseReference releaseReference;
|
|
||||||
PFNConfiglIf_GetEntryValue getEntryValue;
|
|
||||||
|
|
||||||
} ConfigIf, *PConfigIf;
|
|
||||||
|
|
||||||
|
|
||||||
#endif // #ifndef _CONFIG_IF_H_
|
|
||||||
|
|
@ -1,663 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
#define DEFAULT_RETRY_LIFETIME 5 // seconds
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Debug tracing level
|
|
||||||
//
|
|
||||||
int DebugLevel = 0;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Operating parameter
|
|
||||||
//
|
|
||||||
bool secureRpcSetting = false;
|
|
||||||
int retryLifetime = DEFAULT_RETRY_LIFETIME;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ObtainSessionToken(
|
|
||||||
IN RpcSession *pRpcSession,
|
|
||||||
IN AuthPolicy *pAuthPolicy,
|
|
||||||
INOUT char **ppSessionToken)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
AuthCacheEntry *pCacheEntry = NULL;
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainSessionToken- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize output parameter
|
|
||||||
*ppSessionToken = NULL;
|
|
||||||
|
|
||||||
// Look in our cache for an entry that matches one of the auth
|
|
||||||
// contexts specified in the AuthPolicy object.
|
|
||||||
pListEntry = pAuthPolicy->authContextListHead.Flink;
|
|
||||||
while (pListEntry != &pAuthPolicy->authContextListHead)
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
|
|
||||||
// Get pointer to AuthContext structure
|
|
||||||
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
|
|
||||||
|
|
||||||
// Try to find a cache entry for the auth context
|
|
||||||
pCacheEntry = FindSessionTokenEntryInCache(pAuthContext->pContext);
|
|
||||||
if (pCacheEntry != NULL)
|
|
||||||
{
|
|
||||||
// Cache entry found, check if it is of use to us.
|
|
||||||
if (CASA_SUCCESS(pCacheEntry->status))
|
|
||||||
{
|
|
||||||
// This entry can be used, stop looking.
|
|
||||||
retStatus = pCacheEntry->status;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// If we did not find a cache entry that we can use, then try to create one.
|
|
||||||
pListEntry = pAuthPolicy->authContextListHead.Flink;
|
|
||||||
while (!CASA_SUCCESS(retStatus)
|
|
||||||
&& pListEntry != &pAuthPolicy->authContextListHead)
|
|
||||||
{
|
|
||||||
AuthContext *pAuthContext;
|
|
||||||
char *pAuthMechToken;
|
|
||||||
|
|
||||||
// Get pointer to AuthContext structure
|
|
||||||
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
|
|
||||||
|
|
||||||
// Only try to create cache entry for the auth context if there is not
|
|
||||||
// one already.
|
|
||||||
pCacheEntry = FindSessionTokenEntryInCache(pAuthContext->pContext);
|
|
||||||
if (pCacheEntry == NULL)
|
|
||||||
{
|
|
||||||
// Get authentication mechanism token
|
|
||||||
retStatus = GetAuthMechToken(pAuthContext, &pAuthMechToken);
|
|
||||||
if (!CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// We were not able to obtain an authentication mechanism token
|
|
||||||
// for the context.
|
|
||||||
//
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Create a cache entry for the auth context
|
|
||||||
pCacheEntry = CreateSessionTokenCacheEntry(pAuthContext->pContext);
|
|
||||||
if (pCacheEntry)
|
|
||||||
{
|
|
||||||
char *pReqMsg = NULL;
|
|
||||||
char *pRespMsg = NULL;
|
|
||||||
int respLen;
|
|
||||||
int cacheEntryLifetime = retryLifetime; // Initialize to retry in case of failure
|
|
||||||
|
|
||||||
// Authenticate to the ATS
|
|
||||||
pReqMsg = BuildAuthenticateMsg(pAuthContext, pAuthMechToken);
|
|
||||||
if (pReqMsg)
|
|
||||||
{
|
|
||||||
// Issue rpc
|
|
||||||
retStatus = Rpc(pRpcSession,
|
|
||||||
"Authenticate",
|
|
||||||
secureRpcSetting,
|
|
||||||
pReqMsg,
|
|
||||||
&pRespMsg,
|
|
||||||
&respLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
AuthenticateResp *pAuthenticateResp;
|
|
||||||
|
|
||||||
// Create Authenticate response object
|
|
||||||
retStatus = CreateAuthenticateResp(pRespMsg, respLen, &pAuthenticateResp);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Return the auth token to the caller
|
|
||||||
pCacheEntry->pToken = pAuthenticateResp->pToken;
|
|
||||||
pAuthenticateResp->pToken = NULL; // To keep us from freeing the buffer
|
|
||||||
cacheEntryLifetime = pAuthenticateResp->tokenLifetime;
|
|
||||||
|
|
||||||
// Free the Authenticate response object
|
|
||||||
RelAuthenticateResp(pAuthenticateResp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainSessionToken- Authenticate Rpc failure, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free resources that may be hanging around
|
|
||||||
if (pRespMsg)
|
|
||||||
free(pRespMsg);
|
|
||||||
|
|
||||||
free(pReqMsg);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainSessionToken- Error building Authenticate msg\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Add the entry to the cache if successful or if the reason that we failed
|
|
||||||
// was because the server was unavailable.
|
|
||||||
if (CASA_SUCCESS(retStatus)
|
|
||||||
|| CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE)
|
|
||||||
{
|
|
||||||
pCacheEntry->status = retStatus;
|
|
||||||
AddEntryToAuthCache(pCacheEntry, cacheEntryLifetime);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release the cache entry if the resulting status is not successful
|
|
||||||
if (!CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainSessionToken- Cache entry creation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free up the buffer associated with the authentication mechanism token
|
|
||||||
free(pAuthMechToken);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return session token if successful
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Allocate a buffer for the return token
|
|
||||||
*ppSessionToken = (char*) malloc(strlen(pCacheEntry->pToken) + 1);
|
|
||||||
if (*ppSessionToken)
|
|
||||||
{
|
|
||||||
// Copy the token onto the allocated buffer
|
|
||||||
strcpy(*ppSessionToken, pCacheEntry->pToken);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainSessionToken- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainSessionToken- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ObtainAuthTokenFromServer(
|
|
||||||
IN const char *pServiceName,
|
|
||||||
IN const char *pHostName,
|
|
||||||
INOUT char **ppAuthToken,
|
|
||||||
INOUT int *pTokenLifetime)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
RpcSession *pRpcSession;
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainAuthTokenFromServer- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize output parameter
|
|
||||||
*ppAuthToken = NULL;
|
|
||||||
|
|
||||||
// Open Rpc Session to the auth service at the specified host
|
|
||||||
pRpcSession = OpenRpcSession(pHostName);
|
|
||||||
if (pRpcSession)
|
|
||||||
{
|
|
||||||
char *pReqMsg = NULL;
|
|
||||||
char *pRespMsg = NULL;
|
|
||||||
int respLen;
|
|
||||||
AuthPolicy *pAuthPolicy = NULL;
|
|
||||||
GetAuthPolicyResp *pGetAuthPolicyResp = NULL;
|
|
||||||
GetAuthTokenResp *pGetAuthTokenResp = NULL;
|
|
||||||
char *pSessionToken = NULL;
|
|
||||||
|
|
||||||
// Request the auth parameters associated with this service
|
|
||||||
pReqMsg = BuildGetAuthPolicyMsg(pServiceName, pHostName);
|
|
||||||
if (pReqMsg)
|
|
||||||
{
|
|
||||||
// Issue rpc
|
|
||||||
retStatus = Rpc(pRpcSession,
|
|
||||||
"GetAuthPolicy",
|
|
||||||
secureRpcSetting,
|
|
||||||
pReqMsg,
|
|
||||||
&pRespMsg,
|
|
||||||
&respLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Create GetAuthPolicy response object
|
|
||||||
retStatus = CreateGetAuthPolicyResp(pRespMsg, respLen, &pGetAuthPolicyResp);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Create the AuthPolicy object
|
|
||||||
retStatus = CreateAuthPolicy(pGetAuthPolicyResp->pPolicy,
|
|
||||||
pGetAuthPolicyResp->policyLen,
|
|
||||||
&pAuthPolicy);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Now try to obtain a session token
|
|
||||||
retStatus = ObtainSessionToken(pRpcSession, pAuthPolicy, &pSessionToken);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Request auth token for the service
|
|
||||||
free(pReqMsg);
|
|
||||||
pReqMsg = BuildGetAuthTokenMsg(pServiceName, pHostName, pSessionToken);
|
|
||||||
if (pReqMsg)
|
|
||||||
{
|
|
||||||
// Free the previous response msg buffer
|
|
||||||
free(pRespMsg);
|
|
||||||
pRespMsg = NULL;
|
|
||||||
|
|
||||||
// Issue rpc
|
|
||||||
retStatus = Rpc(pRpcSession,
|
|
||||||
"GetAuthToken",
|
|
||||||
secureRpcSetting,
|
|
||||||
pReqMsg,
|
|
||||||
&pRespMsg,
|
|
||||||
&respLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Create GetAuthPolicy response object
|
|
||||||
retStatus = CreateGetAuthTokenResp(pRespMsg, respLen, &pGetAuthTokenResp);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Return the auth token to the caller
|
|
||||||
*ppAuthToken = pGetAuthTokenResp->pToken;
|
|
||||||
pGetAuthTokenResp->pToken = NULL; // To keep us from freeing the buffer
|
|
||||||
*pTokenLifetime = pGetAuthTokenResp->tokenLifetime;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to create GetAuthTokenResp object, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- GetAuthToken Rpc failure, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Error building GetAuthToken msg\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to obtain session token, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to create AuthPolicy object, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to create GetAuthPolicyResp object, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- GetAuthPolicy Rpc failure, error = %08X\n", retStatus);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free resources that may be hanging around
|
|
||||||
if (pReqMsg)
|
|
||||||
free(pReqMsg);
|
|
||||||
|
|
||||||
if (pRespMsg)
|
|
||||||
free(pRespMsg);
|
|
||||||
|
|
||||||
if (pSessionToken)
|
|
||||||
free(pSessionToken);
|
|
||||||
|
|
||||||
if (pGetAuthTokenResp)
|
|
||||||
RelGetAuthTokenResp(pGetAuthTokenResp);
|
|
||||||
|
|
||||||
if (pGetAuthPolicyResp)
|
|
||||||
RelGetAuthPolicyResp(pGetAuthPolicyResp);
|
|
||||||
|
|
||||||
if (pAuthPolicy)
|
|
||||||
RelAuthPolicy(pAuthPolicy);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Error building GetAuthPolicy msg\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the Rpc Session
|
|
||||||
CloseRpcSession(pRpcSession);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthTokenFromServer- Error opening Rpc session\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainAuthTokenFromServer- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
ObtainAuthToken(
|
|
||||||
IN const char *pServiceName,
|
|
||||||
IN const char *pHostName,
|
|
||||||
INOUT char *pAuthTokenBuf,
|
|
||||||
INOUT int *pAuthTokenBufLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pServiceName -
|
|
||||||
// Pointer to NULL terminated string that contains the
|
|
||||||
// name of the service to which the client is trying to
|
|
||||||
// authenticate.
|
|
||||||
//
|
|
||||||
// pHostName -
|
|
||||||
// Pointer to NULL terminated string that contains the
|
|
||||||
// name of the host where resides the service to which the
|
|
||||||
// client is trying to authenticate. Note that the name
|
|
||||||
// can either be a DNS name or a dotted IP address.
|
|
||||||
//
|
|
||||||
// pAuthTokenBuf -
|
|
||||||
// Pointer to buffer that will receive the authentication
|
|
||||||
// token. The length of this buffer is specified by the
|
|
||||||
// pAuthTokenBufLen parameter. Note that the the authentication
|
|
||||||
// token will be in the form of a NULL terminated string.
|
|
||||||
//
|
|
||||||
// pAuthTokenBufLen -
|
|
||||||
// Pointer to integer that contains the length of the
|
|
||||||
// buffer pointed at by pAuthTokenBuf. Upon return of the
|
|
||||||
// function, the integer will contain the actual length
|
|
||||||
// of the authentication token if the function successfully
|
|
||||||
// completes or the buffer length required if the function
|
|
||||||
// fails because the buffer pointed at by pAuthTokenBuf is
|
|
||||||
// not large enough.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get authentication token to authenticate user to specified
|
|
||||||
// service at host.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
AuthCacheEntry *pCacheEntry;
|
|
||||||
char *pNormalizedHostName;
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainAuthToken- Start\n", 0);
|
|
||||||
|
|
||||||
// Verify the input parameters
|
|
||||||
if (pServiceName == NULL
|
|
||||||
|| pHostName == NULL
|
|
||||||
|| pAuthTokenBufLen == NULL
|
|
||||||
|| (*pAuthTokenBufLen != 0 && pAuthTokenBuf == NULL))
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthToken- Invalid parameter\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INVALID_PARAMETER);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Normalize the host name
|
|
||||||
pNormalizedHostName = NormalizeHostName(pHostName);
|
|
||||||
if (pNormalizedHostName)
|
|
||||||
{
|
|
||||||
// Start user process synchronization
|
|
||||||
AcquireUserMutex();
|
|
||||||
|
|
||||||
// Try to find a cache entry for the service
|
|
||||||
pCacheEntry = FindAuthTokenEntryInCache(pServiceName, pNormalizedHostName);
|
|
||||||
if (pCacheEntry == NULL)
|
|
||||||
{
|
|
||||||
// No entry found in the cache, create one.
|
|
||||||
pCacheEntry = CreateAuthTokenCacheEntry(pServiceName, pNormalizedHostName);
|
|
||||||
if (pCacheEntry)
|
|
||||||
{
|
|
||||||
int cacheEntryLifetime = retryLifetime; // Initialize to retry in case of failure
|
|
||||||
|
|
||||||
// Cache entry created, now try to obtain auth token from the CASA Server
|
|
||||||
retStatus = ObtainAuthTokenFromServer(pServiceName,
|
|
||||||
pNormalizedHostName,
|
|
||||||
&pCacheEntry->pToken,
|
|
||||||
&cacheEntryLifetime);
|
|
||||||
|
|
||||||
// Add the entry to the cache if successful or if the reason that we failed
|
|
||||||
// was because the server was un-available.
|
|
||||||
if (CASA_SUCCESS(retStatus)
|
|
||||||
|| CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE)
|
|
||||||
{
|
|
||||||
pCacheEntry->status = retStatus;
|
|
||||||
AddEntryToAuthCache(pCacheEntry, cacheEntryLifetime);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release the cache entry if the resulting status is not successful
|
|
||||||
if (!CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthToken- Cache entry creation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Cache entry found, update the return status with the information saved in it
|
|
||||||
// and release it if its status is not successful.
|
|
||||||
if (!CASA_SUCCESS(retStatus = pCacheEntry->status))
|
|
||||||
{
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Try to return auth token if we have one to return
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
int tokenLen = (int) strlen(pCacheEntry->pToken) + 1;
|
|
||||||
|
|
||||||
// We have an authentication token, try to return it to the caller
|
|
||||||
// after verifying that the supplied buffer is big enough.
|
|
||||||
if (*pAuthTokenBufLen >= tokenLen)
|
|
||||||
{
|
|
||||||
// Return the auth token to the caller
|
|
||||||
strcpy(pAuthTokenBuf, pCacheEntry->pToken);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthToken- The supplied buffer is not large enough", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_BUFFER_OVERFLOW);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the token length to the caller
|
|
||||||
*pAuthTokenBufLen = tokenLen;
|
|
||||||
|
|
||||||
// Release auth cache entry reference
|
|
||||||
ReleaseAuthCacheEntry(pCacheEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Stop user process synchronization
|
|
||||||
ReleaseUserMutex();
|
|
||||||
|
|
||||||
// Free the space allocated for the normalized host name
|
|
||||||
free(pNormalizedHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ObtainAuthToken- Host name normalization failed\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(1, "-ObtainAuthToken- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
int
|
|
||||||
InitializeLibrary(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int retStatus = -1;
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- Start\n", 0);
|
|
||||||
|
|
||||||
// Create user synchronization mutex
|
|
||||||
if (CreateUserMutex() == 0)
|
|
||||||
{
|
|
||||||
// Initialize the auth cache
|
|
||||||
if (CASA_SUCCESS(InitializeAuthCache()))
|
|
||||||
{
|
|
||||||
// Initialize the host name normalization
|
|
||||||
if (CASA_SUCCESS(InitializeHostNameNormalization()))
|
|
||||||
{
|
|
||||||
// Success
|
|
||||||
retStatus = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InitializeLibrary- Error initializing host name normalization\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InitializeLibrary- Error initializing the auth cache\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InitializeLibrary- Error creating mutex for the user\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,745 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parse states
|
|
||||||
//
|
|
||||||
#define AWAITING_ROOT_ELEMENT_START 0x0
|
|
||||||
#define AWAITING_ROOT_ELEMENT_END 0x1
|
|
||||||
#define AWAITING_STATUS_ELEMENT_START 0x2
|
|
||||||
#define AWAITING_STATUS_ELEMENT_END 0x3
|
|
||||||
#define AWAITING_STATUS_DATA 0x4
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_START 0x5
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_END 0x6
|
|
||||||
#define AWAITING_DESCRIPTION_DATA 0x7
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_START 0x8
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_END 0x9
|
|
||||||
#define AWAITING_AUTH_TOKEN_DATA 0xA
|
|
||||||
#define AWAITING_AUTH_POLICY_ELEMENT_START 0xB
|
|
||||||
#define AWAITING_AUTH_POLICY_ELEMENT_END 0xC
|
|
||||||
#define AWAITING_AUTH_POLICY_DATA 0xD
|
|
||||||
#define DONE_PARSING 0xE
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get Authentication Policy Response Parse Structure
|
|
||||||
//
|
|
||||||
typedef struct _GetAuthPolicyRespParse
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
int state;
|
|
||||||
int elementDataProcessed;
|
|
||||||
GetAuthPolicyResp *pGetAuthPolicyResp;
|
|
||||||
CasaStatus status;
|
|
||||||
|
|
||||||
} GetAuthPolicyRespParse, *PGetAuthPolicyRespParse;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
char*
|
|
||||||
BuildGetAuthPolicyMsg(
|
|
||||||
IN char *pServiceName,
|
|
||||||
IN char *pHostName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pMsg = NULL;
|
|
||||||
int bufferSize;
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildGetAuthPolicyMsg- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The format of the get authentication policy request message is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_policy_req>
|
|
||||||
* <service>service name<\service>
|
|
||||||
* <host>host name</host>
|
|
||||||
* </get_auth_policy_req>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Determine the buffer size necessary to hold the msg
|
|
||||||
bufferSize = strlen(XML_DECLARATION)
|
|
||||||
+ 2 // crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(GET_AUTH_POLICY_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(SERVICE_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pServiceName)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(SERVICE_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(HOST_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pHostName)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(HOST_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(GET_AUTH_POLICY_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 2; // >null
|
|
||||||
|
|
||||||
// Allocate the msg buffer
|
|
||||||
pMsg = (char*) malloc(bufferSize);
|
|
||||||
if (pMsg)
|
|
||||||
{
|
|
||||||
// Now build the message
|
|
||||||
memset(pMsg, 0, bufferSize);
|
|
||||||
strcat(pMsg, XML_DECLARATION);
|
|
||||||
strcat(pMsg, "\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, GET_AUTH_POLICY_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, SERVICE_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pServiceName);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, SERVICE_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, HOST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pHostName);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, HOST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, GET_AUTH_POLICY_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-BuildGetAuthPolicyMsg- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildGetAuthPolicyMsg- End, pMsg = %08X\n", pMsg);
|
|
||||||
|
|
||||||
return pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthPolicyRespStartElementHandler(
|
|
||||||
IN GetAuthPolicyRespParse *pGetAuthPolicyRespParse,
|
|
||||||
IN const XML_Char *name,
|
|
||||||
IN const XML_Char **atts)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespStartElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthPolicyRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Get Authentication
|
|
||||||
// Policy Response Element.
|
|
||||||
if (strcmp(name, GET_AUTH_POLICY_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_STATUS_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_DESCRIPTION_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_DESCRIPTION_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_POLICY_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication Policy Element.
|
|
||||||
if (strcmp(name, AUTH_POLICY_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_AUTH_POLICY_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespStartElementHandler- Un-expected state = %d\n", pGetAuthPolicyRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespStartElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ConsumeElementData(
|
|
||||||
IN GetAuthPolicyRespParse *pGetAuthPolicyRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len,
|
|
||||||
INOUT char **ppElementData,
|
|
||||||
INOUT int *pElementDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on whether or not we have already consumed data
|
|
||||||
// for this element.
|
|
||||||
if (*ppElementData == NULL)
|
|
||||||
{
|
|
||||||
// We have not yet consumed data for this element
|
|
||||||
pGetAuthPolicyRespParse->elementDataProcessed = len;
|
|
||||||
|
|
||||||
// Allocate a buffer to hold this element data (null terminated).
|
|
||||||
*ppElementData = (char*) malloc(len + 1);
|
|
||||||
if (*ppElementData)
|
|
||||||
{
|
|
||||||
memset(*ppElementData, 0, len + 1);
|
|
||||||
memcpy(*ppElementData, s, len);
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pGetAuthPolicyRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pNewBuf;
|
|
||||||
|
|
||||||
// We have already received token data, append this data to it.
|
|
||||||
pNewBuf = (char*) malloc(pGetAuthPolicyRespParse->elementDataProcessed + len + 1);
|
|
||||||
if (pNewBuf)
|
|
||||||
{
|
|
||||||
memset(pNewBuf,
|
|
||||||
0,
|
|
||||||
pGetAuthPolicyRespParse->elementDataProcessed + len + 1);
|
|
||||||
memcpy(pNewBuf,
|
|
||||||
*ppElementData,
|
|
||||||
pGetAuthPolicyRespParse->elementDataProcessed);
|
|
||||||
memcpy(pNewBuf + pGetAuthPolicyRespParse->elementDataProcessed, s, len);
|
|
||||||
pGetAuthPolicyRespParse->elementDataProcessed += len;
|
|
||||||
|
|
||||||
// Swap the buffers
|
|
||||||
free(*ppElementData);
|
|
||||||
*ppElementData = pNewBuf;
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pGetAuthPolicyRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthPolicyRespCharDataHandler(
|
|
||||||
IN GetAuthPolicyRespParse *pGetAuthPolicyRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespCharDataHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Just exit if being called to process white space
|
|
||||||
if (*s == '\n' || *s == '\r' || *s == '\t' || *s == ' ')
|
|
||||||
{
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthPolicyRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_DESCRIPTION_DATA:
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// Ignore the status description data for now.
|
|
||||||
// tbd
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_DESCRIPTION_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_DATA:
|
|
||||||
|
|
||||||
// Set the appropriate status in the AuthenticationResp based on the
|
|
||||||
// returned status.
|
|
||||||
if (strncmp(HTTP_OK_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthPolicyRespParse->status = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_UNAUTHORIZED_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthPolicyRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_AUTHENTICATION_FAILURE);
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_NOT_FOUND_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthPolicyRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_NOT_CONFIGURED);
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_SERVER_ERROR_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthPolicyRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_SERVER_ERROR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespCharDataHandler- Un-expected status\n", 0);
|
|
||||||
pGetAuthPolicyRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_STATUS_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_POLICY_DATA:
|
|
||||||
case AWAITING_AUTH_POLICY_ELEMENT_END:
|
|
||||||
|
|
||||||
pGetAuthPolicyRespParse->status = ConsumeElementData(pGetAuthPolicyRespParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pGetAuthPolicyRespParse->pGetAuthPolicyResp->pPolicy,
|
|
||||||
&pGetAuthPolicyRespParse->pGetAuthPolicyResp->policyLen);
|
|
||||||
if (CASA_SUCCESS(pGetAuthPolicyRespParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_AUTH_POLICY_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespCharDataHandler- Un-expected state = %d\n", pGetAuthPolicyRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespCharDataHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthPolicyRespEndElementHandler(
|
|
||||||
IN GetAuthPolicyRespParse *pGetAuthPolicyRespParse,
|
|
||||||
IN const XML_Char *name)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespEndElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthPolicyRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Get Authentication
|
|
||||||
// Policy Response Element.
|
|
||||||
if (strcmp(name, GET_AUTH_POLICY_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Done.
|
|
||||||
pGetAuthPolicyRespParse->state = DONE_PARSING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespEndHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_STATUS_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state based on the status code.
|
|
||||||
if (CASA_SUCCESS(pGetAuthPolicyRespParse->status))
|
|
||||||
{
|
|
||||||
// The request completed successfully
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_AUTH_POLICY_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_POLICY_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication Policy Element.
|
|
||||||
if (strcmp(name, AUTH_POLICY_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthPolicyRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthPolicyRespEndElementHandler- Un-expected state = %d\n", pGetAuthPolicyRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthPolicyRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthPolicyRespEndElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
CreateGetAuthPolicyResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT GetAuthPolicyResp **ppGetAuthPolicyResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
GetAuthPolicyRespParse getAuthPolicyRespParse = {0};
|
|
||||||
GetAuthPolicyResp *pGetAuthPolicyResp;
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateGetAuthPolicyResp- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When a get authentication policy request is processed successfully, the
|
|
||||||
* server replies to the client with a message with the following format:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_policy_resp>
|
|
||||||
* <status><description>ok</description>200</status>
|
|
||||||
* <auth_policy>authentication policy data</auth_policy>
|
|
||||||
* </get_auth_policy_resp>
|
|
||||||
*
|
|
||||||
* When a get authentication policy request fails to be successfully processed,
|
|
||||||
* the server responds with an error and an error description string. The message
|
|
||||||
* format of an unsuccessful reply is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_policy_resp>
|
|
||||||
* <status><description>status description</description>status code</status>
|
|
||||||
* </get_auth_policy_resp>
|
|
||||||
*
|
|
||||||
* Plase note that the protocol utilizes the status codes defined
|
|
||||||
* in the HTTP 1.1 Specification.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Allocate GetAuthPolicyResp object
|
|
||||||
pGetAuthPolicyResp = malloc(sizeof(*pGetAuthPolicyResp));
|
|
||||||
if (pGetAuthPolicyResp)
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
|
|
||||||
// Initialize the GetAuthPolicyResp object and set it in the
|
|
||||||
// parse oject.
|
|
||||||
memset(pGetAuthPolicyResp, 0, sizeof(*pGetAuthPolicyResp));
|
|
||||||
getAuthPolicyRespParse.pGetAuthPolicyResp = pGetAuthPolicyResp;
|
|
||||||
|
|
||||||
// Create parser
|
|
||||||
p = XML_ParserCreate(NULL);
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
// Keep track of the parser in our parse object
|
|
||||||
getAuthPolicyRespParse.p = p;
|
|
||||||
|
|
||||||
// Initialize the status within the parse object
|
|
||||||
getAuthPolicyRespParse.status = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
// Set the start and end element handlers
|
|
||||||
XML_SetElementHandler(p,
|
|
||||||
GetAuthPolicyRespStartElementHandler,
|
|
||||||
GetAuthPolicyRespEndElementHandler);
|
|
||||||
|
|
||||||
// Set the character data handler
|
|
||||||
XML_SetCharacterDataHandler(p, GetAuthPolicyRespCharDataHandler);
|
|
||||||
|
|
||||||
|
|
||||||
// Set our user data
|
|
||||||
XML_SetUserData(p, &getAuthPolicyRespParse);
|
|
||||||
|
|
||||||
// Parse the document
|
|
||||||
if (XML_Parse(p, pRespMsg, respLen, 1) == XML_STATUS_OK)
|
|
||||||
{
|
|
||||||
// Verify that the parse operation completed successfully
|
|
||||||
if (getAuthPolicyRespParse.state == DONE_PARSING)
|
|
||||||
{
|
|
||||||
// The parse operation succeded, obtain the status returned
|
|
||||||
// by the server.
|
|
||||||
retStatus = getAuthPolicyRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthPolicyResp- Parse operation did not complete\n", 0);
|
|
||||||
|
|
||||||
// Check if a status has been recorded
|
|
||||||
if (getAuthPolicyRespParse.status != CASA_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
retStatus = getAuthPolicyRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthPolicyResp- Parse error %d\n", XML_GetErrorCode(p));
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the parser
|
|
||||||
XML_ParserFree(p);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthPolicyResp- Parser creation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the AuthenticationResp object to the caller if necessary
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
*ppGetAuthPolicyResp = pGetAuthPolicyResp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(pGetAuthPolicyResp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthPolicyResp- Memory allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateGetAuthPolicyResp- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
RelGetAuthPolicyResp(
|
|
||||||
IN GetAuthPolicyResp *pGetAuthPolicyResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-RelGetAuthPolicyResp- Start\n", 0);
|
|
||||||
|
|
||||||
// Free the buffer holding the authentication policy
|
|
||||||
if (pGetAuthPolicyResp->pPolicy)
|
|
||||||
free(pGetAuthPolicyResp->pPolicy);
|
|
||||||
|
|
||||||
// Free the GetAuthPolicyResp
|
|
||||||
free(pGetAuthPolicyResp);
|
|
||||||
|
|
||||||
DbgTrace(1, "-RelGetAuthPolicyResp- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,793 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Parse states
|
|
||||||
//
|
|
||||||
#define AWAITING_ROOT_ELEMENT_START 0x0
|
|
||||||
#define AWAITING_ROOT_ELEMENT_END 0x1
|
|
||||||
#define AWAITING_STATUS_ELEMENT_START 0x2
|
|
||||||
#define AWAITING_STATUS_ELEMENT_END 0x3
|
|
||||||
#define AWAITING_STATUS_DATA 0x4
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_START 0x5
|
|
||||||
#define AWAITING_DESCRIPTION_ELEMENT_END 0x6
|
|
||||||
#define AWAITING_DESCRIPTION_DATA 0x7
|
|
||||||
#define AWAITING_LIFETIME_DATA 0x8
|
|
||||||
#define AWAITING_LIFETIME_ELEMENT_START 0x9
|
|
||||||
#define AWAITING_LIFETIME_ELEMENT_END 0xA
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_START 0xB
|
|
||||||
#define AWAITING_AUTH_TOKEN_ELEMENT_END 0xC
|
|
||||||
#define AWAITING_AUTH_TOKEN_DATA 0xD
|
|
||||||
#define DONE_PARSING 0xE
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get Authentication Token Response Parse Structure
|
|
||||||
//
|
|
||||||
typedef struct _GetAuthTokenRespParse
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
int state;
|
|
||||||
int elementDataProcessed;
|
|
||||||
GetAuthTokenResp *pGetAuthTokenResp;
|
|
||||||
CasaStatus status;
|
|
||||||
|
|
||||||
} GetAuthTokenRespParse, *PGetAuthTokenRespParse;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
char*
|
|
||||||
BuildGetAuthTokenMsg(
|
|
||||||
IN char *pServiceName,
|
|
||||||
IN char *pHostName,
|
|
||||||
IN char *pSessionToken)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pMsg = NULL;
|
|
||||||
int bufferSize;
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildGetAuthTokenMsg- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* The format of the get authentication token request message
|
|
||||||
* is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_token_req>
|
|
||||||
* <service>service name</service>
|
|
||||||
* <host>host name</host>
|
|
||||||
* <session_token>session token data</session_token>
|
|
||||||
* </get_auth_token_req>
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Determine the buffer size necessary to hold the msg
|
|
||||||
bufferSize = strlen(XML_DECLARATION)
|
|
||||||
+ 2 // crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(GET_AUTH_TOKEN_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(SERVICE_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pServiceName)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(SERVICE_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(HOST_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pHostName)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(HOST_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 1 // <
|
|
||||||
+ strlen(SESSION_TOKEN_ELEMENT_NAME)
|
|
||||||
+ 1 // >
|
|
||||||
+ strlen(pSessionToken)
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(SESSION_TOKEN_ELEMENT_NAME)
|
|
||||||
+ 3 // >crlf
|
|
||||||
+ 2 // </
|
|
||||||
+ strlen(GET_AUTH_TOKEN_REQUEST_ELEMENT_NAME)
|
|
||||||
+ 2; // >null
|
|
||||||
|
|
||||||
// Allocate the msg buffer
|
|
||||||
pMsg = (char*) malloc(bufferSize);
|
|
||||||
if (pMsg)
|
|
||||||
{
|
|
||||||
// Now build the message
|
|
||||||
memset(pMsg, 0, bufferSize);
|
|
||||||
strcat(pMsg, XML_DECLARATION);
|
|
||||||
strcat(pMsg, "\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, GET_AUTH_TOKEN_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, SERVICE_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pServiceName);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, SERVICE_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, HOST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pHostName);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, HOST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "<");
|
|
||||||
strcat(pMsg, SESSION_TOKEN_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
strcat(pMsg, pSessionToken);
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, SESSION_TOKEN_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">\r\n");
|
|
||||||
strcat(pMsg, "</");
|
|
||||||
strcat(pMsg, GET_AUTH_TOKEN_REQUEST_ELEMENT_NAME);
|
|
||||||
strcat(pMsg, ">");
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-BuildGetAuthTokenMsg- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-BuildGetAuthTokenMsg- End, pMsg = %08X\n", pMsg);
|
|
||||||
|
|
||||||
return pMsg;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthTokenRespStartElementHandler(
|
|
||||||
IN GetAuthTokenRespParse *pGetAuthTokenRespParse,
|
|
||||||
IN const XML_Char *name,
|
|
||||||
IN const XML_Char **atts)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespStartElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthTokenRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Get Authentication
|
|
||||||
// Token Response Element.
|
|
||||||
if (strcmp(name, GET_AUTH_TOKEN_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_STATUS_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_DESCRIPTION_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_DESCRIPTION_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_TOKEN_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication Token Element.
|
|
||||||
if (strcmp(name, AUTH_TOKEN_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_LIFETIME_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_ELEMENT_START:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Lifetime Element.
|
|
||||||
if (strcmp(name, LIFETIME_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_LIFETIME_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespStartElementHandler- Un-expected state = %d\n", pGetAuthTokenRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespStartElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
ConsumeElementData(
|
|
||||||
IN GetAuthTokenRespParse *pGetAuthTokenRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len,
|
|
||||||
INOUT char **ppElementData,
|
|
||||||
INOUT int *pElementDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on whether or not we have already consumed data
|
|
||||||
// for this element.
|
|
||||||
if (*ppElementData == NULL)
|
|
||||||
{
|
|
||||||
// We have not yet consumed data for this element
|
|
||||||
pGetAuthTokenRespParse->elementDataProcessed = len;
|
|
||||||
|
|
||||||
// Allocate a buffer to hold this element data (null terminated).
|
|
||||||
*ppElementData = (char*) malloc(len + 1);
|
|
||||||
if (*ppElementData)
|
|
||||||
{
|
|
||||||
memset(*ppElementData, 0, len + 1);
|
|
||||||
memcpy(*ppElementData, s, len);
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pGetAuthTokenRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pNewBuf;
|
|
||||||
|
|
||||||
// We have already received token data, append this data to it.
|
|
||||||
pNewBuf = (char*) malloc(pGetAuthTokenRespParse->elementDataProcessed + len + 1);
|
|
||||||
if (pNewBuf)
|
|
||||||
{
|
|
||||||
memset(pNewBuf,
|
|
||||||
0,
|
|
||||||
pGetAuthTokenRespParse->elementDataProcessed + len + 1);
|
|
||||||
memcpy(pNewBuf,
|
|
||||||
*ppElementData,
|
|
||||||
pGetAuthTokenRespParse->elementDataProcessed);
|
|
||||||
memcpy(pNewBuf + pGetAuthTokenRespParse->elementDataProcessed, s, len);
|
|
||||||
pGetAuthTokenRespParse->elementDataProcessed += len;
|
|
||||||
|
|
||||||
// Swap the buffers
|
|
||||||
free(*ppElementData);
|
|
||||||
*ppElementData = pNewBuf;
|
|
||||||
|
|
||||||
// Return the length of the element data buffer
|
|
||||||
*pElementDataLen = pGetAuthTokenRespParse->elementDataProcessed + 1;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ConsumeElementData- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-ConsumeElementData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthTokenRespCharDataHandler(
|
|
||||||
IN GetAuthTokenRespParse *pGetAuthTokenRespParse,
|
|
||||||
IN const XML_Char *s,
|
|
||||||
IN int len)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespCharDataHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Just exit if being called to process white space
|
|
||||||
if (*s == '\n' || *s == '\r' || *s == '\t' || *s == ' ')
|
|
||||||
{
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthTokenRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_DESCRIPTION_DATA:
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// Ignore the status description data for now.
|
|
||||||
// tbd
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_DESCRIPTION_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_DATA:
|
|
||||||
|
|
||||||
// Set the appropriate status in the AuthenticationResp based on the
|
|
||||||
// returned status.
|
|
||||||
if (strncmp(HTTP_OK_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthTokenRespParse->status = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_UNAUTHORIZED_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthTokenRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_AUTHENTICATION_FAILURE);
|
|
||||||
}
|
|
||||||
else if (strncmp(HTTP_SERVER_ERROR_STATUS_CODE, s, len) == 0)
|
|
||||||
{
|
|
||||||
pGetAuthTokenRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_SERVER_ERROR);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespCharDataHandler- Un-expected status\n", 0);
|
|
||||||
pGetAuthTokenRespParse->status = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_STATUS_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_DATA:
|
|
||||||
|
|
||||||
// Convert the lifetime string to a numeric value
|
|
||||||
pGetAuthTokenRespParse->pGetAuthTokenResp->tokenLifetime = dtoul(s, len);
|
|
||||||
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_LIFETIME_ELEMENT_END;
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_TOKEN_DATA:
|
|
||||||
case AWAITING_AUTH_TOKEN_ELEMENT_END:
|
|
||||||
|
|
||||||
// Consume the data
|
|
||||||
pGetAuthTokenRespParse->status = ConsumeElementData(pGetAuthTokenRespParse,
|
|
||||||
s,
|
|
||||||
len,
|
|
||||||
&pGetAuthTokenRespParse->pGetAuthTokenResp->pToken,
|
|
||||||
&pGetAuthTokenRespParse->pGetAuthTokenResp->tokenLen);
|
|
||||||
if (CASA_SUCCESS(pGetAuthTokenRespParse->status))
|
|
||||||
{
|
|
||||||
// Advanced to the next state
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_AUTH_TOKEN_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespCharDataHandler- Un-expected state = %d\n", pGetAuthTokenRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespCharDataHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void XMLCALL
|
|
||||||
GetAuthTokenRespEndElementHandler(
|
|
||||||
IN GetAuthTokenRespParse *pGetAuthTokenRespParse,
|
|
||||||
IN const XML_Char *name)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespEndElementHandler- Start\n", 0);
|
|
||||||
|
|
||||||
// Proceed based on the state
|
|
||||||
switch (pGetAuthTokenRespParse->state)
|
|
||||||
{
|
|
||||||
case AWAITING_ROOT_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Get Authentication
|
|
||||||
// Token Response Element.
|
|
||||||
if (strcmp(name, GET_AUTH_TOKEN_RESPONSE_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Done.
|
|
||||||
pGetAuthTokenRespParse->state = DONE_PARSING;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_DESCRIPTION_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Description Element.
|
|
||||||
if (strcmp(name, DESCRIPTION_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_STATUS_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndElementHandler- Un-expected end element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_STATUS_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Status Element.
|
|
||||||
if (strcmp(name, STATUS_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state based on the status code.
|
|
||||||
if (CASA_SUCCESS(pGetAuthTokenRespParse->status))
|
|
||||||
{
|
|
||||||
// The request completed successfully
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_AUTH_TOKEN_ELEMENT_START;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_LIFETIME_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Lifetime Element.
|
|
||||||
if (strcmp(name, LIFETIME_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_AUTH_TOKEN_DATA;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case AWAITING_AUTH_TOKEN_ELEMENT_END:
|
|
||||||
|
|
||||||
// In this state, we are only expecting the Authentication Token Element.
|
|
||||||
if (strcmp(name, AUTH_TOKEN_ELEMENT_NAME) == 0)
|
|
||||||
{
|
|
||||||
// Good, advance to the next state.
|
|
||||||
pGetAuthTokenRespParse->state = AWAITING_ROOT_ELEMENT_END;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndElementHandler- Un-expected start element\n", 0);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
default:
|
|
||||||
DbgTrace(0, "-GetAuthTokenRespEndElementHandler- Un-expected state = %d\n", pGetAuthTokenRespParse->state);
|
|
||||||
XML_StopParser(pGetAuthTokenRespParse->p, XML_FALSE);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-GetAuthTokenRespEndElementHandler- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
CreateGetAuthTokenResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT GetAuthTokenResp **ppGetAuthTokenResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
GetAuthTokenRespParse getAuthTokenRespParse = {0};
|
|
||||||
GetAuthTokenResp *pGetAuthTokenResp;
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateGetAuthTokenResp- Start\n", 0);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* When a get authentication token request is processed successfully, the
|
|
||||||
* server replies to the client with a message with the following format:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_token_resp>
|
|
||||||
* <status><description>ok</description>200</status>
|
|
||||||
* <auth_token><lifetime>lifetime value</lifetime>session token data</auth_token>
|
|
||||||
* </get_auth_token_resp>
|
|
||||||
*
|
|
||||||
* When a get authentication token request fails to be successfully processed,
|
|
||||||
* the server responds with an error and an error description string. The message
|
|
||||||
* format of an unsuccessful reply is as follows:
|
|
||||||
*
|
|
||||||
* <?xml version="1.0" encoding="ISO-8859-1"?>
|
|
||||||
* <get_auth_token_resp>
|
|
||||||
* <status><description>status description</description>status code</status>
|
|
||||||
* </get_auth_token_resp>
|
|
||||||
*
|
|
||||||
* Plase note that the protocol utilizes the status codes defined
|
|
||||||
* in the HTTP 1.1 Specification.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
|
|
||||||
// Allocate GetAuthTokenResp object
|
|
||||||
pGetAuthTokenResp = malloc(sizeof(*pGetAuthTokenResp));
|
|
||||||
if (pGetAuthTokenResp)
|
|
||||||
{
|
|
||||||
XML_Parser p;
|
|
||||||
|
|
||||||
// Initialize the GetAuthTokenResp object and set it in the
|
|
||||||
// parse oject.
|
|
||||||
memset(pGetAuthTokenResp, 0, sizeof(*pGetAuthTokenResp));
|
|
||||||
getAuthTokenRespParse.pGetAuthTokenResp = pGetAuthTokenResp;
|
|
||||||
|
|
||||||
// Create parser
|
|
||||||
p = XML_ParserCreate(NULL);
|
|
||||||
if (p)
|
|
||||||
{
|
|
||||||
// Keep track of the parser in our parse object
|
|
||||||
getAuthTokenRespParse.p = p;
|
|
||||||
|
|
||||||
// Initialize the status within the parse object
|
|
||||||
getAuthTokenRespParse.status = CASA_STATUS_SUCCESS;
|
|
||||||
|
|
||||||
// Set the start and end element handlers
|
|
||||||
XML_SetElementHandler(p,
|
|
||||||
GetAuthTokenRespStartElementHandler,
|
|
||||||
GetAuthTokenRespEndElementHandler);
|
|
||||||
|
|
||||||
// Set the character data handler
|
|
||||||
XML_SetCharacterDataHandler(p, GetAuthTokenRespCharDataHandler);
|
|
||||||
|
|
||||||
|
|
||||||
// Set our user data
|
|
||||||
XML_SetUserData(p, &getAuthTokenRespParse);
|
|
||||||
|
|
||||||
// Parse the document
|
|
||||||
if (XML_Parse(p, pRespMsg, respLen, 1) == XML_STATUS_OK)
|
|
||||||
{
|
|
||||||
// Verify that the parse operation completed successfully
|
|
||||||
if (getAuthTokenRespParse.state == DONE_PARSING)
|
|
||||||
{
|
|
||||||
// The parse operation succeded, obtain the status returned
|
|
||||||
// by the server.
|
|
||||||
retStatus = getAuthTokenRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthTokenResp- Parse operation did not complete\n", 0);
|
|
||||||
|
|
||||||
// Check if a status has been recorded
|
|
||||||
if (getAuthTokenRespParse.status != CASA_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
retStatus = getAuthTokenRespParse.status;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthTokenResp- Parse error %d\n", XML_GetErrorCode(p));
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_PROTOCOL_ERROR);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the parser
|
|
||||||
XML_ParserFree(p);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthTokenResp- Parser creation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the AuthenticationResp object to the caller if necessary
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
*ppGetAuthTokenResp = pGetAuthTokenResp;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
free(pGetAuthTokenResp);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateGetAuthTokenResp- Memory allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
DbgTrace(1, "-CreateGetAuthTokenResp- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
RelGetAuthTokenResp(
|
|
||||||
IN GetAuthTokenResp *pGetAuthTokenResp)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-RelGetAuthTokenResp- Start\n", 0);
|
|
||||||
|
|
||||||
// Free the resources associated with the object
|
|
||||||
if (pGetAuthTokenResp->pToken)
|
|
||||||
free(pGetAuthTokenResp->pToken);
|
|
||||||
|
|
||||||
free(pGetAuthTokenResp);
|
|
||||||
|
|
||||||
DbgTrace(1, "-RelGetAuthTokenResp- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,369 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _INTERNAL_H_
|
|
||||||
#define _INTERNAL_H_
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "platform.h"
|
|
||||||
#include <expat.h>
|
|
||||||
#include <micasa_types.h>
|
|
||||||
#include <casa_status.h>
|
|
||||||
#include <casa_c_authtoken.h>
|
|
||||||
#include "list_entry.h"
|
|
||||||
#include "config_if.h"
|
|
||||||
#include "mech_if.h"
|
|
||||||
#include "proto.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Context structure
|
|
||||||
//
|
|
||||||
typedef struct _AuthContext
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
char *pContext;
|
|
||||||
int contextLen;
|
|
||||||
char *pMechanism;
|
|
||||||
int mechanismLen;
|
|
||||||
char *pMechInfo;
|
|
||||||
int mechInfoLen;
|
|
||||||
|
|
||||||
} AuthContext, *PAuthContext;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Policy structure
|
|
||||||
//
|
|
||||||
typedef struct _AuthPolicy
|
|
||||||
{
|
|
||||||
LIST_ENTRY authContextListHead;
|
|
||||||
|
|
||||||
} AuthPolicy, *PAuthPolicy;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get Authentication Policy Response structure
|
|
||||||
//
|
|
||||||
typedef struct _GetAuthPolicyResp
|
|
||||||
{
|
|
||||||
char *pPolicy;
|
|
||||||
int policyLen;
|
|
||||||
|
|
||||||
} GetAuthPolicyResp, *PGetAuthPolicyResp;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get Authentication Token Response structure
|
|
||||||
//
|
|
||||||
typedef struct _GetAuthTokenResp
|
|
||||||
{
|
|
||||||
char *pToken;
|
|
||||||
int tokenLen;
|
|
||||||
int tokenLifetime;
|
|
||||||
|
|
||||||
} GetAuthTokenResp, *PGetAuthTokenResp;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authenticate Response structure
|
|
||||||
//
|
|
||||||
typedef struct _AuthenticateResp
|
|
||||||
{
|
|
||||||
char *pToken;
|
|
||||||
int tokenLen;
|
|
||||||
int tokenLifetime;
|
|
||||||
|
|
||||||
} AuthenticateResp, *PAuthenticateResp;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
extern int DebugLevel;
|
|
||||||
|
|
||||||
extern char mechConfigFolder[];
|
|
||||||
|
|
||||||
extern char pathCharString[];
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by engine.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
int
|
|
||||||
InitializeLibrary(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by authmech.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
GetAuthMechToken(
|
|
||||||
IN AuthContext *pAuthContext,
|
|
||||||
INOUT char **ppAuthMechToken);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by getpolicymsg.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
char*
|
|
||||||
BuildGetAuthPolicyMsg(
|
|
||||||
IN char *pServiceName,
|
|
||||||
IN char *pHostName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
CreateGetAuthPolicyResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT GetAuthPolicyResp **ppGetAuthPolicyResp);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
RelGetAuthPolicyResp(
|
|
||||||
IN GetAuthPolicyResp *pGetAuthPolicyResp);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by authpolicy.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
CreateAuthPolicy(
|
|
||||||
IN char *pEncodedData,
|
|
||||||
IN int encodedDataLen,
|
|
||||||
INOUT AuthPolicy **ppAuthPolicy);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
RelAuthPolicy(
|
|
||||||
IN AuthPolicy *pAuthPolicy);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by authmsg.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
char*
|
|
||||||
BuildAuthenticateMsg(
|
|
||||||
IN AuthContext *pAuthContext,
|
|
||||||
IN char *pAuthMechToken);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
CreateAuthenticateResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT AuthenticateResp **ppAuthenticateResp);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
RelAuthenticateResp(
|
|
||||||
IN AuthenticateResp *pAuthenticateResp);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by gettokenmsg.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
char*
|
|
||||||
BuildGetAuthTokenMsg(
|
|
||||||
IN char *pServiceName,
|
|
||||||
IN char *pHostName,
|
|
||||||
IN char *pSessionToken);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
CreateGetAuthTokenResp(
|
|
||||||
IN char *pRespMsg,
|
|
||||||
IN int respLen,
|
|
||||||
INOUT GetAuthTokenResp **ppGetAuthTokenResp);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
RelGetAuthTokenResp(
|
|
||||||
IN GetAuthTokenResp *pGetAuthTokenResp);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by cache.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
AuthCacheEntry*
|
|
||||||
CreateSessionTokenCacheEntry(
|
|
||||||
IN const char *pCacheKey);
|
|
||||||
|
|
||||||
extern
|
|
||||||
AuthCacheEntry*
|
|
||||||
CreateAuthTokenCacheEntry(
|
|
||||||
IN const char *pCacheKey,
|
|
||||||
IN const char *pGroupOrHostName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
ReleaseAuthCacheEntry(
|
|
||||||
IN AuthCacheEntry *pEntry);
|
|
||||||
|
|
||||||
extern void
|
|
||||||
IncAuthCacheEntryRefCount(
|
|
||||||
IN AuthCacheEntry *pEntry);
|
|
||||||
|
|
||||||
extern
|
|
||||||
AuthCacheEntry*
|
|
||||||
FindSessionTokenEntryInCache(
|
|
||||||
IN const char *pCacheKey);
|
|
||||||
|
|
||||||
extern
|
|
||||||
AuthCacheEntry*
|
|
||||||
FindAuthTokenEntryInCache(
|
|
||||||
IN const char *pCacheKey,
|
|
||||||
IN const char *pGroupOrHostName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
AddEntryToAuthCache(
|
|
||||||
IN AuthCacheEntry *pEntry,
|
|
||||||
IN int entryLifetime);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
InitializeAuthCache(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by config.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
GetConfigInterface(
|
|
||||||
IN const char *pConfigFolder,
|
|
||||||
IN const char *pConfigName,
|
|
||||||
INOUT ConfigIf **ppConfigIf);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by platform.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
CreateUserMutex(void);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
AcquireUserMutex(void);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
ReleaseUserMutex(void);
|
|
||||||
|
|
||||||
extern
|
|
||||||
LIB_HANDLE
|
|
||||||
OpenLibrary(
|
|
||||||
IN char *pFileName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
CloseLibrary(
|
|
||||||
IN LIB_HANDLE libHandle);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void*
|
|
||||||
GetFunctionPtr(
|
|
||||||
IN LIB_HANDLE libHandle,
|
|
||||||
IN char *pFunctionName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
char*
|
|
||||||
NormalizeHostName(
|
|
||||||
IN const char *pHostName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
InitializeHostNameNormalization(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Functions exported by rpc.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
RpcSession*
|
|
||||||
OpenRpcSession(
|
|
||||||
IN char *pHostName);
|
|
||||||
|
|
||||||
extern
|
|
||||||
void
|
|
||||||
CloseRpcSession(
|
|
||||||
IN RpcSession *pSession);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
Rpc(
|
|
||||||
IN RpcSession *pSession,
|
|
||||||
IN char *pMethod,
|
|
||||||
IN bool secure,
|
|
||||||
IN char *pRequestData,
|
|
||||||
INOUT char **ppResponseData,
|
|
||||||
INOUT int *pResponseDataLen);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defined in utils.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
int
|
|
||||||
dtoul(
|
|
||||||
IN const char *cp,
|
|
||||||
IN const int len);
|
|
||||||
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
||||||
#endif // _INTERNAL_H_
|
|
||||||
|
|
@ -1,177 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef _MECH_IF_H_
|
|
||||||
#define _MECH_IF_H_
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
/**************************************************************************
|
|
||||||
***************************************************************************
|
|
||||||
** **
|
|
||||||
** Authentication Mechanism Token Interface Definitions **
|
|
||||||
** **
|
|
||||||
***************************************************************************
|
|
||||||
**************************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
int
|
|
||||||
(SSCS_CALL *PFNAuthTokenIf_AddReference)(
|
|
||||||
IN const void *pIfInstance);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Interface reference count.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Increases interface reference count.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
void
|
|
||||||
(SSCS_CALL *PFNAuthTokenIf_ReleaseReference)(
|
|
||||||
IN const void *pIfInstance);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Nothing.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Decreases interface reference count. The interface is deallocated if
|
|
||||||
// the reference count becomes zero.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
CasaStatus
|
|
||||||
(SSCS_CALL *PFNAuthTokenIf_GetAuthToken)(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pContext,
|
|
||||||
IN const char *pMechInfo,
|
|
||||||
INOUT char *pTokenBuf,
|
|
||||||
INOUT int *pTokenBufLen);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// pServiceConfigIf -
|
|
||||||
// Pointer to service config object to which the client is trying to
|
|
||||||
// authenticate.
|
|
||||||
//
|
|
||||||
// pContext -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// context information. Another name for context is Authentication
|
|
||||||
// Realm.
|
|
||||||
//
|
|
||||||
// pMechInfo -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// information. This is information is provided by the server to
|
|
||||||
// aid the mechanism to generate an authentication token. For
|
|
||||||
// example, the mechanism information for a Kerberos mechanism
|
|
||||||
// may be the service principal name to which the user will be
|
|
||||||
// authenticating.
|
|
||||||
//
|
|
||||||
// pTokenBuf -
|
|
||||||
// Pointer to buffer that will receive the authentication
|
|
||||||
// token. The length of this buffer is specified by the
|
|
||||||
// pTokenBufLen parameter. Note that the the authentication
|
|
||||||
// token will be in the form of a NULL terminated string.
|
|
||||||
//
|
|
||||||
// pTokenBufLen -
|
|
||||||
// Pointer to integer that contains the length of the
|
|
||||||
// buffer pointed at by pTokenBuf. Upon return of the
|
|
||||||
// function, the integer will contain the actual length
|
|
||||||
// of the authentication token if the function successfully
|
|
||||||
// completes or the buffer length required if the function
|
|
||||||
// fails because the buffer pointed at by pUserNameBuf is
|
|
||||||
// not large enough.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get authentication token to authenticate user to specified service.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// AuthMechToken Interface Object
|
|
||||||
//
|
|
||||||
typedef struct _AuthTokenIf
|
|
||||||
{
|
|
||||||
PFNAuthTokenIf_AddReference addReference;
|
|
||||||
PFNAuthTokenIf_ReleaseReference releaseReference;
|
|
||||||
PFNAuthTokenIf_GetAuthToken getAuthToken;
|
|
||||||
|
|
||||||
} AuthTokenIf, *PAuthTokenIf;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
typedef
|
|
||||||
CasaStatus
|
|
||||||
(SSCS_CALL *PFN_GetAuthTokenIfRtn)(
|
|
||||||
IN const ConfigIf *pModuleConfigIf,
|
|
||||||
INOUT AuthTokenIf **ppAuthTokenIf);
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pModuleConfigIf -
|
|
||||||
// Pointer to configuration interface instance for the module.
|
|
||||||
//
|
|
||||||
// ppAuthTokenIf -
|
|
||||||
// Pointer to variable that will receive pointer to AuthTokenIf
|
|
||||||
// instance.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Gets authentication token interface instance.
|
|
||||||
//=======================================================================--
|
|
||||||
|
|
||||||
#define GET_AUTH_TOKEN_INTERFACE_RTN_SYMBOL "GetAuthTokenInterface"
|
|
||||||
#define GET_AUTH_TOKEN_INTERFACE_RTN GetAuthTokenInterface
|
|
||||||
|
|
||||||
|
|
||||||
#endif // #ifndef _MECH_IF_H_
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
#######################################################
|
|
||||||
# #
|
|
||||||
# CASA Authentication Token System configuration file #
|
|
||||||
# for module: #
|
|
||||||
# #
|
|
||||||
# Krb5Authenticate #
|
|
||||||
# #
|
|
||||||
#######################################################
|
|
||||||
|
|
||||||
LibraryName \Program Files\novell\casa\lib\krb5mech.dll
|
|
||||||
|
|
||||||
|
|
@ -1,30 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* README for krb5mech
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
krb5mech is a client authentication mechanism for the support of Kerberos 5
|
|
||||||
authentication. The mechanism leverages the services of the native Kerberos 5
|
|
||||||
client to obtain Kerberos Tokens that can be used for authenticating an entity
|
|
||||||
to a Kerberos service.
|
|
||||||
|
|
||||||
|
|
||||||
SECURITY CONSIDERATIONS
|
|
||||||
|
|
||||||
The tokens that krb5mech generates are only utilized to authenticate the client
|
|
||||||
entity to the Kerberos service, because of this, auth_token relies on SSL for
|
|
||||||
server authentication. auth_token does not leverage the capabilities of GSSAPI
|
|
||||||
for data privacy and data integrity purposes.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* TODO for krb5mech
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
This file contains a list of the items still outstanding for krb5mech.
|
|
||||||
|
|
||||||
OUTSTANDING ITEMS
|
|
||||||
|
|
||||||
- Implementation of Linux specific code.
|
|
||||||
|
|
@ -1,207 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Token Interface instance data
|
|
||||||
//
|
|
||||||
typedef struct _AuthTokenIfInstance
|
|
||||||
{
|
|
||||||
int refCount;
|
|
||||||
AuthTokenIf authTokenIf;
|
|
||||||
|
|
||||||
} AuthTokenIfInstance, *PAuthTokenIfInstance;
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// AuthTokenIf variables
|
|
||||||
static
|
|
||||||
int g_numAuthTokenIfObjs = 0;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
int SSCS_CALL
|
|
||||||
AuthTokenIf_AddReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Interface reference count.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Increases interface reference count.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int refCount;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance = CONTAINING_RECORD(pIfInstance, AuthTokenIfInstance, authTokenIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_AddReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Increment the reference count on the object
|
|
||||||
pAuthTokenIfInstance->refCount ++;
|
|
||||||
refCount = pAuthTokenIfInstance->refCount;
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_AddReference- End, refCount = %08X\n", refCount);
|
|
||||||
|
|
||||||
return refCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void SSCS_CALL
|
|
||||||
AuthTokenIf_ReleaseReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Nothing.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Decreases interface reference count. The interface is deallocated if
|
|
||||||
// the reference count becomes zero.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
bool freeObj = false;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance = CONTAINING_RECORD(pIfInstance, AuthTokenIfInstance, authTokenIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_ReleaseReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Decrement the reference count on the object and determine if it needs to
|
|
||||||
// be released.
|
|
||||||
pAuthTokenIfInstance->refCount --;
|
|
||||||
if (pAuthTokenIfInstance->refCount == 0)
|
|
||||||
{
|
|
||||||
// The object needs to be released, forget about it.
|
|
||||||
freeObj = true;
|
|
||||||
g_numAuthTokenIfObjs --;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free object if necessary
|
|
||||||
if (freeObj)
|
|
||||||
free(pAuthTokenIfInstance);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_ReleaseReference- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
GET_AUTH_TOKEN_INTERFACE_RTN(
|
|
||||||
IN const ConfigIf *pModuleConfigIf,
|
|
||||||
INOUT AuthTokenIf **ppAuthTokenIf)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pModuleConfigIf -
|
|
||||||
// Pointer to configuration interface instance for the module.
|
|
||||||
//
|
|
||||||
// ppAuthTokenIf -
|
|
||||||
// Pointer to variable that will receive pointer to AuthTokenIf
|
|
||||||
// instance.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Gets authentication token interface instance.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthTokenInterface- Start\n", 0);
|
|
||||||
|
|
||||||
// Validate input parameters
|
|
||||||
if (pModuleConfigIf == NULL
|
|
||||||
|| ppAuthTokenIf == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenInterface- Invalid input parameter\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INVALID_PARAMETER);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate space for the interface instance
|
|
||||||
pAuthTokenIfInstance = malloc(sizeof(*pAuthTokenIfInstance));
|
|
||||||
if (pAuthTokenIfInstance)
|
|
||||||
{
|
|
||||||
// Initialize the interface instance data
|
|
||||||
pAuthTokenIfInstance->refCount = 1;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.addReference = AuthTokenIf_AddReference;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.releaseReference = AuthTokenIf_ReleaseReference;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.getAuthToken = AuthTokenIf_GetAuthToken;
|
|
||||||
|
|
||||||
// Keep track of this object
|
|
||||||
g_numAuthTokenIfObjs ++;
|
|
||||||
|
|
||||||
// Return the interface to the caller
|
|
||||||
*ppAuthTokenIf = &pAuthTokenIfInstance->authTokenIf;
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenInterface- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthTokenInterface- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,90 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _INTERNAL_H_
|
|
||||||
#define _INTERNAL_H_
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "platform.h"
|
|
||||||
#include <micasa_types.h>
|
|
||||||
#include <casa_status.h>
|
|
||||||
#include "config_if.h"
|
|
||||||
#include "mech_if.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
extern int DebugLevel;
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defined in get.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
AuthTokenIf_GetAuthToken(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pContext,
|
|
||||||
IN const char *pMechInfo,
|
|
||||||
INOUT char *pTokenBuf,
|
|
||||||
INOUT int *pTokenBufLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
int
|
|
||||||
InitializeLibrary(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defined in utils.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen);
|
|
||||||
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
||||||
#endif // _INTERNAL_H_
|
|
@ -1,182 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="krb5"
|
|
||||||
ProjectGUID="{5499F624-F371-4559-B4C2-A484BCE892FD}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\mechanisms\krb5\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\mechanisms\krb5\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="-DSECURITY_WIN32"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="windows;.;..\..;..\..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/EXPORT:GetAuthTokenInterface"
|
|
||||||
AdditionalDependencies="secur32.lib"
|
|
||||||
OutputFile="$(OutDir)/krb5mech.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/pw.pdb"
|
|
||||||
SubSystem="0"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\mechanisms\
|
|
||||||
copy Krb5Authenticate.conf \"Program Files"\novell\casa\etc\auth\mechanisms\Krb5Authenticate.conf
|
|
||||||
copy $(OutDir)\krb5mech.dll \"Program Files"\novell\casa\lib\krb5mech.dll
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\mechanisms\krb5\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\mechanisms\krb5\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalOptions="-DSECURITY_WIN32"
|
|
||||||
AdditionalIncludeDirectories="windows;.;..\..;..\..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/EXPORT:GetAuthTokenInterface"
|
|
||||||
AdditionalDependencies="secur32.lib"
|
|
||||||
OutputFile="$(OutDir)/krb5mech.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="0"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\mechanisms\
|
|
||||||
copy Krb5Authenticate.conf \"Program Files"\novell\casa\etc\auth\mechanisms\Krb5Authenticate.conf
|
|
||||||
copy $(OutDir)\krb5mech.dll \"Program Files"\novell\casa\lib\krb5mech.dll
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\dllsup.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\get.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\interface.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\Krb5Authenticate.conf">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\win32\krb5mech.def">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\util.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\internal.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -1,282 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// Debug Level
|
|
||||||
int DebugLevel = 0;
|
|
||||||
|
|
||||||
// Tables for Base64 encoding and decoding
|
|
||||||
static const int8_t g_Base64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
|
|
||||||
static const uint8_t g_Expand64[256] =
|
|
||||||
{
|
|
||||||
/* ASCII table */
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
||||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
|
|
||||||
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int encodedSize;
|
|
||||||
|
|
||||||
char *pTmp;
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the encoded size and allocate a buffer to hold the encoded data
|
|
||||||
encodedSize = ((dataLen * 4 + 2) / 3) - (dataLen % 3 ) + 4;
|
|
||||||
pTmp = (char*) malloc(encodedSize);
|
|
||||||
*ppEncodedData = pTmp;
|
|
||||||
if (*ppEncodedData)
|
|
||||||
{
|
|
||||||
uint8_t *pOut, *pIn;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// Setup pointers to move through the buffers
|
|
||||||
pIn = (uint8_t*) pData;
|
|
||||||
pOut = (uint8_t*) *ppEncodedData;
|
|
||||||
|
|
||||||
// Perform the encoding
|
|
||||||
for (i = 0; i < dataLen - 2; i += 3)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2) |
|
|
||||||
((int32_t)(pIn[i + 2] & 0xC0) >> 6)];
|
|
||||||
*pOut++ = g_Base64[pIn[i + 2] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < dataLen)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
if (i == (dataLen - 1))
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4)];
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
*pOut++ = '\0';
|
|
||||||
|
|
||||||
// Return the encoded data length
|
|
||||||
*pEncodedDataLen = (int32_t)(pOut - (uint8_t*)*ppEncodedData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-EncodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int i, j;
|
|
||||||
int decodedSize;
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the decoded size
|
|
||||||
for (i = 0, j = 0; i < encodedDataLen; i++)
|
|
||||||
if (g_Expand64[((uint8_t*) pEncodedData)[i]] < 64)
|
|
||||||
j++;
|
|
||||||
decodedSize = (j * 3 + 3) / 4;
|
|
||||||
|
|
||||||
// Allocate buffer to hold the decoded data
|
|
||||||
*ppData = malloc(decodedSize);
|
|
||||||
if (*ppData)
|
|
||||||
{
|
|
||||||
bool endReached = false;
|
|
||||||
uint8_t c0, c1, c2, c3;
|
|
||||||
uint8_t *p, *q;
|
|
||||||
|
|
||||||
// Initialize parameters that will be used during the decode operation
|
|
||||||
c0 = c1 = c2 = c3 = 0;
|
|
||||||
p = (uint8_t*) pEncodedData;
|
|
||||||
q = (uint8_t*) *ppData;
|
|
||||||
|
|
||||||
// Decode the data
|
|
||||||
//
|
|
||||||
// Loop through the data, piecing back information. Any newlines, and/or
|
|
||||||
// carriage returns need to be skipped.
|
|
||||||
while (j > 4)
|
|
||||||
{
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c0 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2);
|
|
||||||
j--;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c1 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4);
|
|
||||||
j -= 2;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c2 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6);
|
|
||||||
j -= 3;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c3 = *(p++);
|
|
||||||
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6 | g_Expand64[c3]);
|
|
||||||
j -= 4;
|
|
||||||
}
|
|
||||||
if (!endReached)
|
|
||||||
{
|
|
||||||
if (j > 1)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[*p] << 2 | g_Expand64[p[1]] >> 4);
|
|
||||||
if (j > 2)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[1]] << 4 | g_Expand64[p[2]] >> 2);
|
|
||||||
if (j > 3)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[2]] << 6 | g_Expand64[p[3]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the length of the decoded data
|
|
||||||
*pDataLen = (int32_t)(q - (uint8_t*)*ppData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-DecodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ External data ]=====================================================
|
|
||||||
|
|
||||||
//===[ Manifest constants ]================================================
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
UINT32 g_ulCount = 0;
|
|
||||||
UINT32 g_ulLock = 0;
|
|
||||||
HANDLE g_hModule;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
BOOL APIENTRY DllMain(
|
|
||||||
HANDLE hModule,
|
|
||||||
DWORD ul_reason_for_call,
|
|
||||||
LPVOID lpReserved
|
|
||||||
)
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
BOOL retStatus = TRUE;
|
|
||||||
|
|
||||||
switch (ul_reason_for_call)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
|
|
||||||
// Initialize the library
|
|
||||||
if (InitializeLibrary() != 0)
|
|
||||||
{
|
|
||||||
// Failed to initialize the library
|
|
||||||
OutputDebugString("CASA_KRB5_MECH -DllMain- Library initialization failed\n");
|
|
||||||
retStatus = FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
{
|
|
||||||
/* Don't uninitialize on windows
|
|
||||||
tbd
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//
|
|
||||||
// DllCanUnloadNow
|
|
||||||
//
|
|
||||||
// Synopsis
|
|
||||||
//
|
|
||||||
//
|
|
||||||
STDAPI
|
|
||||||
DllCanUnloadNow()
|
|
||||||
//
|
|
||||||
// Input Arguments
|
|
||||||
//
|
|
||||||
// Ouput Arguments
|
|
||||||
//
|
|
||||||
// Return Value
|
|
||||||
// S_OK The DLL can be unloaded.
|
|
||||||
// S_FALSE The DLL cannot be unloaded now.
|
|
||||||
//
|
|
||||||
// Description
|
|
||||||
// An Exported Function.
|
|
||||||
// DLLs that support the OLE Component Object Model (COM) should implement
|
|
||||||
// and export DllCanUnloadNow.
|
|
||||||
// A call to DllCanUnloadNow determines whether the DLL from which it is
|
|
||||||
// exported is still in use. A DLL is no longer in use when it is not
|
|
||||||
// managing any existing objects (the reference count on all of its objects
|
|
||||||
// is 0).
|
|
||||||
// DllCanUnloadNow returns S_FALSE if there are any existing references to
|
|
||||||
// objects that the DLL manages.
|
|
||||||
//
|
|
||||||
// Environment
|
|
||||||
//
|
|
||||||
// See Also
|
|
||||||
//
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
// tbd
|
|
||||||
return ((g_ulCount == 0 && g_ulLock == 0) ? S_OK : S_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
//=========================================================================
|
|
||||||
|
|
@ -1,272 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
AuthTokenIf_GetAuthToken(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pContext,
|
|
||||||
IN const char *pMechInfo,
|
|
||||||
INOUT char *pTokenBuf,
|
|
||||||
INOUT int *pTokenBufLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// pServiceConfigIf -
|
|
||||||
// Pointer to service config object to which the client is trying to
|
|
||||||
// authenticate.
|
|
||||||
//
|
|
||||||
// pContext -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// context information. Another name for context is Authentication
|
|
||||||
// Realm.
|
|
||||||
//
|
|
||||||
// pMechInfo -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// information. This is information is provided by the server to
|
|
||||||
// aid the mechanism to generate an authentication token. For
|
|
||||||
// example, the mechanism information for a Kerberos mechanism
|
|
||||||
// may be the service principal name to which the user will be
|
|
||||||
// authenticating.
|
|
||||||
//
|
|
||||||
// pTokenBuf -
|
|
||||||
// Pointer to buffer that will receive the authentication
|
|
||||||
// token. The length of this buffer is specified by the
|
|
||||||
// pTokenBufLen parameter. Note that the the authentication
|
|
||||||
// token will be in the form of a NULL terminated string.
|
|
||||||
//
|
|
||||||
// pTokenBufLen -
|
|
||||||
// Pointer to integer that contains the length of the
|
|
||||||
// buffer pointed at by pTokenBuf. Upon return of the
|
|
||||||
// function, the integer will contain the actual length
|
|
||||||
// of the authentication token if the function successfully
|
|
||||||
// completes or the buffer length required if the function
|
|
||||||
// fails because the buffer pointed at by pUserNameBuf is
|
|
||||||
// not large enough.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get authentication token to authenticate user to specified service.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
char *pKrbServiceName = pMechInfo;
|
|
||||||
SECURITY_STATUS secStatus;
|
|
||||||
TimeStamp expiry;
|
|
||||||
CredHandle hCredentials = {0};
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- Start\n", 0);
|
|
||||||
|
|
||||||
// Validate input parameters
|
|
||||||
if (pIfInstance == NULL
|
|
||||||
|| pContext == NULL
|
|
||||||
|| pMechInfo == NULL
|
|
||||||
|| pTokenBufLen == NULL
|
|
||||||
|| (pTokenBuf == NULL && *pTokenBufLen != 0))
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthTokenIf_GetAuthToken- Invalid input parameter\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_KRB5TOKEN,
|
|
||||||
CASA_STATUS_INVALID_PARAMETER);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Acquire a credential handle for the current user
|
|
||||||
secStatus = AcquireCredentialsHandle(NULL, // no principal name
|
|
||||||
"Kerberos", // package name
|
|
||||||
SECPKG_CRED_OUTBOUND,
|
|
||||||
NULL, // no logon id
|
|
||||||
NULL, // no auth data
|
|
||||||
NULL, // no get key fn
|
|
||||||
NULL, // noget key arg
|
|
||||||
&hCredentials,
|
|
||||||
&expiry);
|
|
||||||
if (secStatus == SEC_E_OK)
|
|
||||||
{
|
|
||||||
CtxtHandle hContext = {0};
|
|
||||||
SecBuffer sendTok;
|
|
||||||
SecBufferDesc outputDesc;
|
|
||||||
ULONG retFlags;
|
|
||||||
|
|
||||||
// We acquired the credential, now initialize a security context
|
|
||||||
// so that we can authenticate the user to the specified service.
|
|
||||||
//
|
|
||||||
// First ready an output descriptor so that we can receive the
|
|
||||||
// token buffer.
|
|
||||||
outputDesc.cBuffers = 1;
|
|
||||||
outputDesc.pBuffers = &sendTok;
|
|
||||||
outputDesc.ulVersion = SECBUFFER_VERSION;
|
|
||||||
|
|
||||||
sendTok.BufferType = SECBUFFER_TOKEN;
|
|
||||||
sendTok.cbBuffer = 0;
|
|
||||||
sendTok.pvBuffer = NULL;
|
|
||||||
|
|
||||||
// Initialize the security context for the specified service
|
|
||||||
secStatus = InitializeSecurityContext(&hCredentials,
|
|
||||||
NULL,
|
|
||||||
pKrbServiceName,
|
|
||||||
ISC_REQ_ALLOCATE_MEMORY,
|
|
||||||
0, // reserved
|
|
||||||
SECURITY_NATIVE_DREP,
|
|
||||||
NULL,
|
|
||||||
0, // reserved
|
|
||||||
&hContext,
|
|
||||||
&outputDesc,
|
|
||||||
&retFlags,
|
|
||||||
&expiry);
|
|
||||||
if (secStatus == SEC_E_OK)
|
|
||||||
{
|
|
||||||
char *pEncodedToken;
|
|
||||||
int encodedTokenLen;
|
|
||||||
|
|
||||||
// The security context was initialized, now return it to the caller after base64 encoding it.
|
|
||||||
retStatus = EncodeData(sendTok.pvBuffer,
|
|
||||||
(const int) sendTok.cbBuffer,
|
|
||||||
&pEncodedToken,
|
|
||||||
&encodedTokenLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Verify that the caller provided a buffer that is big enough
|
|
||||||
if (encodedTokenLen > *pTokenBufLen)
|
|
||||||
{
|
|
||||||
// The buffer is not big enough
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_KRB5TOKEN,
|
|
||||||
CASA_STATUS_BUFFER_OVERFLOW);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The buffer provided is large enough, copy the data.
|
|
||||||
memcpy((void*) pTokenBuf, pEncodedToken, encodedTokenLen);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the actual size or the size required
|
|
||||||
*pTokenBufLen = encodedTokenLen;
|
|
||||||
|
|
||||||
// Free the buffer containing the encoded token
|
|
||||||
free(pEncodedToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Delete the security context
|
|
||||||
DeleteSecurityContext(&hContext);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthTokenIf_GetAuthToken- Failed to initialize the security context, error = %08X\n", secStatus);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_KRB5TOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free any buffer associated with the sendToken
|
|
||||||
if (sendTok.pvBuffer)
|
|
||||||
FreeContextBuffer(sendTok.pvBuffer);
|
|
||||||
|
|
||||||
// Free the credential handle obtained
|
|
||||||
FreeCredentialsHandle(&hCredentials);
|
|
||||||
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- Failed to obtain the credentials handle, error = %08X\n", secStatus);
|
|
||||||
|
|
||||||
// Set retStatus based on secStatus
|
|
||||||
if (secStatus == SEC_E_NOT_OWNER
|
|
||||||
|| secStatus == SEC_E_NO_CREDENTIALS)
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_KRB5TOKEN,
|
|
||||||
CASA_STATUS_NO_CREDENTIALS);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_KRB5TOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
int
|
|
||||||
InitializeLibrary(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int retStatus = 0;
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- Start\n", 0);
|
|
||||||
|
|
||||||
// Nothing to do at this time.
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
LIBRARY KRB5MECH
|
|
||||||
DESCRIPTION 'CASA Kerberos V Authentication Mechanism Library.'
|
|
||||||
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
; DllRegisterServer PRIVATE
|
|
||||||
; DllUnregisterServer PRIVATE
|
|
||||||
; DllGetClassObject PRIVATE
|
|
||||||
GetAuthTokenInterface PRIVATE
|
|
||||||
; DllCanUnloadNow PRIVATE
|
|
@ -1,35 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
@ -1,83 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _PLATFORM_H_
|
|
||||||
#define _PLATFORM_H_
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <winerror.h>
|
|
||||||
#include <security.h>
|
|
||||||
#include <sspi.h>
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
#ifndef CONTAINING_RECORD
|
|
||||||
#define CONTAINING_RECORD(address, type, field) ((type *)( \
|
|
||||||
(char*)(address) - \
|
|
||||||
(char*)(&((type *)0)->field)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// DbgTrace macro define
|
|
||||||
//
|
|
||||||
//#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
//char printBuff[256]; \
|
|
||||||
// if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
// { \
|
|
||||||
// _snprintf(printBuff, sizeof(printBuff), X, Y); \
|
|
||||||
// printf("Krb5Mech %s", printBuff); \
|
|
||||||
// } \
|
|
||||||
//}
|
|
||||||
#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
char formatBuff[128]; \
|
|
||||||
char printBuff[256]; \
|
|
||||||
if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
{ \
|
|
||||||
strcpy(formatBuff, "Krb5Mech "); \
|
|
||||||
strncat(formatBuff, X, sizeof(formatBuff) - 9); \
|
|
||||||
_snprintf(printBuff, sizeof(printBuff), formatBuff, Y); \
|
|
||||||
OutputDebugString(printBuff); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define bool BOOLEAN
|
|
||||||
#define true TRUE
|
|
||||||
#define false FALSE
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
||||||
#endif // _PLATFORM_H_
|
|
||||||
|
|
@ -1,12 +0,0 @@
|
|||||||
#######################################################
|
|
||||||
# #
|
|
||||||
# CASA Authentication Token System configuration file #
|
|
||||||
# for module: #
|
|
||||||
# #
|
|
||||||
# PwdAuthenticate #
|
|
||||||
# #
|
|
||||||
#######################################################
|
|
||||||
|
|
||||||
LibraryName \Program Files\novell\casa\lib\pwmech.dll
|
|
||||||
|
|
||||||
|
|
@ -1,27 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* README for pwmech
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
pwmech is a client authentication mechanism for the support of username
|
|
||||||
and password authenticaton. The mechanism leverages the credentials stored
|
|
||||||
in the miCASA cache and does not prompt the user for credentials.
|
|
||||||
|
|
||||||
SECURITY CONSIDERATIONS
|
|
||||||
|
|
||||||
The tokens that pwmech generates contain the user's username and password,
|
|
||||||
this mandates that the auth_token client utilize a secure channel when
|
|
||||||
transfering them to the ATS.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
@ -1,14 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* TODO for pwmech
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
INTRODUCTION
|
|
||||||
|
|
||||||
This file contains a list of the items still outstanding for pwmech.
|
|
||||||
|
|
||||||
OUTSTANDING ITEMS
|
|
||||||
|
|
||||||
- Implementation of Linux specific code.
|
|
||||||
|
|
@ -1,359 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
GetUserCredentials(
|
|
||||||
IN const char *pRealm,
|
|
||||||
INOUT char **ppUsername,
|
|
||||||
INOUT char **ppPassword)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pRealm -
|
|
||||||
// The realm to which the credentials apply.
|
|
||||||
//
|
|
||||||
// ppUsername -
|
|
||||||
// Pointer to variable that will receive buffer with the username.
|
|
||||||
//
|
|
||||||
// ppPassword -
|
|
||||||
// Pointer to variable that will receive buffer with the password.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get authentication credentials for the specified realm.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
char *pUsername;
|
|
||||||
char *pPassword;
|
|
||||||
int rcode = NSSCS_E_OBJECT_NOT_FOUND;
|
|
||||||
int32_t credtype = SSCS_CRED_TYPE_BASIC_F;
|
|
||||||
SSCS_BASIC_CREDENTIAL credential = {0};
|
|
||||||
SSCS_SECRET_ID_T secretId = {0};
|
|
||||||
SSCS_SECRET_ID_T sharedSecretId = {0};
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetUserCredentials- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize output parameters
|
|
||||||
*ppUsername = NULL;
|
|
||||||
*ppPassword = NULL;
|
|
||||||
|
|
||||||
// Get the length of the realm string into the secret id structure
|
|
||||||
// and verify thatr it is not too long.
|
|
||||||
secretId.len = sscs_Utf8Strlen(pRealm) + 1;
|
|
||||||
if (secretId.len <= NSSCS_MAX_SECRET_ID_LEN)
|
|
||||||
{
|
|
||||||
// Set the secret id in the structure
|
|
||||||
sscs_Utf8Strcpy(secretId.id, pRealm);
|
|
||||||
|
|
||||||
// Specify that we want the common name
|
|
||||||
credential.unFlags = USERNAME_TYPE_CN_F;
|
|
||||||
|
|
||||||
// Now try to get the credentials
|
|
||||||
rcode = miCASAGetCredential(0,
|
|
||||||
&secretId,
|
|
||||||
NULL,
|
|
||||||
&credtype,
|
|
||||||
&credential,
|
|
||||||
NULL);
|
|
||||||
if (rcode != NSSCS_SUCCESS)
|
|
||||||
{
|
|
||||||
// There were no credentials for the realm, now try to obtain the
|
|
||||||
// desktop credentials.
|
|
||||||
secretId.len = sscs_Utf8Strlen("Desktop") + 1;
|
|
||||||
sscs_Utf8Strcpy(secretId.id, "Desktop");
|
|
||||||
rcode = miCASAGetCredential(0,
|
|
||||||
&secretId,
|
|
||||||
NULL,
|
|
||||||
&credtype,
|
|
||||||
&credential,
|
|
||||||
NULL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetUserCredentials- Realm name too long\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on the result of the operatiosn above
|
|
||||||
if (rcode == NSSCS_SUCCESS
|
|
||||||
&& credential.username != NULL
|
|
||||||
&& credential.password != NULL)
|
|
||||||
{
|
|
||||||
// Allocate a buffer to return the username
|
|
||||||
pUsername = (char*) malloc(strlen(credential.username) + 1);
|
|
||||||
if (pUsername)
|
|
||||||
{
|
|
||||||
// Copy the username into the buffer that we will be returning
|
|
||||||
strcpy(pUsername, credential.username);
|
|
||||||
|
|
||||||
// Allocate a buffer to return the password
|
|
||||||
pPassword = (char*) malloc(strlen(credential.password) + 1);
|
|
||||||
if (pPassword)
|
|
||||||
{
|
|
||||||
// Copy the password into the buffer that we will be returning
|
|
||||||
strcpy(pPassword, credential.password);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetUserCredentials- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
|
|
||||||
// Free the buffer allocated for the username
|
|
||||||
free(pUsername);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetUserCredentials- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the buffers to the caller if successful
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
*ppUsername = pUsername;
|
|
||||||
*ppPassword = pPassword;
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetUserCredentials- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
AuthTokenIf_GetAuthToken(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pContext,
|
|
||||||
IN const char *pMechInfo,
|
|
||||||
INOUT char *pTokenBuf,
|
|
||||||
INOUT int *pTokenBufLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// pServiceConfigIf -
|
|
||||||
// Pointer to service config object to which the client is trying to
|
|
||||||
// authenticate.
|
|
||||||
//
|
|
||||||
// pContext -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// context information. Another name for context is Authentication
|
|
||||||
// Realm.
|
|
||||||
//
|
|
||||||
// pMechInfo -
|
|
||||||
// Pointer to null terminated string containing mechanism specific
|
|
||||||
// information. This is information is provided by the server to
|
|
||||||
// aid the mechanism to generate an authentication token. For
|
|
||||||
// example, the mechanism information for a Kerberos mechanism
|
|
||||||
// may be the service principal name to which the user will be
|
|
||||||
// authenticating.
|
|
||||||
//
|
|
||||||
// pTokenBuf -
|
|
||||||
// Pointer to buffer that will receive the authentication
|
|
||||||
// token. The length of this buffer is specified by the
|
|
||||||
// pTokenBufLen parameter. Note that the the authentication
|
|
||||||
// token will be in the form of a NULL terminated string.
|
|
||||||
//
|
|
||||||
// pTokenBufLen -
|
|
||||||
// Pointer to integer that contains the length of the
|
|
||||||
// buffer pointed at by pTokenBuf. Upon return of the
|
|
||||||
// function, the integer will contain the actual length
|
|
||||||
// of the authentication token if the function successfully
|
|
||||||
// completes or the buffer length required if the function
|
|
||||||
// fails because the buffer pointed at by pUserNameBuf is
|
|
||||||
// not large enough.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Get authentication token to authenticate user to specified service.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
char *pUsername = NULL;
|
|
||||||
char *pPassword = NULL;
|
|
||||||
char *pToken;
|
|
||||||
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- Start\n", 0);
|
|
||||||
|
|
||||||
// Validate input parameters
|
|
||||||
if (pIfInstance == NULL
|
|
||||||
|| pContext == NULL
|
|
||||||
|| pMechInfo == NULL
|
|
||||||
|| pTokenBufLen == NULL
|
|
||||||
|| (pTokenBuf == NULL && *pTokenBufLen != 0))
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthTokenIf_GetAuthToken- Invalid input parameter\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INVALID_PARAMETER);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Get the user credentials
|
|
||||||
retStatus = GetUserCredentials(pContext, &pUsername, &pPassword);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Now construct the PW token with the following format:
|
|
||||||
// "username\r\n" + "password\r\n"
|
|
||||||
//
|
|
||||||
// First allocate a buffer large enough to hold the token
|
|
||||||
pToken = (char*) malloc(strlen(pUsername) + 2 + strlen(pPassword) + 2 + 1);
|
|
||||||
if (pToken)
|
|
||||||
{
|
|
||||||
char *pEncodedToken;
|
|
||||||
int encodedTokenLen;
|
|
||||||
|
|
||||||
// Now assemble the token
|
|
||||||
sprintf(pToken, "%s\r\n%s\r\n", pUsername, pPassword);
|
|
||||||
|
|
||||||
// The token has been assembled, now encode it.
|
|
||||||
retStatus = EncodeData(pToken,
|
|
||||||
(const int) strlen(pToken),
|
|
||||||
&pEncodedToken,
|
|
||||||
&encodedTokenLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// Verify that the caller provided a buffer that is big enough
|
|
||||||
if (encodedTokenLen > *pTokenBufLen)
|
|
||||||
{
|
|
||||||
// The buffer is not big enough
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_BUFFER_OVERFLOW);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The buffer provided is large enough, copy the data.
|
|
||||||
memcpy((void*) pTokenBuf, pEncodedToken, encodedTokenLen);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the actual size or the size required
|
|
||||||
*pTokenBufLen = encodedTokenLen;
|
|
||||||
|
|
||||||
// Free the buffer containing the encoded token
|
|
||||||
free(pEncodedToken);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the buffer allocated for the token
|
|
||||||
free(pToken);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-AuthTokenIf_GetAuthToken- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free allocated buffers
|
|
||||||
free(pUsername);
|
|
||||||
free(pPassword);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- Failed to obtain the user credentials\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(1, "-AuthTokenIf_GetAuthToken- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
int
|
|
||||||
InitializeLibrary(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int retStatus = 0;
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- Start\n", 0);
|
|
||||||
|
|
||||||
// Nothing to do at this time.
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeLibrary- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,207 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Authentication Token Interface instance data
|
|
||||||
//
|
|
||||||
typedef struct _AuthTokenIfInstance
|
|
||||||
{
|
|
||||||
int refCount;
|
|
||||||
AuthTokenIf authTokenIf;
|
|
||||||
|
|
||||||
} AuthTokenIfInstance, *PAuthTokenIfInstance;
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// AuthTokenIf variables
|
|
||||||
static
|
|
||||||
int g_numAuthTokenIfObjs = 0;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
int SSCS_CALL
|
|
||||||
AuthTokenIf_AddReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Interface reference count.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Increases interface reference count.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int refCount;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance = CONTAINING_RECORD(pIfInstance, AuthTokenIfInstance, authTokenIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_AddReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Increment the reference count on the object
|
|
||||||
pAuthTokenIfInstance->refCount ++;
|
|
||||||
refCount = pAuthTokenIfInstance->refCount;
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_AddReference- End, refCount = %08X\n", refCount);
|
|
||||||
|
|
||||||
return refCount;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
void SSCS_CALL
|
|
||||||
AuthTokenIf_ReleaseReference(
|
|
||||||
IN const void *pIfInstance)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pIfInstance -
|
|
||||||
// Pointer to interface object.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Nothing.
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Decreases interface reference count. The interface is deallocated if
|
|
||||||
// the reference count becomes zero.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
bool freeObj = false;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance = CONTAINING_RECORD(pIfInstance, AuthTokenIfInstance, authTokenIf);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_ReleaseReference- Start\n", 0);
|
|
||||||
|
|
||||||
// Decrement the reference count on the object and determine if it needs to
|
|
||||||
// be released.
|
|
||||||
pAuthTokenIfInstance->refCount --;
|
|
||||||
if (pAuthTokenIfInstance->refCount == 0)
|
|
||||||
{
|
|
||||||
// The object needs to be released, forget about it.
|
|
||||||
freeObj = true;
|
|
||||||
g_numAuthTokenIfObjs --;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free object if necessary
|
|
||||||
if (freeObj)
|
|
||||||
free(pAuthTokenIfInstance);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AuthTokenIf_ReleaseReference- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
GET_AUTH_TOKEN_INTERFACE_RTN(
|
|
||||||
IN const ConfigIf *pModuleConfigIf,
|
|
||||||
INOUT AuthTokenIf **ppAuthTokenIf)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
// pModuleConfigIf -
|
|
||||||
// Pointer to configuration interface instance for the module.
|
|
||||||
//
|
|
||||||
// ppAuthTokenIf -
|
|
||||||
// Pointer to variable that will receive pointer to AuthTokenIf
|
|
||||||
// instance.
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
// Casa Status
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
// Gets authentication token interface instance.
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
AuthTokenIfInstance *pAuthTokenIfInstance;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthTokenInterface- Start\n", 0);
|
|
||||||
|
|
||||||
// Validate input parameters
|
|
||||||
if (pModuleConfigIf == NULL
|
|
||||||
|| ppAuthTokenIf == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenInterface- Invalid input parameter\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INVALID_PARAMETER);
|
|
||||||
goto exit;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate space for the interface instance
|
|
||||||
pAuthTokenIfInstance = malloc(sizeof(*pAuthTokenIfInstance));
|
|
||||||
if (pAuthTokenIfInstance)
|
|
||||||
{
|
|
||||||
// Initialize the interface instance data
|
|
||||||
pAuthTokenIfInstance->refCount = 1;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.addReference = AuthTokenIf_AddReference;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.releaseReference = AuthTokenIf_ReleaseReference;
|
|
||||||
pAuthTokenIfInstance->authTokenIf.getAuthToken = AuthTokenIf_GetAuthToken;
|
|
||||||
|
|
||||||
// Keep track of this object
|
|
||||||
g_numAuthTokenIfObjs ++;
|
|
||||||
|
|
||||||
// Return the interface to the caller
|
|
||||||
*ppAuthTokenIf = &pAuthTokenIfInstance->authTokenIf;
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetAuthTokenInterface- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
exit:
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetAuthTokenInterface- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,92 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _INTERNAL_H_
|
|
||||||
#define _INTERNAL_H_
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "platform.h"
|
|
||||||
#include <micasa_types.h>
|
|
||||||
#include <micasa_mgmd.h>
|
|
||||||
#include <sscs_utf8.h>
|
|
||||||
#include <casa_status.h>
|
|
||||||
#include "config_if.h"
|
|
||||||
#include "mech_if.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
extern int DebugLevel;
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defined in get.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus SSCS_CALL
|
|
||||||
AuthTokenIf_GetAuthToken(
|
|
||||||
IN const void *pIfInstance,
|
|
||||||
IN const char *pContext,
|
|
||||||
IN const char *pMechInfo,
|
|
||||||
INOUT char *pTokenBuf,
|
|
||||||
INOUT int *pTokenBufLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
int
|
|
||||||
InitializeLibrary(void);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Defined in utils.c
|
|
||||||
//
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen);
|
|
||||||
|
|
||||||
extern
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen);
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
||||||
#endif // _INTERNAL_H_
|
|
||||||
|
|
@ -1,183 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="pwd"
|
|
||||||
ProjectGUID="{5499F624-F371-4559-B4C2-A484BCE892FD}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\mechanisms\pwd\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\mechanisms\pwd\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="windows;.;..\..;..\..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_WINDOWS"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/EXPORT:GetAuthTokenInterface"
|
|
||||||
AdditionalDependencies="micasa.lib"
|
|
||||||
OutputFile="$(OutDir)/pwmech.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="C:\Program Files\novell\CASA\lib"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/pw.pdb"
|
|
||||||
SubSystem="0"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\mechanisms\
|
|
||||||
copy PwdAuthenticate.conf \"Program Files"\novell\casa\etc\auth\mechanisms\PwdAuthenticate.conf
|
|
||||||
copy $(OutDir)\pwmech.dll \"Program Files"\novell\casa\lib\pwmech.dll
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="$(SolutionDir)client\mechanisms\pwd\windows\$(ConfigurationName)"
|
|
||||||
IntermediateDirectory="$(SolutionDir)client\mechanisms\pwd\windows\$(ConfigurationName)"
|
|
||||||
ConfigurationType="2"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="windows;.;..\..;..\..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_WINDOWS"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalOptions="/EXPORT:GetAuthTokenInterface"
|
|
||||||
AdditionalDependencies="micasa.lib"
|
|
||||||
OutputFile="$(OutDir)/pwmech.dll"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories="C:\Program Files\novell\CASA\lib"
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="0"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="mkdir \"Program Files"\novell\
|
|
||||||
mkdir \"Program Files"\novell\casa
|
|
||||||
mkdir \"Program Files"\novell\casa\lib\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\
|
|
||||||
mkdir \"Program Files"\novell\casa\etc\auth\mechanisms\
|
|
||||||
copy PwdAuthenticate.conf \"Program Files"\novell\casa\etc\auth\mechanisms\PwdAuthenticate.conf
|
|
||||||
copy $(OutDir)\pwmech.dll \"Program Files"\novell\casa\lib\pwmech.dll
|
|
||||||
"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\dllsup.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\get.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\interface.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.c">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\PwdAuthenticate.conf"
|
|
||||||
DeploymentContent="TRUE">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\pwmech.def">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\util.c">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\internal.h">
|
|
||||||
</File>
|
|
||||||
<File
|
|
||||||
RelativePath=".\windows\platform.h">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
</Filter>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -1,282 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// Debug Level
|
|
||||||
int DebugLevel = 0;
|
|
||||||
|
|
||||||
// Tables for Base64 encoding and decoding
|
|
||||||
static const int8_t g_Base64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
|
|
||||||
static const uint8_t g_Expand64[256] =
|
|
||||||
{
|
|
||||||
/* ASCII table */
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
||||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
|
|
||||||
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int encodedSize;
|
|
||||||
|
|
||||||
char *pTmp;
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the encoded size and allocate a buffer to hold the encoded data
|
|
||||||
encodedSize = ((dataLen * 4 + 2) / 3) - (dataLen % 3 ) + 4;
|
|
||||||
pTmp = (char*) malloc(encodedSize);
|
|
||||||
*ppEncodedData = pTmp;
|
|
||||||
if (*ppEncodedData)
|
|
||||||
{
|
|
||||||
uint8_t *pOut, *pIn;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// Setup pointers to move through the buffers
|
|
||||||
pIn = (uint8_t*) pData;
|
|
||||||
pOut = (uint8_t*) *ppEncodedData;
|
|
||||||
|
|
||||||
// Perform the encoding
|
|
||||||
for (i = 0; i < dataLen - 2; i += 3)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2) |
|
|
||||||
((int32_t)(pIn[i + 2] & 0xC0) >> 6)];
|
|
||||||
*pOut++ = g_Base64[pIn[i + 2] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < dataLen)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
if (i == (dataLen - 1))
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4)];
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
*pOut++ = '\0';
|
|
||||||
|
|
||||||
// Return the encoded data length
|
|
||||||
*pEncodedDataLen = (int32_t)(pOut - (uint8_t*)*ppEncodedData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-EncodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int i, j;
|
|
||||||
int decodedSize;
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the decoded size
|
|
||||||
for (i = 0, j = 0; i < encodedDataLen; i++)
|
|
||||||
if (g_Expand64[((uint8_t*) pEncodedData)[i]] < 64)
|
|
||||||
j++;
|
|
||||||
decodedSize = (j * 3 + 3) / 4;
|
|
||||||
|
|
||||||
// Allocate buffer to hold the decoded data
|
|
||||||
*ppData = malloc(decodedSize);
|
|
||||||
if (*ppData)
|
|
||||||
{
|
|
||||||
bool endReached = false;
|
|
||||||
uint8_t c0, c1, c2, c3;
|
|
||||||
uint8_t *p, *q;
|
|
||||||
|
|
||||||
// Initialize parameters that will be used during the decode operation
|
|
||||||
c0 = c1 = c2 = c3 = 0;
|
|
||||||
p = (uint8_t*) pEncodedData;
|
|
||||||
q = (uint8_t*) *ppData;
|
|
||||||
|
|
||||||
// Decode the data
|
|
||||||
//
|
|
||||||
// Loop through the data, piecing back information. Any newlines, and/or
|
|
||||||
// carriage returns need to be skipped.
|
|
||||||
while (j > 4)
|
|
||||||
{
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c0 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2);
|
|
||||||
j--;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c1 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4);
|
|
||||||
j -= 2;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c2 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6);
|
|
||||||
j -= 3;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c3 = *(p++);
|
|
||||||
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6 | g_Expand64[c3]);
|
|
||||||
j -= 4;
|
|
||||||
}
|
|
||||||
if (!endReached)
|
|
||||||
{
|
|
||||||
if (j > 1)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[*p] << 2 | g_Expand64[p[1]] >> 4);
|
|
||||||
if (j > 2)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[1]] << 4 | g_Expand64[p[2]] >> 2);
|
|
||||||
if (j > 3)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[2]] << 6 | g_Expand64[p[3]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the length of the decoded data
|
|
||||||
*pDataLen = (int32_t)(q - (uint8_t*)*ppData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-DecodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_PWTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,132 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ External data ]=====================================================
|
|
||||||
|
|
||||||
//===[ Manifest constants ]================================================
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
UINT32 g_ulCount = 0;
|
|
||||||
UINT32 g_ulLock = 0;
|
|
||||||
HANDLE g_hModule;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
BOOL APIENTRY DllMain(
|
|
||||||
HANDLE hModule,
|
|
||||||
DWORD ul_reason_for_call,
|
|
||||||
LPVOID lpReserved
|
|
||||||
)
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
BOOL retStatus = TRUE;
|
|
||||||
|
|
||||||
switch (ul_reason_for_call)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
|
|
||||||
// Initialize the library
|
|
||||||
if (InitializeLibrary() != 0)
|
|
||||||
{
|
|
||||||
// Failed to initialize the library
|
|
||||||
OutputDebugString("CASA_PW_MECH -DllMain- Library initialization failed\n");
|
|
||||||
retStatus = FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
{
|
|
||||||
/* Don't uninitialize on windows
|
|
||||||
tbd
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//
|
|
||||||
// DllCanUnloadNow
|
|
||||||
//
|
|
||||||
// Synopsis
|
|
||||||
//
|
|
||||||
//
|
|
||||||
STDAPI
|
|
||||||
DllCanUnloadNow()
|
|
||||||
//
|
|
||||||
// Input Arguments
|
|
||||||
//
|
|
||||||
// Ouput Arguments
|
|
||||||
//
|
|
||||||
// Return Value
|
|
||||||
// S_OK The DLL can be unloaded.
|
|
||||||
// S_FALSE The DLL cannot be unloaded now.
|
|
||||||
//
|
|
||||||
// Description
|
|
||||||
// An Exported Function.
|
|
||||||
// DLLs that support the OLE Component Object Model (COM) should implement
|
|
||||||
// and export DllCanUnloadNow.
|
|
||||||
// A call to DllCanUnloadNow determines whether the DLL from which it is
|
|
||||||
// exported is still in use. A DLL is no longer in use when it is not
|
|
||||||
// managing any existing objects (the reference count on all of its objects
|
|
||||||
// is 0).
|
|
||||||
// DllCanUnloadNow returns S_FALSE if there are any existing references to
|
|
||||||
// objects that the DLL manages.
|
|
||||||
//
|
|
||||||
// Environment
|
|
||||||
//
|
|
||||||
// See Also
|
|
||||||
//
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
// tbd
|
|
||||||
return ((g_ulCount == 0 && g_ulLock == 0) ? S_OK : S_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
//=========================================================================
|
|
||||||
|
|
@ -1,35 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
@ -1,81 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#ifndef _PLATFORM_H_
|
|
||||||
#define _PLATFORM_H_
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <winerror.h>
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
#ifndef CONTAINING_RECORD
|
|
||||||
#define CONTAINING_RECORD(address, type, field) ((type *)( \
|
|
||||||
(char*)(address) - \
|
|
||||||
(char*)(&((type *)0)->field)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// DbgTrace macro define
|
|
||||||
//
|
|
||||||
//#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
//char printBuff[256]; \
|
|
||||||
// if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
// { \
|
|
||||||
// _snprintf(printBuff, sizeof(printBuff), X, Y); \
|
|
||||||
// printf("PwdMech %s", printBuff); \
|
|
||||||
// } \
|
|
||||||
//}
|
|
||||||
#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
char formatBuff[128]; \
|
|
||||||
char printBuff[256]; \
|
|
||||||
if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
{ \
|
|
||||||
strcpy(formatBuff, "PwdMech "); \
|
|
||||||
strncat(formatBuff, X, sizeof(formatBuff) - 8); \
|
|
||||||
_snprintf(printBuff, sizeof(printBuff), formatBuff, Y); \
|
|
||||||
OutputDebugString(printBuff); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
#define bool BOOLEAN
|
|
||||||
#define true TRUE
|
|
||||||
#define false FALSE
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
||||||
#endif // _PLATFORM_H_
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
LIBRARY PWMECH
|
|
||||||
DESCRIPTION 'CASA PW Authentication Mechanism Library.'
|
|
||||||
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
; DllRegisterServer PRIVATE
|
|
||||||
; DllUnregisterServer PRIVATE
|
|
||||||
; DllGetClassObject PRIVATE
|
|
||||||
GetAuthTokenInterface PRIVATE
|
|
||||||
; DllCanUnloadNow PRIVATE
|
|
@ -1,513 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
#include <windows.h>
|
|
||||||
#include "casa_c_authtoken.h"
|
|
||||||
|
|
||||||
// Globals
|
|
||||||
char usageString[] = "usage: test -a serverAddress -p serverPort [-h]\n";
|
|
||||||
|
|
||||||
char *pServerAddress = NULL;
|
|
||||||
int serverPort = 0;
|
|
||||||
BOOLEAN execHttpTest = FALSE;
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* dtoul()
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
int
|
|
||||||
dtoul(
|
|
||||||
IN char *cp,
|
|
||||||
IN int len)
|
|
||||||
{
|
|
||||||
int n = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i = 0; i < len; i++, cp++)
|
|
||||||
{
|
|
||||||
// Verify that we are dealing with a valid digit
|
|
||||||
if (*cp >= '0' && *cp <= '9')
|
|
||||||
{
|
|
||||||
n = 10 * n + (*cp - '0');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-dtoul- Found invalid digit\n");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* EncodeData()
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
int
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen)
|
|
||||||
{
|
|
||||||
int8_t base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
int retStatus;
|
|
||||||
int encodedSize;
|
|
||||||
|
|
||||||
char *pTmp;
|
|
||||||
|
|
||||||
// Determine the encoded size and allocate a buffer to hold the encoded data
|
|
||||||
encodedSize = ((dataLen * 4 + 2) / 3) - (dataLen % 3 ) + 4;
|
|
||||||
pTmp = (char*) malloc(encodedSize);
|
|
||||||
*ppEncodedData = pTmp;
|
|
||||||
if (*ppEncodedData)
|
|
||||||
{
|
|
||||||
uint8_t *pOut, *pIn;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// Setup pointers to move through the buffers
|
|
||||||
pIn = (uint8_t*) pData;
|
|
||||||
pOut = (uint8_t*) *ppEncodedData;
|
|
||||||
|
|
||||||
// Perform the encoding
|
|
||||||
for (i = 0; i < dataLen - 2; i += 3)
|
|
||||||
{
|
|
||||||
*pOut++ = base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
*pOut++ = base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = base64[((pIn[i + 1] & 0xF) << 2) |
|
|
||||||
((int32_t)(pIn[i + 2] & 0xC0) >> 6)];
|
|
||||||
*pOut++ = base64[pIn[i + 2] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < dataLen)
|
|
||||||
{
|
|
||||||
*pOut++ = base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
if (i == (dataLen - 1))
|
|
||||||
{
|
|
||||||
*pOut++ = base64[((pIn[i] & 0x3) << 4)];
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pOut++ = base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = base64[((pIn[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
*pOut++ = '\0';
|
|
||||||
|
|
||||||
// Return the encoded data length
|
|
||||||
*pEncodedDataLen = (int32_t)(pOut - (uint8_t*)*ppEncodedData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-EncodeData- Buffer allocation failure\n");
|
|
||||||
retStatus = -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* NonHttpTest()
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void NonHttpTest(void)
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
char authToken[4096];
|
|
||||||
int authTokenLen = sizeof(authToken);
|
|
||||||
|
|
||||||
// Obtain an authentication token for the testService
|
|
||||||
retStatus = ObtainAuthToken("testService", pServerAddress, authToken, &authTokenLen);
|
|
||||||
if (!CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- ObtainAuthToken failed with status %d\n", retStatus);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SOCKET sock;
|
|
||||||
struct sockaddr_in localAddr = {0};
|
|
||||||
struct sockaddr_in remoteAddr = {0};
|
|
||||||
struct linger linger_opt = {1, 15};
|
|
||||||
struct hostent *pLookupResult;
|
|
||||||
int winsockStartupResult;
|
|
||||||
WSADATA winsockData;
|
|
||||||
|
|
||||||
printf("-NonHttpTest- ObtainAuthToken succedded, tokenlen = %d\n", authTokenLen);
|
|
||||||
|
|
||||||
// Send the token to the server
|
|
||||||
//
|
|
||||||
// First initialize winsock
|
|
||||||
if ((winsockStartupResult = WSAStartup(MAKEWORD(2,2), &winsockData)) == 0)
|
|
||||||
{
|
|
||||||
// Open socket
|
|
||||||
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
if (sock != INVALID_SOCKET)
|
|
||||||
{
|
|
||||||
// Setup the local address structure
|
|
||||||
localAddr.sin_family = AF_INET;
|
|
||||||
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
|
|
||||||
// Bind socket
|
|
||||||
if (!bind(sock, (const struct sockaddr*) &localAddr, sizeof(struct sockaddr_in)))
|
|
||||||
{
|
|
||||||
// Resolve the server address
|
|
||||||
pLookupResult = gethostbyname(pServerAddress);
|
|
||||||
if (pLookupResult)
|
|
||||||
{
|
|
||||||
// Validate the address type returned
|
|
||||||
if (pLookupResult->h_addrtype == AF_INET)
|
|
||||||
{
|
|
||||||
int numAddressesFound = 0;
|
|
||||||
|
|
||||||
// Determine how many addresses where returned
|
|
||||||
while (pLookupResult->h_addr_list[numAddressesFound] != NULL)
|
|
||||||
{
|
|
||||||
//printf("ServerAddress = %08X\n", *((int*) pLookupResult->h_addr_list[numAddressesFound]));
|
|
||||||
numAddressesFound ++;
|
|
||||||
}
|
|
||||||
//printf("Found %d addresses\n", numAddressesFound);
|
|
||||||
|
|
||||||
// Setup the remote address structure with the lookup results
|
|
||||||
remoteAddr.sin_family = AF_INET;
|
|
||||||
remoteAddr.sin_port = serverPort;
|
|
||||||
remoteAddr.sin_addr.s_addr = *((int*) pLookupResult->h_addr_list[0]); // Short-cut
|
|
||||||
//printf("ServerAddress = %08X\n", remoteAddr.sin_addr.s_addr);
|
|
||||||
|
|
||||||
// Perform connect operation
|
|
||||||
if (connect(sock,
|
|
||||||
(struct sockaddr*) &remoteAddr,
|
|
||||||
sizeof(struct sockaddr_in)) == SOCKET_ERROR)
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- Connection creation failed, error = %d\n", WSAGetLastError());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Now the connection is setup, send the credentials to the server as one line.
|
|
||||||
// using our cheesy protocol followed by a hello string.
|
|
||||||
//
|
|
||||||
// Send the token to the server (including NULL terminator)
|
|
||||||
send(sock, authToken, (int) strlen(authToken) + 1, 0);
|
|
||||||
|
|
||||||
// Send new line
|
|
||||||
send(sock, "\n", 1, 0);
|
|
||||||
|
|
||||||
// Send "hello"
|
|
||||||
//send(sock, helloString, strlen(helloString) + 1, MSG_NOSIGNAL);
|
|
||||||
|
|
||||||
// Send new line
|
|
||||||
//send(sock, "\n", 1, 0);
|
|
||||||
|
|
||||||
// Shutdown the connection
|
|
||||||
shutdown(sock, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- Unsupported address type returned %08X\n", pLookupResult->h_addrtype);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- Lookup for %s failed\n", pServerAddress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- Unable to bind socket, error = %d", errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the socket
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char*) &linger_opt, sizeof(linger_opt));
|
|
||||||
closesocket(sock);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- Unable to open socket, error = %d\n", errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close winsock
|
|
||||||
WSACleanup();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-NonHttpTest- WSAStartup failed, error = %d\n", winsockStartupResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* HttpTest()
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
void HttpTest(void)
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
char authToken[4096];
|
|
||||||
int authTokenLen = sizeof(authToken);
|
|
||||||
|
|
||||||
// Obtain an authentication token for the testService
|
|
||||||
retStatus = ObtainAuthToken("testService", pServerAddress, authToken, &authTokenLen);
|
|
||||||
if (!CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
printf("-HttpTest- ObtainAuthToken failed with status %d\n", retStatus);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SOCKET sock;
|
|
||||||
struct sockaddr_in localAddr = {0};
|
|
||||||
struct sockaddr_in remoteAddr = {0};
|
|
||||||
struct linger linger_opt = {1, 15};
|
|
||||||
struct hostent *pLookupResult;
|
|
||||||
int winsockStartupResult;
|
|
||||||
WSADATA winsockData;
|
|
||||||
|
|
||||||
//printf("ObtainAuthToken succedded, token = %s\n", authToken);
|
|
||||||
printf("-HttpTest- ObtainAuthToken succedded, tokenlen = %d\n", authTokenLen);
|
|
||||||
|
|
||||||
// Send the token to the server
|
|
||||||
//
|
|
||||||
// First initialize winsock
|
|
||||||
if ((winsockStartupResult = WSAStartup(MAKEWORD(2,2), &winsockData)) == 0)
|
|
||||||
{
|
|
||||||
// Open socket
|
|
||||||
sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
|
|
||||||
if (sock != INVALID_SOCKET)
|
|
||||||
{
|
|
||||||
// Setup the local address structure
|
|
||||||
localAddr.sin_family = AF_INET;
|
|
||||||
localAddr.sin_addr.s_addr = htonl(INADDR_ANY);
|
|
||||||
|
|
||||||
// Bind socket
|
|
||||||
if (!bind(sock, (const struct sockaddr*) &localAddr, sizeof(struct sockaddr_in)))
|
|
||||||
{
|
|
||||||
// Resolve the server address
|
|
||||||
pLookupResult = gethostbyname(pServerAddress);
|
|
||||||
if (pLookupResult)
|
|
||||||
{
|
|
||||||
// Validate the address type returned
|
|
||||||
if (pLookupResult->h_addrtype == AF_INET)
|
|
||||||
{
|
|
||||||
int numAddressesFound = 0;
|
|
||||||
|
|
||||||
// Determine how many addresses where returned
|
|
||||||
while (pLookupResult->h_addr_list[numAddressesFound] != NULL)
|
|
||||||
{
|
|
||||||
//printf("ServerAddress = %08X\n", *((int*) pLookupResult->h_addr_list[numAddressesFound]));
|
|
||||||
numAddressesFound ++;
|
|
||||||
}
|
|
||||||
//printf("Found %d addresses\n", numAddressesFound);
|
|
||||||
|
|
||||||
|
|
||||||
// Setup the remote address structure with the lookup results
|
|
||||||
remoteAddr.sin_family = AF_INET;
|
|
||||||
remoteAddr.sin_port = serverPort;
|
|
||||||
remoteAddr.sin_addr.s_addr = *((int*) pLookupResult->h_addr_list[0]); // Short-cut
|
|
||||||
//printf("ServerAddress = %08X\n", remoteAddr.sin_addr.s_addr);
|
|
||||||
|
|
||||||
// Perform connect operation
|
|
||||||
if (connect(sock,
|
|
||||||
(struct sockaddr*) &remoteAddr,
|
|
||||||
sizeof(struct sockaddr_in)) == SOCKET_ERROR)
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Connection creation failed, error = %d\n", WSAGetLastError());
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
char *pBasicCredentials;
|
|
||||||
char *pEncodedBasicCredentials;
|
|
||||||
int encodedLength;
|
|
||||||
char CasaPrincipal[] = "CasaPrincipal:";
|
|
||||||
char HTTPReqPart1[] = "GET /example-info HTTP/1.1\r\\nUser-Agent: CasaTestClient\r\nHost: jcstation.dnsdhcp.provo.novell.com:4096\r\nConnection: Keep-Alive\r\nAuthorization: Basic ";
|
|
||||||
|
|
||||||
// Now the connection is setup, send 1st part of HTTP request to the server.
|
|
||||||
send(sock, HTTPReqPart1, (int) strlen(HTTPReqPart1), 0);
|
|
||||||
|
|
||||||
// Now setup the HTTP Basic Credentials
|
|
||||||
pBasicCredentials = (char*) malloc(strlen(CasaPrincipal) + strlen(authToken) + 1);
|
|
||||||
if (pBasicCredentials)
|
|
||||||
{
|
|
||||||
char *pEncodedCredentials;
|
|
||||||
|
|
||||||
memcpy(pBasicCredentials, CasaPrincipal, sizeof(CasaPrincipal));
|
|
||||||
strcat(pBasicCredentials, authToken);
|
|
||||||
|
|
||||||
// Now Base64 encode the credentials
|
|
||||||
if (EncodeData(pBasicCredentials, strlen(pBasicCredentials), &pEncodedBasicCredentials, &encodedLength) == 0)
|
|
||||||
{
|
|
||||||
// Send the encoded credentials
|
|
||||||
send(sock, pEncodedBasicCredentials, encodedLength - 1, 0);
|
|
||||||
|
|
||||||
// Send the rest of the header
|
|
||||||
send(sock, "\r\n\r\n", 4, 0);
|
|
||||||
|
|
||||||
// Free the buffer holding the encoded credentials
|
|
||||||
free(pEncodedBasicCredentials);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Error encoding credentials\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the buffer containing the basic credentials
|
|
||||||
free(pBasicCredentials);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Buffer allocation failure\n");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Shutdown the connection
|
|
||||||
shutdown(sock, 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Unsupported address type returned %08X\n", pLookupResult->h_addrtype);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Lookup for %s failed\n", pServerAddress);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Unable to bind socket, error = %d", errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the socket
|
|
||||||
setsockopt(sock, SOL_SOCKET, SO_LINGER, (const char*) &linger_opt, sizeof(linger_opt));
|
|
||||||
closesocket(sock);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- Unable to open socket, error = %d\n", errno);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close winsock
|
|
||||||
WSACleanup();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf("-HttpTest- WSAStartup failed, error = %d\n", winsockStartupResult);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* main()
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
int main(int argc, char* argv[])
|
|
||||||
{
|
|
||||||
// Process input parameters
|
|
||||||
int i = 1;
|
|
||||||
while(argv[i] != NULL)
|
|
||||||
{
|
|
||||||
if (stricmp(argv[i], "-a") == 0)
|
|
||||||
{
|
|
||||||
// Server Address option, the next argument should
|
|
||||||
// contain the address.
|
|
||||||
i++;
|
|
||||||
if (argv[i] != NULL)
|
|
||||||
{
|
|
||||||
pServerAddress = argv[i];
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf(usageString);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (stricmp(argv[i], "-p") == 0)
|
|
||||||
{
|
|
||||||
// Server port option, the next argument should
|
|
||||||
// contain the port.
|
|
||||||
i++;
|
|
||||||
if (argv[i] != NULL)
|
|
||||||
{
|
|
||||||
serverPort = htons(dtoul(argv[i], strlen(argv[i])));
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf(usageString);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else if (stricmp(argv[i], "-h") == 0)
|
|
||||||
{
|
|
||||||
// Perform http test option
|
|
||||||
execHttpTest = TRUE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next argument
|
|
||||||
i++;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Verify that the server address and port were specified
|
|
||||||
if (pServerAddress && serverPort != 0)
|
|
||||||
{
|
|
||||||
// Repeat the test when indicated
|
|
||||||
printf("Press 'Enter' to run test or 'n + Enter' to stop.\n");
|
|
||||||
while(getchar() != 'n')
|
|
||||||
{
|
|
||||||
// Execute the appropriate test
|
|
||||||
if (execHttpTest)
|
|
||||||
{
|
|
||||||
HttpTest();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
NonHttpTest();
|
|
||||||
}
|
|
||||||
printf("Press 'Enter' to run test or 'n + Enter' to stop.\n");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
printf(usageString);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
@ -1,142 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="Windows-1252"?>
|
|
||||||
<VisualStudioProject
|
|
||||||
ProjectType="Visual C++"
|
|
||||||
Version="7.10"
|
|
||||||
Name="test"
|
|
||||||
ProjectGUID="{6034EBF1-0838-45C4-A538-A41A31EC8F46}"
|
|
||||||
Keyword="Win32Proj">
|
|
||||||
<Platforms>
|
|
||||||
<Platform
|
|
||||||
Name="Win32"/>
|
|
||||||
</Platforms>
|
|
||||||
<Configurations>
|
|
||||||
<Configuration
|
|
||||||
Name="Debug|Win32"
|
|
||||||
OutputDirectory="Debug"
|
|
||||||
IntermediateDirectory="Debug"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
Optimization="0"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;_DEBUG;_CONSOLE"
|
|
||||||
MinimalRebuild="TRUE"
|
|
||||||
BasicRuntimeChecks="3"
|
|
||||||
RuntimeLibrary="5"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="4"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="authtoken.lib ws2_32.lib"
|
|
||||||
OutputFile="$(OutDir)/test.exe"
|
|
||||||
LinkIncremental="2"
|
|
||||||
AdditionalLibraryDirectories=""C:\Program Files\novell\CASA\lib""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
ProgramDatabaseFile="$(OutDir)/test.pdb"
|
|
||||||
SubSystem="1"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"
|
|
||||||
CommandLine="copy ..\windows\debug\authtoken.dll debug\authtoken.dll"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
<Configuration
|
|
||||||
Name="Release|Win32"
|
|
||||||
OutputDirectory="Release"
|
|
||||||
IntermediateDirectory="Release"
|
|
||||||
ConfigurationType="1"
|
|
||||||
CharacterSet="2">
|
|
||||||
<Tool
|
|
||||||
Name="VCCLCompilerTool"
|
|
||||||
AdditionalIncludeDirectories="..\..\..\include"
|
|
||||||
PreprocessorDefinitions="WIN32;NDEBUG;_CONSOLE"
|
|
||||||
RuntimeLibrary="4"
|
|
||||||
UsePrecompiledHeader="0"
|
|
||||||
WarningLevel="3"
|
|
||||||
Detect64BitPortabilityProblems="TRUE"
|
|
||||||
DebugInformationFormat="3"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCCustomBuildTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCLinkerTool"
|
|
||||||
AdditionalDependencies="authtoken.lib ws2_32.lib"
|
|
||||||
OutputFile="$(OutDir)/test.exe"
|
|
||||||
LinkIncremental="1"
|
|
||||||
AdditionalLibraryDirectories=""C:\Program Files\novell\CASA\lib""
|
|
||||||
GenerateDebugInformation="TRUE"
|
|
||||||
SubSystem="1"
|
|
||||||
OptimizeReferences="2"
|
|
||||||
EnableCOMDATFolding="2"
|
|
||||||
TargetMachine="1"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCMIDLTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPostBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreBuildEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCPreLinkEventTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCResourceCompilerTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebServiceProxyGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCXMLDataGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCWebDeploymentTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCManagedWrapperGeneratorTool"/>
|
|
||||||
<Tool
|
|
||||||
Name="VCAuxiliaryManagedWrapperGeneratorTool"/>
|
|
||||||
</Configuration>
|
|
||||||
</Configurations>
|
|
||||||
<References>
|
|
||||||
</References>
|
|
||||||
<Files>
|
|
||||||
<Filter
|
|
||||||
Name="Source Files"
|
|
||||||
Filter="cpp;c;cxx;def;odl;idl;hpj;bat;asm;asmx"
|
|
||||||
UniqueIdentifier="{4FC737F1-C7A5-4376-A066-2A32D752A2FF}">
|
|
||||||
<File
|
|
||||||
RelativePath=".\CASA_Auth.cpp">
|
|
||||||
</File>
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Header Files"
|
|
||||||
Filter="h;hpp;hxx;hm;inl;inc;xsd"
|
|
||||||
UniqueIdentifier="{93995380-89BD-4b04-88EB-625FBE52EBFB}">
|
|
||||||
</Filter>
|
|
||||||
<Filter
|
|
||||||
Name="Resource Files"
|
|
||||||
Filter="rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx"
|
|
||||||
UniqueIdentifier="{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}">
|
|
||||||
</Filter>
|
|
||||||
<File
|
|
||||||
RelativePath=".\ReadMe.txt">
|
|
||||||
</File>
|
|
||||||
</Files>
|
|
||||||
<Globals>
|
|
||||||
</Globals>
|
|
||||||
</VisualStudioProject>
|
|
@ -1,321 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// Tables for Base64 encoding and decoding
|
|
||||||
static const int8_t g_Base64[] =
|
|
||||||
"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
|
|
||||||
|
|
||||||
static const uint8_t g_Expand64[256] =
|
|
||||||
{
|
|
||||||
/* ASCII table */
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 62, 64, 64, 64, 63,
|
|
||||||
52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
|
|
||||||
15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 64, 64, 64, 64, 64,
|
|
||||||
64, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40,
|
|
||||||
41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64,
|
|
||||||
64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
EncodeData(
|
|
||||||
IN const void *pData,
|
|
||||||
IN const int32_t dataLen,
|
|
||||||
INOUT char **ppEncodedData,
|
|
||||||
INOUT int32_t *pEncodedDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int encodedSize;
|
|
||||||
|
|
||||||
char *pTmp;
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the encoded size and allocate a buffer to hold the encoded data
|
|
||||||
encodedSize = ((dataLen * 4 + 2) / 3) - (dataLen % 3 ) + 4;
|
|
||||||
pTmp = (char*) malloc(encodedSize);
|
|
||||||
*ppEncodedData = pTmp;
|
|
||||||
if (*ppEncodedData)
|
|
||||||
{
|
|
||||||
uint8_t *pOut, *pIn;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
// Setup pointers to move through the buffers
|
|
||||||
pIn = (uint8_t*) pData;
|
|
||||||
pOut = (uint8_t*) *ppEncodedData;
|
|
||||||
|
|
||||||
// Perform the encoding
|
|
||||||
for (i = 0; i < dataLen - 2; i += 3)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2) |
|
|
||||||
((int32_t)(pIn[i + 2] & 0xC0) >> 6)];
|
|
||||||
*pOut++ = g_Base64[pIn[i + 2] & 0x3F];
|
|
||||||
}
|
|
||||||
if (i < dataLen)
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[(pIn[i] >> 2) & 0x3F];
|
|
||||||
if (i == (dataLen - 1))
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4)];
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
*pOut++ = g_Base64[((pIn[i] & 0x3) << 4) |
|
|
||||||
((int32_t)(pIn[i + 1] & 0xF0) >> 4)];
|
|
||||||
*pOut++ = g_Base64[((pIn[i + 1] & 0xF) << 2)];
|
|
||||||
}
|
|
||||||
*pOut++ = '=';
|
|
||||||
}
|
|
||||||
*pOut++ = '\0';
|
|
||||||
|
|
||||||
// Return the encoded data length
|
|
||||||
*pEncodedDataLen = (int32_t)(pOut - (uint8_t*)*ppEncodedData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-EncodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-EncodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
DecodeData(
|
|
||||||
IN const char *pEncodedData,
|
|
||||||
IN const int32_t encodedDataLen, // Does not include NULL terminator
|
|
||||||
INOUT void **ppData,
|
|
||||||
INOUT int32_t *pDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Description:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int i, j;
|
|
||||||
int decodedSize;
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- Start\n", 0);
|
|
||||||
|
|
||||||
// Determine the decoded size
|
|
||||||
for (i = 0, j = 0; i < encodedDataLen; i++)
|
|
||||||
if (g_Expand64[((uint8_t*) pEncodedData)[i]] < 64)
|
|
||||||
j++;
|
|
||||||
decodedSize = (j * 3 + 3) / 4;
|
|
||||||
|
|
||||||
// Allocate buffer to hold the decoded data
|
|
||||||
*ppData = malloc(decodedSize);
|
|
||||||
if (*ppData)
|
|
||||||
{
|
|
||||||
bool endReached = false;
|
|
||||||
uint8_t c0, c1, c2, c3;
|
|
||||||
uint8_t *p, *q;
|
|
||||||
|
|
||||||
// Initialize parameters that will be used during the decode operation
|
|
||||||
c0 = c1 = c2 = c3 = 0;
|
|
||||||
p = (uint8_t*) pEncodedData;
|
|
||||||
q = (uint8_t*) *ppData;
|
|
||||||
|
|
||||||
// Decode the data
|
|
||||||
//
|
|
||||||
// Loop through the data, piecing back information. Any newlines, and/or
|
|
||||||
// carriage returns need to be skipped.
|
|
||||||
while (j > 4)
|
|
||||||
{
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c0 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2);
|
|
||||||
j--;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c1 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4);
|
|
||||||
j -= 2;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c2 = *(p++);
|
|
||||||
|
|
||||||
while ((64 == g_Expand64[*p]) && (('\n' == *p) || ('\r' == *p)))
|
|
||||||
p++;
|
|
||||||
if (64 == g_Expand64[*p])
|
|
||||||
{
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6);
|
|
||||||
j -= 3;
|
|
||||||
endReached = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
c3 = *(p++);
|
|
||||||
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c0] << 2 | g_Expand64[c1] >> 4);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c1] << 4 | g_Expand64[c2] >> 2);
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[c2] << 6 | g_Expand64[c3]);
|
|
||||||
j -= 4;
|
|
||||||
}
|
|
||||||
if (!endReached)
|
|
||||||
{
|
|
||||||
if (j > 1)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[*p] << 2 | g_Expand64[p[1]] >> 4);
|
|
||||||
if (j > 2)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[1]] << 4 | g_Expand64[p[2]] >> 2);
|
|
||||||
if (j > 3)
|
|
||||||
*(q++) = (uint8_t)(g_Expand64[p[2]] << 6 | g_Expand64[p[3]]);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Return the length of the decoded data
|
|
||||||
*pDataLen = (int32_t)(q - (uint8_t*)*ppData);
|
|
||||||
|
|
||||||
// Success
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-DecodeData- Buffer allocation failure\n", 0);
|
|
||||||
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(3, "-DecodeData- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
int
|
|
||||||
dtoul(
|
|
||||||
IN const char *cp,
|
|
||||||
IN const int len)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int n = 0;
|
|
||||||
int i;
|
|
||||||
|
|
||||||
DbgTrace(2, "-dtoul- Start\n", 0);
|
|
||||||
|
|
||||||
for (i = 0; i < len; i++, cp++)
|
|
||||||
{
|
|
||||||
// Verify that we are dealing with a valid digit
|
|
||||||
if (*cp >= '0' && *cp <= '9')
|
|
||||||
{
|
|
||||||
n = 10 * n + (*cp - '0');
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-dtoul- Found invalid digit\n", 0);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-dtoul- End, result = %d\n", n);
|
|
||||||
|
|
||||||
return n;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,10 +0,0 @@
|
|||||||
LIBRARY AUTHTOKEN
|
|
||||||
DESCRIPTION 'CASA Authentication Token Library.'
|
|
||||||
|
|
||||||
|
|
||||||
EXPORTS
|
|
||||||
; DllRegisterServer PRIVATE
|
|
||||||
; DllUnregisterServer PRIVATE
|
|
||||||
; DllGetClassObject PRIVATE
|
|
||||||
ObtainAuthToken PRIVATE
|
|
||||||
; DllCanUnloadNow PRIVATE
|
|
File diff suppressed because it is too large
Load Diff
@ -1,132 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ External data ]=====================================================
|
|
||||||
|
|
||||||
//===[ Manifest constants ]================================================
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
UINT32 g_ulCount = 0;
|
|
||||||
UINT32 g_ulLock = 0;
|
|
||||||
HANDLE g_hModule;
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
BOOL APIENTRY DllMain(
|
|
||||||
HANDLE hModule,
|
|
||||||
DWORD ul_reason_for_call,
|
|
||||||
LPVOID lpReserved
|
|
||||||
)
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
BOOL retStatus = TRUE;
|
|
||||||
|
|
||||||
switch (ul_reason_for_call)
|
|
||||||
{
|
|
||||||
case DLL_PROCESS_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
|
|
||||||
// Initialize the library
|
|
||||||
if (InitializeLibrary() != 0)
|
|
||||||
{
|
|
||||||
// Failed to initialize the library
|
|
||||||
OutputDebugString("CASAAUTH -DllMain- Library initialization failed\n");
|
|
||||||
retStatus = FALSE;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_ATTACH:
|
|
||||||
{
|
|
||||||
g_hModule = hModule;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case DLL_THREAD_DETACH:
|
|
||||||
break;
|
|
||||||
|
|
||||||
case DLL_PROCESS_DETACH:
|
|
||||||
{
|
|
||||||
/* Don't uninitialize on windows
|
|
||||||
tbd
|
|
||||||
*/
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//
|
|
||||||
// DllCanUnloadNow
|
|
||||||
//
|
|
||||||
// Synopsis
|
|
||||||
//
|
|
||||||
//
|
|
||||||
STDAPI
|
|
||||||
DllCanUnloadNow()
|
|
||||||
//
|
|
||||||
// Input Arguments
|
|
||||||
//
|
|
||||||
// Ouput Arguments
|
|
||||||
//
|
|
||||||
// Return Value
|
|
||||||
// S_OK The DLL can be unloaded.
|
|
||||||
// S_FALSE The DLL cannot be unloaded now.
|
|
||||||
//
|
|
||||||
// Description
|
|
||||||
// An Exported Function.
|
|
||||||
// DLLs that support the OLE Component Object Model (COM) should implement
|
|
||||||
// and export DllCanUnloadNow.
|
|
||||||
// A call to DllCanUnloadNow determines whether the DLL from which it is
|
|
||||||
// exported is still in use. A DLL is no longer in use when it is not
|
|
||||||
// managing any existing objects (the reference count on all of its objects
|
|
||||||
// is 0).
|
|
||||||
// DllCanUnloadNow returns S_FALSE if there are any existing references to
|
|
||||||
// objects that the DLL manages.
|
|
||||||
//
|
|
||||||
// Environment
|
|
||||||
//
|
|
||||||
// See Also
|
|
||||||
//
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
// tbd
|
|
||||||
return ((g_ulCount == 0 && g_ulLock == 0) ? S_OK : S_FALSE);
|
|
||||||
}
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
//=========================================================================
|
|
||||||
|
|
@ -1,549 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
//
|
|
||||||
// Normalized Host Name Cache Entry definition
|
|
||||||
//
|
|
||||||
typedef struct _NormalizedHostNameCacheEntry
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
char *pHostName;
|
|
||||||
char *pNormalizedHostName;
|
|
||||||
int buffLengthRequired;
|
|
||||||
|
|
||||||
} NormalizedHostNameCacheEntry, *PNormalizedHostNameCacheEntry;
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
// Global synchronization mutex for the user
|
|
||||||
static
|
|
||||||
HANDLE hUserMutex;
|
|
||||||
|
|
||||||
// Normalized host name cache list head
|
|
||||||
static
|
|
||||||
LIST_ENTRY normalizedHostNameCacheListHead;
|
|
||||||
|
|
||||||
// Synchronization mutex for the normalized host name cache
|
|
||||||
static
|
|
||||||
HANDLE hNormalizedHostNameCacheMutex;
|
|
||||||
|
|
||||||
// Authentication mechanism configuration file folder
|
|
||||||
char mechConfigFolder[] = "\\Program Files\\Novell\\Casa\\Etc\\Auth\\Mechanisms";
|
|
||||||
|
|
||||||
// Path separator
|
|
||||||
char pathCharString[] = "\\";
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
CreateUserMutex(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
char *pUsername = NULL;
|
|
||||||
DWORD nameLength = 0;
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateUserMutex- Start\n", 0);
|
|
||||||
|
|
||||||
// Get the size of the buffer required to obtain the user name
|
|
||||||
GetUserName(pUsername, &nameLength);
|
|
||||||
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
|
|
||||||
{
|
|
||||||
// Allocate buffer to hold the user name
|
|
||||||
pUsername = (char*) malloc(nameLength);
|
|
||||||
if (pUsername)
|
|
||||||
{
|
|
||||||
// Get the name of the user
|
|
||||||
if (GetUserName(pUsername, &nameLength))
|
|
||||||
{
|
|
||||||
SECURITY_ATTRIBUTES mutexAttributes;
|
|
||||||
char mutexName[256];
|
|
||||||
|
|
||||||
// Now lets create a global semaphore for the
|
|
||||||
// user and allow its handle to be inherited.
|
|
||||||
mutexAttributes.nLength = sizeof(mutexAttributes);
|
|
||||||
mutexAttributes.lpSecurityDescriptor = NULL;
|
|
||||||
mutexAttributes.bInheritHandle = TRUE;
|
|
||||||
if (sprintf(mutexName, "Global\\CASA_Auth_Mutex_%s", pUsername) != -1)
|
|
||||||
{
|
|
||||||
hUserMutex = CreateMutex(&mutexAttributes,
|
|
||||||
FALSE,
|
|
||||||
mutexName);
|
|
||||||
if (hUserMutex == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateUserMutex- CreteMutex failed, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateUserMutex- sprintf failed, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateUserMutex- GetUserName failed, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the buffer allocated to hold the user name
|
|
||||||
free(pUsername);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateUserMutex- Buffer allocation error\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-CreateUserMutex- Un-expected GetUserName error, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-CreateUserMutex- End, retStatus\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
AcquireUserMutex(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-AcquireUserMutex- Start\n", 0);
|
|
||||||
|
|
||||||
WaitForSingleObject(hUserMutex, INFINITE);
|
|
||||||
|
|
||||||
DbgTrace(2, "-AcquireUserMutex- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
ReleaseUserMutex(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(2, "-ReleaseUserMutex- Start\n", 0);
|
|
||||||
|
|
||||||
if (ReleaseMutex(hUserMutex) == 0)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-ReleaseUserMutex- ReleaseMutex failed, error = %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-ReleaseUserMutex- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
LIB_HANDLE
|
|
||||||
OpenLibrary(
|
|
||||||
IN char *pFileName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
LIB_HANDLE libHandle;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-OpenLibrary- Start\n", 0);
|
|
||||||
|
|
||||||
libHandle = LoadLibrary(pFileName);
|
|
||||||
if (libHandle == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-OpenLibrary- Not able to load library, error = %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-OpenLibrary- End, handle = %08X\n", libHandle);
|
|
||||||
|
|
||||||
return libHandle;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
CloseLibrary(
|
|
||||||
IN LIB_HANDLE libHandle)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-CloseLibrary- Start\n", 0);
|
|
||||||
|
|
||||||
FreeLibrary(libHandle);
|
|
||||||
|
|
||||||
DbgTrace(1, "-CloseLibrary- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void*
|
|
||||||
GetFunctionPtr(
|
|
||||||
IN LIB_HANDLE libHandle,
|
|
||||||
IN char *pFunctionName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
void *pFuncPtr;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetFunctionPtr- Start\n", 0);
|
|
||||||
|
|
||||||
pFuncPtr = GetProcAddress(libHandle, pFunctionName);
|
|
||||||
if (pFuncPtr == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-GetFunctionPtr- Not able to obtain func ptr, error = %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-GetFunctionPtr- End, pFuncPtr = %08X\n", pFuncPtr);
|
|
||||||
|
|
||||||
return pFuncPtr;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
char*
|
|
||||||
NormalizeHostName(
|
|
||||||
IN const char *pHostName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
char *pNormalizedName = NULL;
|
|
||||||
LIST_ENTRY *pListEntry;
|
|
||||||
NormalizedHostNameCacheEntry *pEntry = NULL;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-NormalizeHostName- Start\n", 0);
|
|
||||||
|
|
||||||
// Obtain our synchronization mutex
|
|
||||||
WaitForSingleObject(hNormalizedHostNameCacheMutex, INFINITE);
|
|
||||||
|
|
||||||
// First try to find an entry in the normalized host name cache
|
|
||||||
// for the host name provided.
|
|
||||||
pListEntry = normalizedHostNameCacheListHead.Flink;
|
|
||||||
while (pListEntry != &normalizedHostNameCacheListHead)
|
|
||||||
{
|
|
||||||
// Get pointer to the entry
|
|
||||||
pEntry = CONTAINING_RECORD(pListEntry, NormalizedHostNameCacheEntry, listEntry);
|
|
||||||
|
|
||||||
// Check if the entry is for the host name
|
|
||||||
if (strcmp(pHostName, pEntry->pHostName) == 0)
|
|
||||||
{
|
|
||||||
// This entry corresponds to the given host name
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The entry does not correspond to the given host name
|
|
||||||
pEntry = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Advance to the next entry
|
|
||||||
pListEntry = pListEntry->Flink;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Check if we found an entry in our cache for the given host name
|
|
||||||
if (pEntry)
|
|
||||||
{
|
|
||||||
// Entry found, obtain the normalized name from it.
|
|
||||||
pNormalizedName = (char*) malloc(pEntry->buffLengthRequired);
|
|
||||||
if (pNormalizedName)
|
|
||||||
{
|
|
||||||
// Copy the normalized name onto the allocated buffer
|
|
||||||
strcpy(pNormalizedName, pEntry->pNormalizedHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// An entry was not found in our cache, create one.
|
|
||||||
pEntry = (NormalizedHostNameCacheEntry*) malloc(sizeof(NormalizedHostNameCacheEntry));
|
|
||||||
if (pEntry)
|
|
||||||
{
|
|
||||||
// Zero the entry
|
|
||||||
memset(pEntry, 0, sizeof(*pEntry));
|
|
||||||
|
|
||||||
// Allocate a buffer to hold the host name in the entry
|
|
||||||
pEntry->pHostName = (char*) malloc(strlen(pHostName) + 1);
|
|
||||||
if (pEntry->pHostName)
|
|
||||||
{
|
|
||||||
struct hostent *pLookupResult;
|
|
||||||
struct sockaddr_in sockAddr = {0};
|
|
||||||
|
|
||||||
// Copy the host name given into the allocated buffer
|
|
||||||
strcpy(pEntry->pHostName, pHostName);
|
|
||||||
|
|
||||||
// Now try to resolve the normalized name
|
|
||||||
pLookupResult = gethostbyname(pHostName);
|
|
||||||
if (pLookupResult && pLookupResult->h_addrtype == AF_INET)
|
|
||||||
{
|
|
||||||
char dnsHostName[NI_MAXHOST];
|
|
||||||
|
|
||||||
// Set up a sockaddr structure
|
|
||||||
sockAddr.sin_family = AF_INET;
|
|
||||||
sockAddr.sin_addr.S_un.S_addr = *((int*) pLookupResult->h_addr_list[0]);
|
|
||||||
|
|
||||||
// Now try to resolve the name using DNS
|
|
||||||
if (getnameinfo((const struct sockaddr*) &sockAddr,
|
|
||||||
sizeof(sockAddr),
|
|
||||||
dnsHostName,
|
|
||||||
sizeof(dnsHostName),
|
|
||||||
NULL,
|
|
||||||
0,
|
|
||||||
NI_NAMEREQD) == 0)
|
|
||||||
{
|
|
||||||
// We resolved the address to a DNS name, use it as the normalized name.
|
|
||||||
pEntry->buffLengthRequired = (int) strlen(dnsHostName) + 1;
|
|
||||||
pEntry->pNormalizedHostName = (char*) malloc(pEntry->buffLengthRequired);
|
|
||||||
if (pEntry->pNormalizedHostName)
|
|
||||||
{
|
|
||||||
// Copy the dns name
|
|
||||||
strcpy(pEntry->pNormalizedHostName, dnsHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- getnameInfo failed, error %d\n", WSAGetLastError());
|
|
||||||
|
|
||||||
// Not able to resolve the name in DNS, just use the host name as
|
|
||||||
// the normalized name.
|
|
||||||
pEntry->buffLengthRequired = (int) strlen(pHostName) + 1;
|
|
||||||
pEntry->pNormalizedHostName = (char*) malloc(pEntry->buffLengthRequired);
|
|
||||||
if (pEntry->pNormalizedHostName)
|
|
||||||
{
|
|
||||||
// Copy the host name
|
|
||||||
strcpy(pEntry->pNormalizedHostName, pHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Name resolution failed, error = %d\n", WSAGetLastError());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
|
|
||||||
// Free the space allocated for the entry
|
|
||||||
free(pEntry);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Proceed based on whether or not we normalized the name
|
|
||||||
if (pEntry->pNormalizedHostName)
|
|
||||||
{
|
|
||||||
// The name was normalized, save the entry in our cache.
|
|
||||||
InsertHeadList(&normalizedHostNameCacheListHead, &pEntry->listEntry);
|
|
||||||
|
|
||||||
// Return the normalized name present in the entry
|
|
||||||
pNormalizedName = (char*) malloc(pEntry->buffLengthRequired);
|
|
||||||
if (pNormalizedName)
|
|
||||||
{
|
|
||||||
// Copy the normalized name onto the allocated buffer
|
|
||||||
strcpy(pNormalizedName, pEntry->pNormalizedHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// The host name was not normalized, free allocated resources.
|
|
||||||
if (pEntry->pHostName)
|
|
||||||
free(pEntry->pHostName);
|
|
||||||
free(pEntry);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- Buffer allocation error\n", 0);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Release our synchronization mutex
|
|
||||||
if (ReleaseMutex(hNormalizedHostNameCacheMutex) == 0)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-NormalizeHostName- ReleaseMutex failed, error\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-NormalizeHostName- End, pNormalizedName = %08X\n", pNormalizedName);
|
|
||||||
|
|
||||||
return pNormalizedName;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
InitializeHostNameNormalization(void)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
int winsockStartupResult;
|
|
||||||
WSADATA winsockData;
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeHostNameNormalization- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize winsock
|
|
||||||
if ((winsockStartupResult = WSAStartup(MAKEWORD(2,2), &winsockData)) == 0)
|
|
||||||
{
|
|
||||||
// Initialize the cache list head
|
|
||||||
InitializeListHead(&normalizedHostNameCacheListHead);
|
|
||||||
|
|
||||||
// Create a cache mutex only applicable to the current process
|
|
||||||
hNormalizedHostNameCacheMutex = CreateMutex(NULL,
|
|
||||||
FALSE,
|
|
||||||
NULL);
|
|
||||||
if (hNormalizedHostNameCacheMutex != NULL)
|
|
||||||
{
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InitializeHostNameNormalization- CreateMutex failed, error = %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InitializeHostNameNormalization- WSAStartup failed, error = %d\n", winsockStartupResult);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-InitializeHostNameNormalization- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,114 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include <winsock2.h>
|
|
||||||
#include <windows.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <aclapi.h>
|
|
||||||
#include <winerror.h>
|
|
||||||
#include <ws2tcpip.h>
|
|
||||||
#include <winhttp.h>
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
#ifndef CONTAINING_RECORD
|
|
||||||
#define CONTAINING_RECORD(address, type, field) ((type *)( \
|
|
||||||
(char*)(address) - \
|
|
||||||
(char*)(&((type *)0)->field)))
|
|
||||||
#endif
|
|
||||||
|
|
||||||
//
|
|
||||||
// DbgTrace macro define
|
|
||||||
//
|
|
||||||
//#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
//char printBuff[256]; \
|
|
||||||
// if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
// { \
|
|
||||||
// _snprintf(printBuff, sizeof(printBuff), X, Y); \
|
|
||||||
// printf("AuthToken %s", printBuff); \
|
|
||||||
// } \
|
|
||||||
//}
|
|
||||||
#define DbgTrace(LEVEL, X, Y) { \
|
|
||||||
char formatBuff[128]; \
|
|
||||||
char printBuff[256]; \
|
|
||||||
if (LEVEL == 0 || DebugLevel >= LEVEL) \
|
|
||||||
{ \
|
|
||||||
strcpy(formatBuff, "AuthToken "); \
|
|
||||||
strncat(formatBuff, X, sizeof(formatBuff) - 10); \
|
|
||||||
_snprintf(printBuff, sizeof(printBuff), formatBuff, Y); \
|
|
||||||
OutputDebugString(printBuff); \
|
|
||||||
} \
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
#define bool BOOLEAN
|
|
||||||
#define true TRUE
|
|
||||||
#define false FALSE
|
|
||||||
|
|
||||||
//
|
|
||||||
// Auth Cache Entry definition
|
|
||||||
//
|
|
||||||
typedef struct _AuthCacheEntry
|
|
||||||
{
|
|
||||||
LIST_ENTRY listEntry;
|
|
||||||
int refCount;
|
|
||||||
DWORD creationTime;
|
|
||||||
DWORD expirationTime;
|
|
||||||
BOOL doesNotExpire;
|
|
||||||
char *pHostName;
|
|
||||||
char *pCacheKeyName;
|
|
||||||
char *pToken;
|
|
||||||
int status;
|
|
||||||
|
|
||||||
} AuthCacheEntry, *PAuthCacheEntry;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Rpc Session definition
|
|
||||||
//
|
|
||||||
typedef struct _RpcSession
|
|
||||||
{
|
|
||||||
HINTERNET hSession;
|
|
||||||
HINTERNET hConnection;
|
|
||||||
|
|
||||||
} RpcSession, *PRpcSession;
|
|
||||||
|
|
||||||
//
|
|
||||||
// Other definitions
|
|
||||||
//
|
|
||||||
#define LIB_HANDLE HMODULE
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Inlines functions ]===============================================
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global externals ]==================================================
|
|
||||||
|
|
||||||
//===[ External prototypes ]===============================================
|
|
||||||
|
|
||||||
//=========================================================================
|
|
||||||
|
|
@ -1,498 +0,0 @@
|
|||||||
/***********************************************************************
|
|
||||||
*
|
|
||||||
* Copyright (C) 2006 Novell, Inc. All Rights Reserved.
|
|
||||||
*
|
|
||||||
* 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; version 2.1
|
|
||||||
* of the License.
|
|
||||||
*
|
|
||||||
* 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
|
|
||||||
* Library 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, Novell, Inc.
|
|
||||||
*
|
|
||||||
* To contact Novell about this file by physical or electronic mail,
|
|
||||||
* you may find current contact information at www.novell.com.
|
|
||||||
*
|
|
||||||
* Author: Juan Carlos Luciani <jluciani@novell.com>
|
|
||||||
*
|
|
||||||
***********************************************************************/
|
|
||||||
|
|
||||||
|
|
||||||
//===[ Include files ]=====================================================
|
|
||||||
|
|
||||||
#include "internal.h"
|
|
||||||
|
|
||||||
//===[ Type definitions ]==================================================
|
|
||||||
|
|
||||||
#define INITIAL_RESPONSE_DATA_BUF_SIZE 1028
|
|
||||||
#define INCREMENT_RESPONSE_DATA_BUF_SIZE 256
|
|
||||||
|
|
||||||
#define MAX_RPC_RETRIES 3
|
|
||||||
|
|
||||||
//===[ Function prototypes ]===============================================
|
|
||||||
|
|
||||||
//===[ Global variables ]==================================================
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
CopyMultiToWideAlloc(
|
|
||||||
IN char *pMulti,
|
|
||||||
IN int multiSize,
|
|
||||||
INOUT LPWSTR *ppWide,
|
|
||||||
INOUT int *pWideSize)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
int retStatus;
|
|
||||||
int size, i;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(2, "-CopyMultiToWideAlloc- Start\n", 0);
|
|
||||||
|
|
||||||
size = (multiSize + 1) * sizeof(WCHAR);
|
|
||||||
|
|
||||||
if ((*ppWide = (PWCHAR) malloc(size)) != NULL)
|
|
||||||
{
|
|
||||||
for (i = 0; i < multiSize; i++)
|
|
||||||
{
|
|
||||||
*(*ppWide + i) = (unsigned char) *(pMulti + i);
|
|
||||||
}
|
|
||||||
|
|
||||||
*(*ppWide + i) = L'\0';
|
|
||||||
|
|
||||||
if (pWideSize)
|
|
||||||
{
|
|
||||||
*pWideSize = size - sizeof(WCHAR);
|
|
||||||
}
|
|
||||||
|
|
||||||
retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-CopyMultiToWideAlloc- End, retStatus = %08X\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
RpcSession*
|
|
||||||
OpenRpcSession(
|
|
||||||
IN char *pHostName)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
RpcSession *pSession;
|
|
||||||
|
|
||||||
|
|
||||||
DbgTrace(1, "-OpenRpcSession- Start\n", 0);
|
|
||||||
|
|
||||||
// Allocate space for the session
|
|
||||||
pSession = (RpcSession*) malloc(sizeof(*pSession));
|
|
||||||
if (pSession)
|
|
||||||
{
|
|
||||||
// Zero the session structure
|
|
||||||
memset(pSession, 0, sizeof(*pSession));
|
|
||||||
|
|
||||||
// Open a Winhttp session
|
|
||||||
pSession->hSession = WinHttpOpen(L"CASA Client/1.0",
|
|
||||||
WINHTTP_ACCESS_TYPE_DEFAULT_PROXY,
|
|
||||||
WINHTTP_NO_PROXY_NAME,
|
|
||||||
WINHTTP_NO_PROXY_BYPASS,
|
|
||||||
0);
|
|
||||||
if (pSession->hSession)
|
|
||||||
{
|
|
||||||
LPWSTR pWideHostName;
|
|
||||||
int wideHostLen;
|
|
||||||
|
|
||||||
// Session opened, now convert the host name to Unicode so that
|
|
||||||
// we can open a connection.
|
|
||||||
if (CopyMultiToWideAlloc(pHostName,
|
|
||||||
(int) strlen(pHostName),
|
|
||||||
&pWideHostName,
|
|
||||||
&wideHostLen) == CASA_STATUS_SUCCESS)
|
|
||||||
{
|
|
||||||
// Now open connection
|
|
||||||
pSession->hConnection = WinHttpConnect(pSession->hSession,
|
|
||||||
pWideHostName,
|
|
||||||
8080, /*INTERNET_DEFAULT_HTTP_PORT,*/
|
|
||||||
0);
|
|
||||||
if (pSession->hConnection == NULL)
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-OpenRpcSession- Failed to open connection, error = %d\n", GetLastError());
|
|
||||||
|
|
||||||
// Free allocated resources
|
|
||||||
WinHttpCloseHandle(pSession->hSession);
|
|
||||||
free(pSession);
|
|
||||||
pSession = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the host name wide string buffer
|
|
||||||
free(pWideHostName);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-OpenRpcSession- Error converting host name to wide string\n", 0);
|
|
||||||
|
|
||||||
// Free allocated resources
|
|
||||||
WinHttpCloseHandle(pSession->hSession);
|
|
||||||
free(pSession);
|
|
||||||
pSession = NULL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-OpenRpcSession- Failed to open session, error = %d\n", GetLastError());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-OpenRpcSession- Failed to allocate buffer for rpc session\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(2, "-OpenRpcSession- End, pSession = %08X\n", pSession);
|
|
||||||
|
|
||||||
return pSession;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
void
|
|
||||||
CloseRpcSession(
|
|
||||||
IN RpcSession *pSession)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
DbgTrace(1, "-CloseRpcSession- Start\n", 0);
|
|
||||||
|
|
||||||
// Close the connection handle
|
|
||||||
WinHttpCloseHandle(pSession->hConnection);
|
|
||||||
|
|
||||||
// Close the session handle
|
|
||||||
WinHttpCloseHandle(pSession->hSession);
|
|
||||||
|
|
||||||
// Free the space allocated for the session
|
|
||||||
free(pSession);
|
|
||||||
|
|
||||||
DbgTrace(1, "-CloseRpcSession- End\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
static
|
|
||||||
CasaStatus
|
|
||||||
InternalRpc(
|
|
||||||
IN RpcSession *pSession,
|
|
||||||
IN char *pMethod,
|
|
||||||
IN bool secure,
|
|
||||||
IN char *pRequestData,
|
|
||||||
INOUT char **ppResponseData,
|
|
||||||
INOUT int *pResponseDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus = CASA_STATUS_SUCCESS;
|
|
||||||
char rpcTarget[256];
|
|
||||||
LPWSTR pWideRpcTarget;
|
|
||||||
int wideRpcTargetLen;
|
|
||||||
WCHAR sendHeaders[] = L"Content-Type: text/html";
|
|
||||||
|
|
||||||
DbgTrace(1, "-InternalRpc- Start\n", 0);
|
|
||||||
|
|
||||||
// Initialize output parameter
|
|
||||||
*ppResponseData = NULL;
|
|
||||||
|
|
||||||
// Create rpc target string and convert it to a wide string
|
|
||||||
sprintf(rpcTarget, "CasaAuthTokenSvc/Rpc?method=%s", pMethod);
|
|
||||||
retStatus = CopyMultiToWideAlloc(rpcTarget,
|
|
||||||
(int) strlen(rpcTarget),
|
|
||||||
&pWideRpcTarget,
|
|
||||||
&wideRpcTargetLen);
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
HINTERNET hRequest;
|
|
||||||
|
|
||||||
// Open a request handle
|
|
||||||
hRequest = WinHttpOpenRequest(pSession->hConnection,
|
|
||||||
L"POST",
|
|
||||||
pWideRpcTarget,
|
|
||||||
NULL,
|
|
||||||
WINHTTP_NO_REFERER,
|
|
||||||
WINHTTP_DEFAULT_ACCEPT_TYPES,
|
|
||||||
secure? WINHTTP_FLAG_REFRESH | WINHTTP_FLAG_SECURE : WINHTTP_FLAG_REFRESH);
|
|
||||||
if (hRequest)
|
|
||||||
{
|
|
||||||
int reqDataLen = (int) strlen(pRequestData);
|
|
||||||
|
|
||||||
// Send the request
|
|
||||||
if (WinHttpSendRequest(hRequest,
|
|
||||||
sendHeaders,
|
|
||||||
-1,
|
|
||||||
pRequestData,
|
|
||||||
reqDataLen,
|
|
||||||
reqDataLen,
|
|
||||||
0))
|
|
||||||
{
|
|
||||||
// Request sent, now await for the response.
|
|
||||||
if (WinHttpReceiveResponse(hRequest, NULL))
|
|
||||||
{
|
|
||||||
WCHAR httpCompStatus[4] = {0};
|
|
||||||
DWORD httpCompStatusLen = sizeof(httpCompStatus);
|
|
||||||
|
|
||||||
// Response received, make sure that it completed successfully.
|
|
||||||
if (WinHttpQueryHeaders(hRequest,
|
|
||||||
WINHTTP_QUERY_STATUS_CODE,
|
|
||||||
NULL,
|
|
||||||
&httpCompStatus,
|
|
||||||
&httpCompStatusLen,
|
|
||||||
WINHTTP_NO_HEADER_INDEX))
|
|
||||||
{
|
|
||||||
// Check that the request completed successfully
|
|
||||||
if (memcmp(httpCompStatus, L"200", sizeof(httpCompStatus)) == 0)
|
|
||||||
{
|
|
||||||
char *pResponseData;
|
|
||||||
int responseDataBufSize = INITIAL_RESPONSE_DATA_BUF_SIZE;
|
|
||||||
int responseDataRead = 0;
|
|
||||||
|
|
||||||
// Now read the response data, to do so we need to allocate a buffer.
|
|
||||||
pResponseData = (char*) malloc(INITIAL_RESPONSE_DATA_BUF_SIZE);
|
|
||||||
if (pResponseData)
|
|
||||||
{
|
|
||||||
char *pCurrLocation = pResponseData;
|
|
||||||
DWORD bytesRead;
|
|
||||||
|
|
||||||
do
|
|
||||||
{
|
|
||||||
bytesRead = 0;
|
|
||||||
if (WinHttpReadData(hRequest,
|
|
||||||
(LPVOID) pCurrLocation,
|
|
||||||
responseDataBufSize - responseDataRead,
|
|
||||||
&bytesRead))
|
|
||||||
{
|
|
||||||
pCurrLocation += bytesRead;
|
|
||||||
responseDataRead += bytesRead;
|
|
||||||
|
|
||||||
// Check if we need to allocate a larger buffer
|
|
||||||
if (responseDataRead == responseDataBufSize)
|
|
||||||
{
|
|
||||||
char *pTmpBuf;
|
|
||||||
|
|
||||||
// We need to upgrade the receive buffer
|
|
||||||
pTmpBuf = (char*) malloc(responseDataBufSize + INCREMENT_RESPONSE_DATA_BUF_SIZE);
|
|
||||||
if (pTmpBuf)
|
|
||||||
{
|
|
||||||
memcpy(pTmpBuf, pResponseData, responseDataBufSize);
|
|
||||||
free(pResponseData);
|
|
||||||
pResponseData = pTmpBuf;
|
|
||||||
pCurrLocation = pResponseData + responseDataBufSize;
|
|
||||||
responseDataBufSize += INCREMENT_RESPONSE_DATA_BUF_SIZE;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Failed reading response data, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
} while (CASA_SUCCESS(retStatus)
|
|
||||||
&& bytesRead != 0);
|
|
||||||
|
|
||||||
// Check if the response data was successfully received
|
|
||||||
if (CASA_SUCCESS(retStatus))
|
|
||||||
{
|
|
||||||
// The response data was received, return it to the caller.
|
|
||||||
*ppResponseData = pResponseData;
|
|
||||||
*pResponseDataLen = responseDataRead;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
// Failed to receive the response data, free the allocated buffer.
|
|
||||||
free(pResponseData);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Buffer allocation failure\n", 0);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- HTTP request did not complete successfully, status = %S\n", httpCompStatus);
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Unable to obtain http request completion status, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Unable to receive response, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int error = GetLastError();
|
|
||||||
|
|
||||||
DbgTrace(0, "-InternalRpc- Unsuccessful send http request, error = %d\n", error);
|
|
||||||
if (error == ERROR_WINHTTP_CANNOT_CONNECT)
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_AUTH_SERVER_UNAVAILABLE);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Close the request handle
|
|
||||||
WinHttpCloseHandle(hRequest);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Unable to open http request, error = %d\n", GetLastError());
|
|
||||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
|
||||||
CASA_FACILITY_AUTHTOKEN,
|
|
||||||
CASA_STATUS_UNSUCCESSFUL);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Free the rpc target wide string buffer
|
|
||||||
free(pWideRpcTarget);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DbgTrace(0, "-InternalRpc- Error converting method name to wide string\n", 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
DbgTrace(1, "-InternalRpc- End, retStatus = %d\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
CasaStatus
|
|
||||||
Rpc(
|
|
||||||
IN RpcSession *pSession,
|
|
||||||
IN char *pMethod,
|
|
||||||
IN bool secure,
|
|
||||||
IN char *pRequestData,
|
|
||||||
INOUT char **ppResponseData,
|
|
||||||
INOUT int *pResponseDataLen)
|
|
||||||
//
|
|
||||||
// Arguments:
|
|
||||||
//
|
|
||||||
// Returns:
|
|
||||||
//
|
|
||||||
// Abstract:
|
|
||||||
//
|
|
||||||
// Notes:
|
|
||||||
//
|
|
||||||
// L2
|
|
||||||
//=======================================================================--
|
|
||||||
{
|
|
||||||
CasaStatus retStatus;
|
|
||||||
int retries = 0;
|
|
||||||
|
|
||||||
DbgTrace(1, "-Rpc- Start\n", 0);
|
|
||||||
|
|
||||||
// Retry the RPC as needed
|
|
||||||
do
|
|
||||||
{
|
|
||||||
// Issue the RPC
|
|
||||||
retStatus = InternalRpc(pSession,
|
|
||||||
pMethod,
|
|
||||||
secure,
|
|
||||||
pRequestData,
|
|
||||||
ppResponseData,
|
|
||||||
pResponseDataLen);
|
|
||||||
|
|
||||||
// Account for this try
|
|
||||||
retries ++;
|
|
||||||
|
|
||||||
} while (CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE
|
|
||||||
&& retries < MAX_RPC_RETRIES);
|
|
||||||
|
|
||||||
DbgTrace(1, "-Rpc- End, retStatus = %d\n", retStatus);
|
|
||||||
|
|
||||||
return retStatus;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
//++=======================================================================
|
|
||||||
|
|
@ -1,5 +1,5 @@
|
|||||||
#
|
#
|
||||||
# spec file for the CASA-auth-token native packages.
|
# spec file for the CASA_auth_token native packages.
|
||||||
#
|
#
|
||||||
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
# Copyright (c) 2006 SUSE LINUX Products GmbH, Nuernberg, Germany.
|
||||||
# This file and all modifications and additions to the pristine
|
# This file and all modifications and additions to the pristine
|
||||||
@ -25,26 +25,26 @@ Autoreqprov: on
|
|||||||
%define bldno 1.0.0
|
%define bldno 1.0.0
|
||||||
Version: @VERSION@
|
Version: @VERSION@
|
||||||
Release: 0
|
Release: 0
|
||||||
Summary: Novell Common Authentication Services Adapter Authentication Token Infrastructure (CASA-auth-token)
|
Summary: Novell Common Authentication Services Adapter Authentication Token Infrastructure "Native" (CASA_auth_token)
|
||||||
Source: %{name}-%{version}.tar.bz2
|
Source: %{name}-%{version}.tar.bz2
|
||||||
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
BuildRoot: %{_tmppath}/%{name}-%{version}-build
|
||||||
Requires: expat
|
Requires: expat
|
||||||
PreReq: %fillup_prereq %insserv_prereq
|
PreReq: %fillup_prereq %insserv_prereq
|
||||||
|
|
||||||
%description
|
%description
|
||||||
CASA-auth-token is an authentication token infrastructure with support for multiple
|
CASA_auth_token is an authentication token infrastructure with support for multiple
|
||||||
authentication mechanisms with an emphasis on providing a scalable single
|
authentication mechanisms with an emphasis on providing a scalable single
|
||||||
sign-on solution.
|
sign-on solution.
|
||||||
|
|
||||||
A key feature of CASA-auth-token is that its authentication tokens contain identity
|
A key feature of CASA_auth_token is that its authentication tokens contain identity
|
||||||
information about the entity being authenticated. This information is made available
|
information about the entity being authenticated. This information is made available
|
||||||
to the consuming services. The amount of information contained in the tokens is
|
to the consuming services. The amount of information contained in the tokens is
|
||||||
configured on a per-service basis. Because of this feature, we say that CASA-auth-token
|
configured on a per-service basis. Because of this feature, we say that CASA_auth_token
|
||||||
projects an "Authenticated Identity".
|
projects an "Authenticated Identity".
|
||||||
|
|
||||||
This package contains the CASA (Common Authentication Services Adapter)
|
The CASA_auth_token_native package contains the CASA (Common Authentication
|
||||||
authentication token infrastructure lower level libraries for token
|
Services Adapter) authentication token infrastructure lower level libraries for
|
||||||
verification from native code ("C"). It is recomended that this library
|
token verification from native code ("C"). It is recomended that this library
|
||||||
not be invoked directly by applications, instead it is recomended that
|
not be invoked directly by applications, instead it is recomended that
|
||||||
appplication invoke its services through the support modules provided to
|
appplication invoke its services through the support modules provided to
|
||||||
integrate with PAM or the Apache Web Server.
|
integrate with PAM or the Apache Web Server.
|
||||||
@ -56,8 +56,19 @@ Group: Applications/System
|
|||||||
Requires: CASA_auth_token_native pam
|
Requires: CASA_auth_token_native pam
|
||||||
|
|
||||||
%description -n CASA_auth_token_pam_support
|
%description -n CASA_auth_token_pam_support
|
||||||
This package contains the CASA (Common Authentication Services Adapter)
|
CASA_auth_token is an authentication token infrastructure with support for multiple
|
||||||
authentication token infrastructure PAM module for token verification.
|
authentication mechanisms with an emphasis on providing a scalable single
|
||||||
|
sign-on solution.
|
||||||
|
|
||||||
|
A key feature of CASA_auth_token is that its authentication tokens contain identity
|
||||||
|
information about the entity being authenticated. This information is made available
|
||||||
|
to the consuming services. The amount of information contained in the tokens is
|
||||||
|
configured on a per-service basis. Because of this feature, we say that CASA_auth_token
|
||||||
|
projects an "Authenticated Identity".
|
||||||
|
|
||||||
|
The CASA_auth_token_pam_support package contains the CASA (Common Authentication
|
||||||
|
Services Adapter) authentication token infrastructure PAM module for token verification.
|
||||||
|
|
||||||
|
|
||||||
%package -n CASA_auth_token_apache2_2_support
|
%package -n CASA_auth_token_apache2_2_support
|
||||||
Summary: Libraries needed for Apache 2.2 applications development.
|
Summary: Libraries needed for Apache 2.2 applications development.
|
||||||
@ -65,8 +76,18 @@ Group: Applications/System
|
|||||||
Requires: apache2 CASA_auth_token_native
|
Requires: apache2 CASA_auth_token_native
|
||||||
|
|
||||||
%description -n CASA_auth_token_apache2_2_support
|
%description -n CASA_auth_token_apache2_2_support
|
||||||
This package contains the CASA (Common Authentication Services Adapter)
|
CASA_auth_token is an authentication token infrastructure with support for multiple
|
||||||
authentication token infrastructure Apache v2.2 authentication provider
|
authentication mechanisms with an emphasis on providing a scalable single
|
||||||
|
sign-on solution.
|
||||||
|
|
||||||
|
A key feature of CASA_auth_token is that its authentication tokens contain identity
|
||||||
|
information about the entity being authenticated. This information is made available
|
||||||
|
to the consuming services. The amount of information contained in the tokens is
|
||||||
|
configured on a per-service basis. Because of this feature, we say that CASA_auth_token
|
||||||
|
projects an "Authenticated Identity".
|
||||||
|
|
||||||
|
The CASA_auth_token_apache2_2_support package contains the CASA (Common Authentication
|
||||||
|
Services Adapter) authentication token infrastructure Apache v2.2 authentication provider
|
||||||
module for token verification. The module expects that users authenticate
|
module for token verification. The module expects that users authenticate
|
||||||
utilizing the HTTP Basic authentication scheme and that the password utilized consist
|
utilizing the HTTP Basic authentication scheme and that the password utilized consist
|
||||||
of a CASA authentication token. Information about the authenticated identity is
|
of a CASA authentication token. Information about the authenticated identity is
|
||||||
@ -78,9 +99,19 @@ Group: Applications/System
|
|||||||
Requires: CASA-devel CASA_auth_token_native CASA_auth_token_jaas_support CASA_auth_token_pam_support CASA_auth_token_apache2_2_support CASA_auth_token_service
|
Requires: CASA-devel CASA_auth_token_native CASA_auth_token_jaas_support CASA_auth_token_pam_support CASA_auth_token_apache2_2_support CASA_auth_token_service
|
||||||
|
|
||||||
%description -n CASA_auth_token_devel
|
%description -n CASA_auth_token_devel
|
||||||
This package contains the files necessary for the development of client and
|
CASA_auth_token is an authentication token infrastructure with support for multiple
|
||||||
server applications that utilize the CASA (Common Authentication Service Adapter)
|
authentication mechanisms with an emphasis on providing a scalable single
|
||||||
authentication token infrastructure for authentication.
|
sign-on solution.
|
||||||
|
|
||||||
|
A key feature of CASA_auth_token is that its authentication tokens contain identity
|
||||||
|
information about the entity being authenticated. This information is made available
|
||||||
|
to the consuming services. The amount of information contained in the tokens is
|
||||||
|
configured on a per-service basis. Because of this feature, we say that CASA_auth_token
|
||||||
|
projects an "Authenticated Identity".
|
||||||
|
|
||||||
|
The CASA_auth_token_devel package contains the files necessary for the development
|
||||||
|
of client and server applications that utilize the CASA (Common Authentication Service
|
||||||
|
Adapter) authentication token infrastructure for authentication.
|
||||||
|
|
||||||
|
|
||||||
%prep
|
%prep
|
||||||
|
Loading…
Reference in New Issue
Block a user