| @@ -29,9 +29,7 @@ _validhashes = set([ 'sha256', 'sha512' ]) | |||||
| _hashlengths = { len(getattr(hashlib, x)().hexdigest()): x for x in _validhashes } | _hashlengths = { len(getattr(hashlib, x)().hexdigest()): x for x in _validhashes } | ||||
| def _iterdictlist(obj): | def _iterdictlist(obj): | ||||
| itms = list(obj.items()) | |||||
| itms.sort() | |||||
| for k, v in itms: | |||||
| for k, v in sorted(obj.items()): | |||||
| if isinstance(v, list): | if isinstance(v, list): | ||||
| v = v[:] | v = v[:] | ||||
| v.sort() | v.sort() | ||||
| @@ -200,10 +198,7 @@ class CanonicalCoder(pasn1.ASN1DictCoder): | |||||
| def enc_dict(self, obj, **kwargs): | def enc_dict(self, obj, **kwargs): | ||||
| class FakeIter: | class FakeIter: | ||||
| def items(self): | def items(self): | ||||
| itms = list(obj.items()) | |||||
| itms.sort() | |||||
| return iter(itms) | |||||
| return iter(sorted(obj.items())) | |||||
| return pasn1.ASN1DictCoder.enc_dict(self, FakeIter(), **kwargs) | return pasn1.ASN1DictCoder.enc_dict(self, FakeIter(), **kwargs) | ||||
| @@ -478,11 +473,19 @@ class ObjectStore(object): | |||||
| else: | else: | ||||
| raise KeyError('unable to find metadata for file') | raise KeyError('unable to find metadata for file') | ||||
| def _readfp(fp): | |||||
| while True: | |||||
| r = fp.read(64*1024) | |||||
| if r == b'': | |||||
| return | |||||
| yield r | |||||
| def _hashfile(fname): | def _hashfile(fname): | ||||
| hash = getattr(hashlib, _defaulthash)() | hash = getattr(hashlib, _defaulthash)() | ||||
| with open(fname, 'rb') as fp: | with open(fname, 'rb') as fp: | ||||
| r = fp.read() | |||||
| hash.update(r) | |||||
| for r in _readfp(fp): | |||||
| hash.update(r) | |||||
| return '%s:%s' % (_defaulthash, hash.hexdigest()) | return '%s:%s' % (_defaulthash, hash.hexdigest()) | ||||