Adding new components to the server side of auth_token.
This commit is contained in:
		
							
								
								
									
										37
									
								
								auth_token/server/ApacheSupport/2.2/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								auth_token/server/ApacheSupport/2.2/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = $(TARGET_OS) | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = linux | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										108
									
								
								auth_token/server/ApacheSupport/2.2/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										108
									
								
								auth_token/server/ApacheSupport/2.2/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,108 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  README for mod_authn_casa | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | mod_authn_casa is an Apache 2.2 Basic Authentication Provider that | ||||||
|  | can be configured to validate Basic Credentials carrying CASA | ||||||
|  | Authentication Tokens. | ||||||
|  |  | ||||||
|  | Clients sending CASA Authentication Tokens as part of the Basic Credentials | ||||||
|  | will format them in the following manner: "username:CasaAuthenticationToken", | ||||||
|  | where the username is set to "CasaPrincipal" and the CasaAuthenticationToken | ||||||
|  | is the token string obtained from the CASA Get Authentication Token API.. | ||||||
|  |  | ||||||
|  | CONFIGURATION | ||||||
|  |  | ||||||
|  | To use mod_authn_casa as an authentication provider for a specific location | ||||||
|  | you must first tell Apache that it must load the module, you do this by | ||||||
|  | placing the module or a link to the module in the Apache server's modules | ||||||
|  | folder and by placing the following line in the server's httpd.conf file: | ||||||
|  |  | ||||||
|  | LoadModule authn_casa_module modules/mod_authn_casa.so | ||||||
|  |  | ||||||
|  | The following lines show how Apache is configured to use mod_authn_casa | ||||||
|  | for authenticating requests issued to mod_example: | ||||||
|  |  | ||||||
|  | <Location /example-info> | ||||||
|  |     SetHandler example-handler | ||||||
|  |     AuthType Basic | ||||||
|  |     AuthName "CASA-Authentication" | ||||||
|  |     AuthBasicProvider casa | ||||||
|  |     Require valid-user | ||||||
|  | </Location> | ||||||
|  |  | ||||||
|  | Note that the name specified in the AuthName directive should match the name | ||||||
|  | configured under CASA for the authentication realm used by CASA to obtain | ||||||
|  | identity information for the service. | ||||||
|  |  | ||||||
|  | mod_authn_casa supports the following configuration directives: | ||||||
|  |  | ||||||
|  | UsernameCheck - This is a per-directory or per-location directive which | ||||||
|  |                 configures whether or not mod_authn_casa must verify that | ||||||
|  |                 the username is set to "CasaPrincipal". Possible values | ||||||
|  |                 for this directive are 'on' or 'off'. Default is 'off'. | ||||||
|  |  | ||||||
|  |                 To enable UsernameChack for a particular location using | ||||||
|  |                 CASA Authentication, include the following line inside | ||||||
|  |                 the location configuration block: | ||||||
|  |  | ||||||
|  |                 UsernameCheck on | ||||||
|  |  | ||||||
|  | CLIENT PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | HTTP Clients sending requests to a location being protected by the CASA | ||||||
|  | Authentication Provider must obtain an Authentication Token from the CASA | ||||||
|  | Client for authenticating to the Service identified as the "location" being | ||||||
|  | accessed in the HTTP Server. In the case of mod_example, the service name | ||||||
|  | would be "example-info". Once the client obtains an Authentication Token | ||||||
|  | from the CASA Client it must then include it in the HTTP Basic Authentication | ||||||
|  | header that it must include in the HTTP Request. The HTTP Basic Authentication | ||||||
|  | credentials should be in the following form: | ||||||
|  |  | ||||||
|  | Base64("CasaPrincipal":"AuthenticationToken") | ||||||
|  |  | ||||||
|  | SERVER PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | Apache modules being protected by the CASA Authentication Provider can obtain | ||||||
|  | the following information about the authenticated identity: | ||||||
|  |  | ||||||
|  | username - This is accessed via the r->user variable or by examining the IdentityId | ||||||
|  | environment variable associated with the request block. The username is the | ||||||
|  | user's unique id within the authentication realm. When the authentication realm | ||||||
|  | is an LDAP database, the username consists of the user's fdn. | ||||||
|  |  | ||||||
|  | Name of the source of identity data (Authentication Realm) - This is accessed by | ||||||
|  | examining the IdentityDataSourceName environment variable associated with the | ||||||
|  | request block. | ||||||
|  |  | ||||||
|  | URL to the source of identity data - This is accessed by examining the | ||||||
|  | IdentityDataSourceUrl environment variable associated with the request block. | ||||||
|  |  | ||||||
|  | Attributes of the authenticated identity - The attributes are set as environment | ||||||
|  | variables associated with the request block. The environment variable names match | ||||||
|  | the names of the attributes. The attributes associated with the authenticated | ||||||
|  | identity and expressed as environment variables are configured at the time that | ||||||
|  | the service is enabled for CASA Authentication. | ||||||
|  |  | ||||||
|  | Note that environment variables are contained in the r->subprocess_env table. | ||||||
|  |  | ||||||
|  | SECURITY CONSIDERATIONS | ||||||
|  |  | ||||||
|  | CASA Authenticatication 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 HTTPS. | ||||||
|  |   | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								auth_token/server/ApacheSupport/2.2/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								auth_token/server/ApacheSupport/2.2/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  TODO for mod_authn_casa | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | This file contains a list of the items still outstanding for mod_authn_casa. | ||||||
|  |  | ||||||
|  | OUTSTANDING ITEMS | ||||||
|  |  | ||||||
|  | None. | ||||||
							
								
								
									
										111
									
								
								auth_token/server/ApacheSupport/2.2/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										111
									
								
								auth_token/server/ApacheSupport/2.2/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,111 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | if DEBUG | ||||||
|  | TARGET_CFG = Debug | ||||||
|  | CFLAGS += -v -w | ||||||
|  | else | ||||||
|  | TARGET_CFG = Release | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | SUBDIRS = | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = | ||||||
|  |  | ||||||
|  | CASAROOT = ../../../../.. | ||||||
|  |  | ||||||
|  | CASALIBDIR = $(CASAROOT)/$(LIB) | ||||||
|  | APACHEROOT = /home/jluciani/dev-local/apache2.2 | ||||||
|  |  | ||||||
|  | # handle Mono secondary dependencies | ||||||
|  | export MONO_PATH := $(MONO_PATH) | ||||||
|  |  | ||||||
|  | PLATFORMINDEPENDENTSOURCEDIR = .. | ||||||
|  | PLATFORMDEPENDENTSOURCEDIR = . | ||||||
|  |  | ||||||
|  | MODULE_NAME = mod_authn_casa | ||||||
|  | MODULE_EXT = so | ||||||
|  |  | ||||||
|  | CFILES = ../mod_authn_casa.c | ||||||
|  |  | ||||||
|  | CSFILES_CSC := | ||||||
|  | INCLUDES = -I. -I$(CASAROOT)/include -I$(APACHEROOT)/include | ||||||
|  | RESOURCES = | ||||||
|  | DEFINES = -Wno-format-extra-args -fno-strict-aliasing | ||||||
|  |  | ||||||
|  | CFLAGS += $(INCLUDES) $(DEFINES) -D_LARGEFILE64_SOURCE | ||||||
|  | LIBS = -lpthread -lcasa_s_authtoken -lapr-1 -laprutil-1 | ||||||
|  | LDFLAGS = -Bsymbolic -shared -Wl,-soname=$(MODULE_NAME).$(MODULE_EXT) -L$(CASALIBDIR)/$(TARGET_CFG) -L$(APACHEROOT)/lib -Xlinker -rpath -Xlinker /opt/novell/CASA/lib | ||||||
|  |  | ||||||
|  | OBJDIR = ./$(TARGET_CFG)/$(LIB) | ||||||
|  | OBJS = $(addprefix $(OBJDIR)/, $(CFILES:%.c=%.o)) | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) | ||||||
|  |  | ||||||
|  | CUR_DIR := $(shell pwd) | ||||||
|  |  | ||||||
|  | all: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Pattern based rules. | ||||||
|  | # | ||||||
|  | vpath %.c $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  | vpath %.cpp $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.c | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.cpp | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT): $(OBJDIR) $(OBJS) | ||||||
|  | 	@echo [======== Linking $@ ========] | ||||||
|  | 	$(LINK) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) | ||||||
|  | 	cp -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | $(OBJDIR): | ||||||
|  | 	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) | ||||||
|  | 	[ -d $(CASALIBDIR) ] || mkdir -p $(CASALIBDIR) | ||||||
|  | 	[ -d $(CASALIBDIR)/$(TARGET_CFG) ] || mkdir -p $(CASALIBDIR)/$(TARGET_CFG) | ||||||
|  |  | ||||||
|  | install-exec-local: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | 	$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(DESTDIR)$(libdir)/ | ||||||
|  |  | ||||||
|  | uninstall-local: | ||||||
|  | 	cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	rmdir $(DESTDIR)$(libdir) | ||||||
|  |  | ||||||
|  | #installcheck-local: install | ||||||
|  | #	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | #	$(INSTALL_PROGRAM) $(DESTDIR)$(libdir) | ||||||
|  | #	cd $(DESTDIR)$(libdir); $(MONO) | ||||||
|  |  | ||||||
|  | clean-local: | ||||||
|  | #cd $(TARGET_CFG); rm -rf *.dbg *.exe *.dll *.o *.so; cd ..; rmdir $(OBJDIR) | ||||||
|  | 	rm -rf $(TARGET_CFG) | ||||||
|  |  | ||||||
|  | distclean-local: | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										478
									
								
								auth_token/server/ApacheSupport/2.2/mod_authn_casa.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										478
									
								
								auth_token/server/ApacheSupport/2.2/mod_authn_casa.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,478 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 <stdbool.h> | ||||||
|  |  | ||||||
|  | #include "apr_strings.h" | ||||||
|  | #include "ap_config.h" | ||||||
|  | #include "ap_provider.h" | ||||||
|  | #include "httpd.h" | ||||||
|  | #include "http_config.h" | ||||||
|  | #include "http_core.h" | ||||||
|  | #include "http_log.h" | ||||||
|  | #include "http_protocol.h" | ||||||
|  | #include "http_request.h" | ||||||
|  |  | ||||||
|  | #include "mod_auth.h" | ||||||
|  |  | ||||||
|  | #include "casa_s_authtoken.h" | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Module per-dir configuration structure. | ||||||
|  | //  | ||||||
|  | typedef struct _authn_casa_dir_cfg | ||||||
|  | { | ||||||
|  |    int   performUsernameCheck; | ||||||
|  |  | ||||||
|  | } authn_casa_dir_cfg; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Forward declaration of our module structure. | ||||||
|  | //  | ||||||
|  | module AP_MODULE_DECLARE_DATA authn_casa_module; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Environment variables set by module | ||||||
|  | //  | ||||||
|  | static char CasaIdentityIdEnvVar[] = "IdentityId"; | ||||||
|  | static char CasaIdentitySourceNameEnvVar[] = "IdentityDataSourceName"; | ||||||
|  | static char CasaIdentitySourceUrlEnvVar[] = "IdentityDataSourceUrl"; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Function: create_per_dir_config() | ||||||
|  | //  | ||||||
|  | // Create per-dir configuration structure. | ||||||
|  | //  | ||||||
|  | static void* | ||||||
|  | create_per_dir_config( | ||||||
|  |    apr_pool_t *p, | ||||||
|  |    char *x) | ||||||
|  | { | ||||||
|  |     authn_casa_dir_cfg *pDirConfig; | ||||||
|  |  | ||||||
|  |     // Allocate space for our configuration structure | ||||||
|  |     pDirConfig = (authn_casa_dir_cfg*) apr_palloc(p, sizeof(*pDirConfig)); | ||||||
|  |  | ||||||
|  |     // Return our new configuration structure | ||||||
|  |     return  (void*) pDirConfig; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * set_authn_casa_uname_check() | ||||||
|  |  *  | ||||||
|  |  * Process UsernameCheck configuration directive.. | ||||||
|  |  * | ||||||
|  |  * L2 | ||||||
|  |  * ************************************************************************/ | ||||||
|  | static const char* | ||||||
|  | set_authn_casa_uname_check( | ||||||
|  |    cmd_parms *cmd, | ||||||
|  |    void *cfg, | ||||||
|  |    int arg) | ||||||
|  | { | ||||||
|  |    authn_casa_dir_cfg *pDirConfig = (authn_casa_dir_cfg*) cfg; | ||||||
|  |  | ||||||
|  |    // Record the value in our structure | ||||||
|  |    pDirConfig->performUsernameCheck = arg; | ||||||
|  |  | ||||||
|  |    return NULL; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Configuration directives array structure. | ||||||
|  | //  | ||||||
|  | static const command_rec authn_casa_cmds[] = | ||||||
|  | { | ||||||
|  |     AP_INIT_FLAG("UsernameCheck",               // tbd - May be this directive should be on a per-directory or per-location basis | ||||||
|  |                  set_authn_casa_uname_check, | ||||||
|  |                  NULL, | ||||||
|  |                  OR_AUTHCFG, | ||||||
|  |                  "Check for username == CasaPrincipal (Value limited to 'on' or 'off')"), | ||||||
|  |     {NULL} | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * check_password() | ||||||
|  |  *  | ||||||
|  |  * Given a user and password, expected to return AUTH_GRANTED if we | ||||||
|  |  * can validate the user/password combination. | ||||||
|  |  * | ||||||
|  |  * L2 | ||||||
|  |  * ************************************************************************/ | ||||||
|  | static authn_status | ||||||
|  | check_password( | ||||||
|  |    request_rec *r, | ||||||
|  |    const char *user, | ||||||
|  |    const char *password) | ||||||
|  | { | ||||||
|  |    authn_status         retStatus;  | ||||||
|  |    authn_casa_dir_cfg   *pDirConfig; | ||||||
|  |    bool                 userNameChecked = false; | ||||||
|  |    int                  i; | ||||||
|  |    char                 *pLocationName; | ||||||
|  |  | ||||||
|  |    // First determine the length of the name of the location being protected | ||||||
|  |    i = 0; | ||||||
|  |    while (r->uri[i] != '\0') | ||||||
|  |    { | ||||||
|  |       if (r->uri[i] == '/') | ||||||
|  |       { | ||||||
|  |          // Ignore the slash if it is at the beginning of the uri | ||||||
|  |          if (i != 0) | ||||||
|  |          { | ||||||
|  |             // The slash is not at the beggining of the uri, stop. | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       i++; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Now get a copy of the location being protected | ||||||
|  |    if (i > 1) | ||||||
|  |    { | ||||||
|  |       pLocationName = apr_palloc(r->pool, i); | ||||||
|  |       if (pLocationName) | ||||||
|  |       { | ||||||
|  |          memset(pLocationName, 0, i); | ||||||
|  |          memcpy(pLocationName, &(r->uri[1]), i - 1);  // Do not include the slashes | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Memory allocation failure"); | ||||||
|  |          return AUTH_GENERAL_ERROR; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       // We are protecting the server root | ||||||
|  |       pLocationName = "apache_root"; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Get access to our per-dir configuration structure | ||||||
|  |    pDirConfig = ap_get_module_config(r->per_dir_config, | ||||||
|  |                                      &authn_casa_module); | ||||||
|  |    if (pDirConfig) | ||||||
|  |    { | ||||||
|  |       // Assume success | ||||||
|  |       retStatus = AUTH_GRANTED; | ||||||
|  |  | ||||||
|  |       // Check if we must perform the username check | ||||||
|  |       if (pDirConfig->performUsernameCheck != 0) | ||||||
|  |       { | ||||||
|  |          // Remember that we performed this check | ||||||
|  |          userNameChecked = true; | ||||||
|  |  | ||||||
|  |          // Check if the username matches the name what we are expecting | ||||||
|  |          if (strcmp(user, "CasaPrincipal") != 0) | ||||||
|  |          { | ||||||
|  |             // The username does not match, allow other providers to get | ||||||
|  |             // a crack to it. | ||||||
|  |             retStatus = AUTH_USER_NOT_FOUND; | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Check the token if a problem has not been found | ||||||
|  |       if (retStatus == AUTH_GRANTED) | ||||||
|  |       { | ||||||
|  |          CasaStatus  casaStatus; | ||||||
|  |          PrincipalIf *pPrincipalIf; | ||||||
|  |  | ||||||
|  |          // Validate the token | ||||||
|  |          casaStatus = ValidateAuthToken(pLocationName, | ||||||
|  |                                         password, | ||||||
|  |                                         strlen(password), | ||||||
|  |                                         &pPrincipalIf); | ||||||
|  |          if (CASA_SUCCESS(casaStatus)) | ||||||
|  |          { | ||||||
|  |  | ||||||
|  |             int            buffLen = 0; | ||||||
|  |             apr_table_t    *e = r->subprocess_env; | ||||||
|  |  | ||||||
|  |             // Associate necessary environment variables with the request block | ||||||
|  |             casaStatus = pPrincipalIf->getIdentityId(pPrincipalIf, | ||||||
|  |                                                      NULL, | ||||||
|  |                                                      &buffLen); | ||||||
|  |             if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |             { | ||||||
|  |                char  *pBuff; | ||||||
|  |  | ||||||
|  |                // Allocate buffer to obtain the Identity Id | ||||||
|  |                pBuff = apr_pcalloc(r->pool, buffLen); | ||||||
|  |                if (pBuff) | ||||||
|  |                { | ||||||
|  |                   // Read the value into our buffer | ||||||
|  |                   if (CASA_SUCCESS(pPrincipalIf->getIdentityId(pPrincipalIf, | ||||||
|  |                                                                pBuff, | ||||||
|  |                                                                &buffLen))) | ||||||
|  |                   { | ||||||
|  |                      // Now set the environment variable | ||||||
|  |                      apr_table_setn(e, CasaIdentityIdEnvVar, pBuff); | ||||||
|  |  | ||||||
|  |                      // Also, update the username within the request block with the identity id | ||||||
|  |                      r->user = pBuff; | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Unable to obtain identity id"); | ||||||
|  |                      retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Memory allocation failure"); | ||||||
|  |                   retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Un-expected error obtaining identity id, %08X", casaStatus); | ||||||
|  |                retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (retStatus == AUTH_GRANTED) | ||||||
|  |             { | ||||||
|  |                buffLen = 0; | ||||||
|  |                casaStatus = pPrincipalIf->getSourceName(pPrincipalIf, | ||||||
|  |                                                         NULL, | ||||||
|  |                                                         &buffLen); | ||||||
|  |                if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                { | ||||||
|  |                   char  *pBuff; | ||||||
|  |  | ||||||
|  |                   // Allocate buffer to obtain the Identity Source Name | ||||||
|  |                   pBuff = apr_pcalloc(r->pool, buffLen); | ||||||
|  |                   if (pBuff) | ||||||
|  |                   { | ||||||
|  |                      // Read the value into our buffer | ||||||
|  |                      if (CASA_SUCCESS(pPrincipalIf->getSourceName(pPrincipalIf, | ||||||
|  |                                                                   pBuff, | ||||||
|  |                                                                   &buffLen))) | ||||||
|  |                      { | ||||||
|  |                         // Now set the environment variable | ||||||
|  |                         apr_table_setn(e, CasaIdentitySourceNameEnvVar, pBuff); | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Unable to obtain identity source name"); | ||||||
|  |                         retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Memory allocation failure"); | ||||||
|  |                      retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Un-expected error obtaining identity source name, %08X", casaStatus); | ||||||
|  |                   retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (retStatus == AUTH_GRANTED) | ||||||
|  |             { | ||||||
|  |                buffLen = 0; | ||||||
|  |                casaStatus = pPrincipalIf->getSourceUrl(pPrincipalIf, | ||||||
|  |                                                        NULL, | ||||||
|  |                                                        &buffLen); | ||||||
|  |                if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                { | ||||||
|  |                   char  *pBuff; | ||||||
|  |  | ||||||
|  |                   // Allocate buffer to obtain the Identity Source Url | ||||||
|  |                   pBuff = apr_pcalloc(r->pool, buffLen); | ||||||
|  |                   if (pBuff) | ||||||
|  |                   { | ||||||
|  |                      // Read the value into our buffer | ||||||
|  |                      if (CASA_SUCCESS(pPrincipalIf->getSourceUrl(pPrincipalIf, | ||||||
|  |                                                                  pBuff, | ||||||
|  |                                                                  &buffLen))) | ||||||
|  |                      { | ||||||
|  |                         // Now set the environment variable | ||||||
|  |                         apr_table_setn(e, CasaIdentitySourceUrlEnvVar, pBuff); | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Unable to obtain identity source url"); | ||||||
|  |                         retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Memory allocation failure"); | ||||||
|  |                      retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Un-expected error obtaining identity source url, %08X", casaStatus); | ||||||
|  |                   retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             if (retStatus == AUTH_GRANTED) | ||||||
|  |             { | ||||||
|  |                char  *pAttribNameBuff, *pAttribValueBuff; | ||||||
|  |                int   enumHandle = 0; | ||||||
|  |                int   attribNameBuffLen, attribValueBuffLen; | ||||||
|  |  | ||||||
|  |                while (retStatus == AUTH_GRANTED) | ||||||
|  |                { | ||||||
|  |                   // Get attribute lengths | ||||||
|  |                   attribNameBuffLen = attribValueBuffLen = 0; | ||||||
|  |                   casaStatus = pPrincipalIf->attributeEnumerate(pPrincipalIf, | ||||||
|  |                                                                 &enumHandle, | ||||||
|  |                                                                 NULL, | ||||||
|  |                                                                 &attribNameBuffLen, | ||||||
|  |                                                                 NULL, | ||||||
|  |                                                                 &attribValueBuffLen); | ||||||
|  |                   if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                   { | ||||||
|  |                      // Allocate buffers to obtain the attribute data | ||||||
|  |                      pAttribNameBuff = apr_pcalloc(r->pool, attribNameBuffLen); | ||||||
|  |                      pAttribValueBuff = apr_pcalloc(r->pool, attribValueBuffLen); | ||||||
|  |                      if (pAttribNameBuff && pAttribValueBuff) | ||||||
|  |                      { | ||||||
|  |                         // Read the attribute into our buffer | ||||||
|  |                         if (CASA_SUCCESS(pPrincipalIf->attributeEnumerate(pPrincipalIf, | ||||||
|  |                                                                           &enumHandle, | ||||||
|  |                                                                           pAttribNameBuff, | ||||||
|  |                                                                           &attribNameBuffLen, | ||||||
|  |                                                                           pAttribValueBuff, | ||||||
|  |                                                                           &attribValueBuffLen))) | ||||||
|  |                         { | ||||||
|  |                            // Now set the environment variable | ||||||
|  |                            apr_table_setn(e, pAttribNameBuff, pAttribValueBuff); | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                            ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Unable to obtain identity attribute"); | ||||||
|  |                            retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                         } | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Memory allocation failure"); | ||||||
|  |                         retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      // Check if we are done going through the attributes | ||||||
|  |                      if (CasaStatusCode(casaStatus) == CASA_STATUS_NO_MORE_ENTRIES) | ||||||
|  |                      { | ||||||
|  |                         // Done | ||||||
|  |                         break; | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Un-expected error during attribute enumeration, %08X", casaStatus); | ||||||
|  |                         retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |  | ||||||
|  |             // Release the principal interface instance | ||||||
|  |             pPrincipalIf->releaseReference(pPrincipalIf); | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             // Check if the token validation failed for a CasaPrincipal | ||||||
|  |             if (userNameChecked) | ||||||
|  |             { | ||||||
|  |                // Token validation failed for a CasaPrincipal, always return AUTH_DENIED. | ||||||
|  |                retStatus = AUTH_DENIED; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                // We did not check the username, set the return status based on the status | ||||||
|  |                // returned by ValidateAuthToken(). | ||||||
|  |                if (CasaStatusCode(casaStatus) == CASA_STATUS_AUTHENTICATION_FAILURE) | ||||||
|  |                { | ||||||
|  |                   // Authentication failed | ||||||
|  |                   retStatus = AUTH_DENIED; | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   // Allow other providers to get a crack to it | ||||||
|  |                   retStatus = AUTH_USER_NOT_FOUND; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       ap_log_rerror(APLOG_MARK, APLOG_ALERT, 0, r, "Did not get module per-server config structure"); | ||||||
|  |       retStatus = AUTH_GENERAL_ERROR; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |     return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Authentication Provider Function Table | ||||||
|  | //  | ||||||
|  | static const authn_provider authn_casa_provider = | ||||||
|  | { | ||||||
|  |     &check_password, | ||||||
|  |     NULL,            // We do not support Digest Authentication | ||||||
|  | }; | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * register_hooks() | ||||||
|  |  *  | ||||||
|  |  * Register all of the module hooks. | ||||||
|  |  * | ||||||
|  |  * L2 | ||||||
|  |  * ************************************************************************/ | ||||||
|  | static void | ||||||
|  | register_hooks( | ||||||
|  |    apr_pool_t *p) | ||||||
|  | { | ||||||
|  |    // Register as an authentication provider | ||||||
|  |    ap_register_provider(p, | ||||||
|  |                         AUTHN_PROVIDER_GROUP,   // Provider group | ||||||
|  |                         "casa",                 // Provider name | ||||||
|  |                         "0",                    // Provider version | ||||||
|  |                         &authn_casa_provider);  // Authentication Provider function table | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Declare ourselves to the HTTPD core. | ||||||
|  | //  | ||||||
|  | module AP_MODULE_DECLARE_DATA authn_casa_module = | ||||||
|  | { | ||||||
|  |    STANDARD20_MODULE_STUFF, | ||||||
|  |    create_per_dir_config,        // Create per-dir config structures | ||||||
|  |    NULL,                         // merge per-dir config structures | ||||||
|  |    NULL,                         // Create per-server config structures | ||||||
|  |    NULL,                         // merge per-server config structures | ||||||
|  |    authn_casa_cmds,              // command handlers | ||||||
|  |    register_hooks                // register hooks | ||||||
|  | }; | ||||||
							
								
								
									
										37
									
								
								auth_token/server/ApacheSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								auth_token/server/ApacheSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = 2.2 | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = 2.2 | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								auth_token/server/AuthTokenValidate/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								auth_token/server/AuthTokenValidate/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = $(TARGET_OS) idenTokenProviders | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = linux idenTokenProviders | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										77
									
								
								auth_token/server/AuthTokenValidate/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										77
									
								
								auth_token/server/AuthTokenValidate/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,77 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  README for libcasa_s_authtoken | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | libcasa_s_authtoken provides an API for the validation of CASA Authentication Tokens. | ||||||
|  | The API provides a means for obtaining identity information about authenticated | ||||||
|  | entities. | ||||||
|  |  | ||||||
|  | Applications should avoid calling directly into this library's APIs. Instead, applications | ||||||
|  | should code to the PAM API to validate authentication credentials or allow an external | ||||||
|  | module to perform the credential validation. To facilitate this, CASA Authentication | ||||||
|  | provides PAM, Apache, and JAAS modules that can be used to validate credentials containing | ||||||
|  | CASA Authentication tokens, | ||||||
|  |  | ||||||
|  | CONFIGURING TRUSTED AUTHENTICATION TOKEN SERVICES | ||||||
|  |  | ||||||
|  | tbd. Add info about the installation of public certificates and trusted certificate authorities. | ||||||
|  |  | ||||||
|  | CONFIGURING ADDITIONAL IDENTITY TOKEN PROVIDER MODULES | ||||||
|  |  | ||||||
|  | CASA Authentication Tokens contain Identity Tokens. The Identity Tokens contain the identity | ||||||
|  | information about the entity being authenticated. Identity Tokens can be of different types, | ||||||
|  | the type utilized for use with a particular service is configured at the time that the service | ||||||
|  | is configured for CASA Authentication. The default identity token type is CasaIdentityToken. | ||||||
|  |  | ||||||
|  | libcasa_s_authtoken supports different identity token types through an API that allows for the | ||||||
|  | configuration of different Identity Token Provider plug-ins. An Identity Token Provider plug-in | ||||||
|  | is configured by placing a configuration file for the plug-ins in the | ||||||
|  | /etc/opt/CASA/authtoken.d/modules.d folder. The name of the plug-in configuration file is related | ||||||
|  | to the identity token type in the following manner: IdentityTokenTypeName.conf. | ||||||
|  |  | ||||||
|  | Identity Token Provider plug-in configuration files must must contain a directive indicating the | ||||||
|  | path to the library implementing the Identity Token Provider plug-in (See the configuration file | ||||||
|  | for the CasaIdentityToken plug-in for an example). | ||||||
|  |  | ||||||
|  | SERVER APPLICATION PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | The Validate CASA Authentication Token API is defined in casa_s_authtoken.h. | ||||||
|  |  | ||||||
|  | The API consists of a call to validate authentication tokens. The caller must supply a service | ||||||
|  | name which must match the service name provided by the client when requesting the authentication | ||||||
|  | token. Successful calls to the validate authentication token API will return a handle to a principal | ||||||
|  | interface object. The principal interface object handle can be used to obtain identity information | ||||||
|  | about the authenticated entity as well as information about the authentication realm. The principal | ||||||
|  | interface object must be released after it is no longer needed. The amount and type of identity | ||||||
|  | information associated with the principal interface is dependent on what is configured at the | ||||||
|  | time that the service is enabled for CASA Authentication. | ||||||
|  |  | ||||||
|  | For examples of code which uses the Validate CASA Authentication Token API look at the implementations | ||||||
|  | of the CASA Authentication PAM module and the CASA Authentication Provider Apache module.  | ||||||
|  |  | ||||||
|  | IDENTITY TOKEN PROVIDER PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | The Identity Token Provider API is defined in iden_token_provider.h. | ||||||
|  |  | ||||||
|  | For an example see the implementation of the CASA Identity Token Provider. | ||||||
|  |  | ||||||
|  | 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. | ||||||
|  |   | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										15
									
								
								auth_token/server/AuthTokenValidate/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										15
									
								
								auth_token/server/AuthTokenValidate/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,15 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  TODO for libcasa_s_authtoken | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | This file contains a list of the items still outstanding for libcasa_s_authtoken. | ||||||
|  |  | ||||||
|  | OUTSTANDING ITEMS | ||||||
|  |  | ||||||
|  | - Change AuthTokens to be SOAP messages secured with WS-Security and WS-Trust. | ||||||
|  | - Implement CheckAuthToken(). | ||||||
|  | - Finish README documentation. | ||||||
							
								
								
									
										693
									
								
								auth_token/server/AuthTokenValidate/authtoken.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										693
									
								
								auth_token/server/AuthTokenValidate/authtoken.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,693 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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_SIGNATURE_DATA              0x2 | ||||||
|  | #define AWAITING_SIGNATURE_ELEMENT_START     0x3 | ||||||
|  | #define AWAITING_SIGNATURE_ELEMENT_END       0x4 | ||||||
|  | #define AWAITING_LIFETIME_DATA               0x5 | ||||||
|  | #define AWAITING_LIFETIME_ELEMENT_START      0x6 | ||||||
|  | #define AWAITING_LIFETIME_ELEMENT_END        0x7 | ||||||
|  | #define AWAITING_IDENT_TOKEN_ELEMENT_START   0x8 | ||||||
|  | #define AWAITING_IDENT_TOKEN_ELEMENT_END     0x9 | ||||||
|  | #define AWAITING_IDENT_TOKEN_DATA            0xA | ||||||
|  | #define AWAITING_TYPE_ELEMENT_START          0xB | ||||||
|  | #define AWAITING_TYPE_ELEMENT_END            0xC | ||||||
|  | #define AWAITING_TYPE_DATA                   0xD | ||||||
|  | #define DONE_PARSING                         0xE | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Authentication Token Parse Structure | ||||||
|  | // | ||||||
|  | typedef struct _AuthTokenParse | ||||||
|  | { | ||||||
|  |    XML_Parser           p; | ||||||
|  |    int                  state; | ||||||
|  |    int                  elementDataProcessed; | ||||||
|  |    AuthToken            *pAuthToken; | ||||||
|  |    CasaStatus           status; | ||||||
|  |  | ||||||
|  | } AuthTokenParse, *PAuthTokenParse; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | void XMLCALL | ||||||
|  | AuthTokenStartElementHandler( | ||||||
|  |    IN    void *pUserData, | ||||||
|  |    IN    const XML_Char *name, | ||||||
|  |    IN    const XML_Char **atts) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    AuthTokenParse    *pAuthTokenParse = (AuthTokenParse*) pUserData; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenStartElementHandler- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Proceed based on the state | ||||||
|  |    switch (pAuthTokenParse->state) | ||||||
|  |    { | ||||||
|  |       case AWAITING_ROOT_ELEMENT_START: | ||||||
|  |  | ||||||
|  |          // In this state, we are only expecting the Authentication | ||||||
|  |          // Response Element. | ||||||
|  |          if (strcmp(name, AUTH_TOKEN_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_SIGNATURE_ELEMENT_START; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected start element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_SIGNATURE_ELEMENT_START: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Signature Element. | ||||||
|  |          if (strcmp(name, SIGNATURE_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_SIGNATURE_DATA; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected start element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->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. | ||||||
|  |             pAuthTokenParse->state = AWAITING_LIFETIME_DATA; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected start element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_IDENT_TOKEN_ELEMENT_START: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Identity Token Element. | ||||||
|  |          if (strcmp(name, IDENTITY_TOKEN_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_TYPE_ELEMENT_START; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected start element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |     | ||||||
|  |       case AWAITING_TYPE_ELEMENT_START: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Type Element. | ||||||
|  |          if (strcmp(name, TYPE_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_TYPE_DATA; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected start element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       default: | ||||||
|  |          DbgTrace(0, "-AuthTokenStartElementHandler- Un-expected state = %d\n", pAuthTokenParse->state); | ||||||
|  |          XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          break; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenStartElementHandler- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus | ||||||
|  | ConsumeElementData( | ||||||
|  |    IN    AuthTokenParse *pAuthTokenParse, | ||||||
|  |    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 | ||||||
|  |       pAuthTokenParse->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 = pAuthTokenParse->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(pAuthTokenParse->elementDataProcessed + len + 1); | ||||||
|  |       if (pNewBuf) | ||||||
|  |       { | ||||||
|  |          memset(pNewBuf, | ||||||
|  |                 0, | ||||||
|  |                 pAuthTokenParse->elementDataProcessed + len + 1); | ||||||
|  |          memcpy(pNewBuf, | ||||||
|  |                 *ppElementData, | ||||||
|  |                 pAuthTokenParse->elementDataProcessed); | ||||||
|  |          memcpy(pNewBuf + pAuthTokenParse->elementDataProcessed, s, len); | ||||||
|  |          pAuthTokenParse->elementDataProcessed += len; | ||||||
|  |  | ||||||
|  |          // Swap the buffers | ||||||
|  |          free(*ppElementData); | ||||||
|  |          *ppElementData = pNewBuf; | ||||||
|  |  | ||||||
|  |          // Return the length of the element data buffer | ||||||
|  |          *pElementDataLen = pAuthTokenParse->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 | ||||||
|  | AuthTokenCharDataHandler( | ||||||
|  |    IN    void *pUserData, | ||||||
|  |    IN    const XML_Char *s, | ||||||
|  |    IN    int len) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    AuthTokenParse    *pAuthTokenParse = (AuthTokenParse*) pUserData; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenCharDataHandler- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Just exit if being called to process LF and CR characters | ||||||
|  |    if (len == 1 | ||||||
|  |        && ((*s == '\n') || (*s == '\r'))) | ||||||
|  |    { | ||||||
|  |       goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Proceed based on the state | ||||||
|  |    switch (pAuthTokenParse->state) | ||||||
|  |    { | ||||||
|  |       case AWAITING_SIGNATURE_DATA: | ||||||
|  |       case AWAITING_SIGNATURE_ELEMENT_END: | ||||||
|  |  | ||||||
|  |          pAuthTokenParse->status = ConsumeElementData(pAuthTokenParse, | ||||||
|  |                                                       s, | ||||||
|  |                                                       len, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->pSignature, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->signatureLen); | ||||||
|  |          if (CASA_SUCCESS(pAuthTokenParse->status)) | ||||||
|  |          { | ||||||
|  |             // Advanced to the next state | ||||||
|  |             pAuthTokenParse->state = AWAITING_SIGNATURE_ELEMENT_END; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_LIFETIME_DATA: | ||||||
|  |       case AWAITING_LIFETIME_ELEMENT_END: | ||||||
|  |     | ||||||
|  |          // Convert the lifetime string to a numeric value | ||||||
|  |          pAuthTokenParse->pAuthToken->tokenLifetime = dtoul((char*) s, len); | ||||||
|  |     | ||||||
|  |          // Advanced to the next state | ||||||
|  |          pAuthTokenParse->state = AWAITING_LIFETIME_ELEMENT_END; | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_TYPE_DATA: | ||||||
|  |       case AWAITING_TYPE_ELEMENT_END: | ||||||
|  |  | ||||||
|  |          pAuthTokenParse->status = ConsumeElementData(pAuthTokenParse, | ||||||
|  |                                                       s, | ||||||
|  |                                                       len, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->pIdenTokenType, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->idenTokenTypeLen); | ||||||
|  |          if (CASA_SUCCESS(pAuthTokenParse->status)) | ||||||
|  |          { | ||||||
|  |             // Advanced to the next state | ||||||
|  |             pAuthTokenParse->state = AWAITING_TYPE_ELEMENT_END; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_IDENT_TOKEN_DATA: | ||||||
|  |       case AWAITING_IDENT_TOKEN_ELEMENT_END: | ||||||
|  |  | ||||||
|  |          pAuthTokenParse->status = ConsumeElementData(pAuthTokenParse, | ||||||
|  |                                                       s, | ||||||
|  |                                                       len, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->pIdenToken, | ||||||
|  |                                                       &pAuthTokenParse->pAuthToken->idenTokenLen); | ||||||
|  |          if (CASA_SUCCESS(pAuthTokenParse->status)) | ||||||
|  |          { | ||||||
|  |             // Advanced to the next state | ||||||
|  |             pAuthTokenParse->state = AWAITING_IDENT_TOKEN_ELEMENT_END; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       default: | ||||||
|  |          DbgTrace(0, "-AuthTokenCharDataHandler- Un-expected state = %d\n", pAuthTokenParse->state); | ||||||
|  |          XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          break; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenCharDataHandler- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | void XMLCALL | ||||||
|  | AuthTokenEndElementHandler( | ||||||
|  |    IN    void *pUserData, | ||||||
|  |    IN    const XML_Char *name) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    AuthTokenParse    *pAuthTokenParse = (AuthTokenParse*) pUserData; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenEndElementHandler- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Proceed based on the state | ||||||
|  |    switch (pAuthTokenParse->state) | ||||||
|  |    { | ||||||
|  |       case AWAITING_ROOT_ELEMENT_END: | ||||||
|  |  | ||||||
|  |          // In this state, we are only expecting the Authentication | ||||||
|  |          // Token Element. | ||||||
|  |          if (strcmp(name, AUTH_TOKEN_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Done. | ||||||
|  |             pAuthTokenParse->state = DONE_PARSING; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenEndHandler- Un-expected end element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |  | ||||||
|  |       case AWAITING_SIGNATURE_ELEMENT_END: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Signature Element. | ||||||
|  |          if (strcmp(name, SIGNATURE_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_LIFETIME_ELEMENT_START; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenEndElementHandler- Un-expected end element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->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. | ||||||
|  |             pAuthTokenParse->state = AWAITING_IDENT_TOKEN_ELEMENT_START; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenEndElementHandler- Un-expected end element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |     | ||||||
|  |       case AWAITING_TYPE_ELEMENT_END: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Type Element. | ||||||
|  |          if (strcmp(name, TYPE_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_IDENT_TOKEN_DATA; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenEndElementHandler- Un-expected end element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |     | ||||||
|  |       case AWAITING_IDENT_TOKEN_ELEMENT_END: | ||||||
|  |     | ||||||
|  |          // In this state, we are only expecting the Identity Token Element. | ||||||
|  |          if (strcmp(name, IDENTITY_TOKEN_ELEMENT_NAME) == 0) | ||||||
|  |          { | ||||||
|  |             // Good, advance to the next state. | ||||||
|  |             pAuthTokenParse->state = AWAITING_ROOT_ELEMENT_END; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-AuthTokenEndElementHandler- Un-expected end element\n", 0); | ||||||
|  |             XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          } | ||||||
|  |          break; | ||||||
|  |     | ||||||
|  |       default: | ||||||
|  |          DbgTrace(0, "-AuthTokenEndElementHandler- Un-expected state = %d\n", pAuthTokenParse->state); | ||||||
|  |          XML_StopParser(pAuthTokenParse->p, XML_FALSE); | ||||||
|  |          break; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AuthTokenEndElementHandler- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | CreateAuthToken( | ||||||
|  |    IN    char *pTokenBuf, | ||||||
|  |    IN    int tokenBufLen, | ||||||
|  |    INOUT AuthToken **ppAuthToken) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus        retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |    AuthTokenParse    authTokenParse = {0}; | ||||||
|  |    AuthToken         *pAuthToken; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-CreateAuthToken- Start\n", 0); | ||||||
|  |  | ||||||
|  |    /* | ||||||
|  |    * Authentication tokens have the following format: | ||||||
|  |    *  | ||||||
|  |    * <?xml version="1.0" encoding="ISO-8859-1"?> | ||||||
|  |    * <auth_token> | ||||||
|  |    * <signature>signature value</signature> | ||||||
|  |    * <lifetime>lifetime value</lifetime> | ||||||
|  |    * <ident_token><type>identity token type</type>identity token data</ident_token> | ||||||
|  |    * </auth_token> | ||||||
|  |    * | ||||||
|  |    */ | ||||||
|  |  | ||||||
|  |    // Allocate AuthToken object | ||||||
|  |    pAuthToken = malloc(sizeof(*pAuthToken)); | ||||||
|  |    if (pAuthToken) | ||||||
|  |    { | ||||||
|  |       XML_Parser  p; | ||||||
|  |  | ||||||
|  |       // Initialize the AuthToken object and set it in the | ||||||
|  |       // authentication response parse object. | ||||||
|  |       memset(pAuthToken, 0, sizeof(*pAuthToken)); | ||||||
|  |       authTokenParse.pAuthToken = pAuthToken; | ||||||
|  |  | ||||||
|  |       // Create parser | ||||||
|  |       p = XML_ParserCreate(NULL); | ||||||
|  |       if (p) | ||||||
|  |       { | ||||||
|  |          // Keep track of the parser in our parse object | ||||||
|  |          authTokenParse.p = p; | ||||||
|  |  | ||||||
|  |          // Initialize the status within the parse object | ||||||
|  |          authTokenParse.status = CASA_STATUS_SUCCESS; | ||||||
|  |  | ||||||
|  |          // Set the start and end element handlers | ||||||
|  |          XML_SetElementHandler(p, | ||||||
|  |                                AuthTokenStartElementHandler, | ||||||
|  |                                AuthTokenEndElementHandler); | ||||||
|  |  | ||||||
|  |          // Set the character data handler | ||||||
|  |          XML_SetCharacterDataHandler(p, AuthTokenCharDataHandler); | ||||||
|  |  | ||||||
|  |  | ||||||
|  |          // Set our user data | ||||||
|  |          XML_SetUserData(p, &authTokenParse); | ||||||
|  |  | ||||||
|  |          // Parse the document | ||||||
|  |          if (XML_Parse(p, pTokenBuf, tokenBufLen, 1) == XML_STATUS_OK) | ||||||
|  |          { | ||||||
|  |             // Verify that the parse operation completed successfully | ||||||
|  |             if (authTokenParse.state == DONE_PARSING) | ||||||
|  |             { | ||||||
|  |                // The parse operation succeded. | ||||||
|  |                retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "-CreateAuthToken- Parse operation did not complete\n", 0); | ||||||
|  |  | ||||||
|  |                // Check if a status has been recorded | ||||||
|  |                if (authTokenParse.status != CASA_STATUS_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   retStatus = authTokenParse.status; | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                               CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                               CASA_STATUS_PROTOCOL_ERROR); | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-CreateAuthToken- 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, "-CreateAuthToken- 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)) | ||||||
|  |       { | ||||||
|  |          *ppAuthToken = pAuthToken; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          free(pAuthToken); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-CreateAuthToken- Memory allocation error\n", 0); | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-CreateAuthToken- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | RelAuthToken( | ||||||
|  |    IN    AuthToken *pAuthToken) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    DbgTrace(1, "-RelAuthToken- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Free the resources associated with the object | ||||||
|  |    if (pAuthToken->pSignature) | ||||||
|  |       free(pAuthToken->pSignature); | ||||||
|  |  | ||||||
|  |    if (pAuthToken->pIdenTokenType) | ||||||
|  |       free(pAuthToken->pIdenTokenType); | ||||||
|  |  | ||||||
|  |    if (pAuthToken->pIdenToken) | ||||||
|  |       free(pAuthToken->pIdenToken); | ||||||
|  |  | ||||||
|  |    free(pAuthToken); | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-RelAuthToken- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | CheckAuthToken( | ||||||
|  |    IN    AuthToken *pAuthToken, | ||||||
|  |    IN    const char *pServiceName) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L0 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus  retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-CheckuthToken- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // tbd | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-CheckAuthToken- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										764
									
								
								auth_token/server/AuthTokenValidate/config.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										764
									
								
								auth_token/server/AuthTokenValidate/config.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,764 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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; | ||||||
|  |  | ||||||
|  | // Synchronization mutex | ||||||
|  | static | ||||||
|  | HANDLE            g_configIfMutex = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | 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); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | int SSCS_CALL | ||||||
|  | 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, "-AddReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Increment the reference count on the object | ||||||
|  |    PlatAcquireMutex(g_configIfMutex); | ||||||
|  |    pConfigIfInstance->refCount ++; | ||||||
|  |    refCount = pConfigIfInstance->refCount; | ||||||
|  |    PlatReleaseMutex(g_configIfMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AddReference- End, refCount = %08X\n", refCount); | ||||||
|  |  | ||||||
|  |    return refCount; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | void SSCS_CALL | ||||||
|  | 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, "-ReleaseReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Decrement the reference count on the object and determine if it needs to | ||||||
|  |    // be released. | ||||||
|  |    PlatAcquireMutex(g_configIfMutex); | ||||||
|  |    pConfigIfInstance->refCount --; | ||||||
|  |    if (pConfigIfInstance->refCount == 0) | ||||||
|  |    { | ||||||
|  |       // The object needs to be released, forget about it. | ||||||
|  |       freeObj = true; | ||||||
|  |       g_numConfigIfObjs --; | ||||||
|  |       RemoveEntryList(&pConfigIfInstance->listEntry); | ||||||
|  |    } | ||||||
|  |    PlatReleaseMutex(g_configIfMutex); | ||||||
|  |  | ||||||
|  |    // 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, "-ReleaseReference- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | char* SSCS_CALL | ||||||
|  | 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 = strlen(pKeyName); | ||||||
|  |    char              *pKeyNameLowercase; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetEntryValue- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Allocate enough space to hold lower case version of the key name | ||||||
|  |    pKeyNameLowercase = 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 = malloc(pConfigKey->valueLen + 1); | ||||||
|  |             if (pValue) | ||||||
|  |             { | ||||||
|  |                strcpy(pValue, pConfigKey->pValue); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "-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, "-GetEntryValue- Buffer allocation failure\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-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 = strlen(pConfigFolder); | ||||||
|  |    int               configNameLen = 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); | ||||||
|  |  | ||||||
|  |    PlatAcquireMutex(g_configIfMutex); | ||||||
|  |  | ||||||
|  |    // 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 = malloc(configFolderLen + 1 + configNameLen + sizeof(".conf")); | ||||||
|  |       if (pFilePath) | ||||||
|  |       { | ||||||
|  |          FILE  *pConfigFile; | ||||||
|  |  | ||||||
|  |          strcpy(pFilePath, pConfigFolder); | ||||||
|  |          strcat(pFilePath, "/"); | ||||||
|  |          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 = 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 = AddReference; | ||||||
|  |                pConfigIfInstance->configIf.releaseReference = ReleaseReference; | ||||||
|  |                pConfigIfInstance->configIf.getEntryValue = GetEntryValue; | ||||||
|  |  | ||||||
|  |                // Save the ConfigFolder and ConfigName information within the instance data | ||||||
|  |                pConfigIfInstance->pConfigFolder = malloc(configFolderLen + 1); | ||||||
|  |                if (pConfigIfInstance->pConfigFolder) | ||||||
|  |                { | ||||||
|  |                   strcpy(pConfigIfInstance->pConfigFolder, pConfigFolder); | ||||||
|  |                   pConfigIfInstance->configFolderLen = configFolderLen; | ||||||
|  |  | ||||||
|  |                   pConfigIfInstance->pConfigName = 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 = 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 = malloc(sizeof(*pConfigKey)); | ||||||
|  |                               if (pConfigKey) | ||||||
|  |                               { | ||||||
|  |                                  pConfigKey->keyNameLen = strlen(pKey); | ||||||
|  |                                  pConfigKey->pKeyName = malloc(pConfigKey->keyNameLen + 1); | ||||||
|  |                                  if (pConfigKey->pKeyName) | ||||||
|  |                                  { | ||||||
|  |                                     // Save the key name in lower case | ||||||
|  |                                     LowerCaseString(pConfigKey->pKeyName, pKey); | ||||||
|  |  | ||||||
|  |                                     pConfigKey->valueLen = strlen(pValue); | ||||||
|  |                                     pConfigKey->pValue = 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); | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    PlatReleaseMutex(g_configIfMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetConfigInterface- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | ConfigIfInit(void) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Initializes the configuration interface complex. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus        retStatus; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-ConfigIfInit- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Allocate mutex | ||||||
|  |    if ((g_configIfMutex = PlatAllocMutex()) != NULL) | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |    else | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-ConfigIfInit- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | ConfigIfUninit(void) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Uninitializes the configuration interface complex. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    DbgTrace(1, "-ConfigIfUninit- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Free mutex if necessary | ||||||
|  |    if (g_configIfMutex) | ||||||
|  |    { | ||||||
|  |       PlatDestroyMutex(g_configIfMutex); | ||||||
|  |       g_configIfMutex = NULL; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-ConfigIfUninit- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										120
									
								
								auth_token/server/AuthTokenValidate/config_if.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										120
									
								
								auth_token/server/AuthTokenValidate/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_ | ||||||
|  |  | ||||||
| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = casa | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = casa | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = $(TARGET_OS) | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = linux | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
| @@ -0,0 +1,39 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  README for casa_identoken | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | casa_identoken is the Identity Token Provider plug-in for tokens of type | ||||||
|  | CasaIdentityToken. This are the default identity tokens utilized by CASA | ||||||
|  | Authentication. | ||||||
|  |  | ||||||
|  | CONFIGURATION | ||||||
|  |  | ||||||
|  | The path to the casa_identoken plug-in is configured by placing the file | ||||||
|  | CasaIdentityToken.conf in the /etc/opt/CASA/authtoken.d/modules.d folder. | ||||||
|  |  | ||||||
|  | PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | This module does not provide APIs to components outside of the CASA | ||||||
|  | Authentication framework. | ||||||
|  |  | ||||||
|  | SECURITY CONSIDERATIONS | ||||||
|  |  | ||||||
|  | CasaIdentityTokens are embedded inside CASA Authentication Tokens. CasaIdentityTokens | ||||||
|  | contain identity information which may be confidential and no attempts are made to | ||||||
|  | ensure the confidentiality of the data. Because of this it is important that CASA | ||||||
|  | Authentication Tokens be secured by applications making use of them. It is recommended | ||||||
|  | that CASA authentication tokens be transmitted using SSL. | ||||||
|  |   | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -0,0 +1,13 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  TODO for casa_identoken | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | This file contains a list of the items still outstanding for casa_identoken. | ||||||
|  |  | ||||||
|  | OUTSTANDING ITEMS | ||||||
|  |  | ||||||
|  | None. | ||||||
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							| @@ -0,0 +1,346 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Identity Token Provider Interface instance data | ||||||
|  | //  | ||||||
|  | typedef struct _IdenTokenProviderIfInstance | ||||||
|  | { | ||||||
|  |    int                  refCount; | ||||||
|  |    IdenTokenProviderIf  idenTokenProviderIf; | ||||||
|  |  | ||||||
|  | } IdenTokenProviderIfInstance, *PIdenTokenProviderIfInstance; | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | // IdenTokenProviderIf variables | ||||||
|  | static | ||||||
|  | int   g_numIdenTokenProviderIfObjs = 0; | ||||||
|  |  | ||||||
|  | // Debug Level | ||||||
|  | int   DebugLevel = 0; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Initialization variables | ||||||
|  | // | ||||||
|  | static | ||||||
|  | bool  g_moduleInitialized = false; | ||||||
|  |  | ||||||
|  | // Synchronization mutex | ||||||
|  | static | ||||||
|  | HANDLE   g_idenTokenProviderIfMutex = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | int SSCS_CALL | ||||||
|  | AddReference( | ||||||
|  |    IN       const void  *pIfInstance) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Interface reference count. | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Increases interface reference count. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int                           refCount; | ||||||
|  |    IdenTokenProviderIfInstance   *pIdenTokenProviderIfInstance = CONTAINING_RECORD(pIfInstance, IdenTokenProviderIfInstance, idenTokenProviderIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AddReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Increment the reference count on the object | ||||||
|  |    PlatAcquireMutex(g_idenTokenProviderIfMutex); | ||||||
|  |    pIdenTokenProviderIfInstance->refCount ++; | ||||||
|  |    refCount = pIdenTokenProviderIfInstance->refCount; | ||||||
|  |    PlatReleaseMutex(g_idenTokenProviderIfMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AddReference- End, refCount = %08X\n", refCount); | ||||||
|  |  | ||||||
|  |    return refCount; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | void SSCS_CALL | ||||||
|  | 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; | ||||||
|  |    IdenTokenProviderIfInstance   *pIdenTokenProviderIfInstance = CONTAINING_RECORD(pIfInstance, IdenTokenProviderIfInstance, idenTokenProviderIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-ReleaseReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Decrement the reference count on the object and determine if it needs to | ||||||
|  |    // be released. | ||||||
|  |    PlatAcquireMutex(g_idenTokenProviderIfMutex); | ||||||
|  |    pIdenTokenProviderIfInstance->refCount --; | ||||||
|  |    if (pIdenTokenProviderIfInstance->refCount == 0) | ||||||
|  |    { | ||||||
|  |       // The object needs to be released, forget about it. | ||||||
|  |       freeObj = true; | ||||||
|  |       g_numIdenTokenProviderIfObjs --; | ||||||
|  |    } | ||||||
|  |    PlatReleaseMutex(g_idenTokenProviderIfMutex); | ||||||
|  |  | ||||||
|  |    // Free object if necessary | ||||||
|  |    if (freeObj) | ||||||
|  |       free(pIdenTokenProviderIfInstance); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-ReleaseReference- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus  | ||||||
|  | GetIdentityTokenIf( | ||||||
|  |    IN       const void        *pIfInstance, | ||||||
|  |    IN       const char        *pTokenBuf, | ||||||
|  |    IN       const int         tokenLen, | ||||||
|  |    INOUT    IdenTokenIf       **ppIdenTokenIf) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pTokenBuf - | ||||||
|  | //       Pointer to null terminated string containing an identity token. | ||||||
|  | // | ||||||
|  | //    tokenLen - | ||||||
|  | //       Length of the token contained in the token buffer. | ||||||
|  | // | ||||||
|  | //    ppIdenTokenIf - | ||||||
|  | //       Pointer to variable that will receive pointer to identity | ||||||
|  | //       token interface. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get identity token interface instance for the specified token. | ||||||
|  | //  | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus  retStatus; | ||||||
|  |    char        *pDecodedTokenBuf; | ||||||
|  |    int         decodedTokenBufLen; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdentityTokenIf- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Validate input parameters | ||||||
|  |    if (pIfInstance == NULL | ||||||
|  |        || pTokenBuf == NULL | ||||||
|  |        || tokenLen == 0 | ||||||
|  |        || ppIdenTokenIf == NULL) | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetIdentityTokenIf- Invalid input parameter\n", 0); | ||||||
|  |  | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INVALID_PARAMETER); | ||||||
|  |       goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // First decode the token string | ||||||
|  |    retStatus = DecodeData(pTokenBuf, | ||||||
|  |                           tokenLen, | ||||||
|  |                           (void**) &pDecodedTokenBuf, | ||||||
|  |                           &decodedTokenBufLen); | ||||||
|  |    if (CASA_SUCCESS(retStatus)) | ||||||
|  |    { | ||||||
|  |       // Get the identity token interface | ||||||
|  |       retStatus = GetIdenTokenInterface(pDecodedTokenBuf, | ||||||
|  |                                         decodedTokenBufLen, | ||||||
|  |                                         ppIdenTokenIf); | ||||||
|  |  | ||||||
|  |       // Free the decoded token buffer | ||||||
|  |       free(pDecodedTokenBuf); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetIdentityTokenIf- Token decode failure\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdentityTokenIf- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | GET_IDEN_TOKEN_PROVIDER_INTERFACE_RTN( | ||||||
|  |    IN       const ConfigIf    *pModuleConfigIf, | ||||||
|  |    INOUT    IdenTokenProviderIf  **ppIdenTokenProviderIf) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pModuleConfigIf - | ||||||
|  | //       Pointer to configuration interface instance for the module. | ||||||
|  | //                | ||||||
|  | //    ppIdenTokenProviderIf - | ||||||
|  | //       Pointer to variable that will receive pointer to | ||||||
|  | //       IdentityTokenProviderIf instance. | ||||||
|  | // | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Gets identity token provider interface instance. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus                    retStatus; | ||||||
|  |    IdenTokenProviderIfInstance   *pIdenTokenProviderIfInstance; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-GetIdenTokenProviderInterface- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Validate input parameters | ||||||
|  |    if (pModuleConfigIf == NULL | ||||||
|  |        || ppIdenTokenProviderIf == NULL) | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetIdenTokenProviderInterface- Invalid input parameter\n", 0); | ||||||
|  |  | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_KRB5TOKEN, | ||||||
|  |                                   CASA_STATUS_INVALID_PARAMETER); | ||||||
|  |       goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |     // Make sure that the module has been initialized | ||||||
|  |    if (g_moduleInitialized == false) | ||||||
|  |    { | ||||||
|  |       // The module has not been initialized, synchronize access thought this section | ||||||
|  |       // to avoid having two threads performing initialization. | ||||||
|  |       AcquireModuleMutex; | ||||||
|  |  | ||||||
|  |       // Assume success | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |  | ||||||
|  |       // Check again in case another thread pre-empted us. | ||||||
|  |       if (g_moduleInitialized == false) | ||||||
|  |       { | ||||||
|  |          // Initialize the IdenTokenIf complex | ||||||
|  |          retStatus = IdenTokenIfInit(); | ||||||
|  |          if (CASA_SUCCESS(retStatus)) | ||||||
|  |          { | ||||||
|  |             // Allocate mutex | ||||||
|  |             if ((g_idenTokenProviderIfMutex = PlatAllocMutex()) != NULL) | ||||||
|  |             { | ||||||
|  |                // Success | ||||||
|  |                g_moduleInitialized = true; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                IdenTokenIfUninit(); | ||||||
|  |                retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL, | ||||||
|  |                                            CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                            CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Stop synchronization | ||||||
|  |       ReleaseModuleMutex; | ||||||
|  |  | ||||||
|  |       // Exit if we failed | ||||||
|  |       if (g_moduleInitialized == false) | ||||||
|  |          goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Allocate space for the interface instance | ||||||
|  |    pIdenTokenProviderIfInstance = malloc(sizeof(*pIdenTokenProviderIfInstance)); | ||||||
|  |    if (pIdenTokenProviderIfInstance) | ||||||
|  |    { | ||||||
|  |       // Initialize the interface instance data | ||||||
|  |       pIdenTokenProviderIfInstance->refCount = 1; | ||||||
|  |       pIdenTokenProviderIfInstance->idenTokenProviderIf.addReference = AddReference; | ||||||
|  |       pIdenTokenProviderIfInstance->idenTokenProviderIf.releaseReference = ReleaseReference; | ||||||
|  |       pIdenTokenProviderIfInstance->idenTokenProviderIf.getIdentityTokenIf = GetIdentityTokenIf; | ||||||
|  |  | ||||||
|  |       // Keep track of this object | ||||||
|  |       PlatAcquireMutex(g_idenTokenProviderIfMutex); | ||||||
|  |       g_numIdenTokenProviderIfObjs ++; | ||||||
|  |       PlatReleaseMutex(g_idenTokenProviderIfMutex); | ||||||
|  |  | ||||||
|  |       // Return the interface to the caller | ||||||
|  |       *ppIdenTokenProviderIf = &pIdenTokenProviderIfInstance->idenTokenProviderIf; | ||||||
|  |  | ||||||
|  |       // Success | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetIdenTokenProviderInterface- Buffer allocation failure\n", 0); | ||||||
|  |  | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_KRB5TOKEN, | ||||||
|  |                                   CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-GetIdenTokenProviderInterface- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
| @@ -0,0 +1,122 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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_s_authtoken.h> | ||||||
|  | #include "config_if.h" | ||||||
|  | #include "iden_token_provider_if.h" | ||||||
|  | #include "list_entry.h" | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | //===[ Inlines functions   ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | //===[ Global externals ]================================================== | ||||||
|  |  | ||||||
|  | extern int  DebugLevel; | ||||||
|  |  | ||||||
|  | //===[ External prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Defined in identoken.c | ||||||
|  | // | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | GetIdenTokenInterface( | ||||||
|  |    IN       const char   *pTokenBuf, | ||||||
|  |    IN       const int    tokenLen, | ||||||
|  |    INOUT    IdenTokenIf  **ppIdenTokenIf); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | IdenTokenIfInit(void); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | IdenTokenIfUninit(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); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | int | ||||||
|  | dtoul( | ||||||
|  |    IN    char *cp, | ||||||
|  |    IN    int len); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by platform.c | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | HANDLE | ||||||
|  | PlatAllocMutex(void); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatDestroyMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatAcquireMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatReleaseMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //========================================================================= | ||||||
|  |  | ||||||
|  | #endif // _INTERNAL_H_ | ||||||
|  |  | ||||||
| @@ -0,0 +1,15 @@ | |||||||
|  | ####################################################### | ||||||
|  | #                                                     # | ||||||
|  | # CASA Authentication Token System configuration file # | ||||||
|  | # for module:                                         # | ||||||
|  | #                                                     # | ||||||
|  | #     CasaIdentityToken                               # | ||||||
|  | #                                                     #  | ||||||
|  | # Note: This module is the provider of Casa Identity  # | ||||||
|  | #       tokens.                                       # | ||||||
|  | #                                                     # | ||||||
|  | ####################################################### | ||||||
|  |  | ||||||
|  | LibraryName		/opt/novell/CASA/lib/casa_iden_token.so | ||||||
|  |  | ||||||
|  |  | ||||||
| @@ -0,0 +1,112 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | if DEBUG | ||||||
|  | TARGET_CFG = Debug | ||||||
|  | CFLAGS += -v -w | ||||||
|  | else | ||||||
|  | TARGET_CFG = Release | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | SUBDIRS = | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = | ||||||
|  |  | ||||||
|  | CASAROOT = ../../../../../.. | ||||||
|  |  | ||||||
|  | CASALIBDIR = $(CASAROOT)/$(LIB) | ||||||
|  |  | ||||||
|  | # handle Mono secondary dependencies | ||||||
|  | export MONO_PATH := $(MONO_PATH) | ||||||
|  |  | ||||||
|  | PLATFORMINDEPENDENTSOURCEDIR = .. | ||||||
|  | PLATFORMDEPENDENTSOURCEDIR = . | ||||||
|  |  | ||||||
|  | MODULE_NAME = casa_iden_token | ||||||
|  | MODULE_EXT = so | ||||||
|  |  | ||||||
|  | CFILES = $(srcdir)/identokenprovider.c \ | ||||||
|  | 	 $(srcdir)/identoken.c \ | ||||||
|  | 	 $(srcdir)/util.c \ | ||||||
|  | 	 $(srcdir)/platform.c | ||||||
|  |  | ||||||
|  | CSFILES_CSC := | ||||||
|  | INCLUDES = -I. -I.. -I../../.. -I$(CASAROOT)/include -I../../../../../include | ||||||
|  | RESOURCES = | ||||||
|  | DEFINES = -Wno-format-extra-args -fno-strict-aliasing  | ||||||
|  | CFLAGS += $(INCLUDES) $(DEFINES) | ||||||
|  | LIBS = -lpthread -ldl -lexpat | ||||||
|  | LDFLAGS = -Bsymbolic -shared -Wl,-soname=$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | OBJDIR = ./$(TARGET_CFG)/$(LIB) | ||||||
|  | OBJS = $(addprefix $(OBJDIR)/, $(CFILES:%.c=%.o)) | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | CUR_DIR := $(shell pwd) | ||||||
|  |  | ||||||
|  | all: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Pattern based rules. | ||||||
|  | # | ||||||
|  | vpath %.c $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  | vpath %.cpp $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.c | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.cpp | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT): $(OBJDIR) $(OBJS) | ||||||
|  | 	@echo [======== Linking $@ ========] | ||||||
|  | 	$(LINK) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) | ||||||
|  | 	cp -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | $(OBJDIR): | ||||||
|  | 	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) | ||||||
|  | 	[ -d $(CASALIBDIR) ] || mkdir -p $(CASALIBDIR) | ||||||
|  | 	[ -d $(CASALIBDIR)/$(TARGET_CFG) ] || mkdir -p $(CASALIBDIR)/$(TARGET_CFG) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | install-exec-local: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | 	$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(DESTDIR)$(libdir)/ | ||||||
|  |  | ||||||
|  | uninstall-local: | ||||||
|  | 	cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	rmdir $(DESTDIR)$(libdir) | ||||||
|  |  | ||||||
|  | #installcheck-local: install | ||||||
|  | #	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | #	$(INSTALL_PROGRAM) $(DESTDIR)$(libdir) | ||||||
|  | #	cd $(DESTDIR)$(libdir); $(MONO) | ||||||
|  |  | ||||||
|  | clean-local: | ||||||
|  | 	if [ -d $(TARGET_CFG) ]; then  rm -rf $(TARGET_CFG); fi | ||||||
|  |  | ||||||
|  | distclean-local: | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
| @@ -0,0 +1,178 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Platform Mutex structure | ||||||
|  | // | ||||||
|  | typedef struct _PlatformMutex | ||||||
|  | { | ||||||
|  |    pthread_mutex_t   mutex; | ||||||
|  |  | ||||||
|  | } PlatformMutex, *PPlatformMutex; | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Module synchronization mutex | ||||||
|  | //  | ||||||
|  | pthread_mutex_t   g_hModuleMutex = PTHREAD_MUTEX_INITIALIZER; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | HANDLE | ||||||
|  | PlatAllocMutex(void) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex        *pPlatMutex; | ||||||
|  |    pthread_mutexattr_t  mutexAttr = {PTHREAD_MUTEX_RECURSIVE}; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAllocMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Allocate space for our mutex structure | ||||||
|  |    pPlatMutex = malloc(sizeof(*pPlatMutex)); | ||||||
|  |    if (pPlatMutex) | ||||||
|  |    { | ||||||
|  |       // Finish initializing the mutex | ||||||
|  |       pthread_mutex_init(&pPlatMutex->mutex, &mutexAttr); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-PlatAllocMutex- Memory allocation failure\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAllocMutex- End, retHandle = %08X\n", (unsigned int) pPlatMutex); | ||||||
|  |  | ||||||
|  |    return (HANDLE) pPlatMutex; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatDestroyMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatDestroyMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Free the resources associated with the mutex | ||||||
|  |    pthread_mutex_destroy(&pPlatMutex->mutex); | ||||||
|  |    free(pPlatMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatDestroyMutex- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatAcquireMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAcquireMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Acquire the mutex | ||||||
|  |    pthread_mutex_lock(&pPlatMutex->mutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAcquireMutex- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatReleaseMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatReleaseMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Release the mutex | ||||||
|  |    pthread_mutex_unlock(&pPlatMutex->mutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatRelease- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
| @@ -0,0 +1,93 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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> | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | #define _GNU_SOURCE | ||||||
|  |  | ||||||
|  | //===[ Include files ]===================================================== | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <syslog.h> | ||||||
|  | #include <pthread.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <dlfcn.h> | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | #define HANDLE void* | ||||||
|  |  | ||||||
|  | #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);     \ | ||||||
|  |       fprintf(stderr, "CASA_IdenToken %s", printBuff);    \ | ||||||
|  |    }                                                     \ | ||||||
|  | } | ||||||
|  | /*#define DbgTrace(LEVEL, X, Y) {                                                  \ | ||||||
|  |    if (LEVEL == 0 || DebugLevel >= LEVEL)                                        \ | ||||||
|  |    {                                                                             \ | ||||||
|  |       openlog("CASA_IdenToken", LOG_CONS | LOG_NOWAIT | LOG_ODELAY, LOG_USER);   \ | ||||||
|  |       syslog(LOG_USER | LOG_INFO, X, Y);                                         \ | ||||||
|  |       closelog();                                                                \ | ||||||
|  |    }                                                                             \ | ||||||
|  | }*/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // Deal with function name mapping issues | ||||||
|  | #define _snprintf snprintf | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Module synchronization | ||||||
|  | //  | ||||||
|  | extern pthread_mutex_t  g_hModuleMutex; | ||||||
|  |  | ||||||
|  | #define AcquireModuleMutex    pthread_mutex_lock(&g_hModuleMutex) | ||||||
|  | #define ReleaseModuleMutex    pthread_mutex_unlock(&g_hModuleMutex) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Inlines functions   ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global externals ]================================================== | ||||||
|  |  | ||||||
|  | //===[ External prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //========================================================================= | ||||||
|  |  | ||||||
| @@ -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    char *cp, | ||||||
|  |    IN    int len) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L0 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										356
									
								
								auth_token/server/AuthTokenValidate/iden_token_provider_if.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										356
									
								
								auth_token/server/AuthTokenValidate/iden_token_provider_if.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,356 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 _IDEN_TOKEN_PROVIDER_IF_H_ | ||||||
|  | #define _IDEN_TOKEN_PROVIDER_IF_H_ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Include files ]===================================================== | ||||||
|  |  | ||||||
|  | #include "config_if.h" | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************** | ||||||
|  | *************************************************************************** | ||||||
|  | **                                                                       ** | ||||||
|  | **    Identity Token Interface Definitions                               ** | ||||||
|  | **                                                                       ** | ||||||
|  | *************************************************************************** | ||||||
|  | **************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | int        | ||||||
|  | (SSCS_CALL *PFNIdenTokenIf_AddReference)( | ||||||
|  |    IN       const void  *pIfInstance); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Interface reference count. | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Increases interface reference count. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | void        | ||||||
|  | (SSCS_CALL *PFNIdenTokenIf_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 *PFNIdenTokenIf_GetIdentityId)( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pIdentIdBuf, | ||||||
|  |    INOUT    int         *pIdentIdLen); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pIdentIdBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity id. The returned | ||||||
|  | //       id will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pIdentIdBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pIdentIdBuf. On exit it contains the length of the returned id | ||||||
|  | //       (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the identity id associated with the identity token. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | CasaStatus  | ||||||
|  | (SSCS_CALL *PFNIdenTokenIf_GetSourceName)( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pSourceNameBuf, | ||||||
|  |    INOUT    int         *pSourceNameLen); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pSourceNameBuf - | ||||||
|  | //       Pointer to buffer that will receive the name associated with the | ||||||
|  | //       identity information source. The returned name will be in the form | ||||||
|  | //       of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pSourceNameBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pSourceNameBuf. On exit it contains the length of the returned | ||||||
|  | //       name (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the name of the identity source associated with the identity token. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | CasaStatus  | ||||||
|  | (SSCS_CALL *PFNIdenTokenIf_GetSourceUrl)( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pSourceUrlBuf, | ||||||
|  |    INOUT    int         *pSourceUrlLen); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pSourceUrlBuf - | ||||||
|  | //       Pointer to buffer that will receive the URL associated with the | ||||||
|  | //       identity information source. The returned URL will be in the form | ||||||
|  | //       of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pSourceUrlBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pSourceUrlBuf. On exit it contains the length of the returned | ||||||
|  | //       URL (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the URL to the identity source associated with the identity token. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | CasaStatus  | ||||||
|  | (SSCS_CALL *PFNIdenTokenIf_AttributeEnumerate)( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    int         *pEnumHandle,        | ||||||
|  |    INOUT    char        *pAttribNameBuf, | ||||||
|  |    INOUT    int         *pAttribNameLen, | ||||||
|  |    INOUT    char        *pAttribValueBuf, | ||||||
|  |    INOUT    int         *pAttribValueLen); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pEnumHandle - | ||||||
|  | //       Pointer to enumeration handle. Must be set to 0 to start an | ||||||
|  | //       enumeration. Note the enumeration handle advances if the | ||||||
|  | //       function returns success. | ||||||
|  | // | ||||||
|  | //    pAttribNameBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity attribute name. The | ||||||
|  | //       returned name will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pAttribNameLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pAttribNameBuf. On exit it contains the length of the returned | ||||||
|  | //       name (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    pAttribValueBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity attribute value. The | ||||||
|  | //       returned value will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pAttribValueLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pAttribValueBuf. On exit it contains the length of the returned | ||||||
|  | //       value (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Enumerates through the attributes associated with the identity token. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Identity Token Interface Object | ||||||
|  | //  | ||||||
|  | typedef struct _IdenTokenIf | ||||||
|  | { | ||||||
|  |    PFNIdenTokenIf_AddReference         addReference; | ||||||
|  |    PFNIdenTokenIf_ReleaseReference     releaseReference; | ||||||
|  |    PFNIdenTokenIf_GetIdentityId        getIdentityId; | ||||||
|  |    PFNIdenTokenIf_GetSourceName        getSourceName; | ||||||
|  |    PFNIdenTokenIf_GetSourceUrl         getSourceUrl; | ||||||
|  |    PFNIdenTokenIf_AttributeEnumerate   attributeEnumerate; | ||||||
|  |  | ||||||
|  | } IdenTokenIf, *PIdenTokenIf; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /************************************************************************** | ||||||
|  | *************************************************************************** | ||||||
|  | **                                                                       ** | ||||||
|  | **    Identity Token Provider Interface Definitions                      ** | ||||||
|  | **                                                                       ** | ||||||
|  | *************************************************************************** | ||||||
|  | **************************************************************************/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | int        | ||||||
|  | (SSCS_CALL *PFNIdenTokenProviderIf_AddReference)( | ||||||
|  |    IN       const void  *pIfInstance); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Interface reference count. | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Increases interface reference count. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | void        | ||||||
|  | (SSCS_CALL *PFNIdenTokenProviderIf_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 *PFNIdenTokenProviderIf_GetIdentityTokenIf)( | ||||||
|  |    IN       const void        *pIfInstance, | ||||||
|  |    IN       const char        *pTokenBuf, | ||||||
|  |    IN       const int         tokenLen, | ||||||
|  |    INOUT    IdenTokenIf       **ppIdenTokenIf); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pTokenBuf - | ||||||
|  | //       Pointer to null terminated string containing an identity token. | ||||||
|  | // | ||||||
|  | //    tokenLen - | ||||||
|  | //       Length of the token contained in the token buffer. | ||||||
|  | // | ||||||
|  | //    ppIdenTokenIf - | ||||||
|  | //       Pointer to variable that will receive pointer to identity | ||||||
|  | //       token interface. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get identity token interface instance for the specified token. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Identity Token Provider Interface Object | ||||||
|  | //  | ||||||
|  | typedef struct _IdenTokenProviderIf | ||||||
|  | { | ||||||
|  |    PFNIdenTokenProviderIf_AddReference          addReference; | ||||||
|  |    PFNIdenTokenProviderIf_ReleaseReference      releaseReference; | ||||||
|  |    PFNIdenTokenProviderIf_GetIdentityTokenIf    getIdentityTokenIf; | ||||||
|  |  | ||||||
|  | } IdenTokenProviderIf, *PIdenTokenProviderIf; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | typedef | ||||||
|  | CasaStatus | ||||||
|  | (SSCS_CALL *PFN_GetIdenTokenProviderIfRtn)( | ||||||
|  |    IN       const ConfigIf       *pModuleConfigIf, | ||||||
|  |    INOUT    IdenTokenProviderIf  **ppIdenTokenProviderIf); | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pModuleConfigIf - | ||||||
|  | //       Pointer to configuration interface instance for the module. | ||||||
|  | //                | ||||||
|  | //    ppIdenTokenProviderIf - | ||||||
|  | //       Pointer to variable that will receive pointer to | ||||||
|  | //       IdentityTokenProviderIf instance. | ||||||
|  | // | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Gets identity token provider interface instance. | ||||||
|  | //=======================================================================-- | ||||||
|  |  | ||||||
|  | #define GET_IDEN_TOKEN_PROVIDER_INTERFACE_RTN_SYMBOL  "GetIdenTokenProviderInterface" | ||||||
|  | #define GET_IDEN_TOKEN_PROVIDER_INTERFACE_RTN         GetIdenTokenProviderInterface | ||||||
|  |  | ||||||
|  |  | ||||||
|  | #endif // #ifndef _IDEN_TOKEN_PROVIDER_IF_H_ | ||||||
|  |  | ||||||
							
								
								
									
										196
									
								
								auth_token/server/AuthTokenValidate/internal.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										196
									
								
								auth_token/server/AuthTokenValidate/internal.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,196 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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_s_authtoken.h> | ||||||
|  | #include "proto.h" | ||||||
|  | #include "list_entry.h" | ||||||
|  | #include "config_if.h" | ||||||
|  | #include "iden_token_provider_if.h" | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Authentication Token structure | ||||||
|  | // | ||||||
|  | typedef struct _AuthToken | ||||||
|  | { | ||||||
|  |    int   tokenLifetime; | ||||||
|  |    char  *pSignature; | ||||||
|  |    int   signatureLen; | ||||||
|  |    char  *pIdenTokenType; | ||||||
|  |    int   idenTokenTypeLen; | ||||||
|  |    char  *pIdenToken; | ||||||
|  |    int   idenTokenLen; | ||||||
|  |  | ||||||
|  | } AuthToken, *PAuthToken; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Inlines functions   ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | //===[ Global externals ]================================================== | ||||||
|  |  | ||||||
|  | extern int  DebugLevel; | ||||||
|  |  | ||||||
|  | //===[ External prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by config.c | ||||||
|  | // | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | GetConfigInterface( | ||||||
|  |    IN       const char  *pConfigFolder, | ||||||
|  |    IN       const char  *pConfigName, | ||||||
|  |    INOUT    ConfigIf    **ppConfigIf); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | ConfigIfInit(void); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | ConfigIfUninit(void); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by platform.c | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | GetIdenTokenProviderInterface( | ||||||
|  |    IN       const char           *pIdenTokenTypeName, | ||||||
|  |    INOUT    IdenTokenProviderIf  **ppIdenTokenProviderIf); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | HANDLE | ||||||
|  | PlatAllocMutex(void); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatDestroyMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatAcquireMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PlatReleaseMutex(HANDLE hMutex); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by principal.c | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | GetPrincipalInterface( | ||||||
|  |    IN       IdenTokenIf  *pIdenTokenIf, | ||||||
|  |    INOUT    PrincipalIf  **ppPrincipalIf); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | PrincipalIfInit(void); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | PrincipalIfUninit(void); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by validate.c | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | ValidateAuthToken( | ||||||
|  |    IN       const char  *pServiceName, | ||||||
|  |    IN       const char  *pTokenBuf, | ||||||
|  |    IN       const int   tokenBufLen, | ||||||
|  |    INOUT    PrincipalIf **ppPrincipalIf); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Functions exported by authtoken.c | ||||||
|  | //  | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | CreateAuthToken( | ||||||
|  |    IN    char *pTokenBuf, | ||||||
|  |    IN    int tokenBufLen, | ||||||
|  |    INOUT AuthToken **ppAuthToken); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | void | ||||||
|  | RelAuthToken( | ||||||
|  |    IN    AuthToken *pAuthToken); | ||||||
|  |  | ||||||
|  | extern | ||||||
|  | CasaStatus | ||||||
|  | CheckAuthToken( | ||||||
|  |    IN    AuthToken *pAuthToken, | ||||||
|  |    IN    const char *pServiceName); | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // 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    char *cp, | ||||||
|  |    IN    int len); | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //========================================================================= | ||||||
|  |  | ||||||
|  | #endif // _INTERNAL_H_ | ||||||
|  |  | ||||||
							
								
								
									
										114
									
								
								auth_token/server/AuthTokenValidate/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										114
									
								
								auth_token/server/AuthTokenValidate/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,114 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | if DEBUG | ||||||
|  | TARGET_CFG = Debug | ||||||
|  | CFLAGS += -v -w | ||||||
|  | else | ||||||
|  | TARGET_CFG = Release | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | SUBDIRS = | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = | ||||||
|  |  | ||||||
|  | CASAROOT = ../../../../ | ||||||
|  |  | ||||||
|  | CASALIBDIR = $(CASAROOT)/$(LIB) | ||||||
|  |  | ||||||
|  | # handle Mono secondary dependencies | ||||||
|  | export MONO_PATH := $(MONO_PATH) | ||||||
|  |  | ||||||
|  | PLATFORMINDEPENDENTSOURCEDIR = .. | ||||||
|  | PLATFORMDEPENDENTSOURCEDIR = . | ||||||
|  |  | ||||||
|  | MODULE_NAME = libcasa_s_authtoken | ||||||
|  | MODULE_EXT = so | ||||||
|  |  | ||||||
|  | CFILES = $(srcdir)/config.c \ | ||||||
|  | 	 $(srcdir)/authtoken.c \ | ||||||
|  | 	 $(srcdir)/principal.c \ | ||||||
|  | 	 $(srcdir)/util.c \ | ||||||
|  | 	 $(srcdir)/validate.c \ | ||||||
|  | 	 $(srcdir)/platform.c | ||||||
|  |  | ||||||
|  | CSFILES_CSC := | ||||||
|  | INCLUDES = -I. -I.. -I$(CASAROOT)/include -I../../../include | ||||||
|  | RESOURCES = | ||||||
|  | DEFINES = -Wno-format-extra-args -fno-strict-aliasing  | ||||||
|  | CFLAGS += $(INCLUDES) $(DEFINES) | ||||||
|  | LIBS = -lpthread -ldl -lexpat | ||||||
|  | LDFLAGS = -Bsymbolic -shared -Wl,-soname=$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | OBJDIR = ./$(TARGET_CFG)/$(LIB) | ||||||
|  | OBJS = $(addprefix $(OBJDIR)/, $(CFILES:%.c=%.o)) | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) *.h | ||||||
|  |  | ||||||
|  | CUR_DIR := $(shell pwd) | ||||||
|  |  | ||||||
|  | all: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Pattern based rules. | ||||||
|  | # | ||||||
|  | vpath %.c $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  | vpath %.cpp $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.c | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.cpp | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT): $(OBJDIR) $(OBJS) | ||||||
|  | 	@echo [======== Linking $@ ========] | ||||||
|  | 	$(LINK) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) | ||||||
|  | 	cp -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | $(OBJDIR): | ||||||
|  | 	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) | ||||||
|  | 	[ -d $(CASALIBDIR) ] || mkdir -p $(CASALIBDIR) | ||||||
|  | 	[ -d $(CASALIBDIR)/$(TARGET_CFG) ] || mkdir -p $(CASALIBDIR)/$(TARGET_CFG) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | install-exec-local: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | 	$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(DESTDIR)$(libdir)/ | ||||||
|  |  | ||||||
|  | uninstall-local: | ||||||
|  | 	cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	rmdir $(DESTDIR)$(libdir) | ||||||
|  |  | ||||||
|  | #installcheck-local: install | ||||||
|  | #	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | #	$(INSTALL_PROGRAM) $(DESTDIR)$(libdir) | ||||||
|  | #	cd $(DESTDIR)$(libdir); $(MONO) | ||||||
|  |  | ||||||
|  | clean-local: | ||||||
|  | 	if [ -d $(TARGET_CFG) ]; then  rm -rf $(TARGET_CFG); fi | ||||||
|  |  | ||||||
|  | distclean-local: | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										397
									
								
								auth_token/server/AuthTokenValidate/linux/platform.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										397
									
								
								auth_token/server/AuthTokenValidate/linux/platform.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,397 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Identity Token Module definition | ||||||
|  | //  | ||||||
|  | typedef struct _IdenTokenProviderModule | ||||||
|  | { | ||||||
|  |    LIST_ENTRY           listEntry; | ||||||
|  |    char                 *pTypeName; | ||||||
|  |    int                  typeNameLen; | ||||||
|  |    void                 *libHandle; | ||||||
|  |    IdenTokenProviderIf  *pIdenTokenProviderIf; | ||||||
|  |  | ||||||
|  | } IdenTokenProviderModule, *PIdenTokenProviderModule; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Platform Mutex structure | ||||||
|  | // | ||||||
|  | typedef struct _PlatformMutex | ||||||
|  | { | ||||||
|  |    pthread_mutex_t   mutex; | ||||||
|  |  | ||||||
|  | } PlatformMutex, *PPlatformMutex; | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Module synchronization mutex | ||||||
|  | //  | ||||||
|  | pthread_mutex_t   g_hModuleMutex = PTHREAD_MUTEX_INITIALIZER; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // IdenTokenProviderModule list and syncronization mutex | ||||||
|  | //  | ||||||
|  | static | ||||||
|  | LIST_ENTRY        g_IdenTokenProviderModuleListHead = {&g_IdenTokenProviderModuleListHead, &g_IdenTokenProviderModuleListHead}; | ||||||
|  |  | ||||||
|  | static | ||||||
|  | pthread_mutex_t   g_IdenTokenProviderModuleMutex = PTHREAD_MUTEX_INITIALIZER; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | GetIdenTokenProviderInterface( | ||||||
|  |    IN       const char           *pIdenTokenTypeName, | ||||||
|  |    INOUT    IdenTokenProviderIf  **ppIdenTokenProviderIf) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus  retStatus; | ||||||
|  |    ConfigIf    *pModuleConfigIf; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdenTokenProviderInterface- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Get the configuration for the module | ||||||
|  |    retStatus = GetConfigInterface("/etc/opt/novell/CASA/authtoken.d/modules.d", | ||||||
|  |                                   pIdenTokenTypeName, | ||||||
|  |                                   &pModuleConfigIf); | ||||||
|  |    if (CASA_SUCCESS(retStatus) | ||||||
|  |        && CasaStatusCode(retStatus) != CASA_STATUS_OBJECT_NOT_FOUND) | ||||||
|  |    { | ||||||
|  |       LIST_ENTRY              *pListEntry; | ||||||
|  |       IdenTokenProviderModule *pIdenTokenProviderModule = NULL; | ||||||
|  |       int32_t                 idenTokenTypeNameLen = strlen(pIdenTokenTypeName); | ||||||
|  |  | ||||||
|  |       // Gain exclusive access to our mutex | ||||||
|  |       pthread_mutex_lock(&g_IdenTokenProviderModuleMutex); | ||||||
|  |  | ||||||
|  |       // Look if we already have the module in our list | ||||||
|  |       pListEntry = g_IdenTokenProviderModuleListHead.Flink; | ||||||
|  |       while (pListEntry != &g_IdenTokenProviderModuleListHead) | ||||||
|  |       { | ||||||
|  |          // Get pointer to the current entry | ||||||
|  |          pIdenTokenProviderModule = CONTAINING_RECORD(pListEntry, IdenTokenProviderModule, listEntry); | ||||||
|  |  | ||||||
|  |          // Check if this is the module that we need | ||||||
|  |          if (pIdenTokenProviderModule->typeNameLen == idenTokenTypeNameLen | ||||||
|  |              && memcmp(pIdenTokenTypeName, pIdenTokenProviderModule->pTypeName, idenTokenTypeNameLen) == 0) | ||||||
|  |          { | ||||||
|  |             // This is the module that we need, stop looking. | ||||||
|  |             break; | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             // This is not the module that we are looking for | ||||||
|  |             pIdenTokenProviderModule = NULL; | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Advance to the next entry | ||||||
|  |          pListEntry = pListEntry->Flink; | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Proceed based on whether or not a module was found | ||||||
|  |       if (pIdenTokenProviderModule) | ||||||
|  |       { | ||||||
|  |          // Module found in our list, provide the caller with its IdenTokenProviderIf | ||||||
|  |          // instance after we have incremented its reference count. | ||||||
|  |          pIdenTokenProviderModule->pIdenTokenProviderIf->addReference(pIdenTokenProviderModule->pIdenTokenProviderIf); | ||||||
|  |          *ppIdenTokenProviderIf = pIdenTokenProviderModule->pIdenTokenProviderIf; | ||||||
|  |  | ||||||
|  |          // Success | ||||||
|  |          retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          // Needed module not found in our list, create an entry. | ||||||
|  |          pIdenTokenProviderModule = malloc(sizeof(*pIdenTokenProviderModule)); | ||||||
|  |          if (pIdenTokenProviderModule) | ||||||
|  |          { | ||||||
|  |             // Allocate buffer to contain the authentication type name within the module entry | ||||||
|  |             pIdenTokenProviderModule->pTypeName = malloc(idenTokenTypeNameLen + 1); | ||||||
|  |             if (pIdenTokenProviderModule->pTypeName) | ||||||
|  |             { | ||||||
|  |                char  *pLibraryName; | ||||||
|  |  | ||||||
|  |                // Initialize the library handle field | ||||||
|  |                pIdenTokenProviderModule->libHandle = NULL; | ||||||
|  |  | ||||||
|  |                // Save the auth type name within the entry | ||||||
|  |                strcpy(pIdenTokenProviderModule->pTypeName, pIdenTokenTypeName); | ||||||
|  |                pIdenTokenProviderModule->typeNameLen = idenTokenTypeNameLen; | ||||||
|  |  | ||||||
|  |                // Obtain the name of the library that we must load | ||||||
|  |                pLibraryName = pModuleConfigIf->getEntryValue(pModuleConfigIf, "LibraryName"); | ||||||
|  |                if (pLibraryName) | ||||||
|  |                { | ||||||
|  |                   // Load the library | ||||||
|  |                   pIdenTokenProviderModule->libHandle = dlopen(pLibraryName, RTLD_LAZY); | ||||||
|  |                   if (pIdenTokenProviderModule->libHandle) | ||||||
|  |                   { | ||||||
|  |                      PFN_GetIdenTokenProviderIfRtn   pGetIdenTokenProviderIfRtn; | ||||||
|  |  | ||||||
|  |                      // Library has been loaded, now get a pointer to its GetIdenTokenProviderProviderInterface routine | ||||||
|  |                      pGetIdenTokenProviderIfRtn = dlsym(pIdenTokenProviderModule->libHandle, GET_IDEN_TOKEN_PROVIDER_INTERFACE_RTN_SYMBOL); | ||||||
|  |                      if (pGetIdenTokenProviderIfRtn) | ||||||
|  |                      { | ||||||
|  |                         // Now, obtain the modules IdenTokenProviderIf. | ||||||
|  |                         retStatus = (pGetIdenTokenProviderIfRtn)(pModuleConfigIf, &pIdenTokenProviderModule->pIdenTokenProviderIf); | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         DbgTrace(0, "-GetIdenTokenProviderInterface- dlsym error = %s\n", dlerror()); | ||||||
|  |                         retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                                     CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                                     CASA_STATUS_LIBRARY_LOAD_FAILURE); | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      DbgTrace(0, "-GetIdenTokenProviderInterface- dlopen error = %s\n", dlerror()); | ||||||
|  |                      retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                                  CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                                  CASA_STATUS_LIBRARY_LOAD_FAILURE); | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   // Free the buffer holding the library name | ||||||
|  |                   free(pLibraryName); | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   DbgTrace(0, "-GetIdenTokenProviderInterface- 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 IdenTokenProviderIf instance for the | ||||||
|  |                // module. | ||||||
|  |                if (CASA_SUCCESS(retStatus)) | ||||||
|  |                { | ||||||
|  |                   // Insert the entry in the list, provide the caller with its IdenTokenProviderIf | ||||||
|  |                   // instance after we have incremented its reference count. | ||||||
|  |                   InsertTailList(&g_IdenTokenProviderModuleListHead, &pIdenTokenProviderModule->listEntry); | ||||||
|  |                   pIdenTokenProviderModule->pIdenTokenProviderIf->addReference(pIdenTokenProviderModule->pIdenTokenProviderIf); | ||||||
|  |                   *ppIdenTokenProviderIf = pIdenTokenProviderModule->pIdenTokenProviderIf; | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   // Failed, free resources. | ||||||
|  |                   free(pIdenTokenProviderModule->pTypeName); | ||||||
|  |                   if (pIdenTokenProviderModule->libHandle) | ||||||
|  |                      dlclose(pIdenTokenProviderModule->libHandle); | ||||||
|  |                   free(pIdenTokenProviderModule); | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "-GetIdenTokenProviderInterface- Unable to allocate buffer\n", 0); | ||||||
|  |  | ||||||
|  |                // Free buffer allocated for entry | ||||||
|  |                free(pIdenTokenProviderModule); | ||||||
|  |  | ||||||
|  |                retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                            CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                            CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "-GetIdenTokenProviderInterface- Unable to allocate buffer\n", 0); | ||||||
|  |             retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                         CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                         CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Release exclusive access to our mutex | ||||||
|  |       pthread_mutex_unlock(&g_IdenTokenProviderModuleMutex); | ||||||
|  |  | ||||||
|  |       // Release config interface instance | ||||||
|  |       pModuleConfigIf->releaseReference(pModuleConfigIf); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetIdenTokenProviderInterface- Unable to obtain config interface\n", 0); | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_CONFIGURATION_ERROR); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdenTokenProviderInterface- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | HANDLE | ||||||
|  | PlatAllocMutex(void) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex        *pPlatMutex; | ||||||
|  |    pthread_mutexattr_t  mutexAttr = {PTHREAD_MUTEX_RECURSIVE}; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAllocMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Allocate space for our mutex structure | ||||||
|  |    pPlatMutex = malloc(sizeof(*pPlatMutex)); | ||||||
|  |    if (pPlatMutex) | ||||||
|  |    { | ||||||
|  |       // Finish initializing the mutex | ||||||
|  |       pthread_mutex_init(&pPlatMutex->mutex, &mutexAttr); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-PlatAllocMutex- Memory allocation failure\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAllocMutex- End, retHandle = %08X\n", (unsigned int) pPlatMutex); | ||||||
|  |  | ||||||
|  |    return (HANDLE) pPlatMutex; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatDestroyMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatDestroyMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Free the resources associated with the mutex | ||||||
|  |    pthread_mutex_destroy(&pPlatMutex->mutex); | ||||||
|  |    free(pPlatMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatDestroyMutex- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatAcquireMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAcquireMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Acquire the mutex | ||||||
|  |    pthread_mutex_lock(&pPlatMutex->mutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatAcquireMutex- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PlatReleaseMutex(HANDLE hMutex) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PlatformMutex  *pPlatMutex = (PlatformMutex*) hMutex; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatReleaseMutex- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Release the mutex | ||||||
|  |    pthread_mutex_unlock(&pPlatMutex->mutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-PlatRelease- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										95
									
								
								auth_token/server/AuthTokenValidate/linux/platform.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										95
									
								
								auth_token/server/AuthTokenValidate/linux/platform.h
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,95 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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> | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | #define _GNU_SOURCE | ||||||
|  |  | ||||||
|  | //===[ Include files ]===================================================== | ||||||
|  |  | ||||||
|  | #include <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <syslog.h> | ||||||
|  | #include <pthread.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <ctype.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <dlfcn.h> | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | #define HANDLE void* | ||||||
|  |  | ||||||
|  | #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);     \ | ||||||
|  |       fprintf(stderr, "CASA_AuthTokenValidate %s", printBuff);    \ | ||||||
|  |    }                                                     \ | ||||||
|  | } | ||||||
|  | /*#define DbgTrace(LEVEL, X, Y) {                                                        \ | ||||||
|  |    if (LEVEL == 0 || DebugLevel >= LEVEL)                                              \ | ||||||
|  |    {                                                                                   \ | ||||||
|  |       openlog("CASA_AuthTokenValidate", LOG_CONS | LOG_NOWAIT | LOG_ODELAY, LOG_USER); \ | ||||||
|  |       syslog(LOG_USER | LOG_INFO, X, Y);                                               \ | ||||||
|  |       closelog();                                                                      \ | ||||||
|  |    }                                                                                   \ | ||||||
|  | }*/ | ||||||
|  |  | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Deal with function name mapping issues | ||||||
|  | //  | ||||||
|  | #define _snprintf snprintf | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Module synchronization | ||||||
|  | //  | ||||||
|  | extern pthread_mutex_t  g_hModuleMutex; | ||||||
|  |  | ||||||
|  | #define AcquireModuleMutex    pthread_mutex_lock(&g_hModuleMutex) | ||||||
|  | #define ReleaseModuleMutex    pthread_mutex_unlock(&g_hModuleMutex) | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Inlines functions   ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global externals ]================================================== | ||||||
|  |  | ||||||
|  | //===[ External prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //========================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										482
									
								
								auth_token/server/AuthTokenValidate/principal.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										482
									
								
								auth_token/server/AuthTokenValidate/principal.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,482 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 Interface instance data | ||||||
|  | //  | ||||||
|  | typedef struct _PrincipalIfInstance | ||||||
|  | { | ||||||
|  |    int            refCount; | ||||||
|  |    IdenTokenIf    *pIdenTokenIf; | ||||||
|  |    PrincipalIf    principalIf; | ||||||
|  |  | ||||||
|  | } PrincipalIfInstance, *PPrincipalIfInstance; | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | // PrincipalIf variables | ||||||
|  | static | ||||||
|  | int               g_numPrincipalIfObjs = 0; | ||||||
|  |  | ||||||
|  | // Synchronization mutex | ||||||
|  | static | ||||||
|  | HANDLE            g_principalIfMutex = NULL; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | int SSCS_CALL | ||||||
|  | AddReference( | ||||||
|  |    IN       const void  *pIfInstance) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Interface reference count. | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Increases interface reference count. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int                  refCount; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AddReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Increment the reference count on the object | ||||||
|  |    PlatAcquireMutex(g_principalIfMutex); | ||||||
|  |    pPrincipalIfInstance->refCount ++; | ||||||
|  |    refCount = pPrincipalIfInstance->refCount; | ||||||
|  |    PlatReleaseMutex(g_principalIfMutex); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AddReference- End, refCount = %08X\n", refCount); | ||||||
|  |  | ||||||
|  |    return refCount; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | void SSCS_CALL | ||||||
|  | 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; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-ReleaseReference- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Decrement the reference count on the object and determine if it needs to | ||||||
|  |    // be released. | ||||||
|  |    PlatAcquireMutex(g_principalIfMutex); | ||||||
|  |    pPrincipalIfInstance->refCount --; | ||||||
|  |    if (pPrincipalIfInstance->refCount == 0) | ||||||
|  |    { | ||||||
|  |       // The object needs to be released, forget about it. | ||||||
|  |       freeObj = true; | ||||||
|  |       g_numPrincipalIfObjs --; | ||||||
|  |    } | ||||||
|  |    PlatReleaseMutex(g_principalIfMutex); | ||||||
|  |  | ||||||
|  |    // Free object if necessary | ||||||
|  |    if (freeObj) | ||||||
|  |    { | ||||||
|  |       // Release the identity token interface associated with our instance | ||||||
|  |       pPrincipalIfInstance->pIdenTokenIf->releaseReference(pPrincipalIfInstance->pIdenTokenIf); | ||||||
|  |  | ||||||
|  |       // Free our instance data | ||||||
|  |       free(pPrincipalIfInstance); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-ReleaseReference- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | GetIdentityId( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pIdentIdBuf, | ||||||
|  |    INOUT    int         *pIdentIdLen) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pIdentIdBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity id. The returned | ||||||
|  | //       id will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pIdentIdBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pIdentIdBuf. On exit it contains the length of the returned id | ||||||
|  | //       (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the identity id associated with the identity token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus           retStatus; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdentityId- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Just call into the identity token | ||||||
|  |    retStatus = pPrincipalIfInstance->pIdenTokenIf->getIdentityId(pPrincipalIfInstance->pIdenTokenIf, | ||||||
|  |                                                                  pIdentIdBuf, | ||||||
|  |                                                                  pIdentIdLen); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetIdentityId- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | GetSourceName( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pSourceNameBuf, | ||||||
|  |    INOUT    int         *pSourceNameLen) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pSourceNameBuf - | ||||||
|  | //       Pointer to buffer that will receive the name associated with the | ||||||
|  | //       identity information source. The returned name will be in the form | ||||||
|  | //       of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pSourceNameBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pSourceNameBuf. On exit it contains the length of the returned | ||||||
|  | //       name (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the name of the identity source associated with the identity token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus           retStatus; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetSourceName- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Just call into the identity token | ||||||
|  |    retStatus = pPrincipalIfInstance->pIdenTokenIf->getSourceName(pPrincipalIfInstance->pIdenTokenIf, | ||||||
|  |                                                                  pSourceNameBuf, | ||||||
|  |                                                                  pSourceNameLen); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetSourceName- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | GetSourceUrl( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    char        *pSourceUrlBuf, | ||||||
|  |    INOUT    int         *pSourceUrlLen) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pSourceUrlBuf - | ||||||
|  | //       Pointer to buffer that will receive the URL associated with the | ||||||
|  | //       identity information source. The returned URL will be in the form | ||||||
|  | //       of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pSourceUrlBufLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pSourceUrlBuf. On exit it contains the length of the returned | ||||||
|  | //       URL (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get the URL to the identity source associated with the identity token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus           retStatus; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetSourceUrl- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Just call into the identity token | ||||||
|  |    retStatus = pPrincipalIfInstance->pIdenTokenIf->getSourceUrl(pPrincipalIfInstance->pIdenTokenIf, | ||||||
|  |                                                                 pSourceUrlBuf, | ||||||
|  |                                                                 pSourceUrlLen); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetSourceUrl- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | static | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | AttributeEnumerate( | ||||||
|  |    IN       const void  *pIfInstance, | ||||||
|  |    INOUT    int         *pEnumHandle,        | ||||||
|  |    INOUT    char        *pAttribNameBuf, | ||||||
|  |    INOUT    int         *pAttribNameLen, | ||||||
|  |    INOUT    char        *pAttribValueBuf, | ||||||
|  |    INOUT    int         *pAttribValueLen) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pIfInstance - | ||||||
|  | //       Pointer to interface object. | ||||||
|  | //    | ||||||
|  | //    pEnumHandle - | ||||||
|  | //       Pointer to enumeration handle. Must be set to 0 to start an | ||||||
|  | //       enumeration. | ||||||
|  | // | ||||||
|  | //    pAttribNameBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity attribute name. The | ||||||
|  | //       returned name will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pAttribNameLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pAttribNameBuf. On exit it contains the length of the returned | ||||||
|  | //       name (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    pAttribValueBuf - | ||||||
|  | //       Pointer to buffer that will receive the identity attribute value. The | ||||||
|  | //       returned value will be in the form of a NULL terminated string. | ||||||
|  | // | ||||||
|  | //    pAttribValueLen - | ||||||
|  | //       Pointer to variable with the length of the buffer pointed by | ||||||
|  | //       pAttribValueBuf. On exit it contains the length of the returned | ||||||
|  | //       value (including the NULL terminator). | ||||||
|  | // | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Enumerates through the attributes associated with the identity token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus           retStatus; | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance = CONTAINING_RECORD(pIfInstance, PrincipalIfInstance, principalIf); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AttributeEnumerate- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Just call into the identity token | ||||||
|  |    retStatus = pPrincipalIfInstance->pIdenTokenIf->attributeEnumerate(pPrincipalIfInstance->pIdenTokenIf, | ||||||
|  |                                                                       pEnumHandle, | ||||||
|  |                                                                       pAttribNameBuf, | ||||||
|  |                                                                       pAttribNameLen, | ||||||
|  |                                                                       pAttribValueBuf, | ||||||
|  |                                                                       pAttribValueLen); | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-AttributeEnumerate- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | GetPrincipalInterface( | ||||||
|  |    IN       IdenTokenIf  *pIdenTokenIf, | ||||||
|  |    INOUT    PrincipalIf  **ppPrincipalIf) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Get principal interface instanced for the identity associated | ||||||
|  | //    with specified identity token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    PrincipalIfInstance  *pPrincipalIfInstance; | ||||||
|  |    CasaStatus           retStatus; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetPrincipalInterface- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Create a PrincipalIfInstance object for it. | ||||||
|  |    pPrincipalIfInstance = malloc(sizeof(*pPrincipalIfInstance)); | ||||||
|  |    if (pPrincipalIfInstance) | ||||||
|  |    { | ||||||
|  |       // Initialize the PrincipalIf within the instance data | ||||||
|  |       pPrincipalIfInstance->principalIf.addReference = AddReference; | ||||||
|  |       pPrincipalIfInstance->principalIf.releaseReference = ReleaseReference; | ||||||
|  |       pPrincipalIfInstance->principalIf.getIdentityId = GetIdentityId; | ||||||
|  |       pPrincipalIfInstance->principalIf.getSourceName = GetSourceName; | ||||||
|  |       pPrincipalIfInstance->principalIf.getSourceUrl = GetSourceUrl; | ||||||
|  |       pPrincipalIfInstance->principalIf.attributeEnumerate = AttributeEnumerate; | ||||||
|  |  | ||||||
|  |       // Keep reference to the identity token interface instance | ||||||
|  |       pPrincipalIfInstance->pIdenTokenIf = pIdenTokenIf; | ||||||
|  |       pIdenTokenIf->addReference(pIdenTokenIf); | ||||||
|  |  | ||||||
|  |       // Return the PrincipalIf associated with the instance data after | ||||||
|  |       // incrementing its reference count. | ||||||
|  |       pPrincipalIfInstance->refCount ++; | ||||||
|  |       *ppPrincipalIf = &pPrincipalIfInstance->principalIf; | ||||||
|  |  | ||||||
|  |       // Bump up our interface instance count | ||||||
|  |       PlatAcquireMutex(g_principalIfMutex); | ||||||
|  |       g_numPrincipalIfObjs ++; | ||||||
|  |       PlatReleaseMutex(g_principalIfMutex); | ||||||
|  |  | ||||||
|  |       // Success | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-GetPrincipalInterface- Buffer allocation failure\n", 0); | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "-GetPrincipalInterface- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus | ||||||
|  | PrincipalIfInit(void) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Initializes the principal interface complex. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus        retStatus; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-PrincipalIfInit- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Allocate mutex | ||||||
|  |    if ((g_principalIfMutex = PlatAllocMutex()) != NULL) | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |    else | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INSUFFICIENT_RESOURCES); | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-PrincipalIfInit- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | PrincipalIfUninit(void) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa Status | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Uninitializes the configuration interface complex. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    DbgTrace(1, "-PrincipalIfUninit- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Free mutex if necessary | ||||||
|  |    if (g_principalIfMutex) | ||||||
|  |    { | ||||||
|  |       PlatDestroyMutex(g_principalIfMutex); | ||||||
|  |       g_principalIfMutex = NULL; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-PrincipalIfUninit- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										321
									
								
								auth_token/server/AuthTokenValidate/util.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										321
									
								
								auth_token/server/AuthTokenValidate/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    char *cp, | ||||||
|  |    IN    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; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										233
									
								
								auth_token/server/AuthTokenValidate/validate.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										233
									
								
								auth_token/server/AuthTokenValidate/validate.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,233 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Initialization variables | ||||||
|  | // | ||||||
|  | static | ||||||
|  | bool  g_moduleInitialized = false; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | CasaStatus SSCS_CALL | ||||||
|  | ValidateAuthToken( | ||||||
|  |    IN       const char  *pServiceName, | ||||||
|  |    IN       const char  *pTokenBuf, | ||||||
|  |    IN       const int   tokenBufLen, | ||||||
|  |    INOUT    PrincipalIf **ppPrincipalIf) | ||||||
|  | // | ||||||
|  | // Arguments:   | ||||||
|  | //    pServiceName - | ||||||
|  | //       Pointer to NULL terminated string that contains the | ||||||
|  | //       name of the service targeted by the token. | ||||||
|  | //                | ||||||
|  | //    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. | ||||||
|  | // | ||||||
|  | //    tokenBufLen - | ||||||
|  | //       Length of the data contained within the buffer pointed | ||||||
|  | //       at by pTokenBuf. | ||||||
|  | //    | ||||||
|  | //    ppPrincipalIf - | ||||||
|  | //       Pointer to variable that will receive a pointer to a principal | ||||||
|  | //       interface with information about the authenticated entity. | ||||||
|  | //       IMPORTANT NOTE: The caller is responsible for releasing the | ||||||
|  | //       interface after it is done with it to avoid a resource leak. | ||||||
|  | //    | ||||||
|  | // Returns: | ||||||
|  | //    Casa status. | ||||||
|  | //                            | ||||||
|  | // Description: | ||||||
|  | //    Validates authentication token. | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    CasaStatus        retStatus; | ||||||
|  |    char              *pDecodedTokenBuf; | ||||||
|  |    int               decodedTokenBufLen; | ||||||
|  |    PrincipalIf       *pPrincipalIf; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-ValidateAuthToken- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Validate input parameters | ||||||
|  |    if (pServiceName == NULL | ||||||
|  |        || pTokenBuf == NULL | ||||||
|  |        || tokenBufLen == 0 | ||||||
|  |        || ppPrincipalIf == NULL) | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-ValidateAuthToken- Invalid input parameter\n", 0); | ||||||
|  |  | ||||||
|  |       retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR, | ||||||
|  |                                   CASA_FACILITY_AUTHTOKEN, | ||||||
|  |                                   CASA_STATUS_INVALID_PARAMETER); | ||||||
|  |       goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Make sure that the module has been initialized | ||||||
|  |    if (g_moduleInitialized == false) | ||||||
|  |    { | ||||||
|  |       // The module has not been initialized, synchronize access thought this section | ||||||
|  |       // to avoid having two threads performing initialization. | ||||||
|  |       AcquireModuleMutex; | ||||||
|  |  | ||||||
|  |       // Assume success | ||||||
|  |       retStatus = CASA_STATUS_SUCCESS; | ||||||
|  |  | ||||||
|  |       // Check again in case another thread pre-empted us. | ||||||
|  |       if (g_moduleInitialized == false) | ||||||
|  |       { | ||||||
|  |          // Initialize the ConfigIf complex | ||||||
|  |          retStatus = ConfigIfInit(); | ||||||
|  |          if (CASA_SUCCESS(retStatus)) | ||||||
|  |          { | ||||||
|  |             // Initialize the PrincipalIf complex | ||||||
|  |             retStatus = PrincipalIfInit(); | ||||||
|  |             if (CASA_SUCCESS(retStatus)) | ||||||
|  |             { | ||||||
|  |                g_moduleInitialized = true; | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                ConfigIfUninit(); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Stop synchronization | ||||||
|  |       ReleaseModuleMutex; | ||||||
|  |  | ||||||
|  |       // Exit if we failed | ||||||
|  |       if (g_moduleInitialized == false) | ||||||
|  |          goto exit; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // First decode the token string | ||||||
|  |    retStatus = DecodeData(pTokenBuf, | ||||||
|  |                           tokenBufLen, | ||||||
|  |                           (void**) &pDecodedTokenBuf, | ||||||
|  |                           &decodedTokenBufLen); | ||||||
|  |    if (CASA_SUCCESS(retStatus)) | ||||||
|  |    { | ||||||
|  |       AuthToken *pAuthToken; | ||||||
|  |  | ||||||
|  |       // Token was decoded successfully, now create an authentication token object with it. | ||||||
|  |       retStatus = CreateAuthToken(pDecodedTokenBuf, decodedTokenBufLen, &pAuthToken); | ||||||
|  |       if (CASA_SUCCESS(retStatus)) | ||||||
|  |       { | ||||||
|  |          // Now check the validity of the token | ||||||
|  |          retStatus = CheckAuthToken(pAuthToken, pServiceName); | ||||||
|  |          if (CASA_SUCCESS(retStatus)) | ||||||
|  |          { | ||||||
|  |             IdenTokenProviderIf  *pIdenTokenProviderIf; | ||||||
|  |  | ||||||
|  |             // The token was validated, now | ||||||
|  |             // Obtain Identity Token Provider interface | ||||||
|  |             retStatus = GetIdenTokenProviderInterface(pAuthToken->pIdenTokenType, | ||||||
|  |                                                       &pIdenTokenProviderIf); | ||||||
|  |             if (CASA_SUCCESS(retStatus)) | ||||||
|  |             { | ||||||
|  |                IdenTokenIf *pIdenTokenIf; | ||||||
|  |  | ||||||
|  |                // Use the Identity Token Provider to get an Identity Token Interface instance | ||||||
|  |                retStatus = pIdenTokenProviderIf->getIdentityTokenIf(pIdenTokenProviderIf, | ||||||
|  |                                                                     pAuthToken->pIdenToken, | ||||||
|  |                                                                     pAuthToken->idenTokenLen, | ||||||
|  |                                                                     &pIdenTokenIf); | ||||||
|  |                if (CASA_SUCCESS(retStatus)) | ||||||
|  |                { | ||||||
|  |                   // Now create a principal interface instance with the identity information present in | ||||||
|  |                   // the identity token. | ||||||
|  |                   retStatus = GetPrincipalInterface(pIdenTokenIf, &pPrincipalIf); | ||||||
|  |                   if (CASA_SUCCESS(retStatus)) | ||||||
|  |                   { | ||||||
|  |                      // Success, return the principal interface to the caller. | ||||||
|  |                      *ppPrincipalIf = pPrincipalIf; | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      DbgTrace(0, "-ValidateAuthToken- Failed to instantiate principal interface\n", 0); | ||||||
|  |                   } | ||||||
|  |  | ||||||
|  |                   // Release identity token interface | ||||||
|  |                   pIdenTokenIf->releaseReference(pIdenTokenIf); | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   DbgTrace(0, "-ValidateAuthToken- Failed to instantiate identity token\n", 0); | ||||||
|  |                } | ||||||
|  |  | ||||||
|  |                // Release identity token provider interface | ||||||
|  |                pIdenTokenProviderIf->releaseReference(pIdenTokenProviderIf); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "-ValidateAuthToken- Failed to obtain identity token provider interface\n", 0); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Free the AuthToken object | ||||||
|  |          RelAuthToken(pAuthToken); | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          DbgTrace(0, "-ValidateAuthToken- Failed to create authentication token object\n", 0); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Free the decoded token buffer | ||||||
|  |       free(pDecodedTokenBuf); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "-ValidateAuthToken- Token decode failure\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "-ValidateAuthToken- End, retStatus = %08X\n", retStatus); | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  | //++======================================================================= | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								auth_token/server/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								auth_token/server/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = AuthTokenValidate PamSupport | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = AuthTokenValidate PamSupport include | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										37
									
								
								auth_token/server/PamSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										37
									
								
								auth_token/server/PamSupport/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,37 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | SUBDIRS = $(TARGET_OS) | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = linux | ||||||
|  |  | ||||||
|  | CFILES = | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) | ||||||
|  |  | ||||||
|  | .PHONY: package package-clean package-install package-uninstall | ||||||
|  | package package-clean package-install package-uninstall: | ||||||
|  | 	$(MAKE) -C $(TARGET_OS) $@ | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										80
									
								
								auth_token/server/PamSupport/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										80
									
								
								auth_token/server/PamSupport/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,80 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  README for pam_casaauthtok | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | pam_casaauthtok is a PAM authentication module which can be configured | ||||||
|  | to validate credentials consisting of CASA Authentication Tokens. | ||||||
|  |  | ||||||
|  | CONFIGURATION | ||||||
|  |  | ||||||
|  | To use pam_casaauthtok as a PAM authentication module for your service, | ||||||
|  | add the following line to the service's PAM configuration file: | ||||||
|  |  | ||||||
|  | auth     required       pam_casaauthtok.so | ||||||
|  |  | ||||||
|  | pam_casaauthtok supports the following input parameters: | ||||||
|  |  | ||||||
|  | U - This parameter tells pam_casaauthtok that it must verify that | ||||||
|  |     the username is set to "CasaPrincipal". If the parameter is not | ||||||
|  |     specified then pam_casaauthtok does not check the username. | ||||||
|  |  | ||||||
|  | CLIENT PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | Clients must specify the same service name when requesting Authentication | ||||||
|  | Tokens from the CASA Client as the service name specified by the server | ||||||
|  | when opening a PAM handle. | ||||||
|  |  | ||||||
|  | SERVER PROGRAMMING NOTES | ||||||
|  |  | ||||||
|  | Server applications validating credentials containing CASA Authentication | ||||||
|  | tokens can obtain the following information about the authenticated identity: | ||||||
|  |  | ||||||
|  | username - This is obtained by querying PAM using the pam_get_item() call with | ||||||
|  | the item type set to PAM_USER. This can also be obtained by querying PAM | ||||||
|  | using the pam_getenv() call with the variable name set to "IdentityId".  The | ||||||
|  | username is the user's unique id within the authentication realm. When the | ||||||
|  | authentication realm is an LDAP database, the username consists of the user's fdn. | ||||||
|  | Note that PAM applications using pam_casaauthtok need to set username to | ||||||
|  | "CasaPrincipal" when opening a PAM handle and then the variable is updated by | ||||||
|  | pam_casaauthtok during the authentication process with the identity information | ||||||
|  | of the authenticated entity. | ||||||
|  |  | ||||||
|  | Name of the source of identity data (Authentication Realm) - This is obtained | ||||||
|  | by querying PAM using the pam_getenv() call with the variable name set to | ||||||
|  | "IdentityDataSourceName". | ||||||
|  |  | ||||||
|  | URL to the source of identity data - This is obtained | ||||||
|  | by querying PAM using the pam_getenv() call with the variable name set to | ||||||
|  | "IdentityDataSourceUrl". | ||||||
|  |  | ||||||
|  | Attributes of the authenticated identity - The attributes are set as environment | ||||||
|  | variables associated with the PAM handle. The environment variable names match | ||||||
|  | the names of the attributes. The attributes associated with the authenticated | ||||||
|  | identity and expressed as environment variables are configured at the time that | ||||||
|  | the service is enabled for CASA Authentication. | ||||||
|  |  | ||||||
|  | EXAMPLE SERVER APPLICATION | ||||||
|  |  | ||||||
|  | See test/test.c for an example application using PAM to authenticate credentials | ||||||
|  | consisting of CASA Authentication Tokens. | ||||||
|  |  | ||||||
|  | SECURITY CONSIDERATIONS | ||||||
|  |  | ||||||
|  | CASA Authenticatication 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. | ||||||
|  |   | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										13
									
								
								auth_token/server/PamSupport/TODO
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										13
									
								
								auth_token/server/PamSupport/TODO
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,13 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  TODO for pam_casaauthtok | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | This file contains a list of the items still outstanding for pam_casaauthtok. | ||||||
|  |  | ||||||
|  | OUTSTANDING ITEMS | ||||||
|  |  | ||||||
|  | None. | ||||||
							
								
								
									
										110
									
								
								auth_token/server/PamSupport/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										110
									
								
								auth_token/server/PamSupport/linux/Makefile.am
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,110 @@ | |||||||
|  | ####################################################################### | ||||||
|  | # | ||||||
|  | #  Copyright (C) 2006 Novell, Inc. | ||||||
|  | # | ||||||
|  | #  This program is free software; you can redistribute it and/or | ||||||
|  | #  modify it under the terms of the GNU General Public | ||||||
|  | #  License as published by the Free Software Foundation; either | ||||||
|  | #  version 2 of the License, or (at your option) any later version. | ||||||
|  | # | ||||||
|  | #  This program 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 | ||||||
|  | #  General Public License for more details. | ||||||
|  | # | ||||||
|  | #  You should have received a copy of the GNU General Public | ||||||
|  | #  License along with this program; if not, write to the Free | ||||||
|  | #  Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. | ||||||
|  | # | ||||||
|  | #  Author: Juan Carlos Luciani <jluciani@novell.com> | ||||||
|  | # | ||||||
|  | ####################################################################### | ||||||
|  |  | ||||||
|  | if DEBUG | ||||||
|  | TARGET_CFG = Debug | ||||||
|  | CFLAGS += -v -w | ||||||
|  | else | ||||||
|  | TARGET_CFG = Release | ||||||
|  | endif | ||||||
|  |  | ||||||
|  | SUBDIRS = | ||||||
|  |  | ||||||
|  | DIST_SUBDIRS = | ||||||
|  |  | ||||||
|  | CASAROOT = ../../../.. | ||||||
|  |  | ||||||
|  | CASALIBDIR = $(CASAROOT)/$(LIB) | ||||||
|  |  | ||||||
|  | # handle Mono secondary dependencies | ||||||
|  | export MONO_PATH := $(MONO_PATH) | ||||||
|  |  | ||||||
|  | PLATFORMINDEPENDENTSOURCEDIR = .. | ||||||
|  | PLATFORMDEPENDENTSOURCEDIR = . | ||||||
|  |  | ||||||
|  | MODULE_NAME = pam_casaauthtok | ||||||
|  | MODULE_EXT = so | ||||||
|  |  | ||||||
|  | CFILES = ../pam_authtoken.c | ||||||
|  |  | ||||||
|  | CSFILES_CSC := | ||||||
|  | INCLUDES = -I. -I$(CASAROOT)/include | ||||||
|  | RESOURCES = | ||||||
|  | DEFINES = -Wno-format-extra-args -fno-strict-aliasing  | ||||||
|  |  | ||||||
|  | CFLAGS += $(INCLUDES) $(DEFINES) | ||||||
|  | LIBS = -lpthread -lpam -lcasa_s_authtoken | ||||||
|  | LDFLAGS = -Bsymbolic -shared -Wl,-soname=$(MODULE_NAME).$(MODULE_EXT) -L$(CASALIBDIR)/$(TARGET_CFG) -Xlinker -rpath -Xlinker /opt/novell/CASA/lib | ||||||
|  |  | ||||||
|  | OBJDIR = ./$(TARGET_CFG)/$(LIB) | ||||||
|  | OBJS = $(addprefix $(OBJDIR)/, $(CFILES:%.c=%.o)) | ||||||
|  |  | ||||||
|  | EXTRA_DIST = $(CFILES) | ||||||
|  |  | ||||||
|  | CUR_DIR := $(shell pwd) | ||||||
|  |  | ||||||
|  | all: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | # | ||||||
|  | # Pattern based rules. | ||||||
|  | # | ||||||
|  | vpath %.c $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  | vpath %.cpp $(PLATFORMDEPENDENTSOURCEDIR) $(PLATFORMINDEPENDENTSOURCEDIR) | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.c | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/%.o: %.cpp | ||||||
|  | 	$(CC) -c $(CFLAGS) -o $@ $< | ||||||
|  |  | ||||||
|  | $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT): $(OBJDIR) $(OBJS) | ||||||
|  | 	@echo [======== Linking $@ ========] | ||||||
|  | 	$(LINK) -o $@ $(LDFLAGS) $(OBJS) $(LIBS) | ||||||
|  | 	cp -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(CASALIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  |  | ||||||
|  | $(OBJDIR): | ||||||
|  | 	[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR) | ||||||
|  | 	[ -d $(CASALIBDIR) ] || mkdir -p $(CASALIBDIR) | ||||||
|  | 	[ -d $(CASALIBDIR)/$(TARGET_CFG) ] || mkdir -p $(CASALIBDIR)/$(TARGET_CFG) | ||||||
|  |  | ||||||
|  | install-exec-local: $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | 	$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) $(DESTDIR)$(libdir)/ | ||||||
|  |  | ||||||
|  | uninstall-local: | ||||||
|  | 	cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME).$(MODULE_EXT) | ||||||
|  | 	rmdir $(DESTDIR)$(libdir) | ||||||
|  |  | ||||||
|  | #installcheck-local: install | ||||||
|  | #	$(mkinstalldirs) $(DESTDIR)$(libdir) | ||||||
|  | #	$(INSTALL_PROGRAM) $(DESTDIR)$(libdir) | ||||||
|  | #	cd $(DESTDIR)$(libdir); $(MONO) | ||||||
|  |  | ||||||
|  | clean-local: | ||||||
|  | #cd $(TARGET_CFG); rm -rf *.dbg *.exe *.dll *.o *.so; cd ..; rmdir $(OBJDIR) | ||||||
|  | 	rm -rf $(TARGET_CFG) | ||||||
|  |  | ||||||
|  | distclean-local: | ||||||
|  |  | ||||||
|  | maintainer-clean-local: | ||||||
|  | 	rm -f Makefile.in | ||||||
|  |  | ||||||
							
								
								
									
										649
									
								
								auth_token/server/PamSupport/pam_authtoken.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										649
									
								
								auth_token/server/PamSupport/pam_authtoken.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,649 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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> | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | #define _GNU_SOURCE | ||||||
|  |  | ||||||
|  | #include <stdarg.h> | ||||||
|  | #include <syslog.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  |  | ||||||
|  | #ifndef LINUX  | ||||||
|  | #include <security/pam_appl.h> | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  | #define PAM_SM_AUTH | ||||||
|  | #define PAM_SM_ACCOUNT | ||||||
|  | #define PAM_SM_PASSWORD | ||||||
|  | #define PAM_SM_SESSION | ||||||
|  |  | ||||||
|  | #include <security/pam_modules.h> | ||||||
|  | #include <security/_pam_macros.h> | ||||||
|  |  | ||||||
|  | #include <casa_s_authtoken.h> | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Environment variables set by module | ||||||
|  | //  | ||||||
|  | static char CasaIdentityIdEnvVar[] = "IdentityId= "; | ||||||
|  | static char CasaIdentitySourceNameEnvVar[] = "IdentityDataSourceName= "; | ||||||
|  | static char CasaIdentitySourceUrlEnvVar[] = "IdentityDataSourceUrl= "; | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * LogError() | ||||||
|  |  * | ||||||
|  |  * Logs error to syslog. | ||||||
|  |  * | ||||||
|  |  * L2 | ||||||
|  |  * ************************************************************************/ | ||||||
|  | static void | ||||||
|  | LogError(char *pFormatStr, ... ) | ||||||
|  | { | ||||||
|  |    va_list  args; | ||||||
|  |  | ||||||
|  |    openlog("pam_casaauthtok", LOG_CONS | LOG_NOWAIT | LOG_ODELAY, LOG_USER); | ||||||
|  |    va_start(args, pFormatStr); | ||||||
|  |    vsyslog(LOG_USER | LOG_INFO, pFormatStr, args); | ||||||
|  |    va_end(args); | ||||||
|  |    closelog(); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_authenticate() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_authenticate(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM authentication management function. | ||||||
|  |  * | ||||||
|  |  * We are going to validate the credentials using the CASA Authentication | ||||||
|  |  * Token Credential APIs. | ||||||
|  |  * | ||||||
|  |  * L2 | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int | ||||||
|  | pam_sm_authenticate(pam_handle_t *pamh, | ||||||
|  |                     int flags, | ||||||
|  |                     int argc, | ||||||
|  |                     const char **argv) | ||||||
|  | { | ||||||
|  |    int         retStatus = PAM_SUCCESS; | ||||||
|  |    bool        performUsernameCheck = false; | ||||||
|  |    int         i; | ||||||
|  |    char        *pServicename = NULL; | ||||||
|  |    char        *pAuthToken = NULL; | ||||||
|  |  | ||||||
|  |    // Determine if we are supposed to perform the username check | ||||||
|  |    // based on the arguments specified. | ||||||
|  |    for (i = 0; i < argc; i++) | ||||||
|  |    { | ||||||
|  |       if (*(argv[i]) == 'U') | ||||||
|  |       { | ||||||
|  |          // The arguments indicate that we should check the username | ||||||
|  |          performUsernameCheck = true; | ||||||
|  |  | ||||||
|  |          // No need to keep going through the arguments | ||||||
|  |          break; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Get the servicename. | ||||||
|  |    if (pam_get_item(pamh, PAM_SERVICE, (void*) &pServicename) == PAM_SUCCESS | ||||||
|  |        && pServicename != NULL) | ||||||
|  |    { | ||||||
|  |       // We got the service name, now check if it is necessary to perform | ||||||
|  |       // the username check. | ||||||
|  |       if (performUsernameCheck) | ||||||
|  |       { | ||||||
|  |          char                 *pUsername; | ||||||
|  |          struct pam_response  *responses = NULL; | ||||||
|  |  | ||||||
|  |          // Obtain the username so that it can be checked. | ||||||
|  |          // . | ||||||
|  |          // Note that we are not calling pam_get_user() because we | ||||||
|  |          // assume that the service has set it before calling PAM_Authenticate. | ||||||
|  |          if (pam_get_item(pamh, PAM_USER, (void*) &pUsername) == PAM_SUCCESS | ||||||
|  |              && pUsername != NULL) | ||||||
|  |          { | ||||||
|  |             // Check if the username matches the name that we are expecting | ||||||
|  |             if (strcmp(pUsername, "CasaPrincipal") != 0) | ||||||
|  |             { | ||||||
|  |                LogError("Un-expected username, %s", pUsername); | ||||||
|  |                retStatus = PAM_USER_UNKNOWN; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             struct pam_conv *pConv; | ||||||
|  |  | ||||||
|  |             // The username has not been set, try to obtain it from the | ||||||
|  |             // application through the use of the conversation function. | ||||||
|  |             if (pam_get_item(pamh, PAM_CONV, (void*) &pConv) == PAM_SUCCESS) | ||||||
|  |             { | ||||||
|  |                struct pam_message   msg; | ||||||
|  |                struct pam_message   *messages = &msg; | ||||||
|  |  | ||||||
|  |                // Obtained the conversation structure, now query the conversation | ||||||
|  |                // function for the username. | ||||||
|  |                msg.msg_style = PAM_PROMPT_ECHO_ON; | ||||||
|  |                if (pConv->conv(1, | ||||||
|  |                                (const struct pam_message **) &messages, | ||||||
|  |                                &responses, | ||||||
|  |                                pConv->appdata_ptr) == PAM_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   // Check if we have a successful response | ||||||
|  |                   if (responses[0].resp_retcode == PAM_SUCCESS | ||||||
|  |                       && responses[0].resp) | ||||||
|  |                   { | ||||||
|  |                      // Check if the username matches the name that we are expecting | ||||||
|  |                      if (strcmp(responses[0].resp, "CasaPrincipal") != 0) | ||||||
|  |                      { | ||||||
|  |                         LogError("Un-expected username, %s", responses[0].resp); | ||||||
|  |                         retStatus = PAM_USER_UNKNOWN; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      LogError("Username not returned"); | ||||||
|  |                      retStatus = PAM_CRED_INSUFFICIENT; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   LogError("Conversation function error"); | ||||||
|  |                   retStatus = PAM_AUTH_ERR; | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                LogError("Unable to obtain conversation structure"); | ||||||
|  |                retStatus = PAM_AUTH_ERR; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Free conversation function response buffers if necessary | ||||||
|  |          if (responses) | ||||||
|  |          { | ||||||
|  |             if (responses[0].resp) | ||||||
|  |                free(responses[0].resp); | ||||||
|  |             free(responses); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Proceed with the authentication token check if we have not encountered any | ||||||
|  |       // problems. | ||||||
|  |       if (retStatus == PAM_SUCCESS) | ||||||
|  |       { | ||||||
|  |          struct pam_response  *responses = NULL; | ||||||
|  |  | ||||||
|  |          // Now obtain the authentication token. | ||||||
|  |          if (pam_get_item(pamh, PAM_AUTHTOK, (void*) &pAuthToken) != PAM_SUCCESS | ||||||
|  |              || pAuthToken == NULL) | ||||||
|  |          { | ||||||
|  |             struct pam_conv *pConv; | ||||||
|  |  | ||||||
|  |             // The authentication token has not been set, try to obtain it from the | ||||||
|  |             // application through the use of the conversation function. | ||||||
|  |             if (pam_get_item(pamh, PAM_CONV, (void*) &pConv) == PAM_SUCCESS) | ||||||
|  |             { | ||||||
|  |                struct pam_message   msg; | ||||||
|  |                struct pam_message   *messages = &msg; | ||||||
|  |  | ||||||
|  |                // Obtained the conversation structure, now query the conversation | ||||||
|  |                // function for the authentication token. | ||||||
|  |                msg.msg_style = PAM_PROMPT_ECHO_OFF; | ||||||
|  |                if (pConv->conv(1, | ||||||
|  |                                (const struct pam_message **) &messages, | ||||||
|  |                                &responses, | ||||||
|  |                                pConv->appdata_ptr) == PAM_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   // Check if we have a successful response | ||||||
|  |                   if (responses[0].resp_retcode == PAM_SUCCESS | ||||||
|  |                       && responses[0].resp) | ||||||
|  |                   { | ||||||
|  |                      // Set the authentication token with PAM | ||||||
|  |                      if (pam_set_item(pamh, PAM_AUTHTOK, responses[0].resp) == PAM_SUCCESS) | ||||||
|  |                      { | ||||||
|  |                         // Use the buffer returned by the caller as the authentication token | ||||||
|  |                         pAuthToken = responses[0].resp; | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         LogError("Unable to set the authentication token"); | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      LogError("Token not returned"); | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   LogError("Conversation function error"); | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                LogError("Unable to obtain conversation structure"); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Check if we succeeded at obtaining the authentication token | ||||||
|  |          if (pAuthToken) | ||||||
|  |          { | ||||||
|  |             CasaStatus  casaStatus; | ||||||
|  |             PrincipalIf *pPrincipalIf; | ||||||
|  |  | ||||||
|  |             // Validate the token | ||||||
|  |             casaStatus = ValidateAuthToken(pServicename, | ||||||
|  |                                            pAuthToken, | ||||||
|  |                                            strlen(pAuthToken), | ||||||
|  |                                            &pPrincipalIf); | ||||||
|  |             if (CASA_SUCCESS(casaStatus)) | ||||||
|  |             { | ||||||
|  |                int   buffLen; | ||||||
|  |  | ||||||
|  |                // Assume success | ||||||
|  |                retStatus = PAM_SUCCESS; | ||||||
|  |  | ||||||
|  |                // Associate necessary environment variables with the PAM Handle | ||||||
|  |                buffLen = 0; | ||||||
|  |                casaStatus = pPrincipalIf->getIdentityId(pPrincipalIf, | ||||||
|  |                                                         NULL, | ||||||
|  |                                                         &buffLen); | ||||||
|  |                if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                { | ||||||
|  |                   char  *pBuff; | ||||||
|  |  | ||||||
|  |                   // Allocate buffer to contain the Identity Id Environment Variable | ||||||
|  |                   pBuff = malloc(sizeof(CasaIdentityIdEnvVar) + buffLen); | ||||||
|  |                   if (pBuff) | ||||||
|  |                   { | ||||||
|  |                      // Start constructing the environment variable | ||||||
|  |                      memcpy(pBuff, CasaIdentityIdEnvVar, sizeof(CasaIdentityIdEnvVar) - 1); | ||||||
|  |  | ||||||
|  |                      // Read the value into our buffer | ||||||
|  |                      if (CASA_SUCCESS(pPrincipalIf->getIdentityId(pPrincipalIf, | ||||||
|  |                                                                   pBuff + sizeof(CasaIdentityIdEnvVar) - 1, | ||||||
|  |                                                                   &buffLen))) | ||||||
|  |                      { | ||||||
|  |                         // Now set the environment variable | ||||||
|  |                         if (pam_putenv(pamh, pBuff) != PAM_SUCCESS) | ||||||
|  |                         { | ||||||
|  |                            LogError("Unable to set identity id environment variable"); | ||||||
|  |                            retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         // Also set the identity id as the username | ||||||
|  |                         if (pam_set_item(pamh, PAM_USER, pBuff + sizeof(CasaIdentityIdEnvVar) - 1) != PAM_SUCCESS) | ||||||
|  |                         { | ||||||
|  |                            LogError("Error setting the username"); | ||||||
|  |                         } | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         LogError("Unable to obtain identity id"); | ||||||
|  |                         retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                      } | ||||||
|  |  | ||||||
|  |                      // Free allocated buffer | ||||||
|  |                      free(pBuff); | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      LogError("Buffer allocation failure"); | ||||||
|  |                      retStatus = PAM_BUF_ERR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |                else | ||||||
|  |                { | ||||||
|  |                   LogError("Un-expected error obtaining identity id, %08X", casaStatus); | ||||||
|  |                   retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                } | ||||||
|  |  | ||||||
|  |                if (retStatus == PAM_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   buffLen = 0; | ||||||
|  |                   casaStatus = pPrincipalIf->getSourceName(pPrincipalIf, | ||||||
|  |                                                            NULL, | ||||||
|  |                                                            &buffLen); | ||||||
|  |                   if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                   { | ||||||
|  |                      char  *pBuff; | ||||||
|  |  | ||||||
|  |                      // Allocate buffer to contain the Identity Source Name Environment Variable | ||||||
|  |                      pBuff = malloc(sizeof(CasaIdentitySourceNameEnvVar) + buffLen); | ||||||
|  |                      if (pBuff) | ||||||
|  |                      { | ||||||
|  |                         // Start constructing the environment variable | ||||||
|  |                         memcpy(pBuff, CasaIdentitySourceNameEnvVar, sizeof(CasaIdentitySourceNameEnvVar) - 1); | ||||||
|  |  | ||||||
|  |                         // Read the value into our buffer | ||||||
|  |                         if (CASA_SUCCESS(pPrincipalIf->getSourceName(pPrincipalIf, | ||||||
|  |                                                                      pBuff + sizeof(CasaIdentitySourceNameEnvVar) - 1, | ||||||
|  |                                                                      &buffLen))) | ||||||
|  |                         { | ||||||
|  |                            // Now set the environment variable | ||||||
|  |                            if (pam_putenv(pamh, pBuff) != PAM_SUCCESS) | ||||||
|  |                            { | ||||||
|  |                               LogError("Unable to set identity source name environment variable"); | ||||||
|  |                               retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                            } | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                            LogError("Unable to obtain identity source name"); | ||||||
|  |                            retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         // Free allocated buffer | ||||||
|  |                         free(pBuff); | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         LogError("Buffer allocation failure"); | ||||||
|  |                         retStatus = PAM_BUF_ERR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      LogError("Un-expected error obtaining identity source name, %08X", casaStatus); | ||||||
|  |                      retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |  | ||||||
|  |                if (retStatus == PAM_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   buffLen = 0; | ||||||
|  |                   casaStatus = pPrincipalIf->getSourceUrl(pPrincipalIf, | ||||||
|  |                                                           NULL, | ||||||
|  |                                                           &buffLen); | ||||||
|  |                   if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                   { | ||||||
|  |                      char  *pBuff; | ||||||
|  |  | ||||||
|  |                      // Allocate buffer to contain the Identity Source Url Environment Variable | ||||||
|  |                      pBuff = malloc(sizeof(CasaIdentitySourceUrlEnvVar) + buffLen); | ||||||
|  |                      if (pBuff) | ||||||
|  |                      { | ||||||
|  |                         // Start constructing the environment variable | ||||||
|  |                         memcpy(pBuff, CasaIdentitySourceUrlEnvVar, sizeof(CasaIdentitySourceUrlEnvVar) - 1); | ||||||
|  |  | ||||||
|  |                         // Read the value into our buffer | ||||||
|  |                         if (CASA_SUCCESS(pPrincipalIf->getSourceUrl(pPrincipalIf, | ||||||
|  |                                                                     pBuff + sizeof(CasaIdentitySourceUrlEnvVar) - 1, | ||||||
|  |                                                                     &buffLen))) | ||||||
|  |                         { | ||||||
|  |                            // Now set the environment variable | ||||||
|  |                            if (pam_putenv(pamh, pBuff) != PAM_SUCCESS) | ||||||
|  |                            { | ||||||
|  |                               LogError("Unable to set identity source url environment variable"); | ||||||
|  |                               retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                            } | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                            LogError("Unable to obtain identity source url"); | ||||||
|  |                            retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                         } | ||||||
|  |  | ||||||
|  |                         // Free allocated buffer | ||||||
|  |                         free(pBuff); | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         LogError("Buffer allocation failure"); | ||||||
|  |                         retStatus = PAM_BUF_ERR; | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      LogError("Un-expected error obtaining identity source url, %08X", casaStatus); | ||||||
|  |                      retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |  | ||||||
|  |                if (retStatus == PAM_SUCCESS) | ||||||
|  |                { | ||||||
|  |                   char  *pBuff; | ||||||
|  |                   int   enumHandle = 0; | ||||||
|  |                   int   buff2Len; | ||||||
|  |  | ||||||
|  |                   while (retStatus == PAM_SUCCESS) | ||||||
|  |                   { | ||||||
|  |                      // Get attribute lengths | ||||||
|  |                      buffLen = buff2Len = 0; | ||||||
|  |                      casaStatus = pPrincipalIf->attributeEnumerate(pPrincipalIf, | ||||||
|  |                                                                    &enumHandle, | ||||||
|  |                                                                    NULL, | ||||||
|  |                                                                    &buffLen, | ||||||
|  |                                                                    NULL, | ||||||
|  |                                                                    &buff2Len); | ||||||
|  |                      if (CasaStatusCode(casaStatus) == CASA_STATUS_BUFFER_OVERFLOW) | ||||||
|  |                      { | ||||||
|  |                         // Allocate buffer to contain the Identity attribute Environment Variable | ||||||
|  |                         pBuff = malloc(buffLen + 2 + buff2Len); | ||||||
|  |                         if (pBuff) | ||||||
|  |                         { | ||||||
|  |                            // Read the attribute into our buffer | ||||||
|  |                            if (CASA_SUCCESS(pPrincipalIf->attributeEnumerate(pPrincipalIf, | ||||||
|  |                                                                              &enumHandle, | ||||||
|  |                                                                              pBuff, | ||||||
|  |                                                                              &buffLen, | ||||||
|  |                                                                              pBuff + buffLen + 1, // This includes the NULL terminator | ||||||
|  |                                                                              &buff2Len))) | ||||||
|  |                            { | ||||||
|  |                               // Finish constructing the environment variable string | ||||||
|  |                               *(pBuff + buffLen - 1) = '='; | ||||||
|  |                               *(pBuff + buffLen) = ' '; | ||||||
|  |  | ||||||
|  |                               // Now set the environment variable | ||||||
|  |                               if (pam_putenv(pamh, pBuff) != PAM_SUCCESS) | ||||||
|  |                               { | ||||||
|  |                                  LogError("Unable to set identity attribute environment variable"); | ||||||
|  |                                  retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                               } | ||||||
|  |                            } | ||||||
|  |                            else | ||||||
|  |                            { | ||||||
|  |                               LogError("Unable to obtain identity attribute"); | ||||||
|  |                               retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                            } | ||||||
|  |  | ||||||
|  |                            // Free allocated buffer | ||||||
|  |                            free(pBuff); | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                            LogError("Buffer allocation failure"); | ||||||
|  |                            retStatus = PAM_BUF_ERR; | ||||||
|  |                         } | ||||||
|  |                      } | ||||||
|  |                      else | ||||||
|  |                      { | ||||||
|  |                         // Check if we are done going through the attributes | ||||||
|  |                         if (CasaStatusCode(casaStatus) == CASA_STATUS_NO_MORE_ENTRIES) | ||||||
|  |                         { | ||||||
|  |                            // Done | ||||||
|  |                            break; | ||||||
|  |                         } | ||||||
|  |                         else | ||||||
|  |                         { | ||||||
|  |                            LogError("Un-expected error during attribute enumeration, %08X", casaStatus); | ||||||
|  |                            retStatus = PAM_SYSTEM_ERR; | ||||||
|  |                         } | ||||||
|  |                      } | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |  | ||||||
|  |                // Release the principal interface instance | ||||||
|  |                pPrincipalIf->releaseReference(pPrincipalIf); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                LogError("Service %s failed to authenticate with status = %08X", pServicename, casaStatus); | ||||||
|  |                retStatus = PAM_AUTH_ERR; | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             LogError("Unable to obtain authentication token"); | ||||||
|  |             retStatus = PAM_CRED_INSUFFICIENT; | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Free conversation function response buffers if necessary | ||||||
|  |          if (responses) | ||||||
|  |          { | ||||||
|  |             if (responses[0].resp) | ||||||
|  |                free(responses[0].resp); | ||||||
|  |             free(responses); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       LogError("Unable to obtain servicename"); | ||||||
|  |       retStatus = PAM_SYSTEM_ERR; | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_setcred() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_setcred(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM authentication management function. | ||||||
|  |  * | ||||||
|  |  * This function is here just for completedness and to protect against | ||||||
|  |  * PAM misconfiguration. | ||||||
|  |  * | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int | ||||||
|  | pam_sm_setcred(pam_handle_t *pamh, | ||||||
|  |                int flags, | ||||||
|  |                int argc, | ||||||
|  |                const char **argv) | ||||||
|  | { | ||||||
|  |    return PAM_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_acct_mgmt() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_acct_mgmt(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM account management function. | ||||||
|  |  * | ||||||
|  |  * This function is here just for completedness and to protect against | ||||||
|  |  * PAM misconfiguration. | ||||||
|  |  * | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int | ||||||
|  | pam_sm_acct_mgmt(pam_handle_t *pamh, | ||||||
|  |                  int flags, | ||||||
|  |                  int argc, | ||||||
|  |                  const char **argv) | ||||||
|  | { | ||||||
|  |    return PAM_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_chauthtok() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_chauthtok(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM password management function. | ||||||
|  |  * | ||||||
|  |  * This function is here just for completedness and to protect against | ||||||
|  |  * PAM misconfiguration. | ||||||
|  |  * | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int | ||||||
|  | pam_sm_chauthtok(pam_handle_t *pamh, | ||||||
|  |                  int flags, | ||||||
|  |                  int argc, | ||||||
|  |                  const char **argv) | ||||||
|  | { | ||||||
|  |    return PAM_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_open_session() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_open_session(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM session management function. | ||||||
|  |  * | ||||||
|  |  * This function is here just for completedness and to protect against | ||||||
|  |  * PAM misconfiguration. | ||||||
|  |  * | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int pam_sm_open_session(pam_handle_t *pamh, | ||||||
|  |                                    int flags, | ||||||
|  |                                    int argc, | ||||||
|  |                                    const char **argv) | ||||||
|  | { | ||||||
|  |    return PAM_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* ************************************************************************ | ||||||
|  |  * pam_sm_close_session() | ||||||
|  |  * | ||||||
|  |  * Service provider implementation for pam_close_session(). | ||||||
|  |  * | ||||||
|  |  * This is a PAM session management function. | ||||||
|  |  * | ||||||
|  |  * This function is here just for completedness and to protect against | ||||||
|  |  * PAM misconfiguration. | ||||||
|  |  * | ||||||
|  |  * ************************************************************************/ | ||||||
|  | PAM_EXTERN int pam_sm_close_session(pam_handle_t *pamh, | ||||||
|  |                                     int flags, | ||||||
|  |                                     int argc, | ||||||
|  |                                     const char **argv) | ||||||
|  | { | ||||||
|  |    return PAM_SUCCESS; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | /* static module data */ | ||||||
|  | #ifdef PAM_STATIC | ||||||
|  | struct pam_module _pam_casa_authtoken_modstruct = { | ||||||
|  |    "pam_casa_authtoken", | ||||||
|  |    pam_sm_authenticate, | ||||||
|  |    pam_sm_setcred, | ||||||
|  |    pam_sm_acct_mgmt, | ||||||
|  |    pam_sm_chauthtok, | ||||||
|  |    pam_sm_open_session, | ||||||
|  |    pam_sm_close_session | ||||||
|  | }; | ||||||
|  | #endif | ||||||
|  |  | ||||||
							
								
								
									
										32
									
								
								auth_token/server/PamSupport/test/README
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								auth_token/server/PamSupport/test/README
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,32 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  * | ||||||
|  |  *  README for pamTest | ||||||
|  |  * | ||||||
|  |  ***********************************************************************/ | ||||||
|  |  | ||||||
|  | INTRODUCTION | ||||||
|  |  | ||||||
|  | pamTest is a PAM application which tests using CASA authentication tokens | ||||||
|  | for authentication. | ||||||
|  |  | ||||||
|  | CONFIGURATION | ||||||
|  |  | ||||||
|  | Place a copy of file testservice in the /etc/pam.d folder. | ||||||
|  |  | ||||||
|  | BUILDING APPLICATION | ||||||
|  |  | ||||||
|  | Execute script: make.sh. | ||||||
|  |  | ||||||
|  | RUNNING APPLICATION | ||||||
|  |  | ||||||
|  | Execute the following command: ./pamTest -s testService | ||||||
|  |   | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |                  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
|  |  | ||||||
							
								
								
									
										2
									
								
								auth_token/server/PamSupport/test/make.sh
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										2
									
								
								auth_token/server/PamSupport/test/make.sh
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,2 @@ | |||||||
|  | #!/bin/bash | ||||||
|  | gcc -o pamTest test.c -g -I"../../.." -I"../../../../include" -DN_PLAT_UNIX -L"../../../lib/Release" -lpam | ||||||
							
								
								
									
										520
									
								
								auth_token/server/PamSupport/test/test.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										520
									
								
								auth_token/server/PamSupport/test/test.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,520 @@ | |||||||
|  | /*********************************************************************** | ||||||
|  |  *  | ||||||
|  |  *  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 <stdio.h> | ||||||
|  | #include <stdlib.h> | ||||||
|  | #include <string.h> | ||||||
|  | #include <stdbool.h> | ||||||
|  | #include <getopt.h> | ||||||
|  | #include <errno.h> | ||||||
|  | #include <security/pam_appl.h> | ||||||
|  | #include <sys/types.h> | ||||||
|  | #include <sys/socket.h> | ||||||
|  | #include <netdb.h> | ||||||
|  |  | ||||||
|  | //===[ Type definitions ]================================================== | ||||||
|  |  | ||||||
|  | typedef struct _AppUserData | ||||||
|  | { | ||||||
|  |    char  *pUserName; | ||||||
|  |    char  *pAuthToken; | ||||||
|  |  | ||||||
|  | } AppUserData, *PAppUserData; | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // DbgTrace macro define | ||||||
|  | // | ||||||
|  | #define DbgTrace(LEVEL, X, Y) {                          \ | ||||||
|  |    if (LEVEL == 0)                                       \ | ||||||
|  |       printf(X, Y);                                      \ | ||||||
|  |    else if (DebugLevel >= LEVEL)                         \ | ||||||
|  |          printf(X, Y);                                   \ | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // | ||||||
|  | // Socket Mapping definitions | ||||||
|  | // | ||||||
|  | #define INVALID_SOCKET -1 | ||||||
|  | #define SOCKET_ERROR -1 | ||||||
|  | #define LINGER struct linger | ||||||
|  | #define SOCKADDR_IN struct sockaddr_in | ||||||
|  | #define closesocket close | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //===[ Function prototypes ]=============================================== | ||||||
|  |  | ||||||
|  | //===[ Global variables ]================================================== | ||||||
|  |  | ||||||
|  | // Usage string | ||||||
|  | char  usage[] = "\nPamTest: usage: -s serviceName [-D DebugLevel]\n"; | ||||||
|  |  | ||||||
|  | // Debug Level | ||||||
|  | int   DebugLevel = 3; | ||||||
|  |  | ||||||
|  | char  *pServiceName = NULL; | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | int | ||||||
|  | Converse(int num_msg, | ||||||
|  |          const struct pam_message **msg, | ||||||
|  | 		   struct pam_response **resp, | ||||||
|  |          void *appdata_ptr) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int                  retStatus = PAM_SUCCESS; | ||||||
|  |    int                  replies = 0; | ||||||
|  |    struct pam_response  *reply = NULL; | ||||||
|  |    AppUserData          *pAppUserData = (PAppUserData) appdata_ptr; | ||||||
|  |  | ||||||
|  |    // Initialize output parameters | ||||||
|  |    *resp = NULL; | ||||||
|  |  | ||||||
|  |    // Check input parameters | ||||||
|  |    if (num_msg <= 0 || appdata_ptr == NULL) | ||||||
|  |       return PAM_CONV_ERR; | ||||||
|  |  | ||||||
|  |    // Allocate enough space for the replies | ||||||
|  |    reply = malloc(sizeof(struct pam_response) * num_msg); | ||||||
|  |    if (!reply) | ||||||
|  |       return PAM_CONV_ERR; | ||||||
|  |  | ||||||
|  |    // Zero the reply buffer | ||||||
|  |    memset(reply, 0, sizeof(struct pam_response) * num_msg); | ||||||
|  |  | ||||||
|  |    for (replies = 0; | ||||||
|  |         replies < num_msg && retStatus == PAM_SUCCESS; | ||||||
|  |         replies++) | ||||||
|  |    { | ||||||
|  |       switch (msg[replies]->msg_style) | ||||||
|  |       { | ||||||
|  |          case PAM_PROMPT_ECHO_ON: | ||||||
|  |  | ||||||
|  |             // The caller wants the username | ||||||
|  |             reply[replies].resp_retcode = PAM_SUCCESS; | ||||||
|  |             reply[replies].resp = malloc(strlen(pAppUserData->pUserName) + 1); | ||||||
|  |             if (reply[replies].resp) | ||||||
|  |                strcpy(reply[replies].resp, pAppUserData->pUserName); | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "Converse- Buffer allocation failure\n", 0); | ||||||
|  |                retStatus = PAM_CONV_ERR; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          case PAM_PROMPT_ECHO_OFF: | ||||||
|  |  | ||||||
|  |             // The caller wants the authentication token | ||||||
|  |             reply[replies].resp_retcode = PAM_SUCCESS; | ||||||
|  |             reply[replies].resp = malloc(strlen(pAppUserData->pAuthToken) + 1); | ||||||
|  |             if (reply[replies].resp) | ||||||
|  |             { | ||||||
|  |                strcpy(reply[replies].resp, pAppUserData->pAuthToken); | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "Converse- Buffer allocation failure\n", 0); | ||||||
|  |                retStatus = PAM_CONV_ERR; | ||||||
|  |             } | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          case PAM_TEXT_INFO: | ||||||
|  |          case PAM_ERROR_MSG: | ||||||
|  |  | ||||||
|  |             // Just return success | ||||||
|  |             reply[replies].resp_retcode = PAM_SUCCESS; | ||||||
|  |             reply[replies].resp = NULL; | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          default: | ||||||
|  |  | ||||||
|  |             // Un-expected | ||||||
|  |             retStatus = PAM_CONV_ERR; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Proceed based on the status | ||||||
|  |    if (retStatus == PAM_SUCCESS) | ||||||
|  |    { | ||||||
|  |       *resp = reply; | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       // Free buffers allocated for the reply | ||||||
|  |       for (replies = 0; | ||||||
|  |            replies < num_msg && retStatus == PAM_SUCCESS; | ||||||
|  |            replies++) | ||||||
|  |       { | ||||||
|  |          if (reply[replies].resp != NULL) | ||||||
|  |             free(reply[replies].resp); | ||||||
|  |       } | ||||||
|  |       free(reply); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return retStatus; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | int | ||||||
|  | ReadLineIntoBuffer(int connSock, char *pBuffer) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int               i = 0; | ||||||
|  |    char              c; | ||||||
|  |    int               bytesReceived = 0; | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "ReadLineIntoBuffer- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Receive the line | ||||||
|  |    while ((bytesReceived = recv(connSock, &c, 1, 0)) == 1) | ||||||
|  |    { | ||||||
|  |       if (c == '\n') | ||||||
|  |          break; | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          pBuffer[i] = c; | ||||||
|  |          i ++; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Check for a socket error | ||||||
|  |    if (bytesReceived == 0) | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "ReadLineIntoBuffer- Socket error\n", 0); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(2, "ReadLineIntoBuffer- End, lineLength = %d\n", i); | ||||||
|  |  | ||||||
|  |    return i; | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | ProcessConnection(int connSock) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    char              userName[] = "CasaPrincipal"; | ||||||
|  |    char              token[4096] = {0}; | ||||||
|  |    char              helloString[100] = {0}; | ||||||
|  |    AppUserData       appUserData = {userName, token}; | ||||||
|  |    struct pam_conv   conv = {Converse, &appUserData}; | ||||||
|  |    pam_handle_t      *pamh; | ||||||
|  |    int               pam_status; | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "ProcessConnection- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // We have received a connection | ||||||
|  |    printf("\n\nConnection received\n"); | ||||||
|  |  | ||||||
|  |    // Receive the token | ||||||
|  |    if (ReadLineIntoBuffer(connSock, token) == 0) | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "ProcessConnection- Error receiving token\n", 0); | ||||||
|  |       goto exit; | ||||||
|  |    } | ||||||
|  |    //printf("Token received = %s\n", token); | ||||||
|  |  | ||||||
|  |    // We obtained authentication token credentials to authenticate | ||||||
|  |    // to the service, now verify the credentials using PAM_Authenticate. | ||||||
|  |    // | ||||||
|  |    // Open a PAM Handle | ||||||
|  |    pam_status = pam_start(pServiceName, userName, &conv, &pamh); | ||||||
|  |    if (pam_status == PAM_SUCCESS) | ||||||
|  |    { | ||||||
|  |       // Now authenticate the user | ||||||
|  |       pam_status = pam_authenticate(pamh, PAM_DISALLOW_NULL_AUTHTOK); | ||||||
|  |       if (pam_status == PAM_SUCCESS) | ||||||
|  |       { | ||||||
|  |          char  **pam_envlist; | ||||||
|  |          char  **pam_env; | ||||||
|  |          char  *pUsername; | ||||||
|  |  | ||||||
|  |          DbgTrace(1, "ProcessConnection- pam_authenticate success\n", 0); | ||||||
|  |          printf("Authentication succeeded\n"); | ||||||
|  |          printf("The DUDE is cool\n"); | ||||||
|  |  | ||||||
|  |          // Get the identity information about the DUDE | ||||||
|  |  | ||||||
|  |          // Notice that the username may have been updated during the authentication process | ||||||
|  |          if (pam_get_item(pamh, PAM_USER, (void*) &pUsername) == PAM_SUCCESS | ||||||
|  |              && pUsername != NULL) | ||||||
|  |          { | ||||||
|  |             printf("The username of the authenticated identity is %s\n", pUsername); | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "ProcessConnection- pam_get_item did not return the username\n", 0); | ||||||
|  |          } | ||||||
|  |  | ||||||
|  |          // Show identity information obtained during the authentication process and maintained | ||||||
|  |          // as PAM environment variables. | ||||||
|  |          pam_envlist = pam_getenvlist(pamh); | ||||||
|  |          if (pam_envlist != NULL) | ||||||
|  |          { | ||||||
|  |             // Display the environment variables and free the memory associated | ||||||
|  |             // with them. | ||||||
|  |             for (pam_env = pam_envlist; *pam_env != NULL; ++pam_env) | ||||||
|  |             { | ||||||
|  |                printf("%s\n", *pam_env); | ||||||
|  |                free(*pam_env); | ||||||
|  |             } | ||||||
|  |             free(pam_envlist); | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "ProcessConnection- pam_getenvlist did not return any data\n", 0); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          DbgTrace(0, "ProcessConnection- pam_authenticate failure, error = %s\n", pam_strerror(pamh, pam_status)); | ||||||
|  |          printf("The DUDE is a fake\n"); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Close the PAM Handle | ||||||
|  |       pam_end(pamh, pam_status | PAM_DATA_SILENT); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "ProcessConnection- pam_start failure, status = %08X\n", pam_status); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  | exit: | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "ProcessConnection- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | void | ||||||
|  | ExecuteTests(void) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | //  Environment: | ||||||
|  | // | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int                  connSock; | ||||||
|  |    int                  listenSock; | ||||||
|  |    struct sockaddr_in   localAddr = {0}; | ||||||
|  |    struct sockaddr_in   boundAddr = {0}; | ||||||
|  |    struct sockaddr_in   remoteAddr = {0}; | ||||||
|  |    struct linger        linger_opt = {1, 15}; | ||||||
|  |    int                  on = 1; | ||||||
|  |    socklen_t            addrLen = sizeof(struct sockaddr_in); | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "ExecuteTests- Start\n", 0); | ||||||
|  |  | ||||||
|  |    // Open listen socket | ||||||
|  |    listenSock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); | ||||||
|  |    if (listenSock != INVALID_SOCKET) | ||||||
|  |    { | ||||||
|  |       // Setup the local address structure | ||||||
|  |       localAddr.sin_family = AF_INET; | ||||||
|  |       localAddr.sin_addr.s_addr = htonl(INADDR_ANY); | ||||||
|  |  | ||||||
|  |       // Set the SO_REUSEADDR option on the socket to avoid | ||||||
|  |       // problems in case of a re-start. | ||||||
|  |       setsockopt(listenSock, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)); | ||||||
|  |  | ||||||
|  |       // Bind socket | ||||||
|  |       if (!bind(listenSock, (const struct sockaddr*) &localAddr, sizeof(struct sockaddr_in))) | ||||||
|  |       { | ||||||
|  |          // Display the local address information | ||||||
|  |          if (getsockname(listenSock, | ||||||
|  |                          (struct sockaddr*) &boundAddr, | ||||||
|  |                          &addrLen) != SOCKET_ERROR) | ||||||
|  |          { | ||||||
|  |             printf("Listen port = %d\n", boundAddr.sin_port); | ||||||
|  |  | ||||||
|  |             // Now start linstening for connections | ||||||
|  |             if (listen(listenSock, SOMAXCONN) != SOCKET_ERROR) | ||||||
|  |             { | ||||||
|  |                // Loop accepting connections | ||||||
|  |                while (1) | ||||||
|  |                { | ||||||
|  |                   addrLen = sizeof(remoteAddr); | ||||||
|  |                   connSock = accept(listenSock, | ||||||
|  |                                 (struct sockaddr*) &remoteAddr, | ||||||
|  |                                 &addrLen); | ||||||
|  |                   if (connSock != INVALID_SOCKET) | ||||||
|  |                   { | ||||||
|  |                      ProcessConnection(connSock); | ||||||
|  |  | ||||||
|  |                      // Close the connection socket | ||||||
|  |                      closesocket(connSock); | ||||||
|  |                   } | ||||||
|  |                   else | ||||||
|  |                   { | ||||||
|  |                      DbgTrace(0, "ExecuteTests- - Accept failed, error = %08X\n", errno); | ||||||
|  |                      break; | ||||||
|  |                   } | ||||||
|  |                } | ||||||
|  |             } | ||||||
|  |             else | ||||||
|  |             { | ||||||
|  |                DbgTrace(0, "ExecuteTests- Unable to start listening, error = %d", errno); | ||||||
|  |             } | ||||||
|  |          } | ||||||
|  |          else | ||||||
|  |          { | ||||||
|  |             DbgTrace(0, "ExecuteTests- Unable to obtain local address information, error = %d", errno); | ||||||
|  |          } | ||||||
|  |       } | ||||||
|  |       else | ||||||
|  |       { | ||||||
|  |          DbgTrace(0, "ExecuteTests- Unable to bind socket, error = %d", errno); | ||||||
|  |       } | ||||||
|  |  | ||||||
|  |       // Close the listen socket | ||||||
|  |       closesocket(listenSock); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       DbgTrace(0, "ExecuteTests- Unable to open socket, error = %d\n", errno); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    DbgTrace(1, "ExecuteTests- End\n", 0); | ||||||
|  | } | ||||||
|  |  | ||||||
|  |  | ||||||
|  | //++======================================================================= | ||||||
|  | int | ||||||
|  | main( | ||||||
|  |    int argc, | ||||||
|  |    char* argv[]) | ||||||
|  | // | ||||||
|  | //  Arguments:  | ||||||
|  | // | ||||||
|  | //  Returns:    | ||||||
|  | // | ||||||
|  | //  Abstract:   | ||||||
|  | // | ||||||
|  | //  Notes: | ||||||
|  | // | ||||||
|  | // L2 | ||||||
|  | //=======================================================================-- | ||||||
|  | { | ||||||
|  |    int         optionsSpecified = 0; | ||||||
|  |    bool        doneScanning = false; | ||||||
|  |    bool        invalidOption = false; | ||||||
|  |    int         option; | ||||||
|  |  | ||||||
|  |    printf("**** server auth_token test ****\n"); | ||||||
|  |  | ||||||
|  |    // Scan through the options specified | ||||||
|  |    while (!doneScanning) | ||||||
|  |    { | ||||||
|  |       opterr = 0; | ||||||
|  |       option = getopt(argc, argv, "s:D:"); | ||||||
|  |  | ||||||
|  |       // Proceed based on the result | ||||||
|  |       switch (option) | ||||||
|  |       { | ||||||
|  |          case 'D': | ||||||
|  |             // Set the debug level | ||||||
|  |             printf("DebugLevel = %s\n", optarg); | ||||||
|  |             DebugLevel = atoi(optarg); | ||||||
|  |             optionsSpecified++; | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          case 's': | ||||||
|  |             // Set the service name | ||||||
|  |             printf("Service name = %s\n", optarg); | ||||||
|  |             pServiceName = optarg; | ||||||
|  |             optionsSpecified++; | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          case '?': | ||||||
|  |             // Invalid option detected | ||||||
|  |             doneScanning = true; | ||||||
|  |             invalidOption = true; | ||||||
|  |             break; | ||||||
|  |  | ||||||
|  |          default: | ||||||
|  |             // Done scanning | ||||||
|  |             doneScanning = true; | ||||||
|  |             break; | ||||||
|  |       } | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    // Do some sanity checking | ||||||
|  |    if (!invalidOption | ||||||
|  |        && pServiceName != NULL) | ||||||
|  |    { | ||||||
|  |       ExecuteTests(); | ||||||
|  |    } | ||||||
|  |    else | ||||||
|  |    { | ||||||
|  |       // Invalid option detected | ||||||
|  |       printf(usage, argv[0]); | ||||||
|  |    } | ||||||
|  |  | ||||||
|  |    return 0; | ||||||
|  |  | ||||||
|  | }  /*-- main() --*/ | ||||||
|  |  | ||||||
							
								
								
									
										6
									
								
								auth_token/server/PamSupport/test/testservice
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										6
									
								
								auth_token/server/PamSupport/test/testservice
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,6 @@ | |||||||
|  | #%PAM-1.0 | ||||||
|  | auth	 required	pam_casaauthtok.so U | ||||||
|  | account  required	pam_casaauthtok.so | ||||||
|  | password required	pam_casaauthtok.so | ||||||
|  | session  required       pam_casaauthtok.so | ||||||
|  |  | ||||||
		Reference in New Issue
	
	Block a user