carddav: only call CurrentUserPrincipal when necessary

This commit is contained in:
Simon Ser 2022-05-12 18:54:11 +02:00
parent a346d42f42
commit bc3faca3a0

View File

@ -50,17 +50,18 @@ func (h *Handler) ServeHTTP(w http.ResponseWriter, r *http.Request) {
return return
} }
if r.URL.Path == "/.well-known/carddav" {
principalPath, err := h.Backend.CurrentUserPrincipal(r.Context()) principalPath, err := h.Backend.CurrentUserPrincipal(r.Context())
if err != nil { if err != nil {
http.Error(w, "carddav: failed to determine current user principal", http.StatusInternalServerError) http.Error(w, "carddav: failed to determine current user principal", http.StatusInternalServerError)
return return
} }
if r.URL.Path == "/.well-known/carddav" {
http.Redirect(w, r, principalPath, http.StatusMovedPermanently) http.Redirect(w, r, principalPath, http.StatusMovedPermanently)
return return
} }
var err error
switch r.Method { switch r.Method {
case "REPORT": case "REPORT":
err = h.handleReport(w, r) err = h.handleReport(w, r)
@ -368,6 +369,7 @@ func (b *backend) propfindUserPrincipal(ctx context.Context, propfind *internal.
if err != nil { if err != nil {
return nil, err return nil, err
} }
props := map[xml.Name]internal.PropfindFunc{ props := map[xml.Name]internal.PropfindFunc{
internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) {
return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil
@ -380,13 +382,13 @@ func (b *backend) propfindUserPrincipal(ctx context.Context, propfind *internal.
} }
func (b *backend) propfindAddressBook(ctx context.Context, propfind *internal.Propfind, ab *AddressBook) (*internal.Response, error) { func (b *backend) propfindAddressBook(ctx context.Context, propfind *internal.Propfind, ab *AddressBook) (*internal.Response, error) {
principalPath, err := b.Backend.CurrentUserPrincipal(ctx) props := map[xml.Name]internal.PropfindFunc{
internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) {
path, err := b.Backend.CurrentUserPrincipal(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
props := map[xml.Name]internal.PropfindFunc{ return &internal.CurrentUserPrincipal{Href: internal.Href{Path: path}}, nil
internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) {
return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil
}, },
internal.ResourceTypeName: func(*internal.RawXMLValue) (interface{}, error) { internal.ResourceTypeName: func(*internal.RawXMLValue) (interface{}, error) {
return internal.NewResourceType(internal.CollectionName, addressBookName), nil return internal.NewResourceType(internal.CollectionName, addressBookName), nil
@ -417,13 +419,13 @@ func (b *backend) propfindAddressBook(ctx context.Context, propfind *internal.Pr
} }
func (b *backend) propfindAddressObject(ctx context.Context, propfind *internal.Propfind, ao *AddressObject) (*internal.Response, error) { func (b *backend) propfindAddressObject(ctx context.Context, propfind *internal.Propfind, ao *AddressObject) (*internal.Response, error) {
principalPath, err := b.Backend.CurrentUserPrincipal(ctx) props := map[xml.Name]internal.PropfindFunc{
internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) {
path, err := b.Backend.CurrentUserPrincipal(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
} }
props := map[xml.Name]internal.PropfindFunc{ return &internal.CurrentUserPrincipal{Href: internal.Href{Path: path}}, nil
internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) {
return &internal.CurrentUserPrincipal{Href: internal.Href{Path: principalPath}}, nil
}, },
internal.GetContentTypeName: func(*internal.RawXMLValue) (interface{}, error) { internal.GetContentTypeName: func(*internal.RawXMLValue) (interface{}, error) {
return &internal.GetContentType{Type: vcard.MIMEType}, nil return &internal.GetContentType{Type: vcard.MIMEType}, nil