diff --git a/carddav/server.go b/carddav/server.go index 81ae875..ea474d6 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -457,9 +457,43 @@ func (b *backend) propfindAddressObject(ctx context.Context, propfind *internal. } func (b *backend) Proppatch(r *http.Request, update *internal.Propertyupdate) (*internal.Response, error) { - // TODO: return a failed Response instead - // TODO: support PROPPATCH for address books - return nil, internal.HTTPErrorf(http.StatusForbidden, "carddav: PROPPATCH is unsupported") + homeSetPath, err := b.Backend.AddressbookHomeSetPath(r.Context()) + if err != nil { + return nil, err + } + + resp := internal.NewOKResponse(r.URL.Path) + + if r.URL.Path == homeSetPath { + // TODO: support PROPPATCH for address books + for _, prop := range update.Remove { + emptyVal := internal.NewRawXMLElement(prop.Prop.XMLName, nil, nil) + if err := resp.EncodeProp(http.StatusNotImplemented, emptyVal); err != nil { + return nil, err + } + } + for _, prop := range update.Set { + emptyVal := internal.NewRawXMLElement(prop.Prop.XMLName, nil, nil) + if err := resp.EncodeProp(http.StatusNotImplemented, emptyVal); err != nil { + return nil, err + } + } + } else { + for _, prop := range update.Remove { + emptyVal := internal.NewRawXMLElement(prop.Prop.XMLName, nil, nil) + if err := resp.EncodeProp(http.StatusMethodNotAllowed, emptyVal); err != nil { + return nil, err + } + } + for _, prop := range update.Set { + emptyVal := internal.NewRawXMLElement(prop.Prop.XMLName, nil, nil) + if err := resp.EncodeProp(http.StatusMethodNotAllowed, emptyVal); err != nil { + return nil, err + } + } + } + + return resp, nil } func (b *backend) Put(r *http.Request) (*internal.Href, error) {