Exemplo n.º 1
0
 def _from_stream_descriptor_blob(cls, loop: asyncio.AbstractEventLoop, blob_dir: str,
                                  blob: AbstractBlob) -> 'StreamDescriptor':
     with blob.reader_context() as blob_reader:
         json_bytes = blob_reader.read()
     try:
         decoded = json.loads(json_bytes.decode())
     except json.JSONDecodeError:
         blob.delete()
         raise InvalidStreamDescriptorError("Does not decode as valid JSON")
     if decoded['blobs'][-1]['length'] != 0:
         raise InvalidStreamDescriptorError("Does not end with a zero-length blob.")
     if any([blob_info['length'] == 0 for blob_info in decoded['blobs'][:-1]]):
         raise InvalidStreamDescriptorError("Contains zero-length data blob")
     if 'blob_hash' in decoded['blobs'][-1]:
         raise InvalidStreamDescriptorError("Stream terminator blob should not have a hash")
     if any([i != blob_info['blob_num'] for i, blob_info in enumerate(decoded['blobs'])]):
         raise InvalidStreamDescriptorError("Stream contains out of order or skipped blobs")
     descriptor = cls(
         loop, blob_dir,
         binascii.unhexlify(decoded['stream_name']).decode(),
         decoded['key'],
         binascii.unhexlify(decoded['suggested_file_name']).decode(),
         [BlobInfo(info['blob_num'], info['length'], info['iv'], info.get('blob_hash'))
          for info in decoded['blobs']],
         decoded['stream_hash'],
         blob.blob_hash
     )
     if descriptor.get_stream_hash() != decoded['stream_hash']:
         raise InvalidStreamDescriptorError("Stream hash does not match stream metadata")
     return descriptor
Exemplo n.º 2
0
 async def from_stream_descriptor_blob(
         cls, loop: asyncio.AbstractEventLoop, blob_dir: str,
         blob: AbstractBlob) -> 'StreamDescriptor':
     if not blob.is_readable():
         raise InvalidStreamDescriptorError(
             f"unreadable/missing blob: {blob.blob_hash}")
     return await loop.run_in_executor(
         None, cls._from_stream_descriptor_blob, loop, blob_dir, blob)