Skip to content

Commit

Permalink
Merge branch 'noncrypto_hash' into development
Browse files Browse the repository at this point in the history
  • Loading branch information
Stefano Cossu committed Oct 28, 2018
2 parents e1a6e2d + 6a43267 commit 53f8f89
Show file tree
Hide file tree
Showing 18 changed files with 336 additions and 4,915 deletions.
3 changes: 3 additions & 0 deletions .gitmodules
Original file line number Diff line number Diff line change
Expand Up @@ -6,3 +6,6 @@
path = ext/tpl
url = https://github.com/troydhanson/tpl.git
branch = stable
[submodule "ext/spookyhash"]
path = ext/spookyhash
url = https://github.com/centaurean/spookyhash.git
4 changes: 3 additions & 1 deletion MANIFEST.in
Original file line number Diff line number Diff line change
@@ -1,12 +1,14 @@
include README.rst
include LICENSE
include bin/*
include ext/lmdb/libraries/liblmdb/lmdb.h
include ext/lmdb/libraries/liblmdb/mdb.c
include ext/lmdb/libraries/liblmdb/lmdb.h
include ext/lmdb/libraries/liblmdb/midl.c
include ext/lmdb/libraries/liblmdb/midl.h
include ext/tpl/src/tpl.c
include ext/tpl/src/tpl.h
include ext/spookyhash/src/*.c
include ext/spookyhash/src/*.h
graft lakesuperior/data/bootstrap
graft lakesuperior/endpoints/templates
graft lakesuperior/etc.defaults
1 change: 1 addition & 0 deletions ext/spookyhash
Submodule spookyhash added at 7192ad
40 changes: 40 additions & 0 deletions lakesuperior/api/admin.py
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import hashlib
import logging

from lakesuperior import env
from lakesuperior.config_parser import parse_config
from lakesuperior.dictionaries.namespaces import ns_collection as nsc
from lakesuperior.exceptions import (
ChecksumValidationError, IncompatibleLdpTypeError)
from lakesuperior.migrator import Migrator
from lakesuperior.store.ldp_nr.default_layout import DefaultLayout as FileLayout

Expand Down Expand Up @@ -54,3 +58,39 @@ def integrity_check():
"""
with env.app_globals.rdfly.store.txn_ctx():
return set(env.app_globals.rdfly.find_refint_violations())


def fixity_check(uid):
"""
Check fixity of a resource.
This calculates the checksum of a resource and validates it against the
checksum stored in its metadata (``premis:hasMessageDigest``).
:param str uid: UID of the resource to be checked.
:rtype: None
:raises: lakesuperior.exceptions.ChecksumValidationError: the cecksums
do not match. This indicates corruption.
:raises: lakesuperior.exceptions.IncompatibleLdpTypeError: if the
resource is not an LDP-NR.
"""
from lakesuperior.api import resource as rsrc_api
from lakesuperior.model.ldp_factory import LDP_NR_TYPE

rsrc = rsrc_api.get(uid)
if LDP_NR_TYPE not in rsrc.ldp_types:
raise IncompatibleLdpTypeError()

ref_digest_term = rsrc.metadata.value(nsc['premis'].hasMessageDigest)
ref_digest_parts = ref_digest_term.split(':')
ref_cksum = ref_digest_parts[-1]
ref_cksum_algo = ref_digest_parts[-2]

calc_cksum = hashlib.new(ref_cksum_algo, rsrc.content.read()).hexdigest()

if calc_cksum != ref_cksum:
raise ChecksumValidationError(uid, ref_cksum, calc_cksum)

logger.info(f'Fixity check passed for {uid}.')

0 comments on commit 53f8f89

Please sign in to comment.