Source code for divera.api.v2.file

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