/* -*- Mode: C; tab-width: 8; indent-tabs-mode: t; c-basic-offset: 8 -*- */ /* * Copyright (C) 2017 Red Hat, Inc. (www.redhat.com) * * This library is free software: you can redistribute it and/or modify it * under the terms of the GNU Lesser General Public License as published by * the Free Software Foundation. * * This library is distributed in the hope that it will be useful, but * WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY * or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public License * for more details. * * You should have received a copy of the GNU Lesser General Public License * along with this library. If not, see . */ #if !defined (__LIBEDATASERVER_H_INSIDE__) && !defined (LIBEDATASERVER_COMPILATION) #error "Only should be included directly." #endif #ifndef E_WEBDAV_SESSION_H #define E_WEBDAV_SESSION_H #include #include #include #include #include #include /* Standard GObject macros */ #define E_TYPE_WEBDAV_SESSION \ (e_webdav_session_get_type ()) #define E_WEBDAV_SESSION(obj) \ (G_TYPE_CHECK_INSTANCE_CAST \ ((obj), E_TYPE_WEBDAV_SESSION, EWebDAVSession)) #define E_WEBDAV_SESSION_CLASS(cls) \ (G_TYPE_CHECK_CLASS_CAST \ ((cls), E_TYPE_WEBDAV_SESSION, EWebDAVSessionClass)) #define E_IS_WEBDAV_SESSION(obj) \ (G_TYPE_CHECK_INSTANCE_TYPE \ ((obj), E_TYPE_WEBDAV_SESSION)) #define E_IS_WEBDAV_SESSION_CLASS(cls) \ (G_TYPE_CHECK_CLASS_TYPE \ ((cls), E_TYPE_WEBDAV_SESSION)) #define E_WEBDAV_SESSION_GET_CLASS(obj) \ (G_TYPE_INSTANCE_GET_CLASS \ ((obj), E_TYPE_WEBDAV_SESSION, EWebDAVSessionClass)) G_BEGIN_DECLS #define E_WEBDAV_CAPABILITY_CLASS_1 "1" #define E_WEBDAV_CAPABILITY_CLASS_2 "2" #define E_WEBDAV_CAPABILITY_CLASS_3 "3" #define E_WEBDAV_CAPABILITY_ACCESS_CONTROL "access-control" #define E_WEBDAV_CAPABILITY_BIND "bind" #define E_WEBDAV_CAPABILITY_EXTENDED_MKCOL "extended-mkcol" #define E_WEBDAV_CAPABILITY_ADDRESSBOOK "addressbook" #define E_WEBDAV_CAPABILITY_CALENDAR_ACCESS "calendar-access" #define E_WEBDAV_CAPABILITY_CALENDAR_SCHEDULE "calendar-schedule" #define E_WEBDAV_CAPABILITY_CALENDAR_AUTO_SCHEDULE "calendar-auto-schedule" #define E_WEBDAV_CAPABILITY_CALENDAR_PROXY "calendar-proxy" #define E_WEBDAV_DEPTH_THIS "0" #define E_WEBDAV_DEPTH_THIS_AND_CHILDREN "1" #define E_WEBDAV_DEPTH_INFINITY "infinity" #define E_WEBDAV_CONTENT_TYPE_XML "application/xml; charset=\"utf-8\"" #define E_WEBDAV_CONTENT_TYPE_CALENDAR "text/calendar; charset=\"utf-8\"" #define E_WEBDAV_CONTENT_TYPE_VCARD "text/vcard; charset=\"utf-8\"" #define E_WEBDAV_NS_DAV "DAV:" #define E_WEBDAV_NS_CALDAV "urn:ietf:params:xml:ns:caldav" #define E_WEBDAV_NS_CARDDAV "urn:ietf:params:xml:ns:carddav" #define E_WEBDAV_NS_CALENDARSERVER "http://calendarserver.org/ns/" #define E_WEBDAV_NS_ICAL "http://apple.com/ns/ical/" typedef struct _EWebDAVSession EWebDAVSession; typedef struct _EWebDAVSessionClass EWebDAVSessionClass; typedef struct _EWebDAVSessionPrivate EWebDAVSessionPrivate; typedef enum { E_WEBDAV_RESOURCE_KIND_UNKNOWN, E_WEBDAV_RESOURCE_KIND_ADDRESSBOOK, E_WEBDAV_RESOURCE_KIND_CALENDAR, E_WEBDAV_RESOURCE_KIND_PRINCIPAL, E_WEBDAV_RESOURCE_KIND_COLLECTION, E_WEBDAV_RESOURCE_KIND_RESOURCE, E_WEBDAV_RESOURCE_KIND_SUBSCRIBED_ICALENDAR, E_WEBDAV_RESOURCE_KIND_WEBDAV_NOTES } EWebDAVResourceKind; typedef enum { E_WEBDAV_RESOURCE_SUPPORTS_NONE = 0, E_WEBDAV_RESOURCE_SUPPORTS_CONTACTS = 1 << 0, E_WEBDAV_RESOURCE_SUPPORTS_EVENTS = 1 << 1, E_WEBDAV_RESOURCE_SUPPORTS_MEMOS = 1 << 2, E_WEBDAV_RESOURCE_SUPPORTS_TASKS = 1 << 3, E_WEBDAV_RESOURCE_SUPPORTS_FREEBUSY = 1 << 4, E_WEBDAV_RESOURCE_SUPPORTS_TIMEZONE = 1 << 5, E_WEBDAV_RESOURCE_SUPPORTS_WEBDAV_NOTES = 1 << 6, E_WEBDAV_RESOURCE_SUPPORTS_LAST = E_WEBDAV_RESOURCE_SUPPORTS_WEBDAV_NOTES } EWebDAVResourceSupports; typedef struct _EWebDAVResource { EWebDAVResourceKind kind; guint32 supports; gchar *href; gchar *etag; gchar *display_name; gchar *content_type; gsize content_length; glong creation_date; glong last_modified; gchar *description; gchar *color; guint order; /* (guint) -1, if unknown */ } EWebDAVResource; GType e_webdav_resource_get_type (void) G_GNUC_CONST; EWebDAVResource * e_webdav_resource_new (EWebDAVResourceKind kind, guint32 supports, const gchar *href, const gchar *etag, const gchar *display_name, const gchar *content_type, gsize content_length, glong creation_date, glong last_modified, const gchar *description, const gchar *color, guint order); EWebDAVResource * e_webdav_resource_copy (const EWebDAVResource *src); void e_webdav_resource_free (gpointer ptr /* EWebDAVResource * */); typedef enum { E_WEBDAV_LIST_ALL = 0x00FFFFFF, E_WEBDAV_LIST_NONE = 0, E_WEBDAV_LIST_SUPPORTS = 1 << 0, E_WEBDAV_LIST_ETAG = 1 << 1, E_WEBDAV_LIST_DISPLAY_NAME = 1 << 2, E_WEBDAV_LIST_CONTENT_TYPE = 1 << 3, E_WEBDAV_LIST_CONTENT_LENGTH = 1 << 4, E_WEBDAV_LIST_CREATION_DATE = 1 << 5, E_WEBDAV_LIST_LAST_MODIFIED = 1 << 6, E_WEBDAV_LIST_DESCRIPTION = 1 << 7, E_WEBDAV_LIST_COLOR = 1 << 8, E_WEBDAV_LIST_ORDER = 1 << 9, E_WEBDAV_LIST_ONLY_CALENDAR = 1 << 28, E_WEBDAV_LIST_ONLY_ADDRESSBOOK = 1 << 29 } EWebDAVListFlags; /** * EWebDAVPropstatTraverseFunc: * @webdav: an #EWebDAVSession * @prop_node: an #xmlNode * @request_uri: a #GUri, containing the request URI, maybe redirected by the server * @href: (nullable): a full URI to which the property belongs, or %NULL, when not found * @status_code: an HTTP status code for this property * @user_data: user data, as passed to e_webdav_session_propfind_sync() * * A callback function for e_webdav_session_propfind_sync(), * e_webdav_session_report_sync() and other XML response with DAV:propstat * elements traversal functions. * * The @prop_node points to the actual property (prop) node and it can be examined * with e_xml_find_child(), e_xml_find_children_nodes() and other provided XML helper functions. * * Returns: %TRUE to continue traversal of the returned response, %FALSE otherwise. * * Since: 3.26 **/ typedef gboolean (* EWebDAVPropstatTraverseFunc) (EWebDAVSession *webdav, xmlNode *prop_node, const GUri *request_uri, const gchar *href, guint status_code, gpointer user_data); typedef enum { E_WEBDAV_PROPERTY_SET, E_WEBDAV_PROPERTY_REMOVE } EWebDAVPropertyChangeKind; typedef struct _EWebDAVPropertyChange { EWebDAVPropertyChangeKind kind; gchar *ns_uri; gchar *name; gchar *value; } EWebDAVPropertyChange; GType e_webdav_property_change_get_type (void) G_GNUC_CONST; EWebDAVPropertyChange * e_webdav_property_change_new_set (const gchar *ns_uri, const gchar *name, const gchar *value); EWebDAVPropertyChange * e_webdav_property_change_new_remove (const gchar *ns_uri, const gchar *name); EWebDAVPropertyChange * e_webdav_property_change_copy (const EWebDAVPropertyChange *src); void e_webdav_property_change_free (gpointer ptr); /* EWebDAVPropertyChange * */ typedef enum { E_WEBDAV_LOCK_EXCLUSIVE, E_WEBDAV_LOCK_SHARED } EWebDAVLockScope; #define E_WEBDAV_COLLATION_ASCII_NUMERIC_SUFFIX "ascii-numeric" #define E_WEBDAV_COLLATION_ASCII_NUMERIC "i;" E_WEBDAV_COLLATION_ASCII_NUMERIC_SUFFIX #define E_WEBDAV_COLLATION_ASCII_CASEMAP_SUFFIX "ascii-casemap" #define E_WEBDAV_COLLATION_ASCII_CASEMAP "i;" E_WEBDAV_COLLATION_ASCII_CASEMAP_SUFFIX #define E_WEBDAV_COLLATION_OCTET_SUFFIX "octet" #define E_WEBDAV_COLLATION_OCTET "i;" E_WEBDAV_COLLATION_OCTET_SUFFIX #define E_WEBDAV_COLLATION_UNICODE_CASEMAP_SUFFIX "unicode-casemap" #define E_WEBDAV_COLLATION_UNICODE_CASEMAP "i;" E_WEBDAV_COLLATION_UNICODE_CASEMAP_SUFFIX typedef enum { E_WEBDAV_PRIVILEGE_KIND_UNKNOWN = 0, E_WEBDAV_PRIVILEGE_KIND_ABSTRACT, E_WEBDAV_PRIVILEGE_KIND_AGGREGATE, E_WEBDAV_PRIVILEGE_KIND_COMMON } EWebDAVPrivilegeKind; typedef enum { E_WEBDAV_PRIVILEGE_HINT_UNKNOWN = 0, E_WEBDAV_PRIVILEGE_HINT_READ, E_WEBDAV_PRIVILEGE_HINT_WRITE, E_WEBDAV_PRIVILEGE_HINT_WRITE_PROPERTIES, E_WEBDAV_PRIVILEGE_HINT_WRITE_CONTENT, E_WEBDAV_PRIVILEGE_HINT_UNLOCK, E_WEBDAV_PRIVILEGE_HINT_READ_ACL, E_WEBDAV_PRIVILEGE_HINT_WRITE_ACL, E_WEBDAV_PRIVILEGE_HINT_READ_CURRENT_USER_PRIVILEGE_SET, E_WEBDAV_PRIVILEGE_HINT_BIND, E_WEBDAV_PRIVILEGE_HINT_UNBIND, E_WEBDAV_PRIVILEGE_HINT_ALL, E_WEBDAV_PRIVILEGE_HINT_CALDAV_READ_FREE_BUSY } EWebDAVPrivilegeHint; typedef struct _EWebDAVPrivilege { gchar *ns_uri; gchar *name; gchar *description; EWebDAVPrivilegeKind kind; EWebDAVPrivilegeHint hint; } EWebDAVPrivilege; GType e_webdav_privilege_get_type (void) G_GNUC_CONST; EWebDAVPrivilege * e_webdav_privilege_new (const gchar *ns_uri, const gchar *name, const gchar *description, EWebDAVPrivilegeKind kind, EWebDAVPrivilegeHint hint); EWebDAVPrivilege * e_webdav_privilege_copy (const EWebDAVPrivilege *src); void e_webdav_privilege_free (gpointer ptr); /* EWebDAVPrivilege * */ typedef enum { E_WEBDAV_ACE_PRINCIPAL_UNKNOWN = 0, E_WEBDAV_ACE_PRINCIPAL_HREF, E_WEBDAV_ACE_PRINCIPAL_ALL, E_WEBDAV_ACE_PRINCIPAL_AUTHENTICATED, E_WEBDAV_ACE_PRINCIPAL_UNAUTHENTICATED, E_WEBDAV_ACE_PRINCIPAL_PROPERTY, E_WEBDAV_ACE_PRINCIPAL_SELF, E_WEBDAV_ACE_PRINCIPAL_OWNER /* special-case, 'property' with only 'DAV:owner' child */ } EWebDAVACEPrincipalKind; typedef enum { E_WEBDAV_ACE_FLAG_UNKNOWN = 0, E_WEBDAV_ACE_FLAG_GRANT = 1 << 0, E_WEBDAV_ACE_FLAG_DENY = 1 << 1, E_WEBDAV_ACE_FLAG_INVERT = 1 << 2, E_WEBDAV_ACE_FLAG_PROTECTED = 1 << 3, E_WEBDAV_ACE_FLAG_INHERITED = 1 << 4 } EWebDAVACEFlag; typedef struct _EWebDAVAccessControlEntry { EWebDAVACEPrincipalKind principal_kind; gchar *principal_href; /* valid only if principal_kind is E_WEBDAV_ACE_PRINCIPAL_HREF */ guint32 flags; /* bit-or of EWebDAVACEFlag */ gchar *inherited_href; /* valid only if flags contain E_WEBDAV_ACE_INHERITED */ GSList *privileges; /* EWebDAVPrivilege * */ } EWebDAVAccessControlEntry; GType e_webdav_access_control_entry_get_type (void) G_GNUC_CONST; EWebDAVAccessControlEntry * e_webdav_access_control_entry_new (EWebDAVACEPrincipalKind principal_kind, const gchar *principal_href, guint32 flags, /* bit-or of EWebDAVACEFlag */ const gchar *inherited_href); EWebDAVAccessControlEntry * e_webdav_access_control_entry_copy (const EWebDAVAccessControlEntry *src); void e_webdav_access_control_entry_free (gpointer ptr); /* EWebDAVAccessControlEntry * */ void e_webdav_access_control_entry_append_privilege (EWebDAVAccessControlEntry *ace, EWebDAVPrivilege *privilege); GSList * e_webdav_access_control_entry_get_privileges (EWebDAVAccessControlEntry *ace); /* EWebDAVPrivilege * */ typedef enum { E_WEBDAV_ACL_RESTRICTION_NONE = 0, E_WEBDAV_ACL_RESTRICTION_GRANT_ONLY = 1 << 0, E_WEBDAV_ACL_RESTRICTION_NO_INVERT = 1 << 1, E_WEBDAV_ACL_RESTRICTION_DENY_BEFORE_GRANT = 1 << 2, E_WEBDAV_ACL_RESTRICTION_REQUIRED_PRINCIPAL = 1 << 3 } EWebDAVACLRestrictions; /** * EWebDAVSession: * * Contains only private data that should be read and manipulated using the * functions below. * * Since: 3.26 **/ struct _EWebDAVSession { /*< private >*/ ESoupSession parent; EWebDAVSessionPrivate *priv; }; struct _EWebDAVSessionClass { ESoupSessionClass parent_class; /* Padding for future expansion */ gpointer reserved[10]; }; GType e_webdav_session_get_type (void) G_GNUC_CONST; EWebDAVSession *e_webdav_session_new (ESource *source); const gchar * e_webdav_session_get_last_dav_error_code(EWebDAVSession *webdav); gboolean e_webdav_session_get_last_dav_error_is_permission (EWebDAVSession *webdav); SoupMessage * e_webdav_session_new_message (EWebDAVSession *webdav, const gchar *method, const gchar *uri, GError **error); gboolean e_webdav_session_replace_with_detailed_error (EWebDAVSession *webdav, SoupMessage *message, const GByteArray *response_data, gboolean ignore_multistatus, const gchar *prefix, GError **inout_error); gchar * e_webdav_session_ensure_full_uri (EWebDAVSession *webdav, const GUri *request_uri, const gchar *href); gboolean e_webdav_session_options_sync (EWebDAVSession *webdav, const gchar *uri, GHashTable **out_capabilities, GHashTable **out_allows, GCancellable *cancellable, GError **error); gboolean e_webdav_session_post_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *data, gsize data_length, const gchar *in_content_type, SoupMessageHeaders *in_headers, gchar **out_content_type, SoupMessageHeaders **out_headers, GByteArray **out_content, GCancellable *cancellable, GError **error); gboolean e_webdav_session_propfind_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *depth, const EXmlDocument *xml, EWebDAVPropstatTraverseFunc func, gpointer func_user_data, GCancellable *cancellable, GError **error); gboolean e_webdav_session_proppatch_sync (EWebDAVSession *webdav, const gchar *uri, const EXmlDocument *xml, GCancellable *cancellable, GError **error); gboolean e_webdav_session_report_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *depth, const EXmlDocument *xml, EWebDAVPropstatTraverseFunc func, gpointer func_user_data, gchar **out_content_type, GByteArray **out_content, GCancellable *cancellable, GError **error); gboolean e_webdav_session_mkcol_sync (EWebDAVSession *webdav, const gchar *uri, GCancellable *cancellable, GError **error); gboolean e_webdav_session_mkcol_addressbook_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *display_name, const gchar *description, GCancellable *cancellable, GError **error); gboolean e_webdav_session_mkcalendar_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *display_name, const gchar *description, const gchar *color, guint32 supports, /* bit-or of EWebDAVResourceSupports */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_sync (EWebDAVSession *webdav, const gchar *uri, gchar **out_href, gchar **out_etag, SoupMessageHeaders **out_headers, GOutputStream *out_stream, GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_data_sync (EWebDAVSession *webdav, const gchar *uri, gchar **out_href, gchar **out_etag, SoupMessageHeaders **out_headers, gchar **out_bytes, gsize *out_length, GCancellable *cancellable, GError **error); gboolean e_webdav_session_put_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *etag, const gchar *content_type, SoupMessageHeaders *in_headers, GInputStream *stream, gssize stream_length, gchar **out_href, gchar **out_etag, SoupMessageHeaders **out_headers, GCancellable *cancellable, GError **error); gboolean e_webdav_session_put_data_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *etag, const gchar *content_type, SoupMessageHeaders *in_headers, const gchar *bytes, gsize length, gchar **out_href, gchar **out_etag, SoupMessageHeaders **out_headers, GCancellable *cancellable, GError **error); gboolean e_webdav_session_delete_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *depth, const gchar *etag, GCancellable *cancellable, GError **error); gboolean e_webdav_session_copy_sync (EWebDAVSession *webdav, const gchar *source_uri, const gchar *destination_uri, const gchar *depth, gboolean can_overwrite, GCancellable *cancellable, GError **error); gboolean e_webdav_session_move_sync (EWebDAVSession *webdav, const gchar *source_uri, const gchar *destination_uri, gboolean can_overwrite, GCancellable *cancellable, GError **error); gboolean e_webdav_session_lock_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *depth, gint32 lock_timeout, const EXmlDocument *xml, gchar **out_lock_token, xmlDoc **out_xml_response, GCancellable *cancellable, GError **error); gboolean e_webdav_session_refresh_lock_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *lock_token, gint32 lock_timeout, GCancellable *cancellable, GError **error); gboolean e_webdav_session_unlock_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *lock_token, GCancellable *cancellable, GError **error); gboolean e_webdav_session_traverse_multistatus_response (EWebDAVSession *webdav, SoupMessage *message, const GByteArray *xml_data, EWebDAVPropstatTraverseFunc func, gpointer func_user_data, GError **error); gboolean e_webdav_session_traverse_mkcol_response (EWebDAVSession *webdav, SoupMessage *message, const GByteArray *xml_data, EWebDAVPropstatTraverseFunc func, gpointer func_user_data, GError **error); gboolean e_webdav_session_traverse_mkcalendar_response (EWebDAVSession *webdav, SoupMessage *message, const GByteArray *xml_data, EWebDAVPropstatTraverseFunc func, gpointer func_user_data, GError **error); gboolean e_webdav_session_getctag_sync (EWebDAVSession *webdav, const gchar *uri, gchar **out_ctag, GCancellable *cancellable, GError **error); gboolean e_webdav_session_list_sync (EWebDAVSession *webdav, const gchar *uri, const gchar *depth, guint32 flags, /* bit-or of EWebDAVListFlags */ GSList **out_resources, /* EWebDAVResource * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_update_properties_sync (EWebDAVSession *webdav, const gchar *uri, const GSList *changes, /* EWebDAVPropertyChange * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_lock_resource_sync (EWebDAVSession *webdav, const gchar *uri, EWebDAVLockScope lock_scope, gint32 lock_timeout, const gchar *owner, gchar **out_lock_token, GCancellable *cancellable, GError **error); gboolean e_webdav_session_acl_sync (EWebDAVSession *webdav, const gchar *uri, const EXmlDocument *xml, GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_supported_privilege_set_sync (EWebDAVSession *webdav, const gchar *uri, GNode **out_privileges, /* EWebDAVPrivilege * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_current_user_privilege_set_sync (EWebDAVSession *webdav, const gchar *uri, GSList **out_privileges, /* EWebDAVPrivilege * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_acl_sync (EWebDAVSession *webdav, const gchar *uri, GSList **out_entries, /* EWebDAVAccessControlEntry * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_acl_restrictions_sync (EWebDAVSession *webdav, const gchar *uri, guint32 *out_restrictions, /* bit-or of EWebDAVACLRestrictions */ EWebDAVACEPrincipalKind *out_principal_kind, GSList **out_principal_hrefs, /* gchar * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_get_principal_collection_set_sync (EWebDAVSession *webdav, const gchar *uri, GSList **out_principal_hrefs, /* gchar * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_set_acl_sync (EWebDAVSession *webdav, const gchar *uri, const GSList *entries, /* EWebDAVAccessControlEntry * */ GCancellable *cancellable, GError **error); gboolean e_webdav_session_principal_property_search_sync (EWebDAVSession *webdav, const gchar *uri, gboolean apply_to_principal_collection_set, const gchar *match_ns_uri, const gchar *match_property, const gchar *match_value, GSList **out_principals, /* EWebDAVResource * */ GCancellable *cancellable, GError **error); gchar * e_webdav_session_util_maybe_dequote (gchar *text); void e_webdav_session_util_free_privileges (GNode *privileges); /* EWebDAVPrivilege * */ gboolean e_webdav_session_util_item_href_equal (const gchar *href1, const gchar *href2); G_END_DECLS #endif /* E_WEBDAV_SESSION_H */