summaryrefslogtreecommitdiffstats
path: root/lasso/xml
diff options
context:
space:
mode:
authorFrederic Peters <fpeters@entrouvert.com>2004-12-17 00:07:20 +0000
committerFrederic Peters <fpeters@entrouvert.com>2004-12-17 00:07:20 +0000
commitf44d34eecbc4cf28d4831138a3b6544716c12c6d (patch)
tree9a846aa8e6365084ce14af46d39d3438ff1066e2 /lasso/xml
parent7258b5aa2b7d6de0fbe8b2dd2f5b98e40a29f17a (diff)
downloadlasso-f44d34eecbc4cf28d4831138a3b6544716c12c6d.tar.gz
lasso-f44d34eecbc4cf28d4831138a3b6544716c12c6d.tar.xz
lasso-f44d34eecbc4cf28d4831138a3b6544716c12c6d.zip
new (draft) query snippet mechanism to generate query string; deployed in
<lib:RegisterNameIdentifier/>
Diffstat (limited to 'lasso/xml')
-rw-r--r--lasso/xml/internals.h10
-rw-r--r--lasso/xml/lib_authn_request.c1
-rw-r--r--lasso/xml/lib_idp_entry.c2
-rw-r--r--lasso/xml/lib_register_name_identifier_request.c117
-rw-r--r--lasso/xml/saml_name_identifier.c2
-rw-r--r--lasso/xml/xml.c189
6 files changed, 226 insertions, 95 deletions
diff --git a/lasso/xml/internals.h b/lasso/xml/internals.h
index efc065a8..65be0183 100644
--- a/lasso/xml/internals.h
+++ b/lasso/xml/internals.h
@@ -53,9 +53,15 @@ struct XmlSnippet {
guint offset;
};
+struct QuerySnippet {
+ char *path;
+ char *field_name;
+};
+
struct _LassoNodeClassData
{
struct XmlSnippet *snippets;
+ struct QuerySnippet *query_snippets;
char *node_name;
xmlNs *ns;
};
@@ -63,6 +69,10 @@ struct _LassoNodeClassData
void lasso_node_class_set_nodename(LassoNodeClass *klass, char *name);
void lasso_node_class_set_ns(LassoNodeClass *klass, char *href, char *prefix);
void lasso_node_class_add_snippets(LassoNodeClass *klass, struct XmlSnippet *snippets);
+void lasso_node_class_add_query_snippets(LassoNodeClass *klass, struct QuerySnippet *snippets);
+
+gchar* lasso_node_build_query_from_snippets(LassoNode *node);
+void lasso_node_init_from_query_fields(LassoNode *node, char **query_fields);
#ifdef __cplusplus
}
diff --git a/lasso/xml/lib_authn_request.c b/lasso/xml/lib_authn_request.c
index 5b1ddceb..9c513912 100644
--- a/lasso/xml/lib_authn_request.c
+++ b/lasso/xml/lib_authn_request.c
@@ -88,6 +88,7 @@
static struct XmlSnippet schema_snippets[] = {
{ "Extension", SNIPPET_EXTENSION, G_STRUCT_OFFSET(LassoLibAuthnRequest, Extension) },
{ "ProviderID", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibAuthnRequest, ProviderID) },
+ { "AffiliationID", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibAuthnRequest, AffiliationID) },
{ "NameIDPolicy", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibAuthnRequest, NameIDPolicy) },
{ "ProtocolProfile", SNIPPET_CONTENT,
G_STRUCT_OFFSET(LassoLibAuthnRequest, ProtocolProfile) },
diff --git a/lasso/xml/lib_idp_entry.c b/lasso/xml/lib_idp_entry.c
index 80dbc629..ad5fb2fc 100644
--- a/lasso/xml/lib_idp_entry.c
+++ b/lasso/xml/lib_idp_entry.c
@@ -44,9 +44,9 @@
/*****************************************************************************/
static struct XmlSnippet schema_snippets[] = {
- { "Loc", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibIDPEntry, Loc) },
{ "ProviderID", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibIDPEntry, ProviderID) },
{ "ProviderName", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibIDPEntry, ProviderName) },
+ { "Loc", SNIPPET_CONTENT, G_STRUCT_OFFSET(LassoLibIDPEntry, Loc) },
{ NULL, 0, 0}
};
diff --git a/lasso/xml/lib_register_name_identifier_request.c b/lasso/xml/lib_register_name_identifier_request.c
index 0846275c..e792fadd 100644
--- a/lasso/xml/lib_register_name_identifier_request.c
+++ b/lasso/xml/lib_register_name_identifier_request.c
@@ -79,112 +79,45 @@ static struct XmlSnippet schema_snippets[] = {
{ NULL, 0, 0}
};
+static struct QuerySnippet query_snippets[] = {
+ { "RequestID", NULL },
+ { "MajorVersion", NULL },
+ { "MinorVersion", NULL },
+ { "IssueInstant", NULL },
+ { "ProviderID", NULL },
+ { "IDPProvidedNameIdentifier/NameQualifier", "IDPNameQualifier"},
+ { "IDPProvidedNameIdentifier/Format", "IDPNameFormat"},
+ { "IDPProvidedNameIdentifier/content", "IDPProvidedNameIdentifier"},
+ { "SPProvidedNameIdentifier/NameQualifier", "SPNameQualifier"},
+ { "SPProvidedNameIdentifier/Format", "SPNameFormat"},
+ { "SPProvidedNameIdentifier/content", "SPProvidedNameIdentifier"},
+ { "OldProvidedNameIdentifier/NameQualifier", "OldNameQualifier"},
+ { "OldProvidedNameIdentifier/Format", "OldNameFormat"},
+ { "OldProvidedNameIdentifier/content", "OldProvidedNameIdentifier"},
+ { "RelayState", NULL },
+ { NULL }
+};
+
static LassoNodeClass *parent_class = NULL;
static gchar*
build_query(LassoNode *node)
{
- char *str, *t;
- GString *s;
- LassoLibRegisterNameIdentifierRequest *request;
-
- request = LASSO_LIB_REGISTER_NAME_IDENTIFIER_REQUEST(node);
-
- str = parent_class->build_query(node);
- s = g_string_new(str);
- g_free(str);
-
- if (request->ProviderID) {
- t = xmlURIEscapeStr(request->ProviderID, NULL);
- g_string_append_printf(s, "&ProviderID=%s", t);
- xmlFree(t);
- }
- if (request->IDPProvidedNameIdentifier) {
- t = lasso_saml_name_identifier_build_query(
- request->IDPProvidedNameIdentifier, "IDP", "IDPProvided");
- g_string_append_printf(s, "&%s", t);
- g_free(t);
- }
- if (request->SPProvidedNameIdentifier) {
- t = lasso_saml_name_identifier_build_query(
- request->SPProvidedNameIdentifier, "SP", "SPProvided");
- g_string_append_printf(s, "&%s", t);
- g_free(t);
- }
- if (request->OldProvidedNameIdentifier) {
- t = lasso_saml_name_identifier_build_query(
- request->OldProvidedNameIdentifier, "Old", "OldProvided");
- g_string_append_printf(s, "&%s", t);
- g_free(t);
- }
- if (request->RelayState)
- g_string_append_printf(s, "&RelayState=%s", request->RelayState);
-
- str = s->str;
- g_string_free(s, FALSE);
-
- return str;
+ return lasso_node_build_query_from_snippets(node);
}
static gboolean
init_from_query(LassoNode *node, char **query_fields)
{
LassoLibRegisterNameIdentifierRequest *request;
- int i;
- char *t;
request = LASSO_LIB_REGISTER_NAME_IDENTIFIER_REQUEST(node);
request->IDPProvidedNameIdentifier = lasso_saml_name_identifier_new();
request->SPProvidedNameIdentifier = lasso_saml_name_identifier_new();
request->OldProvidedNameIdentifier = lasso_saml_name_identifier_new();
-
- for (i=0; (t=query_fields[i]); i++) {
- if (g_str_has_prefix(t, "ProviderID=")) {
- request->ProviderID = g_strdup(t+11);
- continue;
- }
- if (g_str_has_prefix(t, "RelayState=")) {
- request->RelayState = g_strdup(t+11);
- continue;
- }
- if (g_str_has_prefix(t, "IDPProvidedNameIdentifier=")) {
- request->IDPProvidedNameIdentifier->content = g_strdup(t+26);
- continue;
- }
- if (g_str_has_prefix(t, "IDPNameFormat=")) {
- request->IDPProvidedNameIdentifier->Format = g_strdup(t+14);
- continue;
- }
- if (g_str_has_prefix(t, "IDPNameQualifier=")) {
- request->IDPProvidedNameIdentifier->NameQualifier = g_strdup(t+17);
- continue;
- }
- if (g_str_has_prefix(t, "SPProvidedNameIdentifier=")) {
- request->SPProvidedNameIdentifier->content = g_strdup(t+25);
- continue;
- }
- if (g_str_has_prefix(t, "SPNameFormat=")) {
- request->SPProvidedNameIdentifier->Format = g_strdup(t+13);
- continue;
- }
- if (g_str_has_prefix(t, "SPNameQualifier=")) {
- request->SPProvidedNameIdentifier->NameQualifier = g_strdup(t+16);
- continue;
- }
- if (g_str_has_prefix(t, "OldProvidedNameIdentifier=")) {
- request->OldProvidedNameIdentifier->content = g_strdup(t+26);
- continue;
- }
- if (g_str_has_prefix(t, "OldNameFormat=")) {
- request->OldProvidedNameIdentifier->Format = g_strdup(t+14);
- continue;
- }
- if (g_str_has_prefix(t, "OldNameQualifier=")) {
- request->OldProvidedNameIdentifier->NameQualifier = g_strdup(t+17);
- continue;
- }
- }
+
+ lasso_node_init_from_query_fields(node, query_fields);
if (request->IDPProvidedNameIdentifier->content == NULL) {
g_object_unref(request->IDPProvidedNameIdentifier);
@@ -205,12 +138,10 @@ init_from_query(LassoNode *node, char **query_fields)
return FALSE;
}
- return parent_class->init_from_query(node, query_fields);
+ return TRUE;
}
-
-
/*****************************************************************************/
/* instance and class init functions */
/*****************************************************************************/
@@ -237,6 +168,7 @@ class_init(LassoLibRegisterNameIdentifierRequestClass *klass)
lasso_node_class_set_nodename(nclass, "RegisterNameIdentifierRequest");
lasso_node_class_set_ns(nclass, LASSO_LIB_HREF, LASSO_LIB_PREFIX);
lasso_node_class_add_snippets(nclass, schema_snippets);
+ lasso_node_class_add_query_snippets(nclass, query_snippets);
}
GType
@@ -294,7 +226,6 @@ lasso_lib_register_name_identifier_request_new_full(const char *providerID,
request->SPProvidedNameIdentifier = spNameIdentifier;
request->OldProvidedNameIdentifier = oldNameIdentifier;
-
return LASSO_NODE(request);
}
diff --git a/lasso/xml/saml_name_identifier.c b/lasso/xml/saml_name_identifier.c
index 55c7c373..2599f3a0 100644
--- a/lasso/xml/saml_name_identifier.c
+++ b/lasso/xml/saml_name_identifier.c
@@ -83,7 +83,7 @@ static struct XmlSnippet schema_snippets[] = {
{ "NameQualifier", SNIPPET_ATTRIBUTE,
G_STRUCT_OFFSET(LassoSamlNameIdentifier, NameQualifier) },
{ "Format", SNIPPET_ATTRIBUTE, G_STRUCT_OFFSET(LassoSamlNameIdentifier, Format) },
- { "", SNIPPET_TEXT_CHILD, G_STRUCT_OFFSET(LassoSamlNameIdentifier, content) },
+ { "content", SNIPPET_TEXT_CHILD, G_STRUCT_OFFSET(LassoSamlNameIdentifier, content) },
{ NULL, 0, 0 }
};
diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c
index 4442dc48..87487a37 100644
--- a/lasso/xml/xml.c
+++ b/lasso/xml/xml.c
@@ -41,6 +41,11 @@
static void lasso_node_build_xmlNode_from_snippets(
LassoNode *node, xmlNode *xmlnode, struct XmlSnippet *snippets);
+static struct XmlSnippet* find_xml_snippet_by_name(LassoNode *node, char *name);
+static int set_value_at_path(LassoNode *node, char *path, char *query_value);
+static char* get_value_by_path(LassoNode *node, char *path);
+static int find_path(LassoNode *node, char *path, LassoNode **value_node,
+ struct XmlSnippet **snippet);
/*****************************************************************************/
@@ -977,6 +982,16 @@ lasso_node_class_add_snippets(LassoNodeClass *klass, struct XmlSnippet *snippets
klass->node_data->snippets = snippets;
}
+/**
+ * lasso_node_class_add_snippets
+ * @klass: object class
+ * @snippets: array of QuerySnippet (NULL terminated)
+ **/
+void
+lasso_node_class_add_query_snippets(LassoNodeClass *klass, struct QuerySnippet *snippets)
+{
+ klass->node_data->query_snippets = snippets;
+}
/**
* lasso_node_class_set_nodename
@@ -1026,6 +1041,7 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode,
snippet->type & SNIPPET_INTEGER) )
continue;
+ /* XXX: not sure it is 64-bits clean */
if (snippet->type & SNIPPET_BOOLEAN)
str = GPOINTER_TO_INT(value) ? "true" : "false";
if (snippet->type & SNIPPET_INTEGER)
@@ -1090,3 +1106,176 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode,
}
}
+static struct XmlSnippet*
+find_xml_snippet_by_name(LassoNode *node, char *name)
+{
+ LassoNodeClass *class;
+ struct XmlSnippet *snippet;
+
+ class = LASSO_NODE_GET_CLASS(node);
+ while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) {
+ for (snippet = class->node_data->snippets;
+ snippet->name && strcmp(snippet->name, name) != 0;
+ snippet++) ;
+ if (snippet->name)
+ return snippet;
+ class = g_type_class_peek_parent(class);
+ }
+
+ return NULL;
+}
+
+static int
+find_path(LassoNode *node, char *path, LassoNode **value_node, struct XmlSnippet **snippet)
+{
+ char *s, *t;
+ struct XmlSnippet *tsnippet = NULL;
+ LassoNode *tnode = node;
+
+ s = path;
+ while (s-1) {
+ t = strchr(s, '/');
+ if (t) *t = 0;
+ tsnippet = find_xml_snippet_by_name(tnode, s);
+ if (t) {
+ tnode = G_STRUCT_MEMBER(LassoNode*, tnode, tsnippet->offset);
+ if (tnode == NULL)
+ return -1;
+ }
+ s = t+1;
+ }
+
+ *snippet = tsnippet;
+ *value_node = tnode;
+ return 0;
+}
+
+
+static char*
+get_value_by_path(LassoNode *node, char *path)
+{
+ struct XmlSnippet *snippet;
+ LassoNode *value_node;
+ void *value;
+
+ if (find_path(node, path, &value_node, &snippet) != 0)
+ return NULL;
+
+ if (snippet->type & SNIPPET_BOOLEAN) {
+ gboolean v = G_STRUCT_MEMBER(gboolean, value_node, snippet->offset);
+ return v ? g_strdup("true") : g_strdup("false");
+ } else if (snippet->type & SNIPPET_INTEGER) {
+ int v = G_STRUCT_MEMBER(int, value_node, snippet->offset);
+ return g_strdup_printf("%d", v);
+ } else {
+ value = G_STRUCT_MEMBER(char*, value_node, snippet->offset);
+ if (value == NULL) return NULL;
+ return g_strdup(value);
+ }
+ return NULL;
+}
+
+static int
+set_value_at_path(LassoNode *node, char *path, char *query_value)
+{
+ struct XmlSnippet *snippet;
+ LassoNode *value_node;
+ void *value;
+
+ if (find_path(node, path, &value_node, &snippet) != 0)
+ return -1;
+
+ value = G_STRUCT_MEMBER_P(value_node, snippet->offset);
+
+ if (snippet->type & SNIPPET_INTEGER) {
+ int val = atoi(query_value);
+ (*(int*)value) = val;
+ } else if (snippet->type & SNIPPET_BOOLEAN) {
+ int val = (strcmp(query_value, "true") == 0);
+ (*(int*)value) = val;
+ } else {
+ (*(char**)value) = g_strdup(query_value);
+ }
+
+ return 0;
+}
+
+
+gchar*
+lasso_node_build_query_from_snippets(LassoNode *node)
+{
+ int i;
+ char path[100];
+ char *v;
+ GString *s;
+ xmlChar *t;
+ LassoNodeClass *class = LASSO_NODE_GET_CLASS(node);
+ struct QuerySnippet *query_snippets;
+
+ query_snippets = class->node_data->query_snippets;
+
+ s = g_string_sized_new(2000);
+
+ for (i=0; query_snippets[i].path; i++) {
+#if 0
+ fprintf(stderr, "getting value at %s\n", query_snippets[i].path);
+#endif
+ memset(path, 0, 100);
+ strncpy(path, query_snippets[i].path, 100);
+ v = get_value_by_path(node, path);
+ if (v) {
+ char *field_name = query_snippets[i].field_name;
+ if (field_name == NULL)
+ field_name = query_snippets[i].path;
+ if (s->len)
+ g_string_append(s, "&");
+ g_string_append(s, field_name);
+ g_string_append(s, "=");
+ t = xmlURIEscapeStr(v, NULL);
+ g_string_append(s, t);
+ xmlFree(t);
+ }
+ }
+
+ v = s->str;
+ g_string_free(s, FALSE);
+
+ return v;
+}
+
+
+void
+lasso_node_init_from_query_fields(LassoNode *node, char **query_fields)
+{
+ int i, j;
+ char *field, *t;
+ LassoNodeClass *class = LASSO_NODE_GET_CLASS(node);
+ struct QuerySnippet *query_snippets;
+
+ query_snippets = class->node_data->query_snippets;
+
+ for (i=0; (field=query_fields[i]); i++) {
+ t = strchr(field, '=');
+ if (t == NULL)
+ continue;
+ *t = 0;
+
+ for (j=0; query_snippets[j].path; j++) {
+ char *field_name = query_snippets[j].field_name;
+ char path[100];
+
+ memset(path, 0, 100);
+ strncpy(path, query_snippets[j].path, 100);
+
+ if (field_name == NULL)
+ field_name = query_snippets[j].path;
+ if (strcmp(field, field_name) != 0)
+ continue;
+ set_value_at_path(node, path, t+1);
+ break;
+ }
+ *t = '=';
+ }
+
+}
+