// SPDX-FileCopyrightText: 2021 Alexey Andreyev // // SPDX-License-Identifier: LGPL-2.1-or-later #pragma once #include "e2ee/e2ee.h" #include "e2ee/qolmmessage.h" #include "e2ee/qolmerrors.h" #include "e2ee/qolmaccount.h" struct OlmSession; namespace Quotient { //! Either an outbound or inbound session for secure communication. class QUOTIENT_API QOlmSession { public: ~QOlmSession(); //! Creates an inbound session for sending/receiving messages from a received 'prekey' message. static std::variant, QOlmError> createInboundSession(QOlmAccount* account, const QOlmMessage& preKeyMessage); static std::variant, QOlmError> createInboundSessionFrom(QOlmAccount* account, const QString& theirIdentityKey, const QOlmMessage& preKeyMessage); static std::variant, QOlmError> createOutboundSession(QOlmAccount* account, const QString& theirIdentityKey, const QString& theirOneTimeKey); //! Serialises an `QOlmSession` to encrypted Base64. std::variant pickle(const PicklingMode &mode); //! Deserialises from encrypted Base64 that was previously obtained by pickling a `QOlmSession`. static std::variant, QOlmError> unpickle( const QByteArray& pickled, const PicklingMode& mode); //! Encrypts a plaintext message using the session. QOlmMessage encrypt(const QString &plaintext); //! Decrypts a message using this session. Decoding is lossy, meaing if //! the decrypted plaintext contains invalid UTF-8 symbols, they will //! be returned as `U+FFFD` (�). std::variant decrypt(const QOlmMessage &message) const; //! Get a base64-encoded identifier for this session. QByteArray sessionId() const; //! The type of the next message that will be returned from encryption. QOlmMessage::Type encryptMessageType(); //! Checker for any received messages for this session. bool hasReceivedMessage() const; //! Checks if the 'prekey' message is for this in-bound session. std::variant matchesInboundSession( const QOlmMessage& preKeyMessage) const; //! Checks if the 'prekey' message is for this in-bound session. std::variant matchesInboundSessionFrom( const QString& theirIdentityKey, const QOlmMessage& preKeyMessage) const; friend bool operator<(const QOlmSession& lhs, const QOlmSession& rhs) { return lhs.sessionId() < rhs.sessionId(); } friend bool operator<(const std::unique_ptr& lhs, const std::unique_ptr& rhs) { return *lhs < *rhs; } OlmSession* raw() const { return m_session; } QOlmSession(OlmSession* session); private: //! Helper function for creating new sessions and handling errors. static OlmSession* create(); static std::variant, QOlmError> createInbound( QOlmAccount* account, const QOlmMessage& preKeyMessage, bool from = false, const QString& theirIdentityKey = ""); OlmSession* m_session; }; } //namespace Quotient