Adding client files lost during folder re-structuring.
This commit is contained in:
		
							
								
								
									
										67
									
								
								CASA-auth-token/non-java/client/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										67
									
								
								CASA-auth-token/non-java/client/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,67 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										18
									
								
								CASA-auth-token/non-java/client/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										18
									
								
								CASA-auth-token/non-java/client/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,18 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|   | ||||
							
								
								
									
										339
									
								
								CASA-auth-token/non-java/client/authmech.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										339
									
								
								CASA-auth-token/non-java/client/authmech.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,339 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										803
									
								
								CASA-auth-token/non-java/client/authmsg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										803
									
								
								CASA-auth-token/non-java/client/authmsg.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,803 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										801
									
								
								CASA-auth-token/non-java/client/authpolicy.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										801
									
								
								CASA-auth-token/non-java/client/authpolicy.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,801 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
| @@ -0,0 +1,694 @@ | ||||
| "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" | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
| @@ -0,0 +1,438 @@ | ||||
| "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:_1ED6B3F7C91A4BBE875FC4621FC3CD97" | ||||
|         "OwnerKey" = "8:_UNDEFINED" | ||||
|         "MsmSig" = "8:_UNDEFINED" | ||||
|         } | ||||
|         "Entry" | ||||
|         { | ||||
|         "MsmKey" = "8:_677B016062384F4C8A73EC952CBCFD76" | ||||
|         "OwnerKey" = "8:_UNDEFINED" | ||||
|         "MsmSig" = "8:_UNDEFINED" | ||||
|         } | ||||
|         "Entry" | ||||
|         { | ||||
|         "MsmKey" = "8:_9A2FC85FE99C48E8AD1E4813BE33A03A" | ||||
|         "OwnerKey" = "8:_UNDEFINED" | ||||
|         "MsmSig" = "8:_UNDEFINED" | ||||
|         } | ||||
|         "Entry" | ||||
|         { | ||||
|         "MsmKey" = "8:_DB9D7F0710B44F858325E4EFCCB2EEB3" | ||||
|         "OwnerKey" = "8:_UNDEFINED" | ||||
|         "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}:_1ED6B3F7C91A4BBE875FC4621FC3CD97" | ||||
|             { | ||||
|             "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}:_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:" | ||||
|             } | ||||
|         } | ||||
|         "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\\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" | ||||
|                 { | ||||
|                 } | ||||
|             } | ||||
|             "{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" | ||||
|         { | ||||
|         } | ||||
|     } | ||||
| } | ||||
							
								
								
									
										221
									
								
								CASA-auth-token/non-java/client/client.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										221
									
								
								CASA-auth-token/non-java/client/client.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,221 @@ | ||||
| <?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;"\Program Files\novell\casa\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 micasa.lib" | ||||
| 				OutputFile="$(OutDir)/authtoken.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				AdditionalLibraryDirectories=""\Program Files\Novell\CASA\lib";"..\..\..\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;"\Program Files\novell\casa\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 micasa.lib" | ||||
| 				OutputFile="$(OutDir)/authtoken.dll" | ||||
| 				LinkIncremental="1" | ||||
| 				AdditionalLibraryDirectories=""\Program Files\Novell\CASA\lib";"..\..\..\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=".\cache.c"> | ||||
| 				<FileConfiguration | ||||
| 					Name="Debug|Win32"> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 						ObjectFile="$(IntDir)/$(InputName)1.obj"/> | ||||
| 				</FileConfiguration> | ||||
| 				<FileConfiguration | ||||
| 					Name="Release|Win32"> | ||||
| 					<Tool | ||||
| 						Name="VCCLCompilerTool" | ||||
| 						ObjectFile="$(IntDir)/$(InputName)1.obj"/> | ||||
| 				</FileConfiguration> | ||||
| 			</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> | ||||
							
								
								
									
										685
									
								
								CASA-auth-token/non-java/client/config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										685
									
								
								CASA-auth-token/non-java/client/config.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,685 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										120
									
								
								CASA-auth-token/non-java/client/config_if.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								CASA-auth-token/non-java/client/config_if.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,120 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
|  | ||||
							
								
								
									
										696
									
								
								CASA-auth-token/non-java/client/engine.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										696
									
								
								CASA-auth-token/non-java/client/engine.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,696 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| bool	g_bInitialized = FALSE; | ||||
|  | ||||
| //++======================================================================= | ||||
| 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 | ||||
|          { | ||||
| 			// Free the entry | ||||
|             FreeAuthCacheEntry(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) | ||||
|       { | ||||
| 		 char  *pReqMsg = NULL; | ||||
| 		 char  *pRespMsg = NULL; | ||||
| 		 int   respLen; | ||||
|  | ||||
|          // 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; | ||||
|          } | ||||
|  | ||||
| 		 // 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 = CreateSessionTokenCacheEntry( | ||||
| 								 pAuthContext->pContext, | ||||
| 								 retStatus, | ||||
| 								 pAuthenticateResp->pToken, | ||||
| 								 pAuthenticateResp->tokenLifetime); | ||||
|  | ||||
| 				  pAuthenticateResp->pToken = NULL; // To keep us from freeing the buffer | ||||
|  | ||||
| 				  // 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 (CasaStatusCode(retStatus) == CASA_STATUS_AUTH_SERVER_UNAVAILABLE) | ||||
| 		 { | ||||
| 			pCacheEntry = CreateSessionTokenCacheEntry( | ||||
| 						   pAuthContext->pContext, | ||||
| 						   retStatus, | ||||
| 						   NULL, | ||||
| 						   DEFAULT_RETRY_LIFETIME); | ||||
|  | ||||
| 		 } | ||||
|  | ||||
| 		 // Release the cache entry if the resulting status is not successful | ||||
| 		 if (!CASA_SUCCESS(retStatus)) | ||||
| 		 { | ||||
| 			FreeAuthCacheEntry(pCacheEntry); | ||||
| 		 } | ||||
|  | ||||
|          // Free up the buffer associated with the authentication mechanism token | ||||
|          free(pAuthMechToken); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
| 		 // Free the entry | ||||
| 		 FreeAuthCacheEntry(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->token) + 1); | ||||
|       if (*ppSessionToken) | ||||
|       { | ||||
|          // Copy the token onto the allocated buffer | ||||
|          strcpy(*ppSessionToken, pCacheEntry->token); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|          DbgTrace(0, "-ObtainSessionToken- Buffer allocation failure\n", 0); | ||||
|          retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||
|                                      CASA_FACILITY_AUTHTOKEN, | ||||
|                                      CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||
|       } | ||||
|  | ||||
|       FreeAuthCacheEntry(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; | ||||
|    unsigned char	 *pToken; | ||||
|    HANDLE            hUserMutex = NULL; | ||||
|  | ||||
|  | ||||
|    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; | ||||
|    } | ||||
|  | ||||
|    // Make sure we are initialized | ||||
|    // Obtain our synchronization mutex | ||||
|    AcquireInitializationMutex(); | ||||
|  | ||||
|    // Create user synchronization mutex | ||||
|    retStatus = CreateUserMutex(&hUserMutex); | ||||
|  | ||||
|    if (retStatus != CASA_STATUS_SUCCESS) | ||||
|    { | ||||
| 	  DbgTrace(0, "-ObtainAuthToken- Error creating mutex for the user\n", 0); | ||||
|       goto exit; | ||||
|    } | ||||
|  | ||||
|    if (g_bInitialized == FALSE) | ||||
|    { | ||||
| 	  retStatus = InitializeLibrary(); | ||||
|  | ||||
| 	  if (retStatus == CASA_STATUS_SUCCESS) | ||||
| 	  { | ||||
| 		 g_bInitialized = TRUE; | ||||
| 	  } | ||||
| 	  else | ||||
| 	  { | ||||
| 		 goto exit; | ||||
| 	  } | ||||
|    } | ||||
|  | ||||
|    // Release our synchronization mutex | ||||
|    ReleaseInitializationMutex(); | ||||
|  | ||||
|    // Normalize the host name | ||||
|    pNormalizedHostName = NormalizeHostName(pHostName); | ||||
|    if (pNormalizedHostName) | ||||
|    { | ||||
|       // Start user process synchronization | ||||
|       AcquireUserMutex(hUserMutex); | ||||
|  | ||||
|       // Try to find a cache entry for the service | ||||
|       pCacheEntry = FindAuthTokenEntryInCache(pServiceName, pNormalizedHostName); | ||||
|       if (pCacheEntry == NULL) | ||||
|       { | ||||
| 		 // Initialize to retry in case of failure | ||||
| 		 int   cacheEntryLifetime = DEFAULT_RETRY_LIFETIME;  | ||||
|  | ||||
| 		 // Cache entry created, now try to obtain auth token from the CASA Server | ||||
| 		 retStatus = ObtainAuthTokenFromServer(pServiceName, | ||||
| 											   pNormalizedHostName, | ||||
| 											   &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 = CreateAuthTokenCacheEntry( | ||||
| 						   pServiceName, | ||||
| 						   pNormalizedHostName, | ||||
| 						   retStatus, | ||||
| 						   pToken, | ||||
| 						   cacheEntryLifetime); | ||||
|  | ||||
| 			if (pCacheEntry) | ||||
| 			{ | ||||
| 			   // Release the cache entry if the resulting status is not successful | ||||
| 			   if (!CASA_SUCCESS(retStatus)) | ||||
| 			   { | ||||
| 				  FreeAuthCacheEntry(pCacheEntry); | ||||
| 			   } | ||||
| 			} | ||||
| 		 } | ||||
|  | ||||
|       } | ||||
|       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)) | ||||
|          { | ||||
|             FreeAuthCacheEntry(pCacheEntry); | ||||
|          } | ||||
|       } | ||||
|  | ||||
|  | ||||
|       // Try to return auth token if we have one to return | ||||
|       if (CASA_SUCCESS(retStatus)) | ||||
|       { | ||||
|          int   tokenLen = (int) strlen(pCacheEntry->token) + 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->token); | ||||
|          } | ||||
|          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; | ||||
|  | ||||
|          FreeAuthCacheEntry(pCacheEntry); | ||||
|       } | ||||
|  | ||||
|       // Stop user process synchronization | ||||
|       ReleaseUserMutex(hUserMutex); | ||||
|  | ||||
|       // 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: | ||||
|  | ||||
|    if (hUserMutex != NULL) | ||||
|    { | ||||
| 	  DestroyUserMutex(hUserMutex); | ||||
|    } | ||||
|  | ||||
|    DbgTrace(1, "-ObtainAuthToken- End, retStatus = %08X\n", retStatus); | ||||
|  | ||||
|    return retStatus; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| int | ||||
| Initialize(void) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    int   retStatus; | ||||
|  | ||||
|    DbgTrace(1, "-InitializeLibrary- Start\n", 0); | ||||
|  | ||||
|    retStatus = CreateInitializationMutex(); | ||||
|  | ||||
|    DbgTrace(1, "-InitializeLibrary- End, retStatus = %08X\n", retStatus); | ||||
|  | ||||
|    return retStatus; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| int | ||||
| InitializeLibrary(void) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    int   retStatus = -1; | ||||
|  | ||||
|    DbgTrace(1, "-InitializeLibrary- Start\n", 0); | ||||
|  | ||||
|    // Initialize the host name normalization | ||||
|    retStatus = InitializeHostNameNormalization(); | ||||
|  | ||||
|  | ||||
|    if (CASA_SUCCESS(retStatus)) | ||||
|    { | ||||
| 	  retStatus = InitializeAuthCache(); | ||||
|    } | ||||
|  | ||||
|  | ||||
|    DbgTrace(1, "-InitializeLibrary- End, retStatus = %08X\n", retStatus); | ||||
|  | ||||
|    return retStatus; | ||||
| } | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										745
									
								
								CASA-auth-token/non-java/client/getpolicymsg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										745
									
								
								CASA-auth-token/non-java/client/getpolicymsg.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,745 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										793
									
								
								CASA-auth-token/non-java/client/gettokenmsg.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										793
									
								
								CASA-auth-token/non-java/client/gettokenmsg.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,793 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										395
									
								
								CASA-auth-token/non-java/client/internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										395
									
								
								CASA-auth-token/non-java/client/internal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,395 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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 | ||||
| Initialize(void); | ||||
|  | ||||
| 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, | ||||
|    IN	 CasaStatus status, | ||||
|    IN    unsigned char *pToken, | ||||
|    IN    int entryLifetime | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| AuthCacheEntry* | ||||
| CreateAuthTokenCacheEntry( | ||||
|    IN    const char *pCacheKey, | ||||
|    IN    const char *pHostName, | ||||
|    IN	 CasaStatus status, | ||||
|    IN    unsigned char *pToken, | ||||
|    IN    int entryLifetime | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| void | ||||
| FreeAuthCacheEntry( | ||||
|    IN    AuthCacheEntry *pEntry); | ||||
|  | ||||
| extern | ||||
| AuthCacheEntry* | ||||
| FindSessionTokenEntryInCache( | ||||
|    IN    const char *pCacheKey); | ||||
|  | ||||
| extern | ||||
| AuthCacheEntry* | ||||
| FindAuthTokenEntryInCache( | ||||
|    IN    const char *pCacheKey, | ||||
|    IN    const char *pGroupOrHostName); | ||||
|  | ||||
| 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( | ||||
|    HANDLE *phMutex | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| void | ||||
| AcquireUserMutex( | ||||
|    HANDLE hMutex | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| void | ||||
| ReleaseUserMutex( | ||||
|    HANDLE hMutex | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| void | ||||
| DestroyUserMutex( | ||||
|    HANDLE hMutex | ||||
|    ); | ||||
|  | ||||
| extern | ||||
| CasaStatus | ||||
| CreateInitializationMutex(void); | ||||
|  | ||||
| extern | ||||
| void | ||||
| AcquireInitializationMutex(void); | ||||
|  | ||||
| extern | ||||
| void | ||||
| ReleaseInitializationMutex(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_ | ||||
|  | ||||
							
								
								
									
										177
									
								
								CASA-auth-token/non-java/client/mech_if.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										177
									
								
								CASA-auth-token/non-java/client/mech_if.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,177 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
|  | ||||
| @@ -0,0 +1,12 @@ | ||||
| ####################################################### | ||||
| #                                                     # | ||||
| # CASA Authentication Token System configuration file # | ||||
| # for module:                                         # | ||||
| #                                                     # | ||||
| #     Krb5Authenticate                                # | ||||
| #                                                     # | ||||
| ####################################################### | ||||
|  | ||||
| LibraryName		\Program Files\novell\casa\lib\krb5mech.dll | ||||
|  | ||||
|  | ||||
							
								
								
									
										30
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										30
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,30 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										14
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  TODO for krb5mech | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| This file contains a list of the items still outstanding for krb5mech. | ||||
|  | ||||
| OUTSTANDING ITEMS | ||||
|  | ||||
| - Implementation of Linux specific code. | ||||
|   | ||||
							
								
								
									
										207
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/interface.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/interface.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										90
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										90
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/internal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,90 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
							
								
								
									
										182
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/krb5.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										182
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/krb5.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,182 @@ | ||||
| <?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;.;"..\..";"C:\Program Files\novell\CASA\include";"..\..\..\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;.;"..\..";"C:\Program Files\novell\CASA\include";"..\..\..\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> | ||||
							
								
								
									
										282
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/util.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,282 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										132
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
| //========================================================================= | ||||
| //========================================================================= | ||||
|  | ||||
							
								
								
									
										272
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/windows/get.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										272
									
								
								CASA-auth-token/non-java/client/mechanisms/krb5/windows/get.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,272 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
| @@ -0,0 +1,10 @@ | ||||
| LIBRARY         KRB5MECH | ||||
| DESCRIPTION     'CASA Kerberos V Authentication Mechanism Library.' | ||||
|  | ||||
|  | ||||
| EXPORTS | ||||
| ;                DllRegisterServer   PRIVATE | ||||
| ;                DllUnregisterServer PRIVATE | ||||
| ;                DllGetClassObject   PRIVATE | ||||
|                 GetAuthTokenInterface  PRIVATE         | ||||
| ;               DllCanUnloadNow     PRIVATE   | ||||
| @@ -0,0 +1,35 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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 ]================================================== | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,83 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
|  | ||||
| @@ -0,0 +1,12 @@ | ||||
| ####################################################### | ||||
| #                                                     # | ||||
| # CASA Authentication Token System configuration file # | ||||
| # for module:                                         # | ||||
| #                                                     # | ||||
| #     PwdAuthenticate                                 # | ||||
| #                                                     # | ||||
| ####################################################### | ||||
|  | ||||
| LibraryName		\Program Files\novell\casa\lib\pwmech.dll | ||||
|  | ||||
|  | ||||
							
								
								
									
										27
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  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. | ||||
|   | ||||
|  | ||||
|  | ||||
|  | ||||
|                  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
							
								
								
									
										14
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										14
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,14 @@ | ||||
| /*********************************************************************** | ||||
|  * | ||||
|  *  TODO for pwmech | ||||
|  * | ||||
|  ***********************************************************************/ | ||||
|  | ||||
| INTRODUCTION | ||||
|  | ||||
| This file contains a list of the items still outstanding for pwmech. | ||||
|  | ||||
| OUTSTANDING ITEMS | ||||
|  | ||||
| - Implementation of Linux specific code. | ||||
|   | ||||
							
								
								
									
										359
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/get.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										359
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/get.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,359 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										207
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/interface.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										207
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/interface.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,207 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										92
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										92
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/internal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,92 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
|  | ||||
							
								
								
									
										183
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/pwd.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										183
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/pwd.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,183 @@ | ||||
| <?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";"C:\Program Files\novell\CASA\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";"C:\Program Files\novell\CASA\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> | ||||
							
								
								
									
										282
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										282
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/util.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,282 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										132
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								CASA-auth-token/non-java/client/mechanisms/pwd/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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); | ||||
| } | ||||
|  | ||||
| //========================================================================= | ||||
| //========================================================================= | ||||
|  | ||||
| @@ -0,0 +1,35 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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 ]================================================== | ||||
|  | ||||
|  | ||||
| @@ -0,0 +1,81 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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_ | ||||
|  | ||||
| @@ -0,0 +1,10 @@ | ||||
| LIBRARY         PWMECH | ||||
| DESCRIPTION     'CASA PW Authentication Mechanism Library.' | ||||
|  | ||||
|  | ||||
| EXPORTS | ||||
| ;                DllRegisterServer   PRIVATE | ||||
| ;                DllUnregisterServer PRIVATE | ||||
| ;                DllGetClassObject   PRIVATE | ||||
|                 GetAuthTokenInterface  PRIVATE         | ||||
| ;               DllCanUnloadNow     PRIVATE   | ||||
							
								
								
									
										513
									
								
								CASA-auth-token/non-java/client/test/CASA_Auth.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										513
									
								
								CASA-auth-token/non-java/client/test/CASA_Auth.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,513 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
							
								
								
									
										142
									
								
								CASA-auth-token/non-java/client/test/test.vcproj
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										142
									
								
								CASA-auth-token/non-java/client/test/test.vcproj
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,142 @@ | ||||
| <?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";"C:\Program Files\novell\CASA\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";"C:\Program Files\novell\CASA\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> | ||||
							
								
								
									
										321
									
								
								CASA-auth-token/non-java/client/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										321
									
								
								CASA-auth-token/non-java/client/util.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,321 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										10
									
								
								CASA-auth-token/non-java/client/windows/authtoken.def
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										10
									
								
								CASA-auth-token/non-java/client/windows/authtoken.def
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,10 @@ | ||||
| LIBRARY         AUTHTOKEN | ||||
| DESCRIPTION     'CASA Authentication Token Library.' | ||||
|  | ||||
|  | ||||
| EXPORTS | ||||
| ;                DllRegisterServer   PRIVATE | ||||
| ;                DllUnregisterServer PRIVATE | ||||
| ;                DllGetClassObject   PRIVATE | ||||
|                 ObtainAuthToken     PRIVATE         | ||||
| ;               DllCanUnloadNow     PRIVATE   | ||||
							
								
								
									
										132
									
								
								CASA-auth-token/non-java/client/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										132
									
								
								CASA-auth-token/non-java/client/windows/dllsup.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,132 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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 (Initialize() != 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); | ||||
| } | ||||
|  | ||||
| //========================================================================= | ||||
| //========================================================================= | ||||
|  | ||||
							
								
								
									
										665
									
								
								CASA-auth-token/non-java/client/windows/platform.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										665
									
								
								CASA-auth-token/non-java/client/windows/platform.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,665 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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 ]================================================== | ||||
|  | ||||
| // 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"; | ||||
|  | ||||
| // Synchronization mutex for the dll initialization | ||||
| static | ||||
| HANDLE  g_hInitializationMutex; | ||||
|  | ||||
| // Path separator | ||||
| char  pathCharString[] = "\\"; | ||||
|  | ||||
| //++======================================================================= | ||||
| CasaStatus | ||||
| CreateUserMutex( | ||||
|    HANDLE *phMutex | ||||
|    ) | ||||
| // | ||||
| //  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) | ||||
|             { | ||||
|                *phMutex = CreateMutex(&mutexAttributes, | ||||
|                                         FALSE, | ||||
|                                         mutexName); | ||||
|                if (*phMutex == 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- Unexpected 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( | ||||
|    HANDLE hMutex | ||||
|    ) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    DbgTrace(2, "-AcquireUserMutex- Start\n", 0); | ||||
|  | ||||
|    WaitForSingleObject(hMutex, INFINITE); | ||||
|  | ||||
|    DbgTrace(2, "-AcquireUserMutex- End\n", 0); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| void | ||||
| ReleaseUserMutex( | ||||
|    HANDLE hMutex | ||||
|    ) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    DbgTrace(2, "-ReleaseUserMutex- Start\n", 0); | ||||
|  | ||||
|    if (ReleaseMutex(hMutex) == 0) | ||||
|    { | ||||
|       DbgTrace(0, "-ReleaseUserMutex- ReleaseMutex failed, error = %d\n", GetLastError()); | ||||
|    } | ||||
|  | ||||
|    DbgTrace(2, "-ReleaseUserMutex- End\n", 0); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| void | ||||
| DestroyUserMutex( | ||||
|    HANDLE hMutex | ||||
|    ) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    DbgTrace(2, "-DestroyUserMutex- Start\n", 0); | ||||
|  | ||||
|    if (CloseHandle(hMutex) == 0) | ||||
|    { | ||||
|       DbgTrace(0, "-DestroyUserMutex- CloseHandle failed, error = %d\n", GetLastError()); | ||||
|    } | ||||
|  | ||||
|    DbgTrace(2, "-DestroyUserMutex- End\n", 0); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| CasaStatus | ||||
| CreateInitializationMutex(void) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    int   retStatus = -1; | ||||
|  | ||||
|  | ||||
|    DbgTrace(2, "-CreateInitializationMutex- Start\n", 0); | ||||
|  | ||||
|    // Create a cache mutex only applicable to the current process | ||||
|    g_hInitializationMutex = CreateMutex(NULL, FALSE, NULL); | ||||
|  | ||||
|    if (g_hInitializationMutex != NULL) | ||||
|    { | ||||
| 	  retStatus = CASA_STATUS_SUCCESS; | ||||
|    } | ||||
|  | ||||
|    DbgTrace(2, "-CreateInitializationMutex- End\n", 0); | ||||
|  | ||||
|    return retStatus; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| void | ||||
| AcquireInitializationMutex(void) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    DbgTrace(2, "-AcquireInitializationMutex- Start\n", 0); | ||||
|  | ||||
|    WaitForSingleObject(g_hInitializationMutex, INFINITE); | ||||
|  | ||||
|    DbgTrace(2, "-AcquireInitializationMutex- End\n", 0); | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| void | ||||
| ReleaseInitializationMutex(void) | ||||
| // | ||||
| //  Arguments:  | ||||
| // | ||||
| //  Returns:    | ||||
| // | ||||
| //  Abstract:   | ||||
| // | ||||
| //  Notes: | ||||
| // | ||||
| // L2 | ||||
| //=======================================================================-- | ||||
| { | ||||
|    DbgTrace(2, "-ReleaseInitializationMutex- Start\n", 0); | ||||
|  | ||||
|    if (ReleaseMutex(g_hInitializationMutex) == 0) | ||||
|    { | ||||
| 	  DbgTrace(0, "-ReleaseInitializationMutex- ReleaseMutex failed, error\n", 0); | ||||
|    } | ||||
|  | ||||
|    DbgTrace(2, "-ReleaseInitializationMutex- 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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
							
								
								
									
										114
									
								
								CASA-auth-token/non-java/client/windows/platform.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								CASA-auth-token/non-java/client/windows/platform.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
|    int         status; | ||||
|    DWORD       creationTime; | ||||
|    DWORD       expirationTime; | ||||
|    BOOL        doesNotExpire; | ||||
| //   char        *pHostName; | ||||
| //   char        *pCacheKeyName; | ||||
|    char        token[1]; | ||||
|      | ||||
| } 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 ]=============================================== | ||||
|  | ||||
| //========================================================================= | ||||
|  | ||||
							
								
								
									
										498
									
								
								CASA-auth-token/non-java/client/windows/rpc.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										498
									
								
								CASA-auth-token/non-java/client/windows/rpc.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,498 @@ | ||||
| /*********************************************************************** | ||||
|  *  | ||||
|  *  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; | ||||
| } | ||||
|  | ||||
|  | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
| //++======================================================================= | ||||
|  | ||||
		Reference in New Issue
	
	Block a user