From 3d05533a3108f646c7b6e45fa1241fecb7ef7551 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Tue, 14 Jan 2020 22:19:54 +0100 Subject: [PATCH] carddav: add very basic Client --- carddav/carddav.go | 3 +++ carddav/client.go | 44 ++++++++++++++++++++++++++++++++++++++++++++ carddav/elements.go | 10 ++++++++++ client.go | 2 +- elements.go | 2 +- 5 files changed, 59 insertions(+), 2 deletions(-) create mode 100644 carddav/carddav.go create mode 100644 carddav/client.go create mode 100644 carddav/elements.go diff --git a/carddav/carddav.go b/carddav/carddav.go new file mode 100644 index 0000000..61d50bb --- /dev/null +++ b/carddav/carddav.go @@ -0,0 +1,3 @@ +package carddav + +const namespace = "urn:ietf:params:xml:ns:carddav" diff --git a/carddav/client.go b/carddav/client.go new file mode 100644 index 0000000..44723c4 --- /dev/null +++ b/carddav/client.go @@ -0,0 +1,44 @@ +package carddav + +import ( + "encoding/xml" + "net/http" + + "github.com/emersion/go-webdav" + "github.com/emersion/go-webdav/internal" +) + +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) FindAddressbookHomeSet(principal string) (string, error) { + name := xml.Name{namespace, "addressbook-home-set"} + propfind := internal.NewPropPropfind(name) + + resp, err := c.ic.PropfindFlat(principal, propfind) + if err != nil { + return "", err + } + + var prop addressbookHomeSet + if err := resp.DecodeProp(name, &prop); err != nil { + return "", err + } + + return prop.Href, nil +} diff --git a/carddav/elements.go b/carddav/elements.go new file mode 100644 index 0000000..8188585 --- /dev/null +++ b/carddav/elements.go @@ -0,0 +1,10 @@ +package carddav + +import ( + "encoding/xml" +) + +type addressbookHomeSet struct { + Name xml.Name `xml:"urn:ietf:params:xml:ns:carddav addressbook-home-set"` + Href string `xml:"href"` +} diff --git a/client.go b/client.go index f2bd2b2..ca9a844 100644 --- a/client.go +++ b/client.go @@ -28,7 +28,7 @@ func (c *Client) FindCurrentUserPrincipal() (string, error) { return "", err } - var prop currentUserPrincipalProp + var prop currentUserPrincipal if err := resp.DecodeProp(name, &prop); err != nil { return "", err } diff --git a/elements.go b/elements.go index 04abb0c..5c554db 100644 --- a/elements.go +++ b/elements.go @@ -4,7 +4,7 @@ import ( "encoding/xml" ) -type currentUserPrincipalProp struct { +type currentUserPrincipal struct { Name xml.Name `xml:"DAV: current-user-principal"` Href string `xml:"href"` }