[evolution-data-server] I#184 - WebDAV: Privilege with multiple child elements not handled properly
- From: Milan Crha <mcrha src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [evolution-data-server] I#184 - WebDAV: Privilege with multiple child elements not handled properly
- Date: Mon, 20 Jan 2020 10:17:25 +0000 (UTC)
commit 690e00a8b0825f85ca25716591fbdf09e0c61285
Author: Milan Crha <mcrha redhat com>
Date: Mon Jan 20 11:17:38 2020 +0100
I#184 - WebDAV: Privilege with multiple child elements not handled properly
Closes https://gitlab.gnome.org/GNOME/evolution-data-server/issues/184
src/libedataserver/e-webdav-session.c | 80 +++++++++++++++--------------------
1 file changed, 33 insertions(+), 47 deletions(-)
---
diff --git a/src/libedataserver/e-webdav-session.c b/src/libedataserver/e-webdav-session.c
index a25fe938d..afb8ef4d7 100644
--- a/src/libedataserver/e-webdav-session.c
+++ b/src/libedataserver/e-webdav-session.c
@@ -288,7 +288,7 @@ e_webdav_property_change_free (gpointer ptr)
* Describes one privilege entry. The @hint can be %E_WEBDAV_PRIVILEGE_HINT_UNKNOWN
* for privileges which are not known to the #EWebDAVSession. It's possible, because
* the servers can define their own privileges. The hint is also tried to pair with
- * known hnts when it's %E_WEBDAV_PRIVILEGE_HINT_UNKNOWN.
+ * known hints when it's %E_WEBDAV_PRIVILEGE_HINT_UNKNOWN.
*
* The @ns_uri and @name can be %NULL only if the @hint is one of the known
* privileges. Otherwise it's an error to pass either of the two as %NULL.
@@ -4097,32 +4097,28 @@ e_webdav_session_traverse_privilege_level (xmlXPathContextPtr xpath_ctx,
if (node->type == XML_ELEMENT_NODE &&
node->name && *(node->name) &&
node->ns && node->ns->href && *(node->ns->href)) {
- break;
+ GNode *child;
+ gchar *description;
+ EWebDAVPrivilegeKind kind = E_WEBDAV_PRIVILEGE_KIND_COMMON;
+ EWebDAVPrivilegeHint hint = E_WEBDAV_PRIVILEGE_HINT_UNKNOWN;
+ EWebDAVPrivilege *privilege;
+
+ if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:abstract",
prefix))
+ kind = E_WEBDAV_PRIVILEGE_KIND_ABSTRACT;
+ else if (e_xml_xpath_eval_exists (xpath_ctx,
"%s/D:aggregate", prefix))
+ kind = E_WEBDAV_PRIVILEGE_KIND_AGGREGATE;
+
+ description = e_xml_xpath_eval_as_string (xpath_ctx,
"%s/D:description", prefix);
+ privilege = e_webdav_privilege_new ((const gchar *)
node->ns->href, (const gchar *) node->name, description, kind, hint);
+ child = g_node_new (privilege);
+ g_node_append (parent, child);
+
+ g_free (description);
+
+ if (e_xml_xpath_eval_exists (xpath_ctx,
"%s/D:supported-privilege", prefix))
+ e_webdav_session_traverse_privilege_level (xpath_ctx,
prefix, child);
}
}
-
- if (node) {
- GNode *child;
- gchar *description;
- EWebDAVPrivilegeKind kind = E_WEBDAV_PRIVILEGE_KIND_COMMON;
- EWebDAVPrivilegeHint hint = E_WEBDAV_PRIVILEGE_HINT_UNKNOWN;
- EWebDAVPrivilege *privilege;
-
- if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:abstract", prefix))
- kind = E_WEBDAV_PRIVILEGE_KIND_ABSTRACT;
- else if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:aggregate",
prefix))
- kind = E_WEBDAV_PRIVILEGE_KIND_AGGREGATE;
-
- description = e_xml_xpath_eval_as_string (xpath_ctx,
"%s/D:description", prefix);
- privilege = e_webdav_privilege_new ((const gchar *) node->ns->href,
(const gchar *) node->name, description, kind, hint);
- child = g_node_new (privilege);
- g_node_append (parent, child);
-
- g_free (description);
-
- if (e_xml_xpath_eval_exists (xpath_ctx, "%s/D:supported-privilege",
prefix))
- e_webdav_session_traverse_privilege_level (xpath_ctx, prefix,
child);
- }
}
if (xpath_obj_privilege)
@@ -4292,11 +4288,10 @@ e_webdav_session_get_supported_privilege_set_sync (EWebDAVSession *webdav,
return success;
}
-static EWebDAVPrivilege *
-e_webdav_session_extract_privilege_simple (xmlXPathObjectPtr xpath_obj_privilege)
+static void
+e_webdav_session_extract_privilege_simple (xmlXPathObjectPtr xpath_obj_privilege,
+ GSList **out_privileges)
{
- EWebDAVPrivilege *privilege = NULL;
-
if (xpath_obj_privilege &&
xpath_obj_privilege->type == XPATH_NODESET &&
xpath_obj_privilege->nodesetval &&
@@ -4310,17 +4305,16 @@ e_webdav_session_extract_privilege_simple (xmlXPathObjectPtr xpath_obj_privilege
if (node->type == XML_ELEMENT_NODE &&
node->name && *(node->name) &&
node->ns && node->ns->href && *(node->ns->href)) {
- break;
- }
- }
+ EWebDAVPrivilege *privilege;
- if (node) {
- privilege = e_webdav_privilege_new ((const gchar *) node->ns->href, (const gchar *)
node->name,
- NULL, E_WEBDAV_PRIVILEGE_KIND_COMMON, E_WEBDAV_PRIVILEGE_HINT_UNKNOWN);
+ privilege = e_webdav_privilege_new ((const gchar *) node->ns->href, (const
gchar *) node->name,
+ NULL, E_WEBDAV_PRIVILEGE_KIND_COMMON,
E_WEBDAV_PRIVILEGE_HINT_UNKNOWN);
+
+ if (privilege)
+ *out_privileges = g_slist_prepend (*out_privileges, privilege);
+ }
}
}
-
- return privilege;
}
typedef struct _PrivilegeSetData {
@@ -4365,11 +4359,7 @@ e_webdav_session_current_user_privilege_set_cb (EWebDAVSession *webdav,
xpath_obj_privilege = e_xml_xpath_eval (xpath_ctx,
"%s/D:current-user-privilege-set/D:privilege[%d]", xpath_prop_prefix, ii + 1);
if (xpath_obj_privilege) {
- EWebDAVPrivilege *privilege;
-
- privilege = e_webdav_session_extract_privilege_simple
(xpath_obj_privilege);
- if (privilege)
- *(psd->out_privileges) = g_slist_prepend
(*(psd->out_privileges), privilege);
+ e_webdav_session_extract_privilege_simple (xpath_obj_privilege,
psd->out_privileges);
xmlXPathFreeObject (xpath_obj_privilege);
}
@@ -4640,11 +4630,7 @@ e_webdav_session_acl_cb (EWebDAVSession *webdav,
xpath_obj_privilege = e_xml_xpath_eval (xpath_ctx,
"%s[%d]", privilege_prefix, ii + 1);
if (xpath_obj_privilege) {
- EWebDAVPrivilege *privilege;
-
- privilege =
e_webdav_session_extract_privilege_simple (xpath_obj_privilege);
- if (privilege)
- ace->privileges = g_slist_prepend
(ace->privileges, privilege);
+ e_webdav_session_extract_privilege_simple
(xpath_obj_privilege, &ace->privileges);
xmlXPathFreeObject (xpath_obj_privilege);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]