diff options
author | Frederic Peters <fpeters@entrouvert.com> | 2004-12-17 00:07:20 +0000 |
---|---|---|
committer | Frederic Peters <fpeters@entrouvert.com> | 2004-12-17 00:07:20 +0000 |
commit | f44d34eecbc4cf28d4831138a3b6544716c12c6d (patch) | |
tree | 9a846aa8e6365084ce14af46d39d3438ff1066e2 /lasso/xml | |
parent | 7258b5aa2b7d6de0fbe8b2dd2f5b98e40a29f17a (diff) | |
download | lasso-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.h | 10 | ||||
-rw-r--r-- | lasso/xml/lib_authn_request.c | 1 | ||||
-rw-r--r-- | lasso/xml/lib_idp_entry.c | 2 | ||||
-rw-r--r-- | lasso/xml/lib_register_name_identifier_request.c | 117 | ||||
-rw-r--r-- | lasso/xml/saml_name_identifier.c | 2 | ||||
-rw-r--r-- | lasso/xml/xml.c | 189 |
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 = '='; + } + +} + |