LINUX.ORG.RU

Synapse Matrix расшифровать файл из хранилица

 ,


0

1

Пишу бота matrix используя matrix-nio. Бот конвертит pdf в docx.

Работает для незашифрованных чатов. pdf файл скармливается конвертеру, выходной файл заливается в хранилище и отсылается пользователю.

Если чат с ботом зашифрован, то файлы так же попадают в хранилище зашифрованными, конвертер их не может открыть. Как расшифровать файл перед отправкой конвертеру? Это вообще возможно?

Нашел только костыльный способ с matrix-commander

★★★★

Не совсем по теме вопрос: чем PDF конвертируешь, что-то самописное?

Пробовал пару готовых утилит — более-менее хорошо работает только для очень простых документов, не дай бог какая-нибудь таблица встретится — всё разъезжается.

Ja-Ja-Hey-Ho ★★★★★
()
Ответ на: комментарий от intelfx

Не внезапно конечно. Я понимаю, что так и должно быть. Так же я понимаю, что бот здесь не посторонний. Если ему отсылают сообщения, он должен уметь расшифровать их.

Решение подглядел в коде matrix-commnader. Расшифровать файл:

    async def message_encr_file(self, room: MatrixRoom, event: RoomEncryptedFile) -> None:
        if event.sender == self.client.user:
            return
        filename = event.body
        resp = await self.client.download(mxc=event.url, filename=filename)
        media_data = resp.body
        async with aiofiles.open(f"/tmp/{filename}", "wb") as f:
            await f.write(
                crypto.attachments.decrypt_attachment(
                    media_data,
                    event.source["content"]["file"]["key"]["k"],
                    event.source["content"]["file"]["hashes"]["sha256"],
                    event.source["content"]["file"]["iv"],
                )
            )

После конвертации нужно готовый файл залить в хранилище зашифрованным и отправить пользователю с ключами:

        file_stat = await aiofiles.os.stat(f"/tmp/{new_filename}")
        async with aiofiles.open(f"/tmp/{new_filename}", "r+b") as f:
            resp, decryption_keys = await self.client.upload(
                f,
                content_type="application/vnd.openxmlformats-officedocument.wordprocessingml.document",
                filename=f"{new_filename}",
                filesize=file_stat.st_size,
                encrypt=True,
            )
        content = {
            "body": new_filename,
            "msgtype": "m.file",
            "url": resp.content_uri,
            "file": {
                "url": resp.content_uri,
                "key": decryption_keys["key"],
                "iv": decryption_keys["iv"],
                "hashes": decryption_keys["hashes"],
                "v": decryption_keys["v"],
            },
        }
        await self.client.room_send(
            room_id=room.room_id,
            message_type="m.room.message",
            content=content,
        )
afanasiy ★★★★
() автор топика