From 6aea0eda2d54c6b57d77b764a62b311316b58d52 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Thu, 30 Jan 2020 13:18:05 +0100 Subject: [PATCH] caldav: add Client boilerplate --- caldav/caldav.go | 4 ++++ caldav/client.go | 47 ++++++++++++++++++++++++++++++++++++++++++++++ caldav/elements.go | 17 +++++++++++++++++ carddav/carddav.go | 2 +- 4 files changed, 69 insertions(+), 1 deletion(-) create mode 100644 caldav/caldav.go create mode 100644 caldav/client.go create mode 100644 caldav/elements.go diff --git a/caldav/caldav.go b/caldav/caldav.go new file mode 100644 index 0000000..1f53364 --- /dev/null +++ b/caldav/caldav.go @@ -0,0 +1,4 @@ +// Package caldav provides a client and server CalDAV implementation. +// +// CalDAV is defined in RFC 4791. +package caldav diff --git a/caldav/client.go b/caldav/client.go new file mode 100644 index 0000000..99594a6 --- /dev/null +++ b/caldav/client.go @@ -0,0 +1,47 @@ +package caldav + +import ( + "net/http" + + "github.com/emersion/go-webdav" + "github.com/emersion/go-webdav/internal" +) + +// Client provides access to a remote CardDAV server. +type Client struct { + *webdav.Client + + ic *internal.Client +} + +func NewClient(c *http.Client, endpoint string) (*Client, error) { + wc, err := webdav.NewClient(c, endpoint) + if err != nil { + return nil, err + } + ic, err := internal.NewClient(c, endpoint) + if err != nil { + return nil, err + } + return &Client{wc, ic}, nil +} + +func (c *Client) SetBasicAuth(username, password string) { + c.Client.SetBasicAuth(username, password) + c.ic.SetBasicAuth(username, password) +} + +func (c *Client) FindCalendarHomeSet(principal string) (string, error) { + propfind := internal.NewPropNamePropfind(calendarHomeSetName) + resp, err := c.ic.PropfindFlat(principal, propfind) + if err != nil { + return "", err + } + + var prop calendarHomeSet + if err := resp.DecodeProp(&prop); err != nil { + return "", err + } + + return prop.Href.Path, nil +} diff --git a/caldav/elements.go b/caldav/elements.go new file mode 100644 index 0000000..c6706f4 --- /dev/null +++ b/caldav/elements.go @@ -0,0 +1,17 @@ +package caldav + +import ( + "encoding/xml" + + "github.com/emersion/go-webdav/internal" +) + +const namespace = "urn:ietf:params:xml:ns:caldav" + +var calendarHomeSetName = xml.Name{namespace, "calendar-home-set"} + +// https://tools.ietf.org/html/rfc4791#section-6.2.1 +type calendarHomeSet struct { + XMLName xml.Name `xml:"urn:ietf:params:xml:ns:caldav calendar-home-set"` + Href internal.Href `xml:"DAV: href"` +} diff --git a/carddav/carddav.go b/carddav/carddav.go index 7d49c19..9a3dc8b 100644 --- a/carddav/carddav.go +++ b/carddav/carddav.go @@ -71,7 +71,7 @@ const ( ) type AddressBookMultiGet struct { - Paths []string + Paths []string DataRequest AddressDataRequest }