<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Bug:  CalDAV calendar-multiget returns 404 for percent-encoded resource URLs containing @]]></title><description><![CDATA[<p dir="auto">With a little help from my AI friends. <img src="https://forum.cloudron.io/assets/plugins/nodebb-plugin-emoji/emoji/android/1f642.png?v=ceaf42e9406" class="not-responsive emoji emoji-android emoji--slightly_smiling_face" style="height:23px;width:auto;vertical-align:middle" title=":)" alt="🙂" /></p>
<h2>Description</h2>
<p dir="auto">The CalDAV server returns calendar object URLs containing a percent-encoded @ character in DAV:href, but subsequently fails to resolve those same URLs in a calendar-multiget request.</p>
<p dir="auto">This prevents clients such as Mozilla Thunderbird from downloading the affected events.</p>
<h2>Steps to reproduce</h2>
<ol>
<li>Create a calendar object whose resource filename contains @, for example:</li>
</ol>
<p dir="auto">abc123@example.com.ics</p>
<ol start="2">
<li>Request the calendar collection or perform the initial CalDAV synchronization.</li>
<li>The server returns the object using an encoded DAV:href:</li>
</ol>
<pre><code>&lt;D:href&gt;/caldav/users/example/calendars/1/abc123%40example.com.ics&lt;/D:href&gt;
</code></pre>
<ol start="4">
<li>Send a calendar-multiget request using exactly that returned href:</li>
</ol>
<pre><code>&lt;?xml version="1.0" encoding="UTF-8"?&gt;
    &lt;C:calendar-multiget
        xmlns:D="DAV:"
        xmlns:C="urn:ietf:params:xml:ns:caldav"&gt;
      &lt;D:prop&gt;
        &lt;D:getetag/&gt;
        &lt;C:calendar-data/&gt;
      &lt;/D:prop&gt;
      &lt;D:href&gt;/caldav/users/example/calendars/1/abc123%40example.com.ics&lt;/D:href&gt;
    &lt;/C:calendar-multiget&gt;
</code></pre>
<h2>Actual result</h2>
<p dir="auto">The server responds with:</p>
<pre><code>  &lt;D:response&gt;
    &lt;D:href&gt;/caldav/users/example/calendars/1/abc123%40example.com.ics&lt;/D:href&gt;
    &lt;D:status&gt;HTTP/1.1 404 Not Found&lt;/D:status&gt;
  &lt;/D:response&gt;
</code></pre>
<p dir="auto">Thunderbird consequently treats the event as missing or deleted:</p>
<p dir="auto">CalDAV: skipping unfound deleted item:<br />
.../abc123@example.com.ics</p>
<p dir="auto">The calendar object itself still exists. A full calendar-query can return its calendar-data successfully, so  the failure appears specific to resource lookup through calendar-multiget.</p>
<h2>Expected result</h2>
<p dir="auto">Any DAV:href returned by the server must be usable in subsequent CalDAV requests.</p>
<p dir="auto">The calendar-multiget request should return HTTP 200 and the corresponding calendar-data:</p>
<pre><code>  &lt;D:response&gt;
    &lt;D:href&gt;/caldav/users/example/calendars/1/abc123%40example.com.ics&lt;/D:href&gt;
    &lt;D:propstat&gt;
      &lt;D:prop&gt;
        &lt;D:getetag&gt;...&lt;/D:getetag&gt;
        &lt;C:calendar-data&gt;...&lt;/C:calendar-data&gt;
      &lt;/D:prop&gt;
      &lt;D:status&gt;HTTP/1.1 200 OK&lt;/D:status&gt;
    &lt;/D:propstat&gt;
  &lt;/D:response&gt;
</code></pre>
<h2>Impact</h2>
<ul>
<li>Affected events are stored on the server but remain invisible in Thunderbird.</li>
<li>Initial synchronization and forced resynchronization do not help.</li>
<li>Clients may incorrectly consider the affected resources deleted.</li>
<li>All resources whose filenames contain @ can be affected.</li>
</ul>
<h2>Suggested fix</h2>
<p dir="auto">Normalize or decode resource paths consistently when processing calendar-multiget requests.</p>
<p dir="auto">In particular:</p>
<ol>
<li>
<p dir="auto">Parse each supplied DAV:href.</p>
</li>
<li>
<p dir="auto">Decode percent-encoded path segments exactly once.</p>
</li>
<li>
<p dir="auto">Resolve %40 to the same stored resource as @.</p>
</li>
<li>
<p dir="auto">Ensure the lookup logic uses the same URI normalization rules as the code that generates DAV:href.</p>
</li>
<li>
<p dir="auto">Add a regression test covering filenames such as:</p>
<p dir="auto">event@example.com.ics<br />
event%40example.com.ics</p>
</li>
</ol>
<p dir="auto">The test should verify that an href returned during collection discovery can be passed unchanged to calendar-multiget and produces a successful response.</p>
<h2>Environment</h2>
<ul>
<li>Client: Mozilla Thunderbird using native CalDAV support</li>
<li>Request type: calendar-multiget</li>
<li>Calendar objects: valid VEVENT resources</li>
<li>Authentication and collection discovery: successful</li>
<li>Full calendar query: successful</li>
<li>Individual multiget lookup for percent-encoded hrefs: 404 Not Found</li>
</ul>
]]></description><link>https://forum.cloudron.io/topic/15811/bug-caldav-calendar-multiget-returns-404-for-percent-encoded-resource-urls-containing-@</link><generator>RSS for Node</generator><lastBuildDate>Mon, 07 Sep 2026 12:16:29 GMT</lastBuildDate><atom:link href="https://forum.cloudron.io/topic/15811.rss" rel="self" type="application/rss+xml"/><pubDate>Sun, 09 Aug 2026 12:14:00 GMT</pubDate><ttl>60</ttl><item><title><![CDATA[Reply to Bug:  CalDAV calendar-multiget returns 404 for percent-encoded resource URLs containing @ on Tue, 11 Aug 2026 13:28:03 GMT]]></title><description><![CDATA[<p dir="auto"><a class="plugin-mentions-user plugin-mentions-a" href="/user/nebulon" aria-label="Profile: nebulon">@<bdi>nebulon</bdi></a> That worked.</p>
]]></description><link>https://forum.cloudron.io/post/128036</link><guid isPermaLink="true">https://forum.cloudron.io/post/128036</guid><dc:creator><![CDATA[luckow]]></dc:creator><pubDate>Tue, 11 Aug 2026 13:28:03 GMT</pubDate></item><item><title><![CDATA[Reply to Bug:  CalDAV calendar-multiget returns 404 for percent-encoded resource URLs containing @ on Tue, 11 Aug 2026 12:17:38 GMT]]></title><description><![CDATA[<p dir="auto">The new package is out. <a class="plugin-mentions-user plugin-mentions-a" href="/user/luckow" aria-label="Profile: luckow">@<bdi>luckow</bdi></a> would be great if you can test your use-case and see if it is fixed for you</p>
]]></description><link>https://forum.cloudron.io/post/128035</link><guid isPermaLink="true">https://forum.cloudron.io/post/128035</guid><dc:creator><![CDATA[nebulon]]></dc:creator><pubDate>Tue, 11 Aug 2026 12:17:38 GMT</pubDate></item><item><title><![CDATA[Reply to Bug:  CalDAV calendar-multiget returns 404 for percent-encoded resource URLs containing @ on Mon, 10 Aug 2026 15:13:43 GMT]]></title><description><![CDATA[<p dir="auto">thanks, this should be fixed with <a href="https://git.cloudron.io/apps/calendar/-/commit/c96d59673ac499842ff043dc289be3432afb8925" target="_blank" rel="noopener noreferrer nofollow ugc">https://git.cloudron.io/apps/calendar/-/commit/c96d59673ac499842ff043dc289be3432afb8925</a> pending an app package release.</p>
]]></description><link>https://forum.cloudron.io/post/127991</link><guid isPermaLink="true">https://forum.cloudron.io/post/127991</guid><dc:creator><![CDATA[nebulon]]></dc:creator><pubDate>Mon, 10 Aug 2026 15:13:43 GMT</pubDate></item></channel></rss>