The non-java project is being replaced by a client and a server project
in order to allow for the client component to be consumed by distributions targeting the desktop. This check-in is for the server project.
This commit is contained in:
41
CASA-auth-token/server/AuthTokenValidate/Makefile.am
Normal file
41
CASA-auth-token/server/AuthTokenValidate/Makefile.am
Normal file
@@ -0,0 +1,41 @@
|
||||
#######################################################################
|
||||
#
|
||||
# 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 LINUX
|
||||
SUBDIRS = $(TARGET_OS) idenTokenProviders Svc
|
||||
else
|
||||
SUBDIRS =
|
||||
endif
|
||||
|
||||
DIST_SUBDIRS = linux idenTokenProviders Svc
|
||||
|
||||
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
|
||||
|
||||
99
CASA-auth-token/server/AuthTokenValidate/README
Normal file
99
CASA-auth-token/server/AuthTokenValidate/README
Normal file
@@ -0,0 +1,99 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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>
|
||||
*
|
||||
***********************************************************************/
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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,
|
||||
|
||||
libcasa_s_authtoken relies on the CasaAuthtokenValidateD service in order to perform its
|
||||
functions. To learn more about CasaAuthtokenValidateD see the Svc folder.
|
||||
|
||||
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/CASA/authtoken/modules 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.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
37
CASA-auth-token/server/AuthTokenValidate/Svc/Makefile.am
Normal file
37
CASA-auth-token/server/AuthTokenValidate/Svc/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
CASA-auth-token/server/AuthTokenValidate/Svc/README
Normal file
80
CASA-auth-token/server/AuthTokenValidate/Svc/README
Normal file
@@ -0,0 +1,80 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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>
|
||||
*
|
||||
***********************************************************************/
|
||||
/***********************************************************************
|
||||
*
|
||||
* README for CasaAuthtokenValidateD
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
CasaAuthtokenValidateD provides a service that is utilized by libcasa_s_authtoken
|
||||
for the validation of CASA Authentication Tokens.
|
||||
|
||||
Processes executing libcasa_s_authtoken communicate with CasaAuthTokenValidateD via
|
||||
domain sockets. CasaAuthTokenValidateD validates authentication tokens by invoking
|
||||
the appropriate CASA Authentication Token Java classes.
|
||||
|
||||
COMMAND LINE PARAMETERS
|
||||
|
||||
CasaAuthtokenValidateD has the following command line parameters:
|
||||
|
||||
-b BeginThreads
|
||||
|
||||
Optional parameter that specifies the initial number of threads utilized by the
|
||||
service to process requests.
|
||||
|
||||
-g GrowThreads
|
||||
|
||||
Optional parameter that specifies the number of threads by which the service can
|
||||
grow its thread pool utilized for processing requests.
|
||||
|
||||
-m MaxThreads
|
||||
|
||||
Optional parameter that specifies the maximum number of threads that the service
|
||||
can have in its thread pool for processing requests.
|
||||
|
||||
-D DebugLevel
|
||||
|
||||
Optional parameter that specifies the level used for logging debugging information.
|
||||
0 being the lowest debug level.
|
||||
|
||||
-d
|
||||
Optional parameter that specifies that the service must be run as a daemon.
|
||||
|
||||
SECURITY CONSIDERATIONS
|
||||
|
||||
Appropriate rights need to be set on the folder used by CasaAuthtokenValidateD to
|
||||
create its listeing socket to keep other services from hijacking it and taking on
|
||||
the validation of CASA authentication sockets. CasaAuthtokenValidateD creates its
|
||||
listen socket in the /var/lib/CASA/authtoken/validate/ folder.
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
13
CASA-auth-token/server/AuthTokenValidate/Svc/TODO
Normal file
13
CASA-auth-token/server/AuthTokenValidate/Svc/TODO
Normal file
@@ -0,0 +1,13 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* TODO for CasaAuthtokenValidateD
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
This file contains a list of the items still outstanding for CasaAuthtokenValidateD.
|
||||
|
||||
OUTSTANDING ITEMS
|
||||
|
||||
None.
|
||||
@@ -0,0 +1,131 @@
|
||||
#!/bin/sh
|
||||
#
|
||||
# Startup script for the Casa Authtoken Validate Daemon (casa_atvd)
|
||||
#
|
||||
# /etc/init.d/casa_atvd
|
||||
#
|
||||
# description: casa_atvd validates CASA
|
||||
# authentication tokens on behalf of native (non-java)
|
||||
# services.
|
||||
#
|
||||
# processname: casa_atvd
|
||||
# pidfile: None
|
||||
# config utility: None
|
||||
|
||||
|
||||
### BEGIN INIT INFO
|
||||
# Provides: casa_atvd
|
||||
# Required-Start: $local_fs $remote_fs
|
||||
# X-UnitedLinux-Should-Start: $syslog $time
|
||||
# Required-Stop: $local_fs $remote_fs
|
||||
# X-UnitedLinux-Should-Stop: $syslog $time
|
||||
# Default-Start: 1 2 3 5
|
||||
# Default-Stop:
|
||||
# Short-Description: Casa Authtoken Validate Daemon
|
||||
# Description: Start Casa Authtoken Validate Daemon
|
||||
### END INIT INFO
|
||||
|
||||
. /etc/rc.status
|
||||
|
||||
# Shell functions sourced from /etc/rc.status:
|
||||
# rc_check check and set local and overall rc status
|
||||
# rc_status check and set local and overall rc status
|
||||
# rc_status -v ditto but be verbose in local rc status
|
||||
# rc_status -v -r ditto and clear the local rc status
|
||||
# rc_failed set local and overall rc status to failed
|
||||
# rc_reset clear local rc status (overall remains)
|
||||
# rc_exit exit appropriate to overall rc status
|
||||
|
||||
# First reset status of this service
|
||||
rc_reset
|
||||
|
||||
MyStatus()
|
||||
{
|
||||
ps ax | grep "$DAEMON" | grep -v grep 2>&1 > /dev/null
|
||||
if [ "x$?" = "x0" ]; then
|
||||
RVAL=0
|
||||
else
|
||||
RVAL=3
|
||||
fi
|
||||
}
|
||||
|
||||
START_DAEMON_CMD=start_daemon
|
||||
START_DAEMON_CMD_FLAG=-u
|
||||
STATUS=MyStatus
|
||||
LOG_SUCCESS=log_success_msg
|
||||
LOG_FAILURE=log_failure_msg
|
||||
LOG_WARNING=log_warning_msg
|
||||
ECHO=
|
||||
|
||||
DAEMON=/usr/bin/casa_atvd
|
||||
DAEMON_USER=casaatvd
|
||||
|
||||
StartDAEMON()
|
||||
{
|
||||
# Source the environments file for our daemon
|
||||
. /etc/CASA/authtoken/validate/envvars
|
||||
|
||||
# Update the limit parameters
|
||||
#
|
||||
# Do not allow for unlimited core dumps if the daemon is automatically
|
||||
# re-starting crashed processes.
|
||||
if [ $DAEMON_NO_AUTORESTART_AFTER_CRASH ]; then
|
||||
if [ $DAEMON_NO_AUTORESTART_AFTER_CRASH -ne 0 ]; then
|
||||
# Feature disabled, allow core dumping.
|
||||
ulimit -c unlimited
|
||||
else
|
||||
# Check if core dumping is allowed with the feature enabled
|
||||
if [ $DAEMON_COREDUMPS_WANTED ]; then
|
||||
ulimit -c unlimited
|
||||
fi
|
||||
fi
|
||||
else
|
||||
# Check if core dumping is allowed with the feature enabled
|
||||
if [ $DAEMON_COREDUMPS_WANTED ]; then
|
||||
ulimit -c unlimited
|
||||
fi
|
||||
fi
|
||||
|
||||
ulimit -f unlimited
|
||||
|
||||
# Start the daemon
|
||||
echo -n "Starting casa_atvd..."
|
||||
$START_DAEMON_CMD $START_DAEMON_CMD_FLAG $DAEMON_USER $DAEMON -d
|
||||
RVAL=$?
|
||||
$ECHO
|
||||
}
|
||||
|
||||
|
||||
StopDAEMON()
|
||||
{
|
||||
echo -n "Stopping casa_atvd..."
|
||||
killproc $DAEMON
|
||||
RVAL=$?
|
||||
$ECHO
|
||||
}
|
||||
|
||||
case "$1" in
|
||||
start)
|
||||
StartDAEMON
|
||||
;;
|
||||
stop)
|
||||
StopDAEMON
|
||||
;;
|
||||
restart|reload|force-reload)
|
||||
StopDAEMON
|
||||
sleep 1
|
||||
StartDAEMON
|
||||
;;
|
||||
status)
|
||||
$STATUS
|
||||
;;
|
||||
*)
|
||||
echo -n "Usage: $0 <start|stop|restart|reload|force-reload>" > /dev/stderr
|
||||
RVAL=1
|
||||
;;
|
||||
esac
|
||||
|
||||
rc_failed $RVAL
|
||||
rc_status -v
|
||||
rc_exit
|
||||
|
||||
122
CASA-auth-token/server/AuthTokenValidate/Svc/linux/Makefile.am
Normal file
122
CASA-auth-token/server/AuthTokenValidate/Svc/linux/Makefile.am
Normal file
@@ -0,0 +1,122 @@
|
||||
#######################################################################
|
||||
#
|
||||
# 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
|
||||
DEFINES = -DDBG
|
||||
else
|
||||
TARGET_CFG = Release
|
||||
DEFINES = -DNDEBUG
|
||||
endif
|
||||
|
||||
# Override the link setting for C++
|
||||
LINK = g++
|
||||
|
||||
SUBDIRS =
|
||||
|
||||
DIST_SUBDIRS =
|
||||
|
||||
ROOT = ../../../..
|
||||
|
||||
LIBDIR = $(ROOT)/$(LIB)
|
||||
BINDIR = $(ROOT)/$(BIN)
|
||||
JAVA_LIBDIR = /usr/lib/jvm/java-1.5.0-ibm/jre/bin
|
||||
JAVA_INCDIR = /usr/lib/jvm/java-1.5.0-ibm/include
|
||||
|
||||
# handle Mono secondary dependencies
|
||||
export MONO_PATH := $(MONO_PATH)
|
||||
|
||||
MODULE_NAME = CasaAuthtokenValidateD
|
||||
|
||||
CFILES =
|
||||
|
||||
CPPFILES = server.cpp
|
||||
|
||||
CSFILES_CSC :=
|
||||
INCLUDES = -I. -I$(ROOT)/include -I$(JAVA_INCDIR)
|
||||
RESOURCES =
|
||||
|
||||
if LIB64
|
||||
DEFINES += -D_LIB64
|
||||
endif
|
||||
|
||||
CFLAGS += -Wno-format-extra-args -fno-strict-aliasing $(INCLUDES) $(DEFINES)
|
||||
CPPFLAGS += -Wno-format-extra-args -fno-strict-aliasing -fPIC $(INCLUDES) $(DEFINES) $(RPM_OPT_FLAGS)
|
||||
LIBS = -lpthread -lcasa_s_ipc -ljvm -ljsig -lj9thr23
|
||||
LDFLAGS = -L$(LIBDIR)/$(TARGET_CFG) -L$(JAVA_LIBDIR) -L$(JAVA_LIBDIR)/classic
|
||||
|
||||
OBJDIR = ./$(TARGET_CFG)/$(LIB)
|
||||
OBJS = $(addprefix $(OBJDIR)/, $(CFILES:%.c=%.o)) $(addprefix $(OBJDIR)/, $(CPPFILES:%.cpp=%.o))
|
||||
|
||||
EXTRA_DIST = $(CFILES) $(CPPFILES) *.h CasaAuthtokenValidateD envvars
|
||||
|
||||
CUR_DIR := $(shell pwd)
|
||||
|
||||
all: $(OBJDIR)/$(MODULE_NAME)
|
||||
|
||||
#
|
||||
# Pattern based rules.
|
||||
#
|
||||
vpath %.c .
|
||||
vpath %.cpp .
|
||||
|
||||
$(OBJDIR)/%.o: %.c
|
||||
$(CC) -c $(CFLAGS) -o $@ $<
|
||||
|
||||
$(OBJDIR)/%.o: %.cpp
|
||||
$(CC) -c $(CPPFLAGS) -o $@ $<
|
||||
|
||||
$(OBJDIR)/$(MODULE_NAME): $(OBJDIR) $(OBJS)
|
||||
@echo [======== Linking $@ ========]
|
||||
$(LINK) -o $@ $(LDFLAGS) $(OBJS) $(LIBS)
|
||||
cp -f $(OBJDIR)/$(MODULE_NAME) $(BINDIR)/$(TARGET_CFG)/$(MODULE_NAME)
|
||||
|
||||
$(OBJDIR):
|
||||
[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
|
||||
[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR)
|
||||
[ -d $(LIBDIR)/$(TARGET_CFG) ] || mkdir -p $(LIBDIR)/$(TARGET_CFG)
|
||||
[ -d $(BINDIR) ] || mkdir -p $(BINDIR)
|
||||
[ -d $(BINDIR)/$(TARGET_CFG) ] || mkdir -p $(BINDIR)/$(TARGET_CFG)
|
||||
|
||||
|
||||
install-exec-local: $(OBJDIR)/$(MODULE_NAME)
|
||||
$(mkinstalldirs) $(DESTDIR)$(libdir)
|
||||
$(INSTALL_PROGRAM) $(OBJDIR)/$(MODULE_NAME) $(DESTDIR)$(libdir)/
|
||||
|
||||
uninstall-local:
|
||||
cd $(DESTDIR)$(libdir); rm -f $(OBJDIR)/$(MODULE_NAME)
|
||||
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
|
||||
|
||||
35
CASA-auth-token/server/AuthTokenValidate/Svc/linux/envvars
Normal file
35
CASA-auth-token/server/AuthTokenValidate/Svc/linux/envvars
Normal file
@@ -0,0 +1,35 @@
|
||||
############################################################
|
||||
# #
|
||||
# Environment variable file for casa_atvd. #
|
||||
# #
|
||||
# Note: This file is sourced by the casa_atvd rc script #
|
||||
# when starting the service. #
|
||||
# #
|
||||
# The following variables are utilized by the daemon #
|
||||
# and its rc script: #
|
||||
# #
|
||||
# DAEMON_NO_AUTORESTART_AFTER_CRASH - #
|
||||
# #
|
||||
# Set this variable to "1" if you want to disable the #
|
||||
# auto-restart daemon after abnormal termination #
|
||||
# feature. This variable is intended to facilitate #
|
||||
# the discovery of problems during quality assurance #
|
||||
# testing. Disabling of the auto-restart daemon after #
|
||||
# abnormal termination feature will result in a #
|
||||
# configuration that is less fault tolerant. #
|
||||
# #
|
||||
# DAEMON_COREDUMPS_WANTED - #
|
||||
# #
|
||||
# Set this variable to allow core dumps to be taken #
|
||||
# when a daemon terminates abnormally. This variable #
|
||||
# is only meaningful when the auto-restart daemon #
|
||||
# feature mentioned above is enabled. Core dumps are #
|
||||
# allowed to be taken when the auto-restart daemon #
|
||||
# feature is disabled. Core dumps of novell-xsrvd #
|
||||
# service processes are taken to the #
|
||||
# /var/novell/xtier folder. #
|
||||
# #
|
||||
############################################################
|
||||
LD_LIBRARY_PATH="\${LD_LIBRARY_PATH}":/usr/lib/jvm/java-1.5.0-ibm/jre/bin:/usr/lib/jvm/java-1.5.0-ibm/jre/bin/classic
|
||||
export LD_LIBRARY_PATH
|
||||
|
||||
148
CASA-auth-token/server/AuthTokenValidate/Svc/linux/internal.h
Normal file
148
CASA-auth-token/server/AuthTokenValidate/Svc/linux/internal.h
Normal file
@@ -0,0 +1,148 @@
|
||||
/**********************\*************************************************
|
||||
*
|
||||
* 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 _IPCINT_
|
||||
#define _IPCINT_
|
||||
|
||||
//===[ Include files ]=====================================================
|
||||
|
||||
#include <iostream>
|
||||
#include <string>
|
||||
#include <list>
|
||||
#include <map>
|
||||
#include <vector>
|
||||
using namespace std;
|
||||
|
||||
extern "C" {
|
||||
#include <stdint.h>
|
||||
#include <unistd.h>
|
||||
#include <stdio.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/wait.h>
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <pthread.h>
|
||||
#include <syslog.h>
|
||||
#include <signal.h>
|
||||
#include <sys/stat.h>
|
||||
#include <sys/file.h>
|
||||
#include <assert.h> // Ensure that NDEBUG is defined for release builds!
|
||||
#include <sys/ipc.h>
|
||||
#include <casa_s_ipc.h>
|
||||
}
|
||||
|
||||
//===[ External data ]=====================================================
|
||||
|
||||
extern int DebugLevel;
|
||||
extern bool UseSyslog;
|
||||
extern char appName[];
|
||||
extern char *pAppName;
|
||||
extern pthread_mutex_t interlockedMutex;
|
||||
|
||||
//===[ Macro definitions ]=================================================
|
||||
|
||||
//
|
||||
// DbgTrace macro define
|
||||
//
|
||||
#define MAX_FORMAT_STRING_LEN 1024
|
||||
#define DbgTrace(LEVEL, X, Y) { \
|
||||
if (LEVEL == 0 || DebugLevel >= LEVEL) { \
|
||||
if (UseSyslog) \
|
||||
syslog(LOG_USER | LOG_INFO, X, Y); \
|
||||
else { \
|
||||
char *pFormatString = new char[MAX_FORMAT_STRING_LEN]; \
|
||||
if (pFormatString) { \
|
||||
snprintf(pFormatString, MAX_FORMAT_STRING_LEN, X, Y); \
|
||||
fprintf(stderr, "%s -%s", appName, pFormatString); \
|
||||
delete[] pFormatString; \
|
||||
} \
|
||||
} \
|
||||
} \
|
||||
}
|
||||
|
||||
//
|
||||
// Interlocked Increment and Decrement macros
|
||||
//
|
||||
// Well, kind of interlocked :-).
|
||||
//
|
||||
__inline static unsigned long
|
||||
InterlockedIncrement(unsigned long *pValue)
|
||||
{
|
||||
unsigned long retVal;
|
||||
pthread_mutex_lock(&interlockedMutex);
|
||||
(*pValue) ++;
|
||||
retVal = *pValue;
|
||||
pthread_mutex_unlock(&interlockedMutex);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
__inline static unsigned long
|
||||
InterlockedDecrement(unsigned long *pValue)
|
||||
{
|
||||
unsigned long retVal;
|
||||
pthread_mutex_lock(&interlockedMutex);
|
||||
(*pValue) --;
|
||||
retVal = *pValue;
|
||||
pthread_mutex_unlock(&interlockedMutex);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
__inline static uint32_t
|
||||
InterlockedIncrement(uint32_t *pValue)
|
||||
{
|
||||
uint32_t retVal;
|
||||
pthread_mutex_lock(&interlockedMutex);
|
||||
(*pValue) ++;
|
||||
retVal = *pValue;
|
||||
pthread_mutex_unlock(&interlockedMutex);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
__inline static uint32_t
|
||||
InterlockedDecrement(uint32_t *pValue)
|
||||
{
|
||||
uint32_t retVal;
|
||||
pthread_mutex_lock(&interlockedMutex);
|
||||
(*pValue) --;
|
||||
retVal = *pValue;
|
||||
pthread_mutex_unlock(&interlockedMutex);
|
||||
return retVal;
|
||||
}
|
||||
|
||||
//===[ Include files ]=====================================================
|
||||
|
||||
//===[ External prototypes ]===============================================
|
||||
|
||||
//===[ Manifest constants ]================================================
|
||||
|
||||
//===[ Type definitions ]==================================================
|
||||
|
||||
//===[ Function prototypes ]===============================================
|
||||
|
||||
|
||||
#endif // _IPCINT_
|
||||
|
||||
//=========================================================================
|
||||
//=========================================================================
|
||||
839
CASA-auth-token/server/AuthTokenValidate/Svc/linux/server.cpp
Normal file
839
CASA-auth-token/server/AuthTokenValidate/Svc/linux/server.cpp
Normal file
@@ -0,0 +1,839 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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"
|
||||
#include <jni.h>
|
||||
|
||||
//===[ External data ]=====================================================
|
||||
|
||||
//===[ External prototypes ]===============================================
|
||||
|
||||
//===[ Manifest constants ]================================================
|
||||
|
||||
#define MAXFD 64
|
||||
|
||||
#define DOMAIN_SOCKET_FILE_NAME "/var/lib/CASA/authtoken/validate/socket"
|
||||
|
||||
//===[ Type definitions ]==================================================
|
||||
|
||||
//===[ Function prototypes ]===============================================
|
||||
|
||||
void*
|
||||
WorkerThread(void*);
|
||||
|
||||
//===[ Global variables ]==================================================
|
||||
|
||||
// Usage string
|
||||
char usage[] = "\nCasaAuthtokenValidateD: usage: [-p ListenPort] [-b BeginThreads] [-g GrowThreads] [-m MaxThreads] [-D DebugLevel] [-d]\n";
|
||||
|
||||
// Worker thread pool configuration parameters
|
||||
int beginThreads = 5;
|
||||
int growThreads = 5;
|
||||
int maxThreads = 4096;
|
||||
int minWaitingThreads = beginThreads;
|
||||
int maxWaitingThreads = beginThreads * 4;
|
||||
|
||||
// Worker thread pool operating parameters
|
||||
double numThreads = 0;
|
||||
double numBusyThreads = 0;
|
||||
double numPerishingThreads = 0;
|
||||
|
||||
// Listen Port Number
|
||||
//int listenPortNumber = 5000;
|
||||
int listenPortNumber = 0;
|
||||
|
||||
// Parameter indicating whether or not the server needs to run
|
||||
// as a daemon.
|
||||
bool daemonize = false;
|
||||
|
||||
// Name to use for logging purposes
|
||||
char appName[] = "CasaAuthtokenValidateD";
|
||||
|
||||
// Debug Level
|
||||
int DebugLevel = 0;
|
||||
bool UseSyslog = false;
|
||||
|
||||
// Variables for daemon auto-restart after crash feature
|
||||
static bool autoRestartAfterCrash = true;
|
||||
|
||||
// Synchronization variables
|
||||
pthread_mutex_t interlockedMutex;
|
||||
pthread_mutex_t serverMutex;
|
||||
pthread_cond_t serverCondition;
|
||||
|
||||
// Operating parameters
|
||||
bool terminating = false;
|
||||
|
||||
// Java parameters
|
||||
JavaVM *g_jvm = NULL;
|
||||
JNIEnv *g_env = NULL;
|
||||
|
||||
char classpath[] = "-Djava.class.path=/usr/share/java/CASA/authtoken/CasaAuthToken.jar:/usr/share/java/CASA/authtoken/external/axis.jar:/usr/share/java/CASA/authtoken/external/axis-ant.jar:/usr/share/java/CASA/authtoken/external/commons-discovery-0.2.jar:/usr/share/java/CASA/authtoken/external/commons-logging-1.0.4.jar:/usr/share/java/CASA/authtoken/external/jaxrpc.jar:/usr/share/java/CASA/authtoken/external/log4j-1.2.8.jar:/usr/share/java/CASA/authtoken/external/saaj.jar:/usr/share/java/CASA/authtoken/external/wsdl4j-1.5.1.jar:/usr/share/java/CASA/authtoken/external/wss4j-1.5.0.jar:/usr/share/java/CASA/authtoken/external/xalan.jar:/usr/share/java/CASA/authtoken/external/xercesImpl.jar:/usr/share/java/CASA/authtoken/external/xml-apis.jar:/usr/share/java/CASA/authtoken/external/xmlsec-1.2.1.jar:/usr/share/java/CASA/authtoken/external:/etc/CASA/authtoken/keys/client";
|
||||
// Java AuthenticationToken Class and method name
|
||||
//char authTokenClassName[] = "jtest";
|
||||
//char authTokenClassValidateMethodName[] = "test4";
|
||||
char authTokenClassName[] = "com/novell/casa/authtoksvc/AuthToken";
|
||||
char authTokenClassValidateMethodName[] = "validate";
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
GrowWorkerThreadPool(int growNumber)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes: The serverMutex needs to be held when calling this
|
||||
// procedure.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "GrowWorkerThreadPool- Start\n", 0);
|
||||
|
||||
for (int i = 0; i < growNumber; i++)
|
||||
{
|
||||
int threadCreateStatus;
|
||||
pthread_t thread;
|
||||
|
||||
if ((threadCreateStatus = pthread_create(&thread,
|
||||
NULL,
|
||||
(void*(*)(void*))WorkerThread,
|
||||
NULL) == 0))
|
||||
{
|
||||
// Worker thread created
|
||||
numThreads ++;
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "GrowWorkerThreadPool- Thread creation failed, status = %0d\n", threadCreateStatus);
|
||||
}
|
||||
}
|
||||
|
||||
// Let our server know if we ended up with no worker threads
|
||||
if (numThreads == 0)
|
||||
pthread_cond_signal(&serverCondition);
|
||||
|
||||
DbgTrace(1, "GrowWorkerThreadPool- End\n", 0);
|
||||
|
||||
} /*-- GrowWorkerThreadPool() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
WorkerThreadBusy(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "WorkerThreadBusy- Start\n", 0);
|
||||
|
||||
// Acquire our mutex
|
||||
pthread_mutex_lock(&serverMutex);
|
||||
|
||||
// Increment the numBusyThread count and grow the number of worker threads
|
||||
// if necessary.
|
||||
numBusyThreads ++;
|
||||
if ((numThreads - numBusyThreads) < minWaitingThreads)
|
||||
GrowWorkerThreadPool(growThreads);
|
||||
|
||||
// Release our mutex
|
||||
pthread_mutex_unlock(&serverMutex);
|
||||
|
||||
DbgTrace(1, "WorkerThreadBusy- End\n", 0);
|
||||
|
||||
} /*-- WorkerThreadBusy() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
bool
|
||||
WorkerThreadWaiting(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
bool retValue;
|
||||
|
||||
DbgTrace(1, "WorkerThreadWaiting- Start\n", 0);
|
||||
|
||||
// Acquire our mutex
|
||||
pthread_mutex_lock(&serverMutex);
|
||||
|
||||
// Decrement the numBusyThread count
|
||||
numBusyThreads --;
|
||||
|
||||
// Check if we have too many idle workers
|
||||
if ((numThreads - numBusyThreads - numPerishingThreads) > maxWaitingThreads
|
||||
&& numThreads > beginThreads)
|
||||
{
|
||||
// We want to let this worker perish
|
||||
numPerishingThreads ++;
|
||||
retValue = true;
|
||||
}
|
||||
else
|
||||
retValue = false;
|
||||
|
||||
// Release our mutex
|
||||
pthread_mutex_unlock(&serverMutex);
|
||||
|
||||
DbgTrace(1, "WorkerThreadWaiting- End, retValue = %X\n", retValue);
|
||||
|
||||
return retValue;
|
||||
|
||||
} /*-- WorkerThreadWaiting() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void*
|
||||
WorkerThread(void*)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
bool perishingThread = false;
|
||||
|
||||
DbgTrace(1, "WorkerThread- Start\n", 0);
|
||||
|
||||
// Set the thread in the detached state so that it is cleaned up when it exits
|
||||
pthread_detach(pthread_self());
|
||||
|
||||
// Attach the thread to the JVM
|
||||
JNIEnv *env;
|
||||
JavaVMAttachArgs attachArgs = {0};
|
||||
attachArgs.version = JNI_VERSION_1_4;
|
||||
if (g_jvm->AttachCurrentThread((void**) &env, &attachArgs) >= 0)
|
||||
{
|
||||
// We are now attached to the JVM, find the helper class that
|
||||
// we need.
|
||||
jclass helperClass = env->FindClass(authTokenClassName);
|
||||
if (helperClass)
|
||||
{
|
||||
// Helper class found, now get the id of the method that we invoke
|
||||
jmethodID mId = env->GetStaticMethodID(helperClass,
|
||||
authTokenClassValidateMethodName,
|
||||
"(Ljava/lang/String;)Ljava/lang/String;");
|
||||
if (mId)
|
||||
{
|
||||
// Loop until told to terminate
|
||||
while (!terminating)
|
||||
{
|
||||
// Get a request that needs servicing
|
||||
int32_t requestId = IpcServerGetRequest();
|
||||
if (requestId != 0)
|
||||
{
|
||||
// We got a request that needs servicing, now get the
|
||||
// data associated with it.
|
||||
char *pReqData;
|
||||
int dataLen = IpcServerGetRequestData(requestId, &pReqData);
|
||||
if (dataLen != 0)
|
||||
{
|
||||
// Indicate that we are now busy
|
||||
WorkerThreadBusy();
|
||||
|
||||
// Lets push the jvm local frame to allow us to clean up our local
|
||||
// references later.
|
||||
env->PushLocalFrame(10);
|
||||
|
||||
// Encapsulate the request data into a string object
|
||||
jstring inString = env->NewStringUTF(pReqData);
|
||||
if (inString)
|
||||
{
|
||||
// Invoke our helper method
|
||||
jstring outString = (jstring) env->CallStaticObjectMethod(helperClass, mId, inString);
|
||||
|
||||
// Check if an excption occurred
|
||||
if (env->ExceptionCheck() == JNI_TRUE)
|
||||
{
|
||||
// There is a pending exception, display the info which in turn clears it.
|
||||
env->ExceptionDescribe();
|
||||
}
|
||||
else
|
||||
{
|
||||
if (outString)
|
||||
{
|
||||
// The helper method succeded, complete the request
|
||||
// with the data returned.
|
||||
const char *pOutChars = env->GetStringUTFChars(outString, NULL);
|
||||
if (pOutChars)
|
||||
{
|
||||
IpcServerCompleteRequest(requestId, (char*) pOutChars);
|
||||
env->ReleaseStringUTFChars(outString, pOutChars);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- Unable to get UTF characters\n", 0);
|
||||
IpcServerAbortRequest(requestId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// The helper method failed, just abort the request.
|
||||
IpcServerAbortRequest(requestId);
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- UTF String allocation failure\n", 0);
|
||||
IpcServerAbortRequest(requestId);
|
||||
}
|
||||
|
||||
// Pop the jvm local frame to clean up our local references
|
||||
env->PopLocalFrame(NULL);
|
||||
|
||||
// Indicate that we are no longer busy and get indication of
|
||||
// whether or not we should continue to try to process requests.
|
||||
if (WorkerThreadWaiting() == true)
|
||||
{
|
||||
DbgTrace(1, "WorkerThread- Requested to terminate\n", 0);
|
||||
|
||||
// Remember that we are a perishing thread so that we can reduce the
|
||||
// count as we exit.
|
||||
perishingThread = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- Error obtaining Request data\n", 0);
|
||||
IpcServerAbortRequest(requestId);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// No need to service requests any longer
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- Failed to get method id\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- Failed to find helper class\n", 0);
|
||||
}
|
||||
|
||||
// Detach from the JVM
|
||||
g_jvm->DetachCurrentThread();
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "WorkerThread- Failed to attach to JVM\n", 0);
|
||||
}
|
||||
|
||||
// Decrement the number of worker threads and signal our main thread
|
||||
// to terminate itself if we are the last worker thread.
|
||||
pthread_mutex_lock(&serverMutex);
|
||||
|
||||
if (perishingThread)
|
||||
numPerishingThreads --;
|
||||
|
||||
numThreads --;
|
||||
if (numThreads == 0)
|
||||
pthread_cond_signal(&serverCondition);
|
||||
|
||||
pthread_mutex_unlock(&serverMutex);
|
||||
|
||||
DbgTrace(1, "WorkerThread- End\n", 0);
|
||||
|
||||
// Exit
|
||||
pthread_exit(NULL);
|
||||
|
||||
return 0; // never-reached!
|
||||
|
||||
} /*-- WorkerThread() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
SigTermHandler(
|
||||
int signum)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "SigTermHandler- Start\n", 0);
|
||||
|
||||
// Indicate that we are terminating
|
||||
terminating = true;
|
||||
|
||||
// Shutdown the IPC Server
|
||||
IpcServerShutdown();
|
||||
|
||||
DbgTrace(1, "SigTermHandler- End\n", 0);
|
||||
|
||||
} /*-- SigTermHandler() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
int
|
||||
InitJavaInvoke(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
int retStatus = -1;
|
||||
|
||||
DbgTrace(1, "InitJavaInvoke- Start\n", 0);
|
||||
|
||||
JavaVMOption options[6];
|
||||
options[0].optionString = classpath;
|
||||
options[1].optionString = "-Dorg.xml.sax.driver=org.apache.xerces.parsers.SAXParser";
|
||||
options[2].optionString = "-Djavax.xml.parsers.DocumentBuilderFactory=org.apache.xerces.jaxp.DocumentBuilderFactoryImpl";
|
||||
options[3].optionString = "-Djavax.xml.parsers.SAXParserFactory=org.apache.xerces.jaxp.SAXParserFactoryImpl";
|
||||
//options[4].optionString = "-Xcheck:jni";
|
||||
//options[5].optionString = "-Djaxp.debug=1";
|
||||
JavaVMInitArgs vm_args;
|
||||
vm_args.version = JNI_VERSION_1_4;
|
||||
vm_args.options = options;
|
||||
vm_args.nOptions = 4;
|
||||
vm_args.ignoreUnrecognized = true;
|
||||
if (JNI_CreateJavaVM(&g_jvm, (void**)&g_env, &vm_args) >= 0)
|
||||
{
|
||||
// Success
|
||||
retStatus = 0;
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "InitJavaInvoke- Error creating Java VM\n", 0);
|
||||
}
|
||||
|
||||
DbgTrace(1, "InitJavaInvoke- End, retStatus = %08X\n", retStatus);
|
||||
|
||||
return retStatus;
|
||||
|
||||
} /*-- InitJavaInvoke() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
UnInitJavaInvoke(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "UnInitJavaInvoke- Start\n", 0);
|
||||
|
||||
// Destroy the jvm
|
||||
g_jvm->DestroyJavaVM();
|
||||
g_jvm = NULL;
|
||||
g_env = NULL;
|
||||
|
||||
DbgTrace(1, "UnInitJavaInvoke- End\n", 0);
|
||||
|
||||
} /*-- UnInitJavaInvoke() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
DaemonInit(
|
||||
const char *pname)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes: Copy of daemon_init() in Richard Stevens Unix Network
|
||||
// Programming Book.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
pid_t pid;
|
||||
char *pNoAutoRestartEnvvar;
|
||||
|
||||
DbgTrace(1, "DaemonInit- Start\n", 0);
|
||||
|
||||
// Determine if we need to disable the auto-restart after crash feature
|
||||
if ((pNoAutoRestartEnvvar = getenv("CASA_NO_AUTORESTART_AFTER_CRASH")) != NULL
|
||||
&& strcmp(pNoAutoRestartEnvvar, "0") != 0)
|
||||
{
|
||||
DbgTrace(1, "DaemonInit- Disabling daemon auto-restart after crash feature\n", 0);
|
||||
autoRestartAfterCrash = false;
|
||||
}
|
||||
|
||||
// Fork to run in the background, check for error.
|
||||
if ((pid = fork()) == -1)
|
||||
{
|
||||
DbgTrace(0, "DaemonInit- Fork error = %d\n", errno);
|
||||
exit(0);
|
||||
}
|
||||
else if (pid != 0)
|
||||
{
|
||||
// The fork succeeded and we are the parent process, terminate
|
||||
// ourselves.
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* 1st child continues */
|
||||
|
||||
// Become the session leader and set to ignore SIGHUP
|
||||
setsid();
|
||||
signal(SIGHUP, SIG_IGN);
|
||||
|
||||
// Fork again to guarantee that the daemon can not acquire a
|
||||
// controlling terminal.
|
||||
if ((pid = fork()) == -1)
|
||||
{
|
||||
DbgTrace(0, "DaemonInit- Fork error = %d\n", errno);
|
||||
exit(0);
|
||||
}
|
||||
else if (pid != 0)
|
||||
{
|
||||
// The fork succeeded and we are the parent process, terminate
|
||||
// ourselves.
|
||||
exit(0);
|
||||
}
|
||||
|
||||
/* 2nd child continues */
|
||||
|
||||
// Close any open descriptors
|
||||
for (int i = 0; i < MAXFD; i++)
|
||||
close(i);
|
||||
|
||||
|
||||
// Spawn a worker
|
||||
if ((pid = fork()) == -1)
|
||||
{
|
||||
DbgTrace(0, "DaemonInit- Fork error = %d\n", errno);
|
||||
exit(0);
|
||||
}
|
||||
else if (pid == 0)
|
||||
{
|
||||
// The fork succeeded and we are the worker, continue.
|
||||
}
|
||||
else
|
||||
{
|
||||
// We are the parent of the server, check if we must execute the auto-restart
|
||||
// server after crash logic.
|
||||
if (autoRestartAfterCrash)
|
||||
{
|
||||
// Execute auto-restart server after crash logic
|
||||
while (1)
|
||||
{
|
||||
int childExitStatus;
|
||||
|
||||
// Wait for children to exit
|
||||
pid = wait(&childExitStatus);
|
||||
if (pid != -1)
|
||||
{
|
||||
// Fork worker
|
||||
if ((pid = fork()) == -1)
|
||||
{
|
||||
DbgTrace(0, "DaemonInit- Fork error = %d\n", errno);
|
||||
exit(0);
|
||||
}
|
||||
else if (pid == 0)
|
||||
{
|
||||
// The fork succeeded and we are the server, exit the loop
|
||||
// to start.
|
||||
goto childContinue;
|
||||
}
|
||||
|
||||
// We are the parent process, continue to watch for a terminated child process.
|
||||
syslog(LOG_USER | LOG_INFO, "CasaAuthtokenValidateD: Worker re-started after it terminated unexpectedly");
|
||||
sleep(1); // To keep from consuming too many cycles
|
||||
}
|
||||
else
|
||||
{
|
||||
// Check if we must exit the loop
|
||||
if (errno != EINTR)
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Terminate ourselves.
|
||||
exit(0);
|
||||
}
|
||||
|
||||
childContinue:
|
||||
|
||||
// Set flag to inform DbgTrace macros to use Syslog
|
||||
UseSyslog = true;
|
||||
|
||||
// Change the working directory
|
||||
chdir("/var/lib/CASA/authtoken/validate");
|
||||
|
||||
// Clear our file mode creation mask
|
||||
umask(0);
|
||||
|
||||
// Get ready to log
|
||||
openlog(appName, LOG_CONS | LOG_NOWAIT | LOG_ODELAY| LOG_PID, LOG_USER);
|
||||
|
||||
if (DebugLevel == 0)
|
||||
setlogmask(LOG_UPTO(LOG_INFO));
|
||||
else
|
||||
setlogmask(LOG_UPTO(LOG_DEBUG));
|
||||
|
||||
DbgTrace(1, "DaemonInit- End\n", 0);
|
||||
|
||||
} /*-- DaemonInit() --*/
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
int
|
||||
main(
|
||||
int argc,
|
||||
char* argv[])
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
int optionsSpecified = 0;
|
||||
bool doneScanning = false;
|
||||
bool invalidOption = false;
|
||||
int option;
|
||||
|
||||
//printf("**** AuthTokenValidate Daemon ****\n");
|
||||
|
||||
// Scan through the options specified
|
||||
while (!doneScanning)
|
||||
{
|
||||
opterr = 0;
|
||||
option = getopt(argc, argv, "m:p:b:g:D:d");
|
||||
|
||||
// Proceed based on the result
|
||||
switch (option)
|
||||
{
|
||||
case 'p':
|
||||
// Port number option, record location of
|
||||
// argument.
|
||||
listenPortNumber = atoi(optarg);
|
||||
|
||||
optionsSpecified ++;
|
||||
break;
|
||||
|
||||
case 'b':
|
||||
// Begin threads option, override the default parameter
|
||||
// with the value of the option.
|
||||
beginThreads = atoi(optarg);
|
||||
|
||||
optionsSpecified ++;
|
||||
break;
|
||||
|
||||
case 'g':
|
||||
// Grow threads option, override the default parameter
|
||||
// with the value of the option.
|
||||
growThreads = atoi(optarg);
|
||||
|
||||
optionsSpecified ++;
|
||||
break;
|
||||
|
||||
case 'm':
|
||||
// Max threads option, override the default parameter
|
||||
// with the value of the option.
|
||||
maxThreads = atoi(optarg);
|
||||
|
||||
optionsSpecified ++;
|
||||
break;
|
||||
|
||||
case 'd':
|
||||
// Run as daemon option
|
||||
daemonize = true;
|
||||
|
||||
optionsSpecified ++;
|
||||
break;
|
||||
|
||||
case 'D':
|
||||
// Set the debug level
|
||||
DebugLevel = atoi(optarg);
|
||||
optionsSpecified++;
|
||||
break;
|
||||
|
||||
case '?':
|
||||
// Invalid option detected
|
||||
doneScanning = true;
|
||||
invalidOption = true;
|
||||
break;
|
||||
|
||||
default:
|
||||
// Done scanning
|
||||
doneScanning = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// Do some sanity checking
|
||||
if (!invalidOption
|
||||
&& beginThreads > 0
|
||||
&& maxThreads > (growThreads+beginThreads)
|
||||
&& beginThreads <= maxThreads)
|
||||
{
|
||||
// The server is ready to start, check if we must
|
||||
// run it as a daemon.
|
||||
if (daemonize)
|
||||
DaemonInit(argv[0]);
|
||||
|
||||
// Set a handler for SIGTERM
|
||||
signal(SIGTERM, SigTermHandler);
|
||||
|
||||
// Initialize our mutexes
|
||||
pthread_mutex_init(&interlockedMutex, NULL);
|
||||
pthread_mutex_init(&serverMutex, NULL);
|
||||
|
||||
// Initialize the JVM
|
||||
if (InitJavaInvoke() == 0)
|
||||
{
|
||||
// Initialize the condition that we will use to wait
|
||||
// for the exit of all of our worker threads.
|
||||
if (pthread_cond_init(&serverCondition, NULL) == 0)
|
||||
{
|
||||
// Initialize the IPC Server
|
||||
if (IpcServerInit(appName,
|
||||
DebugLevel,
|
||||
UseSyslog) == 0)
|
||||
{
|
||||
// Now setup the appropriate listen address
|
||||
int setAddressResult;
|
||||
if (listenPortNumber == 0)
|
||||
setAddressResult = IpcServerSetUnAddress(DOMAIN_SOCKET_FILE_NAME);
|
||||
else
|
||||
setAddressResult = IpcServerSetInAddress(listenPortNumber);
|
||||
|
||||
if (setAddressResult == 0)
|
||||
{
|
||||
// Now start the IPC server
|
||||
if (IpcServerStart() == 0)
|
||||
{
|
||||
// Acquire our mutex
|
||||
pthread_mutex_lock(&serverMutex);
|
||||
|
||||
// Start worker threads
|
||||
GrowWorkerThreadPool(beginThreads);
|
||||
|
||||
// Wait for the worker threads to terminate
|
||||
pthread_cond_wait(&serverCondition, &serverMutex);
|
||||
|
||||
// Release our mutex
|
||||
pthread_mutex_unlock(&serverMutex);
|
||||
|
||||
DbgTrace(0, "main- Exiting, numThreads = %d\n", numThreads);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "main- Setting of listen address failed\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "main- Initialization of Ipc server failed\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "main- Condition initialization failed\n", 0);
|
||||
}
|
||||
// Un-initialize JVM
|
||||
UnInitJavaInvoke();
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "main- JVM initialization failed\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
// Invalid option detected or the user failed to
|
||||
// specify the listening port number.
|
||||
printf(usage, argv[0]);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
} /*-- main() --*/
|
||||
|
||||
|
||||
//=========================================================================
|
||||
//=========================================================================
|
||||
|
||||
|
||||
13
CASA-auth-token/server/AuthTokenValidate/TODO
Normal file
13
CASA-auth-token/server/AuthTokenValidate/TODO
Normal file
@@ -0,0 +1,13 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* TODO for libcasa_s_authtoken
|
||||
*
|
||||
***********************************************************************/
|
||||
|
||||
INTRODUCTION
|
||||
|
||||
This file contains a list of the items still outstanding for libcasa_s_authtoken.
|
||||
|
||||
OUTSTANDING ITEMS
|
||||
|
||||
None.
|
||||
764
CASA-auth-token/server/AuthTokenValidate/config.c
Normal file
764
CASA-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
CASA-auth-token/server/AuthTokenValidate/config_if.h
Normal file
120
CASA-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)
|
||||
|
||||
.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,62 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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>
|
||||
*
|
||||
***********************************************************************/
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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/CASA/authtoken/modules 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 /usr/lib/CASA/authtoken/casa_iden_token.so
|
||||
|
||||
|
||||
@@ -0,0 +1,15 @@
|
||||
#######################################################
|
||||
# #
|
||||
# CASA Authentication Token System configuration file #
|
||||
# for module: #
|
||||
# #
|
||||
# CasaIdentityToken #
|
||||
# #
|
||||
# Note: This module is the provider of Casa Identity #
|
||||
# tokens. #
|
||||
# #
|
||||
#######################################################
|
||||
|
||||
LibraryName /usr/lib64/CASA/authtoken/casa_iden_token.so
|
||||
|
||||
|
||||
@@ -0,0 +1,125 @@
|
||||
#######################################################################
|
||||
#
|
||||
# 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
|
||||
DEFINES = -DDBG
|
||||
else
|
||||
TARGET_CFG = Release
|
||||
DEFINES = -DNDEBUG
|
||||
endif
|
||||
|
||||
SUBDIRS =
|
||||
|
||||
DIST_SUBDIRS =
|
||||
|
||||
ROOT = ../../../../..
|
||||
|
||||
CASAINCLUDE = ../../../../../../CASA/include
|
||||
|
||||
LIBDIR = $(ROOT)/$(LIB)
|
||||
|
||||
# handle Mono secondary dependencies
|
||||
export MONO_PATH := $(MONO_PATH)
|
||||
|
||||
PLATFORMINDEPENDENTSOURCEDIR = ..
|
||||
PLATFORMDEPENDENTSOURCEDIR = .
|
||||
|
||||
MODULE_NAME = casa_iden_token
|
||||
MODULE_EXT = so
|
||||
|
||||
CFILES = ../identokenprovider.c \
|
||||
../identoken.c \
|
||||
../util.c \
|
||||
platform.c
|
||||
|
||||
CSFILES_CSC :=
|
||||
INCLUDES = -I. -I.. -I../../.. -I$(CASAINCLUDE) -I../../../../../include
|
||||
RESOURCES =
|
||||
|
||||
DEST_CONF_FILE_NAME = CasaIdentityToken.conf
|
||||
if LIB64
|
||||
DEFINES += -D_LIB64
|
||||
SRC_CONF_FILE_NAME = CasaIdentityToken_lib64.conf
|
||||
else
|
||||
SRC_CONF_FILE_NAME = CasaIdentityToken.conf
|
||||
endif
|
||||
|
||||
CFLAGS += -Wno-format-extra-args -fno-strict-aliasing $(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 CasaIdentityToken.conf CasaIdentityToken_lib64.conf
|
||||
|
||||
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) $(LIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT)
|
||||
cp -f $(SRC_CONF_FILE_NAME) $(LIBDIR)/$(TARGET_CFG)/$(DEST_CONF_FILE_NAME)
|
||||
|
||||
$(OBJDIR):
|
||||
[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
|
||||
[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR)
|
||||
[ -d $(LIBDIR)/$(TARGET_CFG) ] || mkdir -p $(LIBDIR)/$(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;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
|
||||
@@ -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_
|
||||
|
||||
320
CASA-auth-token/server/AuthTokenValidate/identoken.c
Normal file
320
CASA-auth-token/server/AuthTokenValidate/identoken.c
Normal file
@@ -0,0 +1,320 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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;
|
||||
LIB_HANDLE libHandle;
|
||||
IdenTokenProviderIf *pIdenTokenProviderIf;
|
||||
|
||||
} IdenTokenProviderModule, *PIdenTokenProviderModule;
|
||||
|
||||
|
||||
//===[ Function prototypes ]===============================================
|
||||
|
||||
//===[ Global variables ]==================================================
|
||||
|
||||
//
|
||||
// IdenTokenProviderModule list and syncronization mutex
|
||||
//
|
||||
static
|
||||
LIST_ENTRY g_IdenTokenProviderModuleListHead = {&g_IdenTokenProviderModuleListHead, &g_IdenTokenProviderModuleListHead};
|
||||
|
||||
static
|
||||
HANDLE g_idenTokenMutex = NULL;
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
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/CASA/authtoken/modules",
|
||||
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
|
||||
PlatAcquireMutex(g_idenTokenMutex);
|
||||
|
||||
// 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 = OpenLibrary(pLibraryName);
|
||||
if (pIdenTokenProviderModule->libHandle)
|
||||
{
|
||||
PFN_GetIdenTokenProviderIfRtn pGetIdenTokenProviderIfRtn;
|
||||
|
||||
// Library has been loaded, now get a pointer to its GetIdenTokenProviderProviderInterface routine
|
||||
pGetIdenTokenProviderIfRtn = (PFN_GetIdenTokenProviderIfRtn) GetFunctionPtr(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- GetFunctionPtr error\n", 0);
|
||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
||||
CASA_FACILITY_AUTHTOKEN,
|
||||
CASA_STATUS_LIBRARY_LOAD_FAILURE);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-GetIdenTokenProviderInterface- OpenLibrary error\n", 0);
|
||||
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)
|
||||
CloseLibrary(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
|
||||
PlatReleaseMutex(g_idenTokenMutex);
|
||||
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
CasaStatus
|
||||
IdenTokenInit(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
// Casa Status
|
||||
//
|
||||
// Description:
|
||||
// Initializes the identity token complex.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
CasaStatus retStatus;
|
||||
|
||||
DbgTrace(1, "-IdenTokenInit- Start\n", 0);
|
||||
|
||||
// Allocate mutex
|
||||
if ((g_idenTokenMutex = PlatAllocMutex()) != NULL)
|
||||
retStatus = CASA_STATUS_SUCCESS;
|
||||
else
|
||||
retStatus = CasaStatusBuild(CASA_SEVERITY_INFORMATIONAL,
|
||||
CASA_FACILITY_AUTHTOKEN,
|
||||
CASA_STATUS_INSUFFICIENT_RESOURCES);
|
||||
|
||||
DbgTrace(1, "-IdenTokenInit- End, retStatus = %08X\n", retStatus);
|
||||
|
||||
return retStatus;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
IdenTokenUninit(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
// Casa Status
|
||||
//
|
||||
// Description:
|
||||
// Uninitializes the indentity token complex.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "-IdenTokenUninit- Start\n", 0);
|
||||
|
||||
// Free mutex if necessary
|
||||
if (g_idenTokenMutex)
|
||||
{
|
||||
PlatDestroyMutex(g_idenTokenMutex);
|
||||
g_idenTokenMutex = NULL;
|
||||
}
|
||||
|
||||
DbgTrace(1, "-IdenTokenUninit- End\n", 0);
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
|
||||
224
CASA-auth-token/server/AuthTokenValidate/internal.h
Normal file
224
CASA-auth-token/server/AuthTokenValidate/internal.h
Normal file
@@ -0,0 +1,224 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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 <casa_c_ipc.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;
|
||||
extern char IpcClientLibraryPath[];
|
||||
|
||||
//===[ 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 identoken.c
|
||||
//
|
||||
extern
|
||||
CasaStatus
|
||||
GetIdenTokenProviderInterface(
|
||||
IN const char *pIdenTokenTypeName,
|
||||
INOUT IdenTokenProviderIf **ppIdenTokenProviderIf);
|
||||
|
||||
extern
|
||||
CasaStatus
|
||||
IdenTokenInit(void);
|
||||
|
||||
extern
|
||||
void
|
||||
IdenTokenUninit(void);
|
||||
|
||||
//
|
||||
// Functions exported by platform.c
|
||||
//
|
||||
extern
|
||||
HANDLE
|
||||
PlatAllocMutex(void);
|
||||
|
||||
extern
|
||||
void
|
||||
PlatDestroyMutex(HANDLE hMutex);
|
||||
|
||||
extern
|
||||
void
|
||||
PlatAcquireMutex(HANDLE hMutex);
|
||||
|
||||
extern
|
||||
void
|
||||
PlatReleaseMutex(HANDLE hMutex);
|
||||
|
||||
extern
|
||||
LIB_HANDLE
|
||||
OpenLibrary(
|
||||
IN char *pFileName);
|
||||
|
||||
extern
|
||||
void
|
||||
CloseLibrary(
|
||||
IN LIB_HANDLE libHandle);
|
||||
|
||||
extern
|
||||
void*
|
||||
GetFunctionPtr(
|
||||
IN LIB_HANDLE libHandle,
|
||||
IN char *pFunctionName);
|
||||
|
||||
//
|
||||
// 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_
|
||||
|
||||
121
CASA-auth-token/server/AuthTokenValidate/linux/Makefile.am
Normal file
121
CASA-auth-token/server/AuthTokenValidate/linux/Makefile.am
Normal file
@@ -0,0 +1,121 @@
|
||||
#######################################################################
|
||||
#
|
||||
# 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
|
||||
DEFINES = -DDBG
|
||||
else
|
||||
TARGET_CFG = Release
|
||||
DEFINES = -DNDEBUG
|
||||
endif
|
||||
|
||||
SUBDIRS =
|
||||
|
||||
DIST_SUBDIRS =
|
||||
|
||||
ROOT = ../../..
|
||||
CASAINCLUDE = ../../../../CASA/include
|
||||
|
||||
LIBDIR = $(ROOT)/$(LIB)
|
||||
|
||||
# handle Mono secondary dependencies
|
||||
export MONO_PATH := $(MONO_PATH)
|
||||
|
||||
PLATFORMINDEPENDENTSOURCEDIR = ..
|
||||
PLATFORMDEPENDENTSOURCEDIR = .
|
||||
|
||||
MODULE_NAME = libcasa_s_authtoken
|
||||
MODULE_EXT = so
|
||||
|
||||
CFILES = ../config.c \
|
||||
../principal.c \
|
||||
../util.c \
|
||||
../validate.c \
|
||||
../identoken.c \
|
||||
platform.c
|
||||
|
||||
CSFILES_CSC :=
|
||||
INCLUDES = -I. -I.. -I$(CASAINCLUDE) -I../../../include
|
||||
RESOURCES =
|
||||
|
||||
if LIB64
|
||||
DEFINES += -D_LIB64
|
||||
endif
|
||||
|
||||
CFLAGS += -Wno-format-extra-args -fno-strict-aliasing $(INCLUDES) $(DEFINES)
|
||||
LIBS = -lpthread -ldl
|
||||
LDFLAGS = -Bsymbolic -shared -Wl,-soname=$(MODULE_NAME).$(MODULE_EXT) -L$(ROOT)/lib/$(TARGET_CFG)
|
||||
|
||||
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) $(LIBDIR)/$(TARGET_CFG)/$(MODULE_NAME).$(MODULE_EXT)
|
||||
|
||||
$(OBJDIR):
|
||||
[ -d $(OBJDIR) ] || mkdir -p $(OBJDIR)
|
||||
[ -d $(LIBDIR) ] || mkdir -p $(LIBDIR)
|
||||
[ -d $(LIBDIR)/$(TARGET_CFG) ] || mkdir -p $(LIBDIR)/$(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
|
||||
|
||||
299
CASA-auth-token/server/AuthTokenValidate/linux/platform.c
Normal file
299
CASA-auth-token/server/AuthTokenValidate/linux/platform.c
Normal file
@@ -0,0 +1,299 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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;
|
||||
|
||||
//
|
||||
// Ipc client library path
|
||||
//
|
||||
#ifdef _LIB64
|
||||
char IpcClientLibraryPath[] = "/usr/lib64/libcasa_c_ipc.so";
|
||||
#else
|
||||
char IpcClientLibraryPath[] = "/usr/lib/libcasa_c_ipc.so";
|
||||
#endif
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
HANDLE
|
||||
PlatAllocMutex(void)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// Environment:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
PlatformMutex *pPlatMutex;
|
||||
pthread_mutexattr_t mutexAttr;
|
||||
|
||||
DbgTrace(2, "-PlatAllocMutex- Start\n", 0);
|
||||
|
||||
// Allocate space for our mutex structure
|
||||
pPlatMutex = malloc(sizeof(*pPlatMutex));
|
||||
if (pPlatMutex)
|
||||
{
|
||||
// Finish initializing the mutex
|
||||
if (pthread_mutexattr_init(&mutexAttr) == 0)
|
||||
{
|
||||
if (pthread_mutexattr_settype(&mutexAttr, PTHREAD_MUTEX_RECURSIVE) == 0)
|
||||
{
|
||||
if (pthread_mutex_init(&pPlatMutex->mutex, &mutexAttr) != 0)
|
||||
{
|
||||
DbgTrace(0, "-PlatAllocMutex- Error %d initing mutex\n", errno);
|
||||
free(pPlatMutex);
|
||||
pPlatMutex = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-PlatAllocMutex- Error %d setting mutex type\n", errno);
|
||||
free(pPlatMutex);
|
||||
pPlatMutex = NULL;
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-PlatAllocMutex- Error %d initing mutexattr\n", errno);
|
||||
free(pPlatMutex);
|
||||
pPlatMutex = NULL;
|
||||
}
|
||||
}
|
||||
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);
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
LIB_HANDLE
|
||||
OpenLibrary(
|
||||
IN char *pFileName)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
LIB_HANDLE libHandle;
|
||||
|
||||
DbgTrace(1, "-OpenLibrary- Start\n", 0);
|
||||
|
||||
libHandle = dlopen(pFileName, RTLD_LAZY);
|
||||
if (libHandle == NULL)
|
||||
{
|
||||
DbgTrace(0, "-OpenLibrary- Not able to load library, error = %s\n", dlerror());
|
||||
}
|
||||
|
||||
DbgTrace(1, "-OpenLibrary- End, handle = %0lX\n", (long) libHandle);
|
||||
|
||||
return libHandle;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void
|
||||
CloseLibrary(
|
||||
IN LIB_HANDLE libHandle)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
DbgTrace(1, "-CloseLibrary- Start\n", 0);
|
||||
|
||||
dlclose(libHandle);
|
||||
|
||||
DbgTrace(1, "-CloseLibrary- End\n", 0);
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
void*
|
||||
GetFunctionPtr(
|
||||
IN LIB_HANDLE libHandle,
|
||||
IN char *pFunctionName)
|
||||
//
|
||||
// Arguments:
|
||||
//
|
||||
// Returns:
|
||||
//
|
||||
// Abstract:
|
||||
//
|
||||
// Notes:
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
void *pFuncPtr;
|
||||
|
||||
DbgTrace(1, "-GetFunctionPtr- Start\n", 0);
|
||||
|
||||
pFuncPtr = dlsym(libHandle, pFunctionName);
|
||||
if (pFuncPtr == NULL)
|
||||
{
|
||||
DbgTrace(0, "-GetFunctionPtr- Not able to obtain func ptr, error = %s\n", dlerror());
|
||||
}
|
||||
|
||||
DbgTrace(1, "-GetFunctionPtr- End, pFuncPtr = %0lX\n", (long) pFuncPtr);
|
||||
|
||||
return pFuncPtr;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
|
||||
102
CASA-auth-token/server/AuthTokenValidate/linux/platform.h
Normal file
102
CASA-auth-token/server/AuthTokenValidate/linux/platform.h
Normal file
@@ -0,0 +1,102 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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)
|
||||
|
||||
//
|
||||
// Other definitions
|
||||
//
|
||||
#define LIB_HANDLE void*
|
||||
|
||||
|
||||
//===[ Inlines functions ]===============================================
|
||||
|
||||
//===[ Function prototypes ]===============================================
|
||||
|
||||
//===[ Global externals ]==================================================
|
||||
|
||||
//===[ External prototypes ]===============================================
|
||||
|
||||
|
||||
|
||||
//=========================================================================
|
||||
|
||||
482
CASA-auth-token/server/AuthTokenValidate/principal.c
Normal file
482
CASA-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
CASA-auth-token/server/AuthTokenValidate/util.c
Normal file
321
CASA-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;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
|
||||
400
CASA-auth-token/server/AuthTokenValidate/validate.c
Normal file
400
CASA-auth-token/server/AuthTokenValidate/validate.c
Normal file
@@ -0,0 +1,400 @@
|
||||
/***********************************************************************
|
||||
*
|
||||
* 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"
|
||||
|
||||
//===[ Manifest constants ]================================================
|
||||
|
||||
#define APPLICATION_NOT_MULTI_THREADED "CASA_APPLICATION_NOT_MULTI_THREADED"
|
||||
|
||||
#define DOMAIN_SOCKET_FILE_NAME "/var/lib/CASA/authtoken/validate/socket"
|
||||
|
||||
//===[ Type definitions ]==================================================
|
||||
|
||||
//===[ Function prototypes ]===============================================
|
||||
|
||||
//===[ Global variables ]==================================================
|
||||
|
||||
// Debug Level
|
||||
int DebugLevel = 0;
|
||||
|
||||
//
|
||||
// Initialization variables
|
||||
//
|
||||
static
|
||||
bool g_moduleInitialized = false;
|
||||
|
||||
//
|
||||
// Configuration variables
|
||||
//
|
||||
bool g_multiThreadedApplication = true;
|
||||
|
||||
//
|
||||
// IPC Client Sub-system variables
|
||||
//
|
||||
PFN_IpcClientInit g_ipcInitPtr = NULL;
|
||||
PFN_IpcClientShutdown g_ipcShutdownPtr = NULL;
|
||||
//PFN_IpcClientOpenInetRemoteEndPoint g_ipcOpenEndPointPtr = NULL;
|
||||
PFN_IpcClientOpenUnixRemoteEndPoint g_ipcOpenEndPointPtr = NULL;
|
||||
PFN_IpcClientCloseRemoteEndPoint g_ipcCloseEndPointPtr = NULL;
|
||||
PFN_IpcClientSubmitReq g_ipcSubmitReq = NULL;
|
||||
|
||||
uint32_t g_atvsEndPointHandle; // Authentication Token Validation Service endpoint handle
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
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))
|
||||
{
|
||||
// Initialize the IdenToken complex
|
||||
retStatus = IdenTokenInit();
|
||||
if (CASA_SUCCESS(retStatus))
|
||||
{
|
||||
// Initialize the Client Ipc Subsystem
|
||||
//
|
||||
// First load the library. We load it itself to keep the system
|
||||
// from unloading it in-case that the application unloads us. Some
|
||||
// applications such as PAM application will repeateadly load and
|
||||
// unload us.
|
||||
void* libHandle = OpenLibrary(IpcClientLibraryPath);
|
||||
if (libHandle)
|
||||
{
|
||||
// The Ipc library has been loaded, now get the symbols that we need.
|
||||
g_ipcInitPtr = GetFunctionPtr(libHandle, "IpcClientInit");
|
||||
g_ipcShutdownPtr = GetFunctionPtr(libHandle, "IpcClientShutdown");
|
||||
//g_ipcOpenEndPointPtr = GetFunctionPtr(libHandle, "IpcClientOpenInetRemoteEndPoint");
|
||||
g_ipcOpenEndPointPtr = GetFunctionPtr(libHandle, "IpcClientOpenUnixRemoteEndPoint");
|
||||
g_ipcCloseEndPointPtr = GetFunctionPtr(libHandle, "IpcClientCloseRemoteEndPoint");
|
||||
g_ipcSubmitReq = GetFunctionPtr(libHandle, "IpcClientSubmitReq");
|
||||
if (g_ipcInitPtr == NULL
|
||||
|| g_ipcShutdownPtr == NULL
|
||||
|| g_ipcOpenEndPointPtr == NULL
|
||||
|| g_ipcCloseEndPointPtr == NULL
|
||||
|| g_ipcSubmitReq == NULL)
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- Failed to get needed Ipc library function pointer\n", 0);
|
||||
IdenTokenUninit();
|
||||
PrincipalIfUninit();
|
||||
ConfigIfUninit();
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((g_ipcInitPtr)("CASA_AuthTokenValidate",
|
||||
g_multiThreadedApplication,
|
||||
DebugLevel,
|
||||
false) == 0)
|
||||
{
|
||||
// Open endpoint for the Authentication Token Validation Service
|
||||
//if ((g_ipcOpenEndPointPtr)(5000,
|
||||
// 0x7F000001,
|
||||
// 0,
|
||||
// &g_atvsEndPointHandle) == 0)
|
||||
if ((g_ipcOpenEndPointPtr)(DOMAIN_SOCKET_FILE_NAME,
|
||||
0,
|
||||
&g_atvsEndPointHandle) == 0)
|
||||
{
|
||||
// Success
|
||||
g_moduleInitialized = true;
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- Failed to open remote endpoint\n", 0);
|
||||
(g_ipcShutdownPtr)();
|
||||
IdenTokenUninit();
|
||||
PrincipalIfUninit();
|
||||
ConfigIfUninit();
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- Ipc subsystem initialization failed\n", 0);
|
||||
(g_ipcShutdownPtr)();
|
||||
IdenTokenUninit();
|
||||
PrincipalIfUninit();
|
||||
ConfigIfUninit();
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- Failed to load Ipc library, error = %s\n", dlerror());
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
PrincipalIfUninit();
|
||||
ConfigIfUninit();
|
||||
}
|
||||
}
|
||||
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))
|
||||
{
|
||||
char *pIdenTokenData;
|
||||
int idenTokenDataLen;
|
||||
|
||||
// Assume failure
|
||||
retStatus = CasaStatusBuild(CASA_SEVERITY_ERROR,
|
||||
CASA_FACILITY_AUTHTOKEN,
|
||||
CASA_STATUS_AUTHENTICATION_FAILURE);
|
||||
|
||||
// Token was decoded successfully, now submit the authentication token to the
|
||||
// authentication token validation service.
|
||||
if ((g_ipcSubmitReq)(g_atvsEndPointHandle,
|
||||
pDecodedTokenBuf,
|
||||
decodedTokenBufLen,
|
||||
&pIdenTokenData,
|
||||
&idenTokenDataLen) == 0)
|
||||
{
|
||||
// The submit succeeded, make sure that we got some identity data back.
|
||||
if (pIdenTokenData)
|
||||
{
|
||||
if (idenTokenDataLen != 0)
|
||||
{
|
||||
IdenTokenProviderIf *pIdenTokenProviderIf;
|
||||
|
||||
// The authentication token was validated, now obtain
|
||||
// Identity Token Provider interface.
|
||||
retStatus = GetIdenTokenProviderInterface("CasaIdentityToken", // tbd - Hard code until we enhance the protocol with the atvs to also return this information.
|
||||
&pIdenTokenProviderIf);
|
||||
if (CASA_SUCCESS(retStatus))
|
||||
{
|
||||
IdenTokenIf *pIdenTokenIf;
|
||||
|
||||
// Use the Identity Token Provider to get an Identity Token Interface instance
|
||||
retStatus = pIdenTokenProviderIf->getIdentityTokenIf(pIdenTokenProviderIf,
|
||||
pIdenTokenData,
|
||||
idenTokenDataLen,
|
||||
&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);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- ValidateAuthToken submit did not return identity token data\n", 0);
|
||||
}
|
||||
|
||||
// Free the buffer containing the identity token data
|
||||
free(pIdenTokenData);
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(0, "-ValidateAuthToken- ValidateAuthToken submit did not return identity token data buffer\n", 0);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
DbgTrace(1, "-ValidateAuthToken- ValidateAuthToken submit failed\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;
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
static void __attribute__((constructor))
|
||||
so_init()
|
||||
//
|
||||
// Arguments In: None.
|
||||
//
|
||||
// Arguments Out: None.
|
||||
//
|
||||
// Returns: Nothing.
|
||||
//
|
||||
// Abstract: Library initialization routine.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
// Check for environment variable specifying that the application is
|
||||
// multi-threaded.
|
||||
if (getenv(APPLICATION_NOT_MULTI_THREADED) != NULL)
|
||||
{
|
||||
// The parameter has been configured, remember it.
|
||||
g_multiThreadedApplication = false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
static void __attribute__((destructor))
|
||||
so_fini()
|
||||
//
|
||||
// Arguments In: None.
|
||||
//
|
||||
// Arguments Out: None.
|
||||
//
|
||||
// Returns: Nothing.
|
||||
//
|
||||
// Abstract: Library un-initialization routine.
|
||||
//
|
||||
// L2
|
||||
//=======================================================================--
|
||||
{
|
||||
if (g_ipcShutdownPtr)
|
||||
(g_ipcShutdownPtr)();
|
||||
}
|
||||
|
||||
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
//++=======================================================================
|
||||
|
||||
Reference in New Issue
Block a user