def perform_pubkey_get(intent): msg = {'id': intent.id} ret = yield Effect(BackendCmd('pubkey_get', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return PubKey(intent.id, from_jsonb64(ret['key']))
def perform_group_read(intent): msg = {'name': intent.name} ret = yield Effect(BackendCmd('group_read', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return Group(intent.name, ret['admins'], ret['users'])
async def open_connection(self, identity): logger.debug('Connection to backend opened') assert not self._websocket, "Connection to backend already opened" try: self._websocket = await websockets.connect(self.url) # Handle handshake raw = await self._websocket.recv() challenge = ejson_loads(raw) answer = identity.private_key.sign(challenge['challenge'].encode()) await self._websocket.send( ejson_dumps({ 'handshake': 'answer', 'identity': identity.id, 'answer': to_jsonb64(answer) })) resp = ejson_loads(await self._websocket.recv()) if resp['status'] != 'ok': await self.close_connection() raise exception_from_status(resp['status'])(resp['label']) self._ws_recv_handler_task = asyncio.ensure_future( self._ws_recv_handler(), loop=self.loop) if self.watchdog_time: self._watchdog_task = asyncio.ensure_future(self._watchdog(), loop=self.loop) except (ConnectionRefusedError, websockets.exceptions.ConnectionClosed) as exc: raise BackendConnectionError('Cannot connect to backend (%s)' % exc)
def perform_vlob_create(intent): msg = {'blob': to_jsonb64(intent.blob)} ret = yield Effect(BackendCmd('vlob_create', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return VlobAccess(ret['id'], ret['read_trust_seed'], ret['write_trust_seed'])
def perform_user_vlob_read(intent): msg = {} if intent.version is not None: msg['version'] = intent.version ret = yield Effect(BackendCmd('user_vlob_read', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return UserVlobAtom(ret['version'], from_jsonb64(ret['blob']))
def perform_vlob_read(intent): assert isinstance(intent.id, str) msg = {'id': intent.id, 'trust_seed': intent.trust_seed} if intent.version is not None: msg['version'] = intent.version ret = yield Effect(BackendCmd('vlob_read', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return VlobAtom(ret['id'], ret['version'], from_jsonb64(ret['blob']))
def perform_message_get(intent): msg = {'recipient': intent.recipient, 'offset': intent.offset} ret = yield Effect(BackendCmd('message_get', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label']) return [ Message(msg['count'], from_jsonb64(msg['body'])) for msg in ret['messages'] ]
def perform_vlob_update(intent): msg = { 'id': intent.id, 'version': intent.version, 'trust_seed': intent.trust_seed, 'blob': to_jsonb64(intent.blob) } ret = yield Effect(BackendCmd('vlob_update', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label'])
async def send_cmd(self, msg): if not self._websocket: raise BackendConnectionError( 'BackendAPIService cannot send command in current state') try: await self._websocket.send(ejson_dumps(msg)) except websockets.exceptions.ConnectionClosed as exc: raise BackendConnectionError('Cannot connect to backend (%s)' % exc) ret = await self._resp_queue.get() status = ret['status'] if status == 'ok': return ret else: raise exception_from_status(status)(ret['label'])
def perform_group_remove_identities(intent): msg = {'name': intent.name, 'identities': intent.identities, 'admin': intent.admin} ret = yield Effect(BackendCmd('group_remove_identities', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label'])
def perform_group_create(intent): msg = {'name': intent.name} ret = yield Effect(BackendCmd('group_create', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label'])
def perform_message_new(intent): msg = {'recipient': intent.recipient, 'body': to_jsonb64(intent.body)} ret = yield Effect(BackendCmd('message_new', msg)) status = ret['status'] if status != 'ok': raise exception_from_status(status)(ret['label'])