From edfc2804b5fb40a047aa8b58c6a59001de126676 Mon Sep 17 00:00:00 2001 From: Simon Ser Date: Sun, 19 Jan 2020 14:53:58 +0100 Subject: [PATCH] carddav: add displayname and addressbook-description to server --- carddav/carddav.go | 1 + carddav/client.go | 2 +- carddav/elements.go | 4 ++-- carddav/server.go | 21 +++++++++++++++++---- internal/elements.go | 7 +++++++ 5 files changed, 28 insertions(+), 7 deletions(-) diff --git a/carddav/carddav.go b/carddav/carddav.go index c02903e..cea36d5 100644 --- a/carddav/carddav.go +++ b/carddav/carddav.go @@ -6,6 +6,7 @@ import ( type AddressBook struct { Href string + Name string Description string } diff --git a/carddav/client.go b/carddav/client.go index 0927820..c6fe2e8 100644 --- a/carddav/client.go +++ b/carddav/client.go @@ -76,7 +76,7 @@ func (c *Client) FindAddressBooks(addressBookHomeSet string) ([]AddressBook, err l = append(l, AddressBook{ Href: href, - Description: descProp.Data, + Description: descProp.Description, }) } diff --git a/carddav/elements.go b/carddav/elements.go index 718b769..e919d1f 100644 --- a/carddav/elements.go +++ b/carddav/elements.go @@ -25,8 +25,8 @@ type addressbookHomeSet struct { } type addressbookDescription struct { - XMLName xml.Name `xml:"urn:ietf:params:xml:ns:carddav addressbook-description"` - Data string `xml:",chardata"` + XMLName xml.Name `xml:"urn:ietf:params:xml:ns:carddav addressbook-description"` + Description string `xml:",chardata"` } // https://tools.ietf.org/html/rfc6352#section-10.3 diff --git a/carddav/server.go b/carddav/server.go index 76665e7..8e49b91 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -1,6 +1,7 @@ package carddav import ( + "bytes" "encoding/xml" "net/http" @@ -11,6 +12,7 @@ import ( // TODO: add support for multiple address books type Backend interface { + AddressBook() (*AddressBook, error) GetAddressObject(href string) (*AddressObject, error) ListAddressObjects() ([]AddressObject, error) QueryAddressObjects(query *AddressBookQuery) ([]AddressObject, error) @@ -157,7 +159,12 @@ func (b *backend) HeadGet(w http.ResponseWriter, r *http.Request) error { func (b *backend) Propfind(r *http.Request, propfind *internal.Propfind, depth internal.Depth) (*internal.Multistatus, error) { var resps []internal.Response if r.URL.Path == "/" { - resp, err := b.propfindAddressBook(propfind) + ab, err := b.Backend.AddressBook() + if err != nil { + return nil, err + } + + resp, err := b.propfindAddressBook(propfind, ab) if err != nil { return nil, err } @@ -193,12 +200,18 @@ func (b *backend) Propfind(r *http.Request, propfind *internal.Propfind, depth i return internal.NewMultistatus(resps...), nil } -func (b *backend) propfindAddressBook(propfind *internal.Propfind) (*internal.Response, error) { +func (b *backend) propfindAddressBook(propfind *internal.Propfind, ab *AddressBook) (*internal.Response, error) { props := map[xml.Name]internal.PropfindFunc{ internal.ResourceTypeName: func(*internal.RawXMLValue) (interface{}, error) { return internal.NewResourceType(internal.CollectionName, addressBookName), nil }, - // TODO: displayname, addressbook-description, addressbook-supported-address-data, addressbook-max-resource-size, addressbook-home-set + internal.DisplayNameName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.DisplayName{Name: ab.Name}, nil + }, + addressBookDescriptionName: func(*internal.RawXMLValue) (interface{}, error) { + return &addressbookDescription{Description: ab.Description}, nil + }, + // TODO: addressbook-supported-address-data, addressbook-max-resource-size, addressbook-home-set } return internal.NewPropfindResponse("/", propfind, props) @@ -209,7 +222,7 @@ func (b *backend) propfindAddressObject(propfind *internal.Propfind, ao *Address internal.GetContentTypeName: func(*internal.RawXMLValue) (interface{}, error) { return &internal.GetContentType{Type: vcard.MIMEType}, nil }, - addressBookDataName: func(*internal.RawXMLValue) (interface{}, error) { + addressDataName: func(*internal.RawXMLValue) (interface{}, error) { var buf bytes.Buffer if err := vcard.NewEncoder(&buf).Encode(ao.Card); err != nil { return nil, err diff --git a/internal/elements.go b/internal/elements.go index 9c071c5..fe14fd5 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -303,6 +303,7 @@ type GetLastModified struct { var ( ResourceTypeName = xml.Name{"DAV:", "resourcetype"} + DisplayNameName = xml.Name{"DAV:", "displayname"} GetContentLengthName = xml.Name{"DAV:", "getcontentlength"} GetContentTypeName = xml.Name{"DAV:", "getcontenttype"} GetLastModifiedName = xml.Name{"DAV:", "getlastmodified"} @@ -314,3 +315,9 @@ type Error struct { XMLName xml.Name `xml:"DAV: error"` Raw []RawXMLValue `xml:",any"` } + +// https://tools.ietf.org/html/rfc4918#section-15.2 +type DisplayName struct { + XMLName xml.Name `xml:"DAV: displayname"` + Name string `xml:",chardata"` +}