diff --git a/carddav/server.go b/carddav/server.go index 8bb9230..5470e75 100644 --- a/carddav/server.go +++ b/carddav/server.go @@ -223,6 +223,10 @@ func (b *backend) propfindAddressBook(propfind *internal.Propfind, ab *AddressBo addressBookHomeSetName: func(*internal.RawXMLValue) (interface{}, error) { return &addressbookHomeSet{Href: "/"}, nil }, + // TODO: this should be set on all resources + internal.CurrentUserPrincipalName: func(*internal.RawXMLValue) (interface{}, error) { + return &internal.CurrentUserPrincipal{Href: "/"}, nil + }, } if ab.MaxResourceSize > 0 { diff --git a/client.go b/client.go index 38e5f4a..8d1cd40 100644 --- a/client.go +++ b/client.go @@ -1,8 +1,8 @@ package webdav import ( - "encoding/xml" "net/http" + "fmt" "github.com/emersion/go-webdav/internal" ) @@ -24,18 +24,20 @@ func (c *Client) SetBasicAuth(username, password string) { } func (c *Client) FindCurrentUserPrincipal() (string, error) { - name := xml.Name{"DAV:", "current-user-principal"} - propfind := internal.NewPropNamePropfind(name) + propfind := internal.NewPropNamePropfind(internal.CurrentUserPrincipalName) resp, err := c.c.PropfindFlat("/", propfind) if err != nil { return "", err } - var prop currentUserPrincipal + var prop internal.CurrentUserPrincipal if err := resp.DecodeProp(&prop); err != nil { return "", err } + if prop.Unauthenticated != nil { + return "", fmt.Errorf("webdav: unauthenticated") + } return prop.Href, nil } diff --git a/elements.go b/elements.go deleted file mode 100644 index 04bc9c7..0000000 --- a/elements.go +++ /dev/null @@ -1,10 +0,0 @@ -package webdav - -import ( - "encoding/xml" -) - -type currentUserPrincipal struct { - XMLName xml.Name `xml:"DAV: current-user-principal"` - Href string `xml:"href"` -} diff --git a/internal/elements.go b/internal/elements.go index f7c50bf..3b6356c 100644 --- a/internal/elements.go +++ b/internal/elements.go @@ -11,6 +11,17 @@ import ( const Namespace = "DAV:" +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"} + GetETagName = xml.Name{"DAV:", "getetag"} + + CurrentUserPrincipalName = xml.Name{"DAV:", "current-user-principal"} +) + type Status struct { Code int Text string @@ -302,15 +313,6 @@ type GetLastModified struct { LastModified Time `xml:",chardata"` } -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"} - GetETagName = xml.Name{"DAV:", "getetag"} -) - // https://tools.ietf.org/html/rfc4918#section-14.5 type Error struct { XMLName xml.Name `xml:"DAV: error"` @@ -322,3 +324,10 @@ type DisplayName struct { XMLName xml.Name `xml:"DAV: displayname"` Name string `xml:",chardata"` } + +// https://tools.ietf.org/html/rfc5397#section-3 +type CurrentUserPrincipal struct { + XMLName xml.Name `xml:"DAV: current-user-principal"` + Href string `xml:"href,omitempty"` + Unauthenticated *struct{} `xml:"unauthenticated,omitempty"` +}