Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix: Handle Depth header for COPY as this is required by RFC #1495

Open
wants to merge 3 commits into
base: master
Choose a base branch
from

Conversation

susnux
Copy link
Contributor

@susnux susnux commented Oct 25, 2023

Currently Sabre\DAV does not support the Depth header on COPY and MOVE.
But the RFC4918 requires servers to do so, the header is not required but:

  • If the header is missing 'infinity' shall be assumed -> This is how we handle every request currently
  • For MOVE the header, if available, must be 'infinity' -> We just have to check the header and throw bad request otherwise
  • For COPY the header may 'infinity' or a positive integer including 0
    • The depths defines how many levels of children shall be copied
    • If the depth is zero only the collection and its properties are copied, but not any children

So especially the COPY method is currently broken, we noticed this when using the WebDAV litmus test bench (version 0.14) which checks for shallow copies (meaning copy a collection with depth 0).

This PR fixes all of this points, while trying to keep backwards compatible. Of cause any using application that implements ICopyTarget::copyInto is still broken and need to adapt to the depth change (it continues to work as before, but the bug fix does not propagate).

Reference from the RFC:

  • The requirement on the server support of COPY Depth 'infinity' and '0': rfc4918#section-9.8.3
  • For MOVE only Depth: infinity is allowed: rfc4918#section-9.9.2


// Depth of inifinty is valid for MOVE and COPY. If it is not set the RFC requires to act like it was 'infinity'.
$depth = strtolower($request->getHeader('Depth') ?? 'infinity');
if ($depth !== 'infinity' && is_numeric($depth)) {
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

In core plugin above it is stated that only infinity is allowed. Adding this logic here can reduce the necessary code changes a lot.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

@DeepDiver1975 yes thats for MOVE, but for COPY we need to support also numeric values.

@susnux
Copy link
Contributor Author

susnux commented Apr 4, 2024

ping again, also cc @phil-davis

Would be great to get this fixed so sabre passes the litmus test v15 ( https://github.com/notroj/litmus previously http://www.webdav.org/neon/litmus/ )

@phil-davis phil-davis self-assigned this Apr 18, 2024
@susnux
Copy link
Contributor Author

susnux commented Aug 13, 2024

Anything I can help with to get this reviewed? (I do not want to bug you but this would be a great to get fixed :) ).

@DeepDiver1975
Copy link
Member

I miss the ci status - what's going on here?

@DeepDiver1975
Copy link
Member

I miss the ci status - what's going on here?

@susnux can I ask you to rebase this pull request ... THX

Only `Depth: infinity` is allowed, ref: rfc4918#section-9.9.2

Signed-off-by: Ferdinand Thiessen <[email protected]>
1. According to the RFC[1] servers **must** support `Depth` 'infinity' and 0.
2. And COPY method on a collection without a Depth header MUST act as if
a Depth header with value "infinity" was included.

[1] rfc4918#section-9.8.3

Signed-off-by: Ferdinand Thiessen <[email protected]>
@susnux
Copy link
Contributor Author

susnux commented Sep 5, 2024

can I ask you to rebase this pull request ... THX

@DeepDiver1975 sure, done!

Noticed I had some code style issues / compatibility issues because I was using PHP 8+ syntax and tests use PHP 7.4. This is now fixed.

Signed-off-by: Ferdinand Thiessen <[email protected]>
Copy link

codecov bot commented Sep 5, 2024

Codecov Report

Attention: Patch coverage is 92.59259% with 2 lines in your changes missing coverage. Please review.

Project coverage is 97.24%. Comparing base (a9d0a90) to head (3e722c3).
Report is 2 commits behind head on master.

Files with missing lines Patch % Lines
lib/DAV/Server.php 85.71% 1 Missing ⚠️
lib/DAV/Tree.php 93.33% 1 Missing ⚠️
Additional details and impacted files
@@            Coverage Diff            @@
##             master    #1495   +/-   ##
=========================================
  Coverage     97.24%   97.24%           
- Complexity     2834     2841    +7     
=========================================
  Files           175      175           
  Lines          8843     8861   +18     
=========================================
+ Hits           8599     8617   +18     
  Misses          244      244           

☔ View full report in Codecov by Sentry.
📢 Have feedback on the report? Share it here.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants