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 ]================================================== //===[ Global variables ]==================================================
static
BOOLEAN g_authCacheInitialized = FALSE;
HANDLE g_hCASAContext; HANDLE g_hCASAContext;
@ -448,8 +450,19 @@ FindSessionTokenEntryInCache(
if (pEntry->doesNotExpire == false if (pEntry->doesNotExpire == false
&& CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime)) && CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime))
{ {
// Remove the entry ??? // Remove the entry from the cache
//miCASARemoveBinaryKey(); 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); FreeAuthCacheEntry(pEntry);
pEntry = NULL; pEntry = NULL;
@ -550,8 +563,19 @@ FindAuthTokenEntryInCache(
if (pEntry->doesNotExpire == false if (pEntry->doesNotExpire == false
&& CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime)) && CacheEntryLifetimeExpired(pEntry->creationTime, pEntry->expirationTime))
{ {
// Remove the entry ??? // Remove the entry from the cache
//miCASARemoveBinaryKey(); 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); FreeAuthCacheEntry(pEntry);
pEntry = NULL; 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 CasaStatus
InitializeAuthCache() InitializeAuthCache()
@ -609,6 +675,7 @@ InitializeAuthCache()
} }
else else
{ {
g_authCacheInitialized = TRUE;
retStatus = CASA_STATUS_SUCCESS; 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

@ -64,7 +64,8 @@ ObtainSessionToken(
IN AuthPolicy *pAuthPolicy, IN AuthPolicy *pAuthPolicy,
IN const char *pHostName, IN const char *pHostName,
IN void *pCredStoreScope, IN void *pCredStoreScope,
INOUT char **ppSessionToken) INOUT char **ppSessionToken,
INOUT AuthContext **ppSessionTokenAuthContext)
// //
// Arguments: // Arguments:
// //
@ -82,6 +83,7 @@ ObtainSessionToken(
CASA_STATUS_UNSUCCESSFUL); CASA_STATUS_UNSUCCESSFUL);
LIST_ENTRY *pListEntry; LIST_ENTRY *pListEntry;
AuthCacheEntry *pCacheEntry = NULL; AuthCacheEntry *pCacheEntry = NULL;
AuthContext *pAuthContext;
DbgTrace(1, "-ObtainSessionToken- Start\n", 0); DbgTrace(1, "-ObtainSessionToken- Start\n", 0);
@ -93,8 +95,6 @@ ObtainSessionToken(
pListEntry = pAuthPolicy->authContextListHead.Flink; pListEntry = pAuthPolicy->authContextListHead.Flink;
while (pListEntry != &pAuthPolicy->authContextListHead) while (pListEntry != &pAuthPolicy->authContextListHead)
{ {
AuthContext *pAuthContext;
// Get pointer to AuthContext structure // Get pointer to AuthContext structure
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry); pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
@ -126,8 +126,7 @@ ObtainSessionToken(
while (!CASA_SUCCESS(retStatus) while (!CASA_SUCCESS(retStatus)
&& pListEntry != &pAuthPolicy->authContextListHead) && pListEntry != &pAuthPolicy->authContextListHead)
{ {
AuthContext *pAuthContext; char *pAuthMechToken;
char *pAuthMechToken;
// Get pointer to AuthContext structure // Get pointer to AuthContext structure
pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry); pAuthContext = CONTAINING_RECORD(pListEntry, AuthContext, listEntry);
@ -272,6 +271,9 @@ ObtainSessionToken(
{ {
// Copy the token onto the allocated buffer // Copy the token onto the allocated buffer
strcpy(*ppSessionToken, pCacheEntry->token); strcpy(*ppSessionToken, pCacheEntry->token);
// Return pointer to AuthContext associated with the session token
*ppSessionTokenAuthContext = pAuthContext;
} }
else else
{ {
@ -358,12 +360,15 @@ ObtainAuthTokenFromServer(
&pAuthPolicy); &pAuthPolicy);
if (CASA_SUCCESS(retStatus)) if (CASA_SUCCESS(retStatus))
{ {
AuthContext *pSessionTokenAuthContext = NULL;
// Now try to obtain a session token // Now try to obtain a session token
retStatus = ObtainSessionToken(pRpcSession, retStatus = ObtainSessionToken(pRpcSession,
pAuthPolicy, pAuthPolicy,
(g_pATSHostName != NULL) ? g_pATSHostName : pHostName, (g_pATSHostName != NULL) ? g_pATSHostName : pHostName,
pCredStoreScope, pCredStoreScope,
&pSessionToken); &pSessionToken,
&pSessionTokenAuthContext);
if (CASA_SUCCESS(retStatus)) if (CASA_SUCCESS(retStatus))
{ {
// Request auth token for the service // Request auth token for the service
@ -399,6 +404,13 @@ ObtainAuthTokenFromServer(
else else
{ {
DbgTrace(0, "-ObtainAuthTokenFromServer- Failed to create GetAuthTokenResp object, error = %08X\n", retStatus); 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 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 const char *pGroupOrHostName,
IN void *pCredStoreScope); IN void *pCredStoreScope);
extern
void
RemoveSessionTokenEntryInCache(
IN const char *pCacheKey,
IN void *pCredStoreScope);
extern extern
CasaStatus CasaStatus
InitializeAuthCache(void); InitializeAuthCache(void);
@ -349,6 +355,10 @@ extern
CasaStatus CasaStatus
InitializeHostNameNormalization(void); InitializeHostNameNormalization(void);
extern
void
UnInitializeHostNameNormalization(void);
// //
// Functions exported by rpc.c // Functions exported by rpc.c
// //
@ -382,6 +392,11 @@ extern
CasaStatus CasaStatus
InitializeRpc(void); InitializeRpc(void);
extern
void
UnInitializeRpc(void);
// //
// Functions exported by utils.c // Functions exported by utils.c
// //

View File

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

View File

@ -45,6 +45,9 @@ typedef struct _NormalizedHostNameCacheEntry
//===[ Global variables ]================================================== //===[ Global variables ]==================================================
static
BOOLEAN hostNameNormalizationInitialized = FALSE;
// Normalized host name cache list head // Normalized host name cache list head
static static
LIST_ENTRY normalizedHostNameCacheListHead; LIST_ENTRY normalizedHostNameCacheListHead;
@ -64,6 +67,7 @@ char mechConfigFolder[MAX_PATH + sizeof(mechConfigFolderPartialPath)];
// Path separator // Path separator
char pathCharString[] = "\\"; char pathCharString[] = "\\";
//++======================================================================= //++=======================================================================
CasaStatus CasaStatus
CreateUserMutex( CreateUserMutex(
@ -585,11 +589,13 @@ InitializeHostNameNormalization(void)
NULL); NULL);
if (hNormalizedHostNameCacheMutex != NULL) if (hNormalizedHostNameCacheMutex != NULL)
{ {
hostNameNormalizationInitialized = TRUE;
retStatus = CASA_STATUS_SUCCESS; retStatus = CASA_STATUS_SUCCESS;
} }
else else
{ {
DbgTrace(0, "-InitializeHostNameNormalization- CreateMutex failed, error = %d\n", GetLastError()); DbgTrace(0, "-InitializeHostNameNormalization- CreateMutex failed, error = %d\n", GetLastError());
WSACleanup();
} }
} }
else 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

@ -729,7 +729,7 @@ InternalRpc(
CASA_STATUS_INSUFFICIENT_RESOURCES); CASA_STATUS_INSUFFICIENT_RESOURCES);
} }
DbgTrace(1, "-InternalRpc- End, retStatus = %d\n", retStatus); DbgTrace(1, "-InternalRpc- End, retStatus = %0X\n", retStatus);
return retStatus; return retStatus;
} }
@ -778,7 +778,7 @@ Rpc(
} while (CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE } while (CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE
&& retries < MAX_RPC_RETRIES); && retries < MAX_RPC_RETRIES);
DbgTrace(1, "-Rpc- End, retStatus = %d\n", retStatus); DbgTrace(1, "-Rpc- End, retStatus = %0X\n", retStatus);
return 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);
}
//++======================================================================= //++=======================================================================
//++======================================================================= //++=======================================================================
//++======================================================================= //++=======================================================================