On Tue, 2020-01-14 at 14:25 +0100, Krauß, Peter (SCC) via evolution-
list wrote:
> So basically it boiled down to
> e_webdav_session_extract_privilege_simple only returning a single
> privilege and not the whole set which I think was the bug. Maybe the
> for loop in e_webdav_session_current_user_privilege_set_cb was
> supposed to deal with this...?

        Hi,
aha, I see. I understood from RFC 3744 [1] that the <D:provilege>
element can contain only single node, not multiple, and the servers I
connect to conform to this expectation, but I didn't find any explicit
mention of it in the RFC (just briefly searching through it).

> I can send you a diff.

That would surely help, at least to know exactly which parts you
touched. Was it anything like the attached patch, please? Could you
give it a try, please? It works here, but it the unpatched code worked
here as well.

By the way, having a reference in a form of a bug report filled at [2]
is appreciated. Such changes do need references, places where to look
for 'what & why' and eventually report regressions with them. Would you
mind to file one, please?
        Thanks and bye,
        Milan

[1] https://tools.ietf.org/html/rfc3744
[2] https://gitlab.gnome.org/GNOME/evolution-data-server/issues/new
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);
 							}
_______________________________________________
evolution-list mailing list
evolution-list@gnome.org
To change your list options or unsubscribe, visit ...
https://mail.gnome.org/mailman/listinfo/evolution-list

Reply via email to