From fbf05b35a0f31076953b375e33498b9d07b81255 Mon Sep 17 00:00:00 2001 From: Marcel Heers Date: Mon, 23 Sep 2024 10:41:04 +0300 Subject: [PATCH 1/3] implements CurrentUserPrivilegeSet to add compatibility with thunderbird address book --- carddav/server.go | 35 +++++++++++++++++++++++++++++++++++ internal/elements.go | 13 ++++++++++++- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/carddav/server.go b/carddav/server.go index 915c49e..dff05da 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -431,6 +431,13 @@ func (b *backend) propFindRoot(ctx context.Context, propfind *internal.PropFind) } props := map[xml.Name]internal.PropFindFunc{ + internal.CurrentUserPrivilegeSetName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrivilegeSet{ + Privileges: []internal.Privilege{ + {Read: true, Write: true}, + }, + }, nil + }, internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil }, @@ -452,6 +459,13 @@ func (b *backend) propFindUserPrincipal(ctx context.Context, propfind *internal. } props := map[xml.Name]internal.PropFindFunc{ + internal.CurrentUserPrivilegeSetName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrivilegeSet{ + Privileges: []internal.Privilege{ + {Read: true, Write: true}, + }, + }, nil + }, internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil }, @@ -477,6 +491,13 @@ func (b *backend) propFindHomeSet(ctx context.Context, propfind *internal.PropFi // TODO anything else to return here? props := map[xml.Name]internal.PropFindFunc{ + internal.CurrentUserPrivilegeSetName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrivilegeSet{ + Privileges: []internal.Privilege{ + {Read: true, Write: true}, + }, + }, nil + }, internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil }, @@ -489,6 +510,13 @@ func (b *backend) propFindHomeSet(ctx context.Context, propfind *internal.PropFi func (b *backend) propFindAddressBook(ctx context.Context, propfind *internal.PropFind, ab *AddressBook) (*internal.Response, error) { props := map[xml.Name]internal.PropFindFunc{ + internal.CurrentUserPrivilegeSetName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrivilegeSet{ + Privileges: []internal.Privilege{ + {Read: true, Write: true}, + }, + }, nil + }, internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { path, err := b.Backend.CurrentUserPrincipal(ctx) if err != nil { @@ -554,6 +582,13 @@ func (b *backend) propFindAllAddressBooks(ctx context.Context, propfind *interna func (b *backend) propFindAddressObject(ctx context.Context, propfind *internal.PropFind, ao *AddressObject) (*internal.Response, error) { props := map[xml.Name]internal.PropFindFunc{ + internal.CurrentUserPrivilegeSetName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrivilegeSet{ + Privileges: []internal.Privilege{ + {Read: true, Write: true}, + }, + }, nil + }, internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { path, err := b.Backend.CurrentUserPrincipal(ctx) if err != nil { diff --git a/internal/elements.go b/internal/elements.go index db7d960..925c351 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -21,7 +21,8 @@ var ( GetLastModifiedName = xml.Name{Namespace, "getlastmodified"} GetETagName = xml.Name{Namespace, "getetag"} - CurrentUserPrincipalName = xml.Name{Namespace, "current-user-principal"} + CurrentUserPrincipalName = xml.Name{Namespace, "current-user-principal"} + CurrentUserPrivilegeSetName = xml.Name{Namespace, "current-user-privilege-set"} ) type Status struct { @@ -417,6 +418,16 @@ type CurrentUserPrincipal struct { Unauthenticated *struct{} `xml:"unauthenticated,omitempty"` } +// https://datatracker.ietf.org/doc/html/rfc3744#section-5.4 +type CurrentUserPrivilegeSet struct { + XMLName xml.Name `xml:"DAV: current-user-principal"` + Privileges []Privilege `xml:"privilege"` +} +type Privilege struct { + Read bool `xml:"read"` + Write bool `xml:"write"` +} + // https://tools.ietf.org/html/rfc4918#section-14.19 type PropertyUpdate struct { XMLName xml.Name `xml:"DAV: propertyupdate"` From b24275e39cf623b0d7ae9789d365a5836ebcf1f4 Mon Sep 17 00:00:00 2001 From: Marcel Heers Date: Sat, 5 Oct 2024 07:55:46 +0300 Subject: [PATCH 2/3] Update internal/elements.go Co-authored-by: oliverpool <3864879+oliverpool@users.noreply.github.com> --- internal/elements.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/internal/elements.go b/internal/elements.go index 925c351..6c65493 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -420,7 +420,7 @@ type CurrentUserPrincipal struct { // https://datatracker.ietf.org/doc/html/rfc3744#section-5.4 type CurrentUserPrivilegeSet struct { - XMLName xml.Name `xml:"DAV: current-user-principal"` + XMLName xml.Name `xml:"DAV: current-user-privilege-set"` Privileges []Privilege `xml:"privilege"` } type Privilege struct { From 93a896d506359731ccc189369fa18c305d8236e7 Mon Sep 17 00:00:00 2001 From: Marcel Heers Date: Sat, 5 Oct 2024 07:56:20 +0300 Subject: [PATCH 3/3] Update internal/elements.go Co-authored-by: oliverpool <3864879+oliverpool@users.noreply.github.com> --- internal/elements.go | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/internal/elements.go b/internal/elements.go index 6c65493..56feec8 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -421,11 +421,10 @@ type CurrentUserPrincipal struct { // https://datatracker.ietf.org/doc/html/rfc3744#section-5.4 type CurrentUserPrivilegeSet struct { XMLName xml.Name `xml:"DAV: current-user-privilege-set"` - Privileges []Privilege `xml:"privilege"` + Privileges []Privilege `xml:"privilege>dynamic"` } type Privilege struct { - Read bool `xml:"read"` - Write bool `xml:"write"` + XMLName xml.Name } // https://tools.ietf.org/html/rfc4918#section-14.19