matrixion/src/Cache.h

257 lines
7.2 KiB
C
Raw Normal View History

// SPDX-FileCopyrightText: Nheko Contributors
2021-03-05 02:35:15 +03:00
//
// SPDX-License-Identifier: GPL-3.0-or-later
#pragma once
#include <QDateTime>
#include <QString>
2020-01-24 20:39:26 +03:00
#if __has_include(<lmdbxx/lmdb++.h>)
#include <lmdbxx/lmdb++.h>
#else
#include <lmdb++.h>
2020-01-24 20:39:26 +03:00
#endif
2019-12-14 19:08:36 +03:00
2020-10-27 19:45:28 +03:00
#include <mtx/events/event_type.hpp>
#include <mtx/events/presence.hpp>
#include <mtx/responses/crypto.hpp>
#include <mtxclient/crypto/types.hpp>
#include "CacheCryptoStructs.h"
#include "CacheStructs.h"
2020-10-27 19:45:28 +03:00
namespace mtx::responses {
struct Notifications;
}
2019-12-15 04:56:04 +03:00
namespace cache {
void
init(const QString &user_id);
std::string
displayName(const std::string &room_id, const std::string &user_id);
QString
displayName(const QString &room_id, const QString &user_id);
QString
avatarUrl(const QString &room_id, const QString &user_id);
// presence
mtx::events::presence::Presence
presence(const std::string &user_id);
// user cache stores user keys
std::optional<UserKeyCache>
userKeys(const std::string &user_id);
void
updateUserKeys(const std::string &sync_token, const mtx::responses::QueryKeys &keyQuery);
2020-06-28 18:31:34 +03:00
// device & user verification cache
std::optional<VerificationStatus>
verificationStatus(const std::string &user_id);
void
markDeviceVerified(const std::string &user_id, const std::string &device);
void
markDeviceUnverified(const std::string &user_id, const std::string &device);
2020-06-28 18:31:34 +03:00
2019-12-15 04:56:04 +03:00
std::vector<std::string>
joinedRooms();
QMap<QString, RoomInfo>
roomInfo(bool withInvites = true);
2021-05-24 15:04:07 +03:00
QHash<QString, RoomInfo>
2019-12-15 04:56:04 +03:00
invites();
//! Calculate & return the name of the room.
QString
getRoomName(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
//! Get room join rules
mtx::events::state::JoinRule
getRoomJoinRule(lmdb::txn &txn, lmdb::dbi &statesdb);
bool
getRoomGuestAccess(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Retrieve the topic of the room if any.
QString
getRoomTopic(lmdb::txn &txn, lmdb::dbi &statesdb);
//! Retrieve the room avatar's url if any.
QString
getRoomAvatarUrl(lmdb::txn &txn, lmdb::dbi &statesdb, lmdb::dbi &membersdb);
2019-12-15 04:56:04 +03:00
//! Retrieve member info from a room.
std::vector<RoomMember>
getMembers(const std::string &room_id, std::size_t startIndex = 0, std::size_t len = 30);
//! Retrive member info from an invite.
std::vector<RoomMember>
getMembersFromInvite(const std::string &room_id, std::size_t start_index = 0, std::size_t len = 30);
2021-09-10 04:31:23 +03:00
2019-12-15 04:56:04 +03:00
bool
isInitialized();
std::string
nextBatchToken();
void
deleteData();
void
removeInvite(lmdb::txn &txn, const std::string &room_id);
void
removeInvite(const std::string &room_id);
void
removeRoom(lmdb::txn &txn, const std::string &roomid);
void
removeRoom(const std::string &roomid);
void
removeRoom(const QString &roomid);
void
setup();
2020-05-02 17:44:50 +03:00
//! returns if the format is current, older or newer
cache::CacheVersion
formatVersion();
//! set the format version to the current version
2019-12-15 04:56:04 +03:00
void
setCurrentFormat();
2020-05-02 17:44:50 +03:00
//! migrates db to the current format
bool
runMigrations();
2019-12-15 04:56:04 +03:00
//! Retrieve all the user ids from a room.
std::vector<std::string>
roomMembers(const std::string &room_id);
//! Check if the given user has power level greater than than
2019-12-15 04:56:04 +03:00
//! lowest power level of the given events.
bool
hasEnoughPowerLevel(const std::vector<mtx::events::EventType> &eventTypes,
const std::string &room_id,
const std::string &user_id);
//! Adds a user to the read list for the given event.
//!
//! There should be only one user id present in a receipt list per room.
//! The user id should be removed from any other lists.
using Receipts = std::map<std::string, std::map<std::string, uint64_t>>;
void
updateReadReceipt(lmdb::txn &txn, const std::string &room_id, const Receipts &receipts);
//! Retrieve all the read receipts for the given event id and room.
//!
//! Returns a map of user ids and the time of the read receipt in milliseconds.
using UserReceipts = std::multimap<uint64_t, std::string, std::greater<uint64_t>>;
UserReceipts
readReceipts(const QString &event_id, const QString &room_id);
//! get index of the event in the event db, not representing the visual index
std::optional<uint64_t>
getEventIndex(const std::string &room_id, std::string_view event_id);
std::optional<std::pair<uint64_t, std::string>>
lastInvisibleEventAfter(const std::string &room_id, std::string_view event_id);
std::optional<std::pair<uint64_t, std::string>>
lastVisibleEvent(const std::string &room_id, std::string_view event_id);
2019-12-15 04:56:04 +03:00
RoomInfo
singleRoomInfo(const std::string &room_id);
std::map<QString, RoomInfo>
getRoomInfo(const std::vector<std::string> &rooms);
2018-05-08 20:30:09 +03:00
2019-12-15 04:56:04 +03:00
//! Calculates which the read status of a room.
//! Whether all the events in the timeline have been read.
std::string
getFullyReadEventId(const std::string &room_id);
2019-12-15 04:56:04 +03:00
bool
calculateRoomReadStatus(const std::string &room_id);
2018-05-08 20:30:09 +03:00
void
2019-12-15 04:56:04 +03:00
calculateRoomReadStatus();
void
markSentNotification(const std::string &event_id);
//! Removes an event from the sent notifications.
void
removeReadNotification(const std::string &event_id);
//! Check if we have sent a desktop notification for the given event id.
bool
isNotificationSent(const std::string &event_id);
//! Remove old unused data.
void
deleteOldMessages();
void
deleteOldData() noexcept;
//! Retrieve all saved room ids.
std::vector<std::string>
getRoomIds(lmdb::txn &txn);
//! Mark a room that uses e2e encryption.
void
setEncryptedRoom(lmdb::txn &txn, const std::string &room_id);
bool
isRoomEncrypted(const std::string &room_id);
//! Check if a user is a member of the room.
bool
isRoomMember(const std::string &user_id, const std::string &room_id);
//
// Outbound Megolm Sessions
//
void
saveOutboundMegolmSession(const std::string &room_id,
const GroupSessionData &data,
mtx::crypto::OutboundGroupSessionPtr &session);
2019-12-15 04:56:04 +03:00
OutboundGroupSessionDataRef
getOutboundMegolmSession(const std::string &room_id);
bool
outboundMegolmSessionExists(const std::string &room_id) noexcept;
void
2020-11-27 06:56:44 +03:00
updateOutboundMegolmSession(const std::string &room_id,
const GroupSessionData &data,
2020-11-27 06:56:44 +03:00
mtx::crypto::OutboundGroupSessionPtr &session);
void
dropOutboundMegolmSession(const std::string &room_id);
2019-12-15 04:56:04 +03:00
void
importSessionKeys(const mtx::crypto::ExportedSessionKeys &keys);
mtx::crypto::ExportedSessionKeys
exportSessionKeys();
//
// Inbound Megolm Sessions
//
void
saveInboundMegolmSession(const MegolmSessionIndex &index,
mtx::crypto::InboundGroupSessionPtr session,
const GroupSessionData &data);
2020-11-27 06:19:03 +03:00
mtx::crypto::InboundGroupSessionPtr
2019-12-15 04:56:04 +03:00
getInboundMegolmSession(const MegolmSessionIndex &index);
bool
inboundMegolmSessionExists(const MegolmSessionIndex &index);
std::optional<GroupSessionData>
getMegolmSessionData(const MegolmSessionIndex &index);
2019-12-15 04:56:04 +03:00
//
// Olm Sessions
//
void
2020-10-20 14:46:05 +03:00
saveOlmSession(const std::string &curve25519,
mtx::crypto::OlmSessionPtr session,
uint64_t timestamp);
2019-12-15 04:56:04 +03:00
std::vector<std::string>
getOlmSessions(const std::string &curve25519);
std::optional<mtx::crypto::OlmSessionPtr>
getOlmSession(const std::string &curve25519, const std::string &session_id);
2020-10-20 14:46:05 +03:00
std::optional<mtx::crypto::OlmSessionPtr>
getLatestOlmSession(const std::string &curve25519);
2019-12-15 04:56:04 +03:00
void
saveOlmAccount(const std::string &pickled);
2020-11-27 06:56:44 +03:00
2019-12-15 04:56:04 +03:00
std::string
restoreOlmAccount();
2020-12-17 00:10:09 +03:00
void
storeSecret(const std::string &name, const std::string &secret);
std::optional<std::string>
secret(const std::string &name);
2018-05-08 20:30:09 +03:00
}