diff options
-rw-r--r-- | bindings/python/wrapper_top.c | 3 | ||||
-rw-r--r-- | lasso/saml-2.0/profile.c | 1 | ||||
-rw-r--r-- | lasso/xml/private.h | 24 | ||||
-rw-r--r-- | lasso/xml/saml-2.0/saml2_subject_confirmation_data.c | 10 | ||||
-rw-r--r-- | lasso/xml/xml.c | 158 |
5 files changed, 130 insertions, 66 deletions
diff --git a/bindings/python/wrapper_top.c b/bindings/python/wrapper_top.c index 7879bb13..c80bf1d6 100644 --- a/bindings/python/wrapper_top.c +++ b/bindings/python/wrapper_top.c @@ -606,8 +606,9 @@ static PyObject *get_logger_object() { } /* XXX: needed so that PyImport_ImportModule("logging") always works */ logging_module = PyImport_ImportModule("sys"); - if (logging_module) + if (logging_module) { Py_DECREF(logging_module); + } logging_module = PyImport_ImportModule("logging"); if (logging_module) { _logger_object = PyObject_CallMethod(logging_module, "getLogger", diff --git a/lasso/saml-2.0/profile.c b/lasso/saml-2.0/profile.c index 8422eee9..7921e04a 100644 --- a/lasso/saml-2.0/profile.c +++ b/lasso/saml-2.0/profile.c @@ -917,6 +917,7 @@ lasso_saml20_profile_build_request_msg(LassoProfile *profile, const char *servic break; case LASSO_HTTP_METHOD_PAOS: rc = lasso_profile_saml20_build_paos_request_msg(profile, url); + break; default: rc = LASSO_PROFILE_ERROR_INVALID_HTTP_METHOD; break; diff --git a/lasso/xml/private.h b/lasso/xml/private.h index 372fb228..249eeaf0 100644 --- a/lasso/xml/private.h +++ b/lasso/xml/private.h @@ -60,6 +60,7 @@ typedef enum { SNIPPET_ANY = 1 << 25, /* ##any node */ SNIPPET_ALLOW_TEXT = 1 << 26, /* allow text childs in list of nodes */ SNIPPET_KEEP_XMLNODE = 1 << 27, /* force keep xmlNode */ + SNIPPET_PRIVATE = 1 << 28, /* means that the offset is relative to a private extension */ } SnippetType; typedef enum { @@ -78,6 +79,29 @@ struct XmlSnippet { char *ns_uri; }; + +/** + * This inline method replace normal use of G_STRUCT_MEMBER_P/G_STRUCT_MEMBER, in order to add an + * indirection through the private structure attached to a GObject instance if needed */ +inline static void * +snippet_struct_member(void *base, GType type, struct XmlSnippet *snippet) +{ + if (snippet->type & SNIPPET_PRIVATE) { + if (! G_IS_OBJECT(base)) + return NULL; + GObject *object = (GObject*)base; + base = g_type_instance_get_private((GTypeInstance*)object, + type); + } + return G_STRUCT_MEMBER_P(base, snippet->offset); +} + +#define SNIPPET_STRUCT_MEMBER(type, base, gtype, snippet) \ + (*(type*)snippet_struct_member(base, gtype, snippet)) + +#define SNIPPET_STRUCT_MEMBER_P(base, gtype, snippet) \ + snippet_struct_member(base, gtype, snippet) + struct QuerySnippet { char *path; char *field_name; diff --git a/lasso/xml/saml-2.0/saml2_subject_confirmation_data.c b/lasso/xml/saml-2.0/saml2_subject_confirmation_data.c index 7e7f97e4..3bc05cec 100644 --- a/lasso/xml/saml-2.0/saml2_subject_confirmation_data.c +++ b/lasso/xml/saml-2.0/saml2_subject_confirmation_data.c @@ -51,6 +51,11 @@ * </figure> */ +struct _LassoSaml2SubjectConfirmationDataPrivate { + GList *any; /* of LassoMiscTextNode */ + GHashTable *attributes; +}; + /*****************************************************************************/ /* private methods */ /*****************************************************************************/ @@ -67,6 +72,10 @@ static struct XmlSnippet schema_snippets[] = { G_STRUCT_OFFSET(LassoSaml2SubjectConfirmationData, InResponseTo), NULL, NULL, NULL}, { "Address", SNIPPET_ATTRIBUTE, G_STRUCT_OFFSET(LassoSaml2SubjectConfirmationData, Address), NULL, NULL, NULL}, + { "", SNIPPET_LIST_NODES | SNIPPET_ANY | SNIPPET_PRIVATE, + G_STRUCT_OFFSET(struct _LassoSaml2SubjectConfirmationDataPrivate, any), NULL, NULL, NULL}, + { "", SNIPPET_ATTRIBUTE | SNIPPET_ANY | SNIPPET_PRIVATE, + G_STRUCT_OFFSET(struct _LassoSaml2SubjectConfirmationDataPrivate, attributes), NULL, NULL, NULL}, {NULL, 0, 0, NULL, NULL, NULL} }; @@ -88,6 +97,7 @@ class_init(LassoSaml2SubjectConfirmationDataClass *klass) lasso_node_class_set_nodename(nclass, "SubjectConfirmationData"); lasso_node_class_set_ns(nclass, LASSO_SAML2_ASSERTION_HREF, LASSO_SAML2_ASSERTION_PREFIX); lasso_node_class_add_snippets(nclass, schema_snippets); + g_type_class_add_private(klass, sizeof(struct _LassoSaml2SubjectConfirmationDataPrivate)); } GType diff --git a/lasso/xml/xml.c b/lasso/xml/xml.c index 62f16cac..13480f33 100644 --- a/lasso/xml/xml.c +++ b/lasso/xml/xml.c @@ -58,13 +58,13 @@ #include "./id-wsf-2.0/idwsf2_strings.h" #endif -static void lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode, +static void lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, xmlNode *xmlnode, struct XmlSnippet *snippets, gboolean lasso_dump); -static struct XmlSnippet* find_xml_snippet_by_name(LassoNode *node, char *name); +static struct XmlSnippet* find_xml_snippet_by_name(LassoNode *node, char *name, LassoNodeClass **class_p); static gboolean set_value_at_path(LassoNode *node, char *path, char *query_value); static char* get_value_by_path(LassoNode *node, char *path, struct XmlSnippet *xml_snippet); static gboolean find_path(LassoNode *node, char *path, LassoNode **value_node, - struct XmlSnippet **snippet); + LassoNodeClass **class_p, struct XmlSnippet **snippet); static void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode, struct XmlSnippet *snippet_signature); @@ -84,7 +84,6 @@ GHashTable *idwsf2_dst_services_by_prefix = NULL; /* ID-WSF 2 DST services, inde /* global methods */ /*****************************************************************************/ - /** * lasso_register_dst_service: * @prefix: prefix of DST service @@ -1145,42 +1144,43 @@ lasso_node_traversal(LassoNode *node, void (*do_to_node)(LassoNode *node, Snippe LassoNodeClass *class; struct XmlSnippet *snippet; - if (node == NULL) { + if (node == NULL || do_to_node == NULL) { return; } class = LASSO_NODE_GET_CLASS(node); - if (class == NULL || class->node_data == NULL || do_to_node == NULL) { - return; - } do_to_node(node, type); - snippet = class->node_data->snippets; - while (snippet->name != NULL) { - SnippetType type; - void **value = G_STRUCT_MEMBER_P(node, snippet->offset); + while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) { + GType g_type = G_TYPE_FROM_CLASS(class); + snippet = class->node_data->snippets; + while (snippet->name != NULL) { + SnippetType type; + void **value = SNIPPET_STRUCT_MEMBER_P(node, g_type, snippet); - type = snippet->type & 0xff; - switch (type) { - case SNIPPET_NODE: - case SNIPPET_NAME_IDENTIFIER: - case SNIPPET_NODE_IN_CHILD: - lasso_node_traversal(*value, do_to_node, snippet->type); - break; - case SNIPPET_LIST_NODES: - { - GList *list = *value; - while (list != NULL) { - if (list->data) { - lasso_node_traversal(LASSO_NODE(list->data), do_to_node, snippet->type); + type = snippet->type & 0xff; + switch (type) { + case SNIPPET_NODE: + case SNIPPET_NAME_IDENTIFIER: + case SNIPPET_NODE_IN_CHILD: + lasso_node_traversal(*value, do_to_node, snippet->type); + break; + case SNIPPET_LIST_NODES: + { + GList *list = *value; + while (list != NULL) { + if (list->data) { + lasso_node_traversal(LASSO_NODE(list->data), do_to_node, snippet->type); + } + list = g_list_next(list); } - list = g_list_next(list); } - } - break; - default: - break; + break; + default: + break; + } + snippet++; } - snippet++; + class = g_type_class_peek_parent(class); } } @@ -1253,6 +1253,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) SnippetType type; struct XmlSnippet *snippet_any = NULL; struct XmlSnippet *snippet_any_attribute = NULL; + GType g_type_collect_namespaces, g_type_any, g_type_any_attribute; struct XmlSnippet *snippet_collect_namespaces = NULL; struct XmlSnippet *snippet_signature = NULL; GSList *unknown_nodes = NULL; @@ -1276,6 +1277,8 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) } while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) { + GType g_type = G_TYPE_FROM_CLASS(class); + lasso_trace(" initializing %s\n", G_OBJECT_CLASS_NAME(class)); /* reduce keep_xmlnode flags */ @@ -1288,7 +1291,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) GList **location = NULL; type = snippet->type & 0xff; - value = G_STRUCT_MEMBER_P(node, snippet->offset); + value = SNIPPET_STRUCT_MEMBER_P(node, g_type, snippet); if (type == SNIPPET_LIST_XMLNODES) { location = value; @@ -1316,9 +1319,10 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) snippet && snippet->name; snippet++) { void *tmp = NULL; type = snippet->type & 0xff; - value = G_STRUCT_MEMBER_P(node, snippet->offset); + value = SNIPPET_STRUCT_MEMBER_P(node, g_type, snippet); if ((snippet->type & SNIPPET_ANY) && type != SNIPPET_ATTRIBUTE) { + g_type_any = g_type; snippet_any = snippet; } @@ -1455,10 +1459,11 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) void *tmp = NULL; type = snippet->type & 0xff; - value = G_STRUCT_MEMBER_P(node, snippet->offset); + value = SNIPPET_STRUCT_MEMBER_P(node, g_type, snippet); if (snippet->name && snippet->name[0] == '\0' && type == SNIPPET_COLLECT_NAMESPACES) { snippet_collect_namespaces = snippet; + g_type_collect_namespaces = g_type; } if (type == SNIPPET_SIGNATURE) { @@ -1467,6 +1472,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) if (type == SNIPPET_ATTRIBUTE) { if (snippet->type & SNIPPET_ANY) { + g_type_any_attribute = g_type; snippet_any_attribute = snippet; continue; } @@ -1517,7 +1523,8 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) /* Collect namespaces on the current node */ if (snippet_collect_namespaces) { - void *value = G_STRUCT_MEMBER_P(node, snippet_collect_namespaces->offset); + void *value = SNIPPET_STRUCT_MEMBER_P(node, g_type_collect_namespaces, + snippet_collect_namespaces); _lasso_node_collect_namespaces(value, xmlnode); } @@ -1562,7 +1569,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) if (unknown_nodes && snippet_any) { xmlNode *t = unknown_nodes->data; void *tmp; - value = G_STRUCT_MEMBER_P(node, snippet_any->offset); + value = SNIPPET_STRUCT_MEMBER_P(node, g_type_any, snippet_any); tmp = lasso_node_new_from_xmlNode_with_type(t, snippet_any->class_name); (*(char**)value) = tmp; } @@ -1574,7 +1581,7 @@ lasso_node_impl_init_from_xml(LassoNode *node, xmlNode *xmlnode) xmlAttr *node_attr; - any_attribute = G_STRUCT_MEMBER_P(node, snippet_any_attribute->offset); + any_attribute = SNIPPET_STRUCT_MEMBER_P(node, g_type_any_attribute, snippet_any_attribute); if (*any_attribute == NULL) { *any_attribute = g_hash_table_new_full( g_str_hash, g_str_equal, g_free, g_free); @@ -1668,6 +1675,7 @@ static xmlNode* lasso_node_impl_get_xmlNode(LassoNode *node, gboolean lasso_dump) { LassoNodeClass *class = LASSO_NODE_GET_CLASS(node); + LassoNodeClass *version_class = NULL; xmlNode *xmlnode; xmlNs *ns; GList *list_ns = NULL, *list_classes = NULL, *t; @@ -1746,7 +1754,7 @@ lasso_node_impl_get_xmlNode(LassoNode *node, gboolean lasso_dump) t = g_list_last(list_classes); while (t) { class = t->data; - lasso_node_build_xmlNode_from_snippets(node, xmlnode, + lasso_node_build_xmlNode_from_snippets(node, (LassoNodeClass*)class, xmlnode, class->node_data->snippets, lasso_dump); t = g_list_previous(t); } @@ -1755,15 +1763,17 @@ lasso_node_impl_get_xmlNode(LassoNode *node, gboolean lasso_dump) xmlCleanNs(xmlnode); /* backward compatibility with Liberty ID-FF 1.1; */ - if (find_path(node, "MajorVersion", &value_node, &version_snippet) == TRUE) { + if (find_path(node, "MajorVersion", &value_node, &version_class, &version_snippet) == TRUE) { int *value; int major_version, minor_version; - value = G_STRUCT_MEMBER_P(value_node, version_snippet->offset); + value = SNIPPET_STRUCT_MEMBER_P(value_node, G_TYPE_FROM_CLASS(version_class), + version_snippet); major_version = *value; - find_path(node, "MinorVersion", &value_node, &version_snippet); - value = G_STRUCT_MEMBER_P(value_node, version_snippet->offset); + find_path(node, "MinorVersion", &value_node, &version_class, &version_snippet); + value = SNIPPET_STRUCT_MEMBER_P(value_node, G_TYPE_FROM_CLASS(version_class), + version_snippet); minor_version = *value; if (strcmp((char*)xmlnode->ns->href, LASSO_LIB_HREF) == 0) { @@ -1830,7 +1840,7 @@ lasso_node_dispose(GObject *object) while (class && LASSO_IS_NODE_CLASS(class) && class->node_data) { for (snippet = class->node_data->snippets; snippet && snippet->name; snippet++) { - void **value = G_STRUCT_MEMBER_P(object, snippet->offset); + void **value = SNIPPET_STRUCT_MEMBER_P(object, G_TYPE_FROM_CLASS(class), snippet); type = snippet->type & 0xff; if (snippet->type & SNIPPET_BOOLEAN) @@ -2559,18 +2569,21 @@ snippet_dump_any(gchar *key, gchar *value, xmlNode *xmlnode) } static void -lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode, +lasso_node_build_xmlNode_from_snippets(LassoNode *node, LassoNodeClass *class, xmlNode *xmlnode, struct XmlSnippet *snippets, gboolean lasso_dump) { struct XmlSnippet *snippet; SnippetType type; + GType g_type; xmlNode *t; xmlNs *xmlns; GList *elem; struct XmlSnippet *snippet_any_attribute = NULL; + g_type = G_TYPE_FROM_CLASS(class); + for (snippet = snippets; snippet && snippet->name; snippet++) { - void *value = G_STRUCT_MEMBER(void*, node, snippet->offset); + void *value = SNIPPET_STRUCT_MEMBER(void *, node, g_type, snippet); char *str = value; type = snippet->type & 0xff; @@ -2691,6 +2704,7 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode, case SNIPPET_ALLOW_TEXT: case SNIPPET_ANY: case SNIPPET_KEEP_XMLNODE: + case SNIPPET_PRIVATE: g_assert_not_reached(); } if (snippet->type & SNIPPET_INTEGER) @@ -2698,8 +2712,8 @@ lasso_node_build_xmlNode_from_snippets(LassoNode *node, xmlNode *xmlnode, } if (snippet_any_attribute) { - GHashTable *value = G_STRUCT_MEMBER(GHashTable*, node, - snippet_any_attribute->offset); + GHashTable *value = SNIPPET_STRUCT_MEMBER(GHashTable *, node, g_type, + snippet_any_attribute); if (value) { g_hash_table_foreach(value, (GHFunc)snippet_dump_any, xmlnode); } @@ -2711,6 +2725,7 @@ void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode, struct XmlSnippet *snippet_signature) { LassoNodeClass *klass = LASSO_NODE_GET_CLASS(node); + GType g_type = G_TYPE_FROM_CLASS(klass); LassoSignatureType sign_type; LassoSignatureMethod sign_method; xmlNode *signature = NULL, *reference, *key_info, *t; @@ -2748,7 +2763,7 @@ void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode, /* XXX: get out if signature == NULL ? */ xmlAddChild(xmlnode, signature); - id = G_STRUCT_MEMBER(char*, node, snippet_signature->offset); + id = SNIPPET_STRUCT_MEMBER(char *, node, g_type, snippet_signature); uri = g_strdup_printf("#%s", id); reference = xmlSecTmplSignatureAddReference(signature, xmlSecTransformSha1Id, NULL, (xmlChar*)uri, NULL); @@ -2767,7 +2782,7 @@ void lasso_node_add_signature_template(LassoNode *node, xmlNode *xmlnode, } static struct XmlSnippet* -find_xml_snippet_by_name(LassoNode *node, char *name) +find_xml_snippet_by_name(LassoNode *node, char *name, LassoNodeClass **class_p) { LassoNodeClass *class; struct XmlSnippet *snippet; @@ -2777,28 +2792,32 @@ find_xml_snippet_by_name(LassoNode *node, char *name) for (snippet = class->node_data->snippets; snippet && snippet->name && strcmp(snippet->name, name) != 0; snippet++) ; - if (snippet && snippet->name) + if (snippet && snippet->name) { + *class_p = class; return snippet; + } class = g_type_class_peek_parent(class); } - + *class_p = NULL; return NULL; } static gboolean -find_path(LassoNode *node, char *path, LassoNode **value_node, struct XmlSnippet **snippet) +find_path(LassoNode *node, char *path, LassoNode **value_node, LassoNodeClass **class_p, struct XmlSnippet **snippet) { char *s, *t; struct XmlSnippet *tsnippet = NULL; LassoNode *tnode = node; + *class_p = NULL; s = path; while (s-1) { t = strchr(s, '/'); if (t) *t = 0; - tsnippet = find_xml_snippet_by_name(tnode, s); + tsnippet = find_xml_snippet_by_name(tnode, s, class_p); if (t) { - tnode = G_STRUCT_MEMBER(LassoNode*, tnode, tsnippet->offset); + tnode = SNIPPET_STRUCT_MEMBER(LassoNode *, tnode, G_TYPE_FROM_CLASS(*class_p), + tsnippet); if (tnode == NULL) return FALSE; } @@ -2819,25 +2838,28 @@ get_value_by_path(LassoNode *node, char *path, struct XmlSnippet *xml_snippet) { struct XmlSnippet *snippet; LassoNode *value_node; + LassoNodeClass *class; + GType g_type; - if (find_path(node, path, &value_node, &snippet) != TRUE) + if (find_path(node, path, &value_node, &class, &snippet) != TRUE) return NULL; + g_type = G_TYPE_FROM_CLASS(class); *xml_snippet = *snippet; if (snippet->type & SNIPPET_BOOLEAN) { - gboolean v = G_STRUCT_MEMBER(gboolean, value_node, snippet->offset); + gboolean v = SNIPPET_STRUCT_MEMBER(gboolean, value_node, g_type, snippet); return v ? g_strdup("true") : g_strdup("false"); } else if (snippet->type & SNIPPET_INTEGER) { - int v = G_STRUCT_MEMBER(int, value_node, snippet->offset); + int v = SNIPPET_STRUCT_MEMBER(int, value_node, g_type, snippet); return g_strdup_printf("%d", v); } else if (snippet->type == SNIPPET_NODE) { - LassoNode *value = G_STRUCT_MEMBER(LassoNode*, value_node, snippet->offset); + LassoNode *value = SNIPPET_STRUCT_MEMBER(LassoNode *, value_node, g_type, snippet); return lasso_node_build_query(value); } else if (snippet->type == SNIPPET_EXTENSION) { /* convert all of the <lib:Extension> into a string, already * escaped for URI usage */ - GList *value = G_STRUCT_MEMBER(GList*, value_node, snippet->offset); + GList *value = SNIPPET_STRUCT_MEMBER(GList *, value_node, g_type, snippet); xmlChar *s, *s2; GString *result = g_string_new(""); while (value) { @@ -2888,7 +2910,7 @@ get_value_by_path(LassoNode *node, char *path, struct XmlSnippet *xml_snippet) return g_string_free(result, FALSE); } else if (snippet->type == SNIPPET_LIST_CONTENT) { /* not clear in spec; concat values with spaces */ - GList *value = G_STRUCT_MEMBER(GList*, value_node, snippet->offset); + GList *value = SNIPPET_STRUCT_MEMBER(GList *, value_node, g_type, snippet); GString *result = g_string_new(""); while (value) { result = g_string_append(result, (char*)value->data); @@ -2902,7 +2924,7 @@ get_value_by_path(LassoNode *node, char *path, struct XmlSnippet *xml_snippet) } return g_string_free(result, FALSE); } else { - char *value = G_STRUCT_MEMBER(char*, value_node, snippet->offset); + char *value = SNIPPET_STRUCT_MEMBER(char *, value_node, g_type, snippet); if (value == NULL) return NULL; return g_strdup(value); } @@ -2914,12 +2936,15 @@ set_value_at_path(LassoNode *node, char *path, char *query_value) { struct XmlSnippet *snippet; LassoNode *value_node; + LassoNodeClass *class; + GType g_type; void *value; - if (find_path(node, path, &value_node, &snippet) != TRUE) + if (find_path(node, path, &value_node, &class, &snippet) != TRUE) return FALSE; + g_type = G_TYPE_FROM_CLASS(class); - value = G_STRUCT_MEMBER_P(value_node, snippet->offset); + value = SNIPPET_STRUCT_MEMBER_P(value_node, g_type, snippet); if (snippet->type & SNIPPET_INTEGER) { int val = atoi(query_value); @@ -3053,10 +3078,13 @@ lasso_node_init_from_query_fields(LassoNode *node, char **query_fields) * Extension; build it */ struct XmlSnippet *extension_snippet; LassoNode *value_node; + LassoNodeClass *class; GList **value; xmlNode *xmlnode, *xmlchild; - if (find_path(node, "Extension", &value_node, &extension_snippet) == TRUE) { - value = G_STRUCT_MEMBER_P(value_node, extension_snippet->offset); + if (find_path(node, "Extension", &value_node, &class, &extension_snippet) == TRUE) { + GType g_type = G_TYPE_FROM_CLASS(class); + value = SNIPPET_STRUCT_MEMBER_P(value_node, g_type, + extension_snippet); if (*value) { xmlnode = (*value)->data; } else { |