Added code to allow us to un-initialize the library when it is unloaded. These changes allow library un-initialization to work for Windows. More code needs to be added to un-initialize the library under Linux.

This commit is contained in:
Juan Carlos Luciani 2007-01-29 10:46:18 +00:00
parent de7dbd7b01
commit b5a6a452e8
6 changed files with 264 additions and 19 deletions

View File

@ -46,6 +46,8 @@ typedef struct _WrapperAuthCacheEntry
//===[ Global variables ]==================================================
static
BOOLEAN g_authCacheInitialized = FALSE;
HANDLE g_hCASAContext;
@ -448,8 +450,19 @@ FindSessionTokenEntryInCache(
if (pEntry->doesNotExpire == false
&& CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime))
{
// Remove the entry ???
//miCASARemoveBinaryKey();
// Remove the entry from the cache
miCasaStatus = miCASARemoveKey(g_hCASAContext,
0,
&sessionKeyChain,
&sharedId,
(SS_UTF8_T*) pCacheKey,
(uint32_t) strlen(pCacheKey) + 1,
(SSCS_PASSWORD_T*) NULL,
(SSCS_EXT_T*) pCredStoreScope);
if (miCasaStatus != NSSCS_SUCCESS)
{
DbgTrace(0, "-FindSessionTokenEntryInCache- miCASARemoveKey error = %0X\n", miCasaStatus);
}
FreeAuthCacheEntry(pEntry);
pEntry = NULL;
@ -550,8 +563,19 @@ FindAuthTokenEntryInCache(
if (pEntry->doesNotExpire == false
&& CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime))
{
// Remove the entry ???
//miCASARemoveBinaryKey();
// Remove the entry from the cache
miCasaStatus = miCASARemoveKey(g_hCASAContext,
0,
&sessionKeyChain,
&sharedId,
(SS_UTF8_T*) pKey,
keySize,
(SSCS_PASSWORD_T*) NULL,
(SSCS_EXT_T*) pCredStoreScope);
if (miCasaStatus != NSSCS_SUCCESS)
{
DbgTrace(0, "-FindAuthTokenEntryInCache- miCASARemoveKey error = %0X\n", miCasaStatus);
}
FreeAuthCacheEntry(pEntry);
pEntry = NULL;
@ -575,6 +599,48 @@ FindAuthTokenEntryInCache(
}
//++=======================================================================
void
RemoveSessionTokenEntryInCache(
IN const char *pCacheKey,
IN void *pCredStoreScope
)
//
// Arguments:
//
// Returns:
//
// Abstract:
//
// Notes:
//
// L2
//=======================================================================--
{
int32_t miCasaStatus;
SSCS_KEYCHAIN_ID_T sessionKeyChain = {26, "SSCS_SESSION_KEY_CHAIN_ID"};
SSCS_SECRET_ID_T sharedId = {20, "CASA_SESSION_TOKENS"};
DbgTrace(1, "-RemoveSessionTokenEntryInCache- Start\n", 0);
// Remove the entry from the cache
miCasaStatus = miCASARemoveKey(g_hCASAContext,
0,
&sessionKeyChain,
&sharedId,
(SS_UTF8_T*) pCacheKey,
(uint32_t) strlen(pCacheKey) + 1,
(SSCS_PASSWORD_T*) NULL,
(SSCS_EXT_T*) pCredStoreScope);
if (miCasaStatus != NSSCS_SUCCESS)
{
DbgTrace(0, "-RemoveSessionTokenEntryInCache- miCASARemoveKey error = %0X\n", miCasaStatus);
}
DbgTrace(1, "-RemoveSessionTokenEntryInCache- End\n", 0);
}
//++=======================================================================
CasaStatus
InitializeAuthCache()
@ -609,6 +675,7 @@ InitializeAuthCache()
}
else
{
g_authCacheInitialized = TRUE;
retStatus = CASA_STATUS_SUCCESS;
}
@ -618,6 +685,43 @@ InitializeAuthCache()
}
//++=======================================================================
void
UnInitializeAuthCache()
//
// Arguments:
//
// Returns:
//
// Abstract:
//
// Notes:
//
// L2
//=======================================================================--
{
CasaStatus retStatus;
SSCS_SECRETSTORE_T ssId;
DbgTrace(1, "-UnInitializeAuthCache- Start\n", 0);
// Proceed if initialized
if (g_authCacheInitialized)
{
// Close the secret store cache
miCASACloseSecretStoreCache(g_hCASAContext,
0,
NULL);
// Forget about being initialized
g_hCASAContext = NULL;
g_authCacheInitialized = FALSE;
}
DbgTrace(1, "-UnInitializeAuthCache- End\n", 0);
}
//++=======================================================================
//++=======================================================================
//++=======================================================================

View File

@ -32,8 +32,8 @@
#define DEFAULT_RETRY_LIFETIME 5 // seconds
#ifndef CASA_STATUS_NAME_RESOLVE_ERROR
#define CASA_STATUS_NAME_RESOLVE_ERROR ((CasaStatus)0x00000024)
#endif
#define CASA_STATUS_NAME_RESOLVE_ERROR ((CasaStatus)0x00000024)
#endif
//===[ Function prototypes ]===============================================
@ -64,7 +64,8 @@ ObtainSessionToken(
IN AuthPolicy *pAuthPolicy,
IN const char *pHostName,
IN void *pCredStoreScope,
INOUT char **ppSessionToken)
INOUT char **ppSessionToken,
INOUT AuthContext **ppSessionTokenAuthContext)
//
// Arguments:
//
@ -82,6 +83,7 @@ ObtainSessionToken(
CASA_STATUS_UNSUCCESSFUL);
LIST_ENTRY *pListEntry;
AuthCacheEntry *pCacheEntry = NULL;
AuthContext *pAuthContext;
DbgTrace(1, "-ObtainSessionToken- Start\n", 0);
@ -93,8 +95,6 @@ ObtainSessionToken(
pListEntry = pAuthPolicy->authContextListHead.Flink;
while (pListEntry != &pAuthPolicy->authContextListHead)
{
AuthContext *pAuthContext;
// Get pointer to AuthContext structure
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
@ -126,8 +126,7 @@ ObtainSessionToken(
while (!CASA_SUCCESS(retStatus)
&& pListEntry != &pAuthPolicy->authContextListHead)
{
AuthContext *pAuthContext;
char *pAuthMechToken;
char *pAuthMechToken;
// Get pointer to AuthContext structure
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
@ -272,6 +271,9 @@ ObtainSessionToken(
{
// Copy the token onto the allocated buffer
strcpy(*ppSessionToken, pCacheEntry->token);
// Return pointer to AuthContext associated with the session token
*ppSessionTokenAuthContext = pAuthContext;
}
else
{
@ -358,12 +360,15 @@ ObtainAuthTokenFromServer(
&pAuthPolicy);
if (CASA_SUCCESS(retStatus))
{
AuthContext *pSessionTokenAuthContext = NULL;
// Now try to obtain a session token
retStatus = ObtainSessionToken(pRpcSession,
pAuthPolicy,
(g_pATSHostName != NULL) ? g_pATSHostName : pHostName,
pCredStoreScope,
&pSessionToken);
&pSessionToken,
&pSessionTokenAuthContext);
if (CASA_SUCCESS(retStatus))
{
// Request auth token for the service
@ -399,6 +404,13 @@ ObtainAuthTokenFromServer(
else
{
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to create GetAuthTokenResp object, error = %08X\n", retStatus);
// Remove the session token from the cache in case that it was due to a bad session token
if (pSessionTokenAuthContext)
{
RemoveSessionTokenEntryInCache(pSessionTokenAuthContext->pContext,
pCredStoreScope);
}
}
}
else
@ -980,6 +992,36 @@ InitializeLibrary(void)
}
//++=======================================================================
void
UnInitializeLibrary(void)
//
// Arguments:
//
// Returns:
//
// Abstract:
//
// Notes:
//
// L2
//=======================================================================--
{
DbgTrace(1, "-UnInitializeLibrary- Start\n", 0);
// Un-initialize the host name normalization
UnInitializeHostNameNormalization();
// Un-initialize the auth cache
UnInitializeAuthCache();
// Un-initialize the Rpc engine
UnInitializeRpc();
DbgTrace(1, "-UnInitializeLibrary- End\n", 0);
}
//++=======================================================================
//++=======================================================================
//++=======================================================================

View File

@ -281,6 +281,12 @@ FindAuthTokenEntryInCache(
IN const char *pGroupOrHostName,
IN void *pCredStoreScope);
extern
void
RemoveSessionTokenEntryInCache(
IN const char *pCacheKey,
IN void *pCredStoreScope);
extern
CasaStatus
InitializeAuthCache(void);
@ -349,6 +355,10 @@ extern
CasaStatus
InitializeHostNameNormalization(void);
extern
void
UnInitializeHostNameNormalization(void);
//
// Functions exported by rpc.c
//
@ -382,6 +392,11 @@ extern
CasaStatus
InitializeRpc(void);
extern
void
UnInitializeRpc(void);
//
// Functions exported by utils.c
//

View File

@ -179,9 +179,7 @@ BOOL APIENTRY DllMain(
case DLL_PROCESS_DETACH:
{
/* Don't uninitialize on windows
tbd
*/
UnInitializeLibrary();
break;
}
}

View File

@ -45,6 +45,9 @@ typedef struct _NormalizedHostNameCacheEntry
//===[ Global variables ]==================================================
static
BOOLEAN hostNameNormalizationInitialized = FALSE;
// Normalized host name cache list head
static
LIST_ENTRY normalizedHostNameCacheListHead;
@ -64,6 +67,7 @@ char mechConfigFolder[MAX_PATH + sizeof(mechConfigFolderPartialPath)];
// Path separator
char pathCharString[] = "\\";
//++=======================================================================
CasaStatus
CreateUserMutex(
@ -585,11 +589,13 @@ InitializeHostNameNormalization(void)
NULL);
if (hNormalizedHostNameCacheMutex != NULL)
{
hostNameNormalizationInitialized = TRUE;
retStatus = CASA_STATUS_SUCCESS;
}
else
{
DbgTrace(0, "-InitializeHostNameNormalization- CreateMutex failed, error = %d\n", GetLastError());
WSACleanup();
}
}
else
@ -603,6 +609,63 @@ InitializeHostNameNormalization(void)
}
//++=======================================================================
void
UnInitializeHostNameNormalization(void)
//
// Arguments:
//
// Returns:
//
// Abstract:
//
// Notes:
//
// L2
//=======================================================================--
{
LIST_ENTRY *pListEntry;
NormalizedHostNameCacheEntry *pEntry = NULL;
DbgTrace(1, "-UnInitializeHostNameNormalization- Start\n", 0);
// Proceed if initialization succeeded
if (hostNameNormalizationInitialized)
{
// Un-initialize winsock
WSACleanup();
// Free up any normalized host names in our cache
pListEntry = normalizedHostNameCacheListHead.Flink;
while (pListEntry != &normalizedHostNameCacheListHead)
{
// Get pointer to the entry
pEntry = CONTAINING_RECORD(pListEntry, NormalizedHostNameCacheEntry, listEntry);
// Remove the entry from the list
RemoveEntryList(pListEntry);
// Free the entry
if (pEntry->pHostName)
free(pEntry->pHostName);
if (pEntry->pNormalizedHostName)
free(pEntry->pNormalizedHostName);
free(pEntry);
// Try to go to the next entry
pListEntry = normalizedHostNameCacheListHead.Flink;
}
// Forget about being initialized
hostNameNormalizationInitialized = FALSE;
}
DbgTrace(1, "-UnInitializeHostNameNormalization- End", 0);
}
//++=======================================================================
//++=======================================================================
//++=======================================================================

View File

@ -359,8 +359,8 @@ InternalRpc(
#define RPC_TARGET_FMT_STRING "CasaAuthTokenSvc/Rpc?method=%s"
#ifndef CASA_STATUS_INVALID_SERVER_CERTIFICATE
#define CASA_STATUS_INVALID_SERVER_CERTIFICATE ((CasaStatus)0x00000023)
#endif
#define CASA_STATUS_INVALID_SERVER_CERTIFICATE ((CasaStatus)0x00000023)
#endif
CasaStatus retStatus = CASA_STATUS_SUCCESS;
char *pRpcTarget;
@ -729,7 +729,7 @@ InternalRpc(
CASA_STATUS_INSUFFICIENT_RESOURCES);
}
DbgTrace(1, "-InternalRpc- End, retStatus = %d\n", retStatus);
DbgTrace(1, "-InternalRpc- End, retStatus = %0X\n", retStatus);
return retStatus;
}
@ -778,7 +778,7 @@ Rpc(
} while (CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE
&& retries < MAX_RPC_RETRIES);
DbgTrace(1, "-Rpc- End, retStatus = %d\n", retStatus);
DbgTrace(1, "-Rpc- End, retStatus = %0X\n", retStatus);
return retStatus;
}
@ -811,6 +811,29 @@ InitializeRpc(void)
}
//++=======================================================================
void
UnInitializeRpc(void)
//
// Arguments:
//
// Returns:
//
// Abstract:
//
// Notes:
//
// L2
//=======================================================================--
{
DbgTrace(1, "-UnInitializeRpc- Start\n", 0);
// Nothing to do for windows
DbgTrace(1, "-UnInitializeRpc- End\n", 0);
}
//++=======================================================================
//++=======================================================================
//++=======================================================================