Repository navigation
fix: reject calendar object resources with more than one distinct UID - #46
Merged
Merged
Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Problem
A calendar object resource could hold more than one distinct UID, and a body with
more than one vCard was stored as a single item. Two unrelated events under one
href share a single ETag, so a client cannot move, edit or delete them one by
one, and the sync semantics of DAVx5 and the iOS/macOS calendars break. A
component without UID is the same defect: it is stored but unreachable.
Evidence
internal/dav/objects.go(validateItem) kept the last UID seen whilewalking the components, and the vCard path decoded only the first card of the
body, so:
VCALENDARwithUID:e1andUID:e2, PUT ase2.ics, returned 201 andstored both events.
VCALENDARwith a secondVEVENTwithout UID was stored too.VCARDs, first one named like the resource, returned 201.Changes
validateItemnow requires everyVEVENT/VTODO/VJOURNALto carry a UIDand all of them to be the same one, which keeps the legitimate shape working:
a master event plus overrides that share its UID and carry
RECURRENCE-ID(RFC 4791).
same reasoning.
Verification
after the fix:
TestPutRejectsMultipleUIDs(two UIDs, and a component withoutUID),
TestPutAcceptsRecurringEventWithOverride,TestPutRejectsMultipleVCards.go test ./... -race -shuffle=on,go vet ./...,gofmt -l .andgo mod tidyclean;govulncheck ./...reports no vulnerabilities.Closes #40