mirror of
https://github.com/1f349/go-webdav.git
synced 2024-12-22 16:24:14 +00:00
a3e56141d9
Allow the backend to provide a value for the `getcontentlength` property as described in [RFC 2518 section 13.4][1]. The implementation treats is as optional, allthough it is a required property per RFC. Most clients do perfectly fine without it, though. Properly setting this in the backend makes the CardDAV collection listable with clients that do require it, e.g. cadaver. [1]: https://datatracker.ietf.org/doc/html/rfc2518#section-13.4
123 lines
2.5 KiB
Go
123 lines
2.5 KiB
Go
// Package carddav provides a client and server CardDAV implementation.
|
|
//
|
|
// CardDAV is defined in RFC 6352.
|
|
package carddav
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/emersion/go-vcard"
|
|
"github.com/emersion/go-webdav"
|
|
"github.com/emersion/go-webdav/internal"
|
|
)
|
|
|
|
func NewAddressBookHomeSet(path string) webdav.BackendSuppliedHomeSet {
|
|
return &addressbookHomeSet{Href: internal.Href{Path: path}}
|
|
}
|
|
|
|
type AddressDataType struct {
|
|
ContentType string
|
|
Version string
|
|
}
|
|
|
|
type AddressBook struct {
|
|
Path string
|
|
Name string
|
|
Description string
|
|
MaxResourceSize int64
|
|
SupportedAddressData []AddressDataType
|
|
}
|
|
|
|
func (ab *AddressBook) SupportsAddressData(contentType, version string) bool {
|
|
if len(ab.SupportedAddressData) == 0 {
|
|
return contentType == "text/vcard" && version == "3.0"
|
|
}
|
|
for _, t := range ab.SupportedAddressData {
|
|
if t.ContentType == contentType && t.Version == version {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
type AddressBookQuery struct {
|
|
DataRequest AddressDataRequest
|
|
|
|
PropFilters []PropFilter
|
|
FilterTest FilterTest // defaults to FilterAnyOf
|
|
|
|
Limit int // <= 0 means unlimited
|
|
}
|
|
|
|
type AddressDataRequest struct {
|
|
Props []string
|
|
AllProp bool
|
|
}
|
|
|
|
type PropFilter struct {
|
|
Name string
|
|
Test FilterTest // defaults to FilterAnyOf
|
|
|
|
// if IsNotDefined is set, TextMatches and Params need to be unset
|
|
IsNotDefined bool
|
|
TextMatches []TextMatch
|
|
Params []ParamFilter
|
|
}
|
|
|
|
type ParamFilter struct {
|
|
Name string
|
|
|
|
// if IsNotDefined is set, TextMatch needs to be unset
|
|
IsNotDefined bool
|
|
TextMatch *TextMatch
|
|
}
|
|
|
|
type TextMatch struct {
|
|
Text string
|
|
NegateCondition bool
|
|
MatchType MatchType // defaults to MatchContains
|
|
}
|
|
|
|
type FilterTest string
|
|
|
|
const (
|
|
FilterAnyOf FilterTest = "anyof"
|
|
FilterAllOf FilterTest = "allof"
|
|
)
|
|
|
|
type MatchType string
|
|
|
|
const (
|
|
MatchEquals MatchType = "equals"
|
|
MatchContains MatchType = "contains"
|
|
MatchStartsWith MatchType = "starts-with"
|
|
MatchEndsWith MatchType = "ends-with"
|
|
)
|
|
|
|
type AddressBookMultiGet struct {
|
|
Paths []string
|
|
DataRequest AddressDataRequest
|
|
}
|
|
|
|
type AddressObject struct {
|
|
Path string
|
|
ModTime time.Time
|
|
ContentLength int64
|
|
ETag string
|
|
Card vcard.Card
|
|
}
|
|
|
|
//SyncQuery is the query struct represents a sync-collection request
|
|
type SyncQuery struct {
|
|
DataRequest AddressDataRequest
|
|
SyncToken string
|
|
Limit int // <= 0 means unlimited
|
|
}
|
|
|
|
//SyncResponse contains the returned sync-token for next time
|
|
type SyncResponse struct {
|
|
SyncToken string
|
|
Updated []AddressObject
|
|
Deleted []string
|
|
}
|