Przeglądaj źródła

Return error for GET requests on directories

Radicale doesn't support directory listings.
Unrud 9 lat temu
rodzic
commit
1ea9b1dca9
2 zmienionych plików z 10 dodań i 6 usunięć
  1. 4 0
      radicale/__init__.py
  2. 6 6
      radicale/tests/test_base.py

+ 4 - 0
radicale/__init__.py

@@ -67,6 +67,8 @@ REQUEST_ENTITY_TOO_LARGE = (client.REQUEST_ENTITY_TOO_LARGE,
                             "Request body too large.")
 REMOTE_DESTINATION = (client.BAD_GATEWAY, {"Content-type": "text/plain"},
                       "Remote destination not supported.")
+DIRECTORY_LISTING = (client.FORBIDDEN, {"Content-type": "text/plain"},
+                     "Directory listings are not supported.")
 
 DAV_HEADERS = "1, 2, 3, calendar-access, addressbook, extended-mkcol"
 
@@ -451,6 +453,8 @@ class Application:
                 return NOT_FOUND
             if isinstance(item, self.Collection):
                 collection = item
+                if collection.get_meta("tag") not in ("VADDRESSBOOK", "VCALENDAR"):
+                    return DIRECTORY_LISTING
             else:
                 collection = item.collection
             content_type = xmlutils.MIMETYPES.get(

+ 6 - 6
radicale/tests/test_base.py

@@ -736,8 +736,8 @@ class BaseRequestsMixIn:
     def test_principal_collection_creation(self):
         """Verify existence of the principal collection."""
         status, headers, answer = self.request(
-            "GET", "/user/", REMOTE_USER="user")
-        assert status == 200
+            "PROPFIND", "/user/", REMOTE_USER="user")
+        assert status == 207
 
     def test_existence_of_root_collections(self):
         """Verify that the root collection always exists."""
@@ -762,8 +762,8 @@ class BaseRequestsMixIn:
                                                          "created_by_hook"))
         status, headers, answer = self.request("MKCOL", "/calendar.ics/")
         assert status == 201
-        status, headers, answer = self.request("GET", "/created_by_hook/")
-        assert status == 200
+        status, headers, answer = self.request("PROPFIND", "/created_by_hook/")
+        assert status == 207
 
     def test_hook_read_access(self):
         """Verify that hook is not run for read accesses."""
@@ -791,8 +791,8 @@ class BaseRequestsMixIn:
                                                          "created_by_hook"))
         status, headers, answer = self.request("GET", "/", REMOTE_USER="user")
         assert status == 200
-        status, headers, answer = self.request("GET", "/created_by_hook/")
-        assert status == 200
+        status, headers, answer = self.request("PROPFIND", "/created_by_hook/")
+        assert status == 207
 
     def test_hook_fail(self):
         """Verify that a request fails if the hook fails."""