summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNicolas Clapies <nclapies@entrouvert.com>2005-02-24 16:38:46 +0000
committerNicolas Clapies <nclapies@entrouvert.com>2005-02-24 16:38:46 +0000
commitd5c84febbb9863fb833bf3a6f25ba1b5c105d75c (patch)
treeb08a4a7c4ea8df47990b72ff4c13469303694d13
parent492e69a25a33c6acd51671ae934e734ff9148578 (diff)
downloadlasso-d5c84febbb9863fb833bf3a6f25ba1b5c105d75c.tar.gz
lasso-d5c84febbb9863fb833bf3a6f25ba1b5c105d75c.tar.xz
lasso-d5c84febbb9863fb833bf3a6f25ba1b5c105d75c.zip
Added support of cyrus libsasl in id-wsf authentication service.
-rw-r--r--lasso/id-wsf/Makefile.am1
-rw-r--r--lasso/id-wsf/authentication.h25
-rw-r--r--lasso/xml/sa_sasl_response.c39
-rw-r--r--lasso/xml/strings.h8
-rw-r--r--lasso/xml/xml.c4
-rw-r--r--python/Makefile.am3
-rw-r--r--swig/Lasso-wsf.i311
7 files changed, 380 insertions, 11 deletions
diff --git a/lasso/id-wsf/Makefile.am b/lasso/id-wsf/Makefile.am
index 64c98248..251b8972 100644
--- a/lasso/id-wsf/Makefile.am
+++ b/lasso/id-wsf/Makefile.am
@@ -3,6 +3,7 @@ liblassoincludedir = $(includedir)/lasso/id-wsf
INCLUDES = \
-I$(top_srcdir) \
-I$(top_srcdir)/lasso \
+ $(SASL_CFLAGS) \
$(LASSO_CORE_CFLAGS) \
-DG_LOG_DOMAIN=\"lasso\"
diff --git a/lasso/id-wsf/authentication.h b/lasso/id-wsf/authentication.h
index dbc770a6..c99d7811 100644
--- a/lasso/id-wsf/authentication.h
+++ b/lasso/id-wsf/authentication.h
@@ -30,6 +30,8 @@ extern "C" {
#endif /* __cplusplus */
+#include <sasl.h>
+
#include <lasso/id-wsf/wsf_profile.h>
#include <lasso/xml/disco_description.h>
@@ -48,9 +50,19 @@ typedef struct _LassoAuthentication LassoAuthentication;
typedef struct _LassoAuthenticationClass LassoAuthenticationClass;
typedef struct _LassoAuthenticationPrivate LassoAuthenticationPrivate;
+typedef enum {
+ LASSO_SASL_OK = SASL_OK, /* 0 */
+ LASSO_SASL_CONTINUE = SASL_CONTINUE, /* 1 */
+ LASSO_SASL_INTERACT = SASL_INTERACT, /* 2 */
+} LassoSaslType;
+
struct _LassoAuthentication {
LassoWsfProfile parent;
+ /* The SASL context kept for the life of the connection */
+ sasl_conn_t *connection; /* FIXME : implement dispose method to release the connection */
+ sasl_interact_t **client_interact;
+
/*< private >*/
LassoAuthenticationPrivate *private_data;
};
@@ -63,9 +75,16 @@ LASSO_EXPORT GType lasso_authentication_get_type(void);
LASSO_EXPORT LassoAuthentication* lasso_authentication_new(LassoServer *server);
+LASSO_EXPORT gint lasso_authentication_client_start(LassoAuthentication *authentication);
+
+LASSO_EXPORT gint lasso_authentication_client_step(LassoAuthentication *authentication);
+
+LASSO_EXPORT char *lasso_authentication_get_mechanism_list(LassoAuthentication *authentication);
+
LASSO_EXPORT gint lasso_authentication_init_request(LassoAuthentication *authentication,
LassoDiscoDescription *description,
- const gchar *mechanism);
+ const char *mechanisms,
+ sasl_callback_t *callbacks);
LASSO_EXPORT gint lasso_authentication_process_request_msg(LassoAuthentication *authentication,
const gchar *soap_msg);
@@ -73,6 +92,10 @@ LASSO_EXPORT gint lasso_authentication_process_request_msg(LassoAuthentication *
LASSO_EXPORT gint lasso_authentication_process_response_msg(LassoAuthentication *authentication,
const gchar *soap_msg);
+LASSO_EXPORT gint lasso_authentication_server_start(LassoAuthentication *authentication);
+
+LASSO_EXPORT gint lasso_authentication_server_step(LassoAuthentication *authentication);
+
#ifdef __cplusplus
}
#endif /* __cplusplus */
diff --git a/lasso/xml/sa_sasl_response.c b/lasso/xml/sa_sasl_response.c
index fb2ed17a..39a8c822 100644
--- a/lasso/xml/sa_sasl_response.c
+++ b/lasso/xml/sa_sasl_response.c
@@ -75,6 +75,34 @@ static struct XmlSnippet schema_snippets[] = {
{ NULL, 0, 0}
};
+static LassoNodeClass *parent_class = NULL;
+
+static void
+insure_namespace(xmlNode *xmlnode, xmlNs *ns)
+{
+ xmlNode *t = xmlnode->children;
+
+ xmlSetNs(xmlnode, ns);
+ while (t) {
+ if (t->type == XML_ELEMENT_NODE && t->ns == NULL)
+ insure_namespace(t, ns);
+ t = t->next;
+ }
+}
+
+static xmlNode*
+get_xmlNode(LassoNode *node, gboolean lasso_dump)
+{
+ xmlNode *xmlnode;
+ xmlNs *ns;
+
+ xmlnode = parent_class->get_xmlNode(node, lasso_dump);
+ ns = xmlNewNs(xmlnode, LASSO_SA_HREF, LASSO_SA_PREFIX);
+ insure_namespace(xmlnode, ns);
+
+ return xmlnode;
+}
+
/*****************************************************************************/
/* instance and class init functions */
/*****************************************************************************/
@@ -95,12 +123,13 @@ instance_init(LassoSaSaslResponse *node)
static void
class_init(LassoSaSaslResponseClass *klass)
{
- LassoNodeClass *nclass = LASSO_NODE_CLASS(klass);
+ LassoNodeClass *nodeClass = LASSO_NODE_CLASS(klass);
- nclass->node_data = g_new0(LassoNodeClassData, 1);
- lasso_node_class_set_nodename(nclass, "SASLResponse");
- lasso_node_class_set_ns(nclass, LASSO_SA_HREF, LASSO_SA_PREFIX);
- lasso_node_class_add_snippets(nclass, schema_snippets);
+ parent_class = g_type_class_peek_parent(klass);
+ nodeClass->get_xmlNode = get_xmlNode;
+ nodeClass->node_data = g_new0(LassoNodeClassData, 1);
+ lasso_node_class_set_nodename(nodeClass, "SASLResponse");
+ lasso_node_class_add_snippets(nodeClass, schema_snippets);
}
GType
diff --git a/lasso/xml/strings.h b/lasso/xml/strings.h
index 1a15b801..e50b5f7b 100644
--- a/lasso/xml/strings.h
+++ b/lasso/xml/strings.h
@@ -157,6 +157,8 @@
#define LASSO_SA_HREF "urn:liberty:sa:2004-04"
#define LASSO_SA_PREFIX "sa"
+#define LASSO_SA_SASL_SERVICE_NAME "idwsf"
+
/* Interaction Service (interact attribute of is:UserInteraction element ) */
#define LASSO_IS_INTERACT_ATTR_INTERACT_IF_NEEDED "is:interactIfNeeded"
#define LASSO_IS_INTERACT_ATTR_DO_NOT_INTERACT "is:doNotInteract"
@@ -186,9 +188,9 @@
#define LASSO_DST_STATUS_CODE_TIME_OUT "TimeOut"
#define LASSO_DST_STATUS_CODE_UNEXPECTED_ERROR "UnexpectedError"
-#define LASSO_SA_STATUS_CODE_CONTINUE "sa:continue"
-#define LASSO_SA_STATUS_CODE_ABORT "sa:abort"
-#define LASSO_SA_STATUS_CODE_OK "sa:OK"
+#define LASSO_SA_STATUS_CODE_CONTINUE "continue"
+#define LASSO_SA_STATUS_CODE_ABORT "abort"
+#define LASSO_SA_STATUS_CODE_OK "OK"
/*****************************************************************************/
/* METADATA */
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index 52e084c2..fff3453e 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -727,6 +727,8 @@ lasso_node_new_from_xmlNode(xmlNode *xmlnode)
prefix = "Lib";
if (strcmp(xmlnode->ns->href, LASSO_LASSO_HREF) == 0)
prefix = "";
+ if (strcmp(xmlnode->ns->href, LASSO_SA_HREF) == 0)
+ prefix = "Sa";
if (strcmp(xmlnode->ns->href, LASSO_SAML_ASSERTION_HREF) == 0)
prefix = "Saml";
if (strcmp(xmlnode->ns->href, LASSO_SAML_PROTOCOL_HREF) == 0)
@@ -743,6 +745,8 @@ lasso_node_new_from_xmlNode(xmlNode *xmlnode)
prefix = "Utility";
if (strcmp(prefix, "Disco") == 0 && strcmp(xmlnode->name, "Status") == 0)
prefix = "Utility";
+ if (strcmp(prefix, "Sa") == 0 && strcmp(xmlnode->name, "Status") == 0)
+ prefix = "Utility";
xsitype = xmlGetNsProp(xmlnode, "type", LASSO_XSI_HREF);
if (xsitype) {
diff --git a/python/Makefile.am b/python/Makefile.am
index 603ed067..3dbf2047 100644
--- a/python/Makefile.am
+++ b/python/Makefile.am
@@ -1,4 +1,5 @@
-INCLUDES = -I$(top_srcdir)
+INCLUDES = -I$(top_srcdir) \
+ $(SASL_CFLAGS)
pythondir= $(PY_SITE_PACKAGES)
python_DATA = lasso.py
diff --git a/swig/Lasso-wsf.i b/swig/Lasso-wsf.i
index 9437c4f2..74337a21 100644
--- a/swig/Lasso-wsf.i
+++ b/swig/Lasso-wsf.i
@@ -25,7 +25,7 @@
*/
%{
-
+#include <lasso/id-wsf/authentication.h>
#include <lasso/id-wsf/discovery.h>
#include <lasso/id-wsf/interaction_profile_service.h>
#include <lasso/id-wsf/profile_service.h>
@@ -46,6 +46,8 @@
#include <lasso/xml/is_select.h>
#include <lasso/xml/is_text.h>
#include <lasso/xml/is_user_interaction.h>
+#include <lasso/xml/sa_sasl_request.h>
+#include <lasso/xml/sa_sasl_response.h>
%}
@@ -122,6 +124,19 @@
#define LASSO_DST_STATUS_CODE_UNEXPECTED_ERROR "UnexpectedError"
+/* Sasl cyrus code */
+#ifndef SWIGPHP4
+%rename(SASL_OK) LASSO_SASL_OK;
+%rename(SASL_CONTINUE) LASSO_SASL_CONTINUE;
+%rename(SASL_INTERACT) LASSO_SASL_INTERACT;
+#endif
+typedef enum {
+ LASSO_SASL_OK = SASL_OK,
+ LASSO_SASL_CONTINUE = SASL_CONTINUE,
+ LASSO_SASL_INTERACT = SASL_INTERACT,
+} LassoSaslType;
+
+
/***********************************************************************
***********************************************************************
* XML Elements in Discovery Namespace
@@ -2400,6 +2415,176 @@ typedef struct {
%}
+/***********************************************************************
+ ***********************************************************************
+ * XML Elements in Sa Namespace
+ ***********************************************************************
+ ***********************************************************************/
+
+/***********************************************************************
+ * sa:SaSaslRequest
+ ***********************************************************************/
+
+
+#ifndef SWIGPHP4
+%rename(SaSaslRequest) LassoSaSaslRequest;
+#endif
+typedef struct {
+ /* Attributes */
+
+ char *mechanism;
+
+ char *authzID;
+
+ char *advisoryAuthnID;
+
+ char *id;
+
+} LassoSaSaslRequest;
+%extend LassoSaSaslRequest {
+ /* Attributes */
+#ifndef SWIGPHP4
+ %rename(data) Data;
+#endif
+ %newobject Data_get;
+ LassoNodeList *Data;
+
+#ifndef SWIGPHP4
+ %rename(requestAuthnContext) RequestAuthnContext;
+#endif
+ %newobject RequestAuthnContext_get;
+ LassoNodeList *RequestAuthnContext;
+
+ /* Constructor, Destructor & Static Methods */
+
+ LassoSaSaslRequest(char *mechanism);
+
+ ~LassoSaSaslRequest();
+
+ /* Methods inherited from LassoNode */
+
+ %newobject dump;
+ char *dump();
+}
+
+%{
+
+/* Attributes Implementations */
+/* Data */
+#define LassoSaSaslRequest_get_Data(self) get_node_list((self)->Data)
+#define LassoSaSaslRequest_Data_get(self) get_node_list((self)->Data)
+#define LassoSaSaslRequest_set_Data(self, value) set_node_list(&(self)->Data, (value))
+#define LassoSaSaslRequest_Data_set(self, value) set_node_list(&(self)->Data, (value))
+
+/* RequestAuthnContext */
+#define LassoSaSaslRequest_get_RequestAuthnContext(self) get_node((self)->RequestAuthnContext)
+#define LassoSaSaslRequest_RequestAuthnContext_get(self) get_node((self)->RequestAuthnContext)
+#define LassoSaSaslRequest_set_RequestAuthnContext(self, value) set_node((gpointer *) &(self)->RequestAuthnContext, (value))
+#define LassoSaSaslRequest_RequestAuthnContext_set(self, value) set_node((gpointer *) &(self)->RequestAuthnContext, (value))
+
+/* Constructors, destructors & static methods implementations */
+
+#define new_LassoSaSaslRequest lasso_sa_sasl_request_new
+#define delete_LassoSaSaslRequest(self) lasso_node_destroy(LASSO_NODE(self))
+
+/* Implementations of methods inherited from LassoNode */
+
+#define LassoSaSaslRequest_dump(self) lasso_node_dump(LASSO_NODE(self))
+
+%}
+
+/***********************************************************************
+ * sa:SaSaslResponse
+ ***********************************************************************/
+
+
+#ifndef SWIGPHP4
+%rename(SaSaslResponse) LassoSaSaslResponse;
+#endif
+typedef struct {
+ /* Attributes */
+
+ char *serverMechanism;
+
+ char *id;
+
+} LassoSaSaslResponse;
+%extend LassoSaSaslResponse {
+ /* Attributes */
+#ifndef SWIGPHP4
+ %rename(data) Data;
+#endif
+ %newobject Data_get;
+ LassoNodeList *Data;
+
+#ifndef SWIGPHP4
+ %rename(passwordTransforms) PasswordTransforms;
+#endif
+ %newobject PasswordTransforms_get;
+ LassoNodeList *PasswordTransforms;
+
+#ifndef SWIGPHP4
+ %rename(resourceOffering) ResourceOffering;
+#endif
+ %newobject ResourceOffering_get;
+ LassoNodeList *ResourceOffering;
+
+#ifndef SWIGPHP4
+ %rename(status) Status;
+#endif
+ %newobject Status_get;
+ LassoUtilityStatus *Status;
+
+ /* Constructor, Destructor & Static Methods */
+
+ LassoSaSaslResponse(LassoUtilityStatus *status);
+
+ ~LassoSaSaslResponse();
+
+ /* Methods inherited from LassoNode */
+
+ %newobject dump;
+ char *dump();
+}
+
+%{
+
+/* Attributes Implementations */
+/* Data */
+#define LassoSaSaslResponse_get_Data(self) get_node_list((self)->Data)
+#define LassoSaSaslResponse_Data_get(self) get_node_list((self)->Data)
+#define LassoSaSaslResponse_set_Data(self, value) set_node_list(&(self)->Data, (value))
+#define LassoSaSaslResponse_Data_set(self, value) set_node_list(&(self)->Data, (value))
+
+/* PasswordTransforms */
+#define LassoSaSaslResponse_get_PasswordTransforms(self) get_node_list((self)->PasswordTransforms)
+#define LassoSaSaslResponse_PasswordTransforms_get(self) get_node_list((self)->PasswordTransforms)
+#define LassoSaSaslResponse_set_PasswordTransforms(self, value) set_node_list(&(self)->PasswordTransforms, (value))
+#define LassoSaSaslResponse_PasswordTransforms_set(self, value) set_node_list(&(self)->PasswordTransforms, (value))
+
+/* ResourceOffering */
+#define LassoSaSaslResponse_get_ResourceOffering(self) get_node_list((self)->ResourceOffering)
+#define LassoSaSaslResponse_ResourceOffering_get(self) get_node_list((self)->ResourceOffering)
+#define LassoSaSaslResponse_set_ResourceOffering(self, value) set_node_list(&(self)->ResourceOffering, (value))
+#define LassoSaSaslResponse_ResourceOffering_set(self, value) set_node_list(&(self)->ResourceOffering, (value))
+
+/* Status */
+#define LassoSaSaslResponse_get_Status(self) get_node((self)->Status)
+#define LassoSaSaslResponse_Status_get(self) get_node((self)->Status)
+#define LassoSaSaslResponse_set_Status(self, value) set_node((gpointer *) &(self)->Status, (value))
+#define LassoSaSaslResponse_Status_set(self, value) set_node((gpointer *) &(self)->Status, (value))
+
+/* Constructors, destructors & static methods implementations */
+
+#define new_LassoSaSaslResponse lasso_sa_sasl_response_new
+#define delete_LassoSaSaslResponse(self) lasso_node_destroy(LASSO_NODE(self))
+
+/* Implementations of methods inherited from LassoNode */
+
+#define LassoSaSaslResponse_dump(self) lasso_node_dump(LASSO_NODE(self))
+
+%}
+
/***********************************************************************
***********************************************************************
@@ -2910,3 +3095,127 @@ gint LassoProfileService_buildResponseMsg(LassoProfileService *self) {
#define LassoProfileService_processQueryResponseMsg lasso_profile_service_process_query_response_msg
%}
+
+
+/***********************************************************************
+ * lasso:Authentication
+ ***********************************************************************/
+
+
+#ifndef SWIGPHP4
+%rename(Authentication) LassoAuthentication;
+#endif
+typedef struct {
+} LassoAuthentication;
+%extend LassoAuthentication {
+ /* Attributes inherited from WsfProfile */
+
+ %immutable msgBody;
+ char *msgBody;
+
+ %immutable msgUrl;
+ char *msgUrl;
+
+ %newobject request_get;
+ LassoSaSaslRequest *request;
+
+ %newobject response_get;
+ LassoSaSaslResponse *response;
+
+ %newobject server_get;
+ LassoServer *server;
+
+ /* Constructor, Destructor & Static Methods */
+
+ LassoAuthentication(LassoServer *server);
+
+ ~LassoAuthentication();
+
+ /* Methods inherited from LassoNode */
+
+ /* Methods inherited from WsfProfile */
+
+ THROW_ERROR
+ int buildRequestMsg();
+ END_THROW_ERROR
+
+ THROW_ERROR
+ int buildResponseMsg();
+ END_THROW_ERROR
+
+ /* Methods */
+ int clientStart();
+
+ int clientStep();
+
+ THROW_ERROR
+ int getMechanismList();
+ END_THROW_ERROR
+
+ int initRequest(LassoDiscoDescription *description, char *mechanisms, sasl_callback_t *callbacks = NULL);
+
+ int processRequestMsg(char *soap_msg);
+
+ int processResponseMsg(char *soap_msg);
+
+ int serverStart();
+
+ int serverStep();
+}
+
+%{
+
+/* Attributes inherited from WsfProfile implementations */
+
+/* msgBody */
+#define LassoAuthentication_get_msgBody(self) LASSO_WSF_PROFILE(self)->msg_body
+#define LassoAuthentication_msgBody_get(self) LASSO_WSF_PROFILE(self)->msg_body
+
+/* msgUrl */
+#define LassoAuthentication_get_msgUrl(self) LASSO_WSF_PROFILE(self)->msg_url
+#define LassoAuthentication_msgUrl_get(self) LASSO_WSF_PROFILE(self)->msg_url
+
+/* request */
+#define LassoAuthentication_get_request(self) get_node(LASSO_WSF_PROFILE(self)->request)
+#define LassoAuthentication_request_get(self) get_node(LASSO_WSF_PROFILE(self)->request)
+#define LassoAuthentication_set_request(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->request, (value))
+#define LassoAuthentication_request_set(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->request, (value))
+
+/* response */
+#define LassoAuthentication_get_response(self) get_node(LASSO_WSF_PROFILE(self)->response)
+#define LassoAuthentication_response_get(self) get_node(LASSO_WSF_PROFILE(self)->response)
+#define LassoAuthentication_set_response(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->response, (value))
+#define LassoAuthentication_response_set(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->response, (value))
+
+/* server */
+#define LassoAuthentication_get_server(self) get_node(LASSO_WSF_PROFILE(self)->server)
+#define LassoAuthentication_server_get(self) get_node(LASSO_WSF_PROFILE(self)->server)
+#define LassoAuthentication_set_server(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->server, (value))
+#define LassoAuthentication_server_set(self, value) set_node((gpointer *) &LASSO_WSF_PROFILE(self)->server, (value))
+
+/* Constructors, destructors & static methods implementations */
+
+#define new_LassoAuthentication lasso_authentication_new
+#define delete_LassoAuthentication(self) lasso_node_destroy(LASSO_NODE(self))
+
+/* Implementations of methods inherited from WsfProfile */
+
+gint LassoAuthentication_buildRequestMsg(LassoAuthentication *self) {
+ return lasso_wsf_profile_build_request_msg(LASSO_WSF_PROFILE(self));
+}
+
+gint LassoAuthentication_buildResponseMsg(LassoAuthentication *self) {
+ return lasso_wsf_profile_build_response_msg(LASSO_WSF_PROFILE(self));
+}
+
+/* Methods implementations */
+#define LassoAuthentication_clientStart lasso_authentication_client_start
+#define LassoAuthentication_clientStep lasso_authentication_client_step
+#define LassoAuthentication_getMechanismList lasso_authentication_get_mechanism_list
+#define LassoAuthentication_initRequest lasso_authentication_init_request
+#define LassoAuthentication_processRequestMsg lasso_authentication_process_request_msg
+#define LassoAuthentication_processResponseMsg lasso_authentication_process_response_msg
+#define LassoAuthentication_serverStart lasso_authentication_server_start
+#define LassoAuthentication_serverStep lasso_authentication_server_step
+
+%}