Explorar el Código

Catch digest errors. Resolves #102.

Stefano Cossu hace 5 años
padre
commit
1d79ee2987

+ 14 - 2
lakesuperior/endpoints/ldp.py

@@ -23,7 +23,8 @@ from lakesuperior.dictionaries.namespaces import ns_mgr as nsm
 from lakesuperior.exceptions import (
         ChecksumValidationError, ResourceNotExistsError, TombstoneError,
         ServerManagedTermError, InvalidResourceError, SingleSubjectError,
-        ResourceExistsError, IncompatibleLdpTypeError)
+        ResourceExistsError, IncompatibleLdpTypeError,
+        IndigestibleError)
 from lakesuperior.globals import RES_CREATED
 from lakesuperior.model.ldp.ldp_factory import LdpFactory
 from lakesuperior.model.ldp.ldp_nr import LdpNr
@@ -283,11 +284,22 @@ def post_resource(parent_uid):
         kwargs['mimetype'] = mimetype
         # Check digest if requested.
         if 'digest' in request.headers:
-            kwargs['prov_cksum_algo'], kwargs['prov_cksum'] = \
+            try:
+                kwargs['prov_cksum_algo'], kwargs['prov_cksum'] = (
                     request.headers['digest'].split('=')
+                )
+            except ValueError:
+                return (
+                    f'Cannot parse digest value: {request.headers["digest"]}',
+                    400
+                )
 
     try:
         rsrc = rsrc_api.create(parent_uid, slug, **kwargs)
+    except IndigestibleError:
+        return (
+            f'Unable to parse digest header: {request.headers["digest"]}'
+        ), 400
     except ResourceNotExistsError as e:
         return str(e), 404
     except (InvalidResourceError, ChecksumValidationError) as e:

+ 8 - 2
lakesuperior/exceptions.py

@@ -39,11 +39,17 @@ class ChecksumValidationError(ResourceError):
 
 
     def __str__(self):
-        return self.msg or (f'Validation failed for resource {self.uid}. '
-                            f'Provided checksum: {self.prov_cksum}; '
+        return self.msg or (f'validation failed for resource {self.uid}. '
+                            f'provided checksum: {self.prov_cksum}; '
                             f'calculated checksum: {self.calc_cksum}')
 
 
+class IndigestibleError(ResourceError):
+    """
+    Raised when an unsupported digest algorithm is requested.
+    """
+    pass
+
 
 class ResourceNotExistsError(ResourceError):
     '''

+ 8 - 3
lakesuperior/store/ldp_nr/default_layout.py

@@ -7,7 +7,7 @@ from uuid import uuid4
 
 from lakesuperior import env
 from lakesuperior.store.ldp_nr.base_non_rdf_layout import BaseNonRdfLayout
-from lakesuperior.exceptions import ChecksumValidationError
+from lakesuperior.exceptions import ChecksumValidationError, IndigestibleError
 
 
 logger = logging.getLogger(__name__)
@@ -98,9 +98,14 @@ class DefaultLayout(BaseNonRdfLayout):
                 logger.debug(f'Writing temp file to {tmp_fname}.')
 
                 store_hash = hashlib.new(default_hash_algo)
-                verify_hash = (
+                try:
+                    verify_hash = (
                         store_hash if prov_cksum_algo == default_hash_algo
-                        else hashlib.new(prov_cksum_algo))
+                        else hashlib.new(prov_cksum_algo)
+                    )
+                except ValueError as e:
+                    raise IndigestibleError(uid, str(e))
+
                 size = 0
                 while True:
                     buf = stream.read(bufsize)