import base64
import io
import Crypto
import Crypto.Random
import Crypto.Util.Padding
from Crypto.Cipher import AES
from divera.api import endpointwrappers as _epw
from divera.api.v2 import models as _models
from divera.api.v2 import pull as _pull
[docs]class GetAll(_models.GetAll):
path = '/api/v2/attachments'
[docs]class Get(GetAll, _models.Get):
@property
def path(self):
return f'/api/v2/attachments/{self.obj.__getattribute__(self.obj.sorting_key)}'
[docs]class DownloadRequest(_epw.FunctionalEndPoint, _epw.ObjectRelated):
method = 'GET'
@property
def path(self):
return f'/api/v2/file/open/{self.obj.file_reference_id}'
def __call__(
self,
base_url: str,
access_token: str,
*args, **kwargs
) -> [list, dict]:
return (
base_url.rstrip('/') + self.path + f'?accesskey={access_token}',
), {}
[docs] async def process_result(
self,
result,
):
raw = result
text = ''
for c in raw:
text += chr(c)
encryption_keys = {}
keys_request = _pull.EncryptionKeys()
async def process_result(result):
nonlocal encryption_keys
encryption_keys = result['data']['items']
return result
keys_request.process_result = process_result
yield keys_request
key = encryption_keys['23103']
iv = self.obj.encryption_iv
key = bytes.fromhex(key)
iv = bytes.fromhex(iv)
ciphertext = base64.b64decode(text)
cipher = AES.new(
key,
AES.MODE_CBC,
iv=iv,
)
plaintext_bytes = Crypto.Util.Padding.unpad(cipher.decrypt(ciphertext), AES.block_size)
file = io.BytesIO(plaintext_bytes)
file.name = self.obj.name
file.write(plaintext_bytes)
yield file