1// SPDX-FileCopyrightText: 2019 Alexey Andreyev <aa13q@ya.ru>
2// SPDX-License-Identifier: LGPL-2.1-or-later
3
4#include "encryptedevent.h"
5#include <Quotient/e2ee/e2ee_common.h>
6
7using namespace Quotient;
8
9EncryptedEvent::EncryptedEvent(const QJsonObject& ciphertexts,
10 const QString& senderKey)
11 : RoomEvent(basicJson(matrixType: TypeId, content: { { AlgorithmKeyL, OlmV1Curve25519AesSha2AlgoKey },
12 { CiphertextKey, ciphertexts },
13 { SenderKeyKey, senderKey } }))
14{}
15
16EncryptedEvent::EncryptedEvent(const QByteArray& ciphertext,
17 const QString& senderKey,
18 const QString& deviceId, const QString& sessionId)
19 : RoomEvent(basicJson(matrixType: TypeId, content: { { AlgorithmKeyL, MegolmV1AesSha2AlgoKey },
20 { CiphertextKey, QString::fromLatin1(ba: ciphertext) },
21 { DeviceIdKey, deviceId },
22 { SenderKeyKey, senderKey },
23 { SessionIdKey, sessionId } }))
24{}
25
26EncryptedEvent::EncryptedEvent(const QJsonObject& obj) : RoomEvent(obj) {}
27
28QString EncryptedEvent::algorithm() const
29{
30 return contentPart<QString>(key: AlgorithmKeyL);
31}
32
33RoomEventPtr EncryptedEvent::createDecrypted(const QString &decrypted) const
34{
35 auto eventObject = QJsonDocument::fromJson(json: decrypted.toUtf8()).object();
36 eventObject["event_id"_ls] = id();
37 eventObject["sender"_ls] = senderId();
38 eventObject["origin_server_ts"_ls] = originTimestamp().toMSecsSinceEpoch();
39 if (const auto relatesToJson = contentPart<QJsonObject>(key: "m.relates_to"_ls);
40 !relatesToJson.isEmpty()) {
41 auto content = eventObject["content"_ls].toObject();
42 content["m.relates_to"_ls] = relatesToJson;
43 eventObject["content"_ls] = content;
44 }
45 if (const auto redactsJson = unsignedPart<QString>(key: "redacts"_ls);
46 !redactsJson.isEmpty()) {
47 auto unsign = eventObject["unsigned"_ls].toObject();
48 unsign["redacts"_ls] = redactsJson;
49 eventObject["unsigned"_ls] = unsign;
50 }
51 return loadEvent<RoomEvent>(fullJson: eventObject);
52}
53
54void EncryptedEvent::setRelation(const QJsonObject& relation)
55{
56 auto content = contentJson();
57 content["m.relates_to"_ls] = relation;
58 editJson()["content"_ls] = content;
59}
60