libQuotient
A Qt library for building matrix clients
encryptedevent.h
Go to the documentation of this file.
1 // SPDX-FileCopyrightText: 2019 Alexey Andreyev <aa13q@ya.ru>
2 // SPDX-License-Identifier: LGPL-2.1-or-later
3 
4 #pragma once
5 
6 #include "roomevent.h"
7 
8 namespace Quotient {
9 
10 constexpr inline auto CiphertextKey = "ciphertext"_ls;
11 constexpr inline auto SenderKeyKey = "sender_key"_ls;
12 constexpr inline auto DeviceIdKey = "device_id"_ls;
13 constexpr inline auto SessionIdKey = "session_id"_ls;
14 
15 /*
16  * While the specification states:
17  *
18  * "This event type is used when sending encrypted events.
19  * It can be used either within a room
20  * (in which case it will have all of the Room Event fields),
21  * or as a to-device event."
22  * "The encrypted payload can contain any message event."
23  * https://matrix.org/docs/spec/client_server/latest#id493
24  *
25  * -- for most of the cases the message event is the room message event.
26  * And even for the to-device events the context is for the room.
27  *
28  * So, to simplify integration to the timeline, EncryptedEvent is a RoomEvent
29  * inheritor. Strictly speaking though, it's not always a RoomEvent, but an Event
30  * in general. It's possible, because RoomEvent interface is similar to Event's
31  * one and doesn't add new restrictions, just provides additional features.
32  */
33 class QUOTIENT_API EncryptedEvent : public RoomEvent {
34 public:
35  QUO_EVENT(EncryptedEvent, "m.room.encrypted")
36 
37  /* In case with Olm, the encrypted content of the event is
38  * a map from the recipient Curve25519 identity key to ciphertext
39  * information */
40  explicit EncryptedEvent(const QJsonObject& ciphertexts,
41  const QString& senderKey);
42  /* In case with Megolm, device_id and session_id are required */
43  explicit EncryptedEvent(const QByteArray& ciphertext,
44  const QString& senderKey, const QString& deviceId,
45  const QString& sessionId);
46  // TODO: replace with 'using RoomEvent::RoomEvent' in 0.8
47  explicit EncryptedEvent(const QJsonObject& obj);
48 
49  QString algorithm() const;
50  QByteArray ciphertext() const
51  {
52  return contentPart<QString>(CiphertextKey).toLatin1();
53  }
54  QJsonObject ciphertext(const QString& identityKey) const
55  {
56  return contentPart<QJsonObject>(CiphertextKey)
57  .value(identityKey)
58  .toObject();
59  }
60  QString senderKey() const { return contentPart<QString>(SenderKeyKey); }
61 
62  /* device_id and session_id are required with Megolm */
63  QString deviceId() const { return contentPart<QString>(DeviceIdKey); }
64  QString sessionId() const { return contentPart<QString>(SessionIdKey); }
65  RoomEventPtr createDecrypted(const QString &decrypted) const;
66 
67  void setRelation(const QJsonObject& relation);
68 };
69 
70 class QUOTIENT_API DummyEvent : public Event {
71 public:
72  QUO_EVENT(DummyEvent, "m.dummy")
73  using Event::Event;
74  explicit DummyEvent()
75  : Event(basicJson(TypeId, {}))
76  {}
77 };
78 } // namespace Quotient