matrix-sdk: Add some custom debug implementations

This should avoid polluting the logs with sled trees and a lot of
redundant info in a device if a device or store ends up in the
structured logs.
master
Damir Jelić 2021-03-02 16:22:38 +01:00
parent 00df34ed59
commit 7729e2b11f
3 changed files with 71 additions and 16 deletions

View File

@ -14,7 +14,13 @@
mod store_key; mod store_key;
use std::{collections::BTreeSet, convert::TryFrom, path::Path, sync::Arc, time::SystemTime}; use std::{
collections::BTreeSet,
convert::TryFrom,
path::{Path, PathBuf},
sync::Arc,
time::SystemTime,
};
use futures::{ use futures::{
stream::{self, Stream}, stream::{self, Stream},
@ -128,8 +134,9 @@ impl EncodeKey for (&str, &str, &str) {
} }
} }
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct SledStore { pub struct SledStore {
path: Option<PathBuf>,
pub(crate) inner: Db, pub(crate) inner: Db,
store_key: Arc<Option<StoreKey>>, store_key: Arc<Option<StoreKey>>,
session: Tree, session: Tree,
@ -148,8 +155,20 @@ pub struct SledStore {
presence: Tree, presence: Tree,
} }
impl std::fmt::Debug for SledStore {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(path) = &self.path {
f.debug_struct("SledStore").field("path", &path).finish()
} else {
f.debug_struct("SledStore")
.field("path", &"memory store")
.finish()
}
}
}
impl SledStore { impl SledStore {
fn open_helper(db: Db, store_key: Option<StoreKey>) -> Result<Self> { fn open_helper(db: Db, path: Option<PathBuf>, store_key: Option<StoreKey>) -> Result<Self> {
let session = db.open_tree("session")?; let session = db.open_tree("session")?;
let account_data = db.open_tree("account_data")?; let account_data = db.open_tree("account_data")?;
@ -169,6 +188,7 @@ impl SledStore {
let stripped_room_state = db.open_tree("stripped_room_state")?; let stripped_room_state = db.open_tree("stripped_room_state")?;
Ok(Self { Ok(Self {
path,
inner: db, inner: db,
store_key: store_key.into(), store_key: store_key.into(),
session, session,
@ -191,12 +211,12 @@ impl SledStore {
pub fn open() -> Result<Self> { pub fn open() -> Result<Self> {
let db = Config::new().temporary(true).open()?; let db = Config::new().temporary(true).open()?;
SledStore::open_helper(db, None) SledStore::open_helper(db, None, None)
} }
pub fn open_with_passphrase(path: impl AsRef<Path>, passphrase: &str) -> Result<Self> { pub fn open_with_passphrase(path: impl AsRef<Path>, passphrase: &str) -> Result<Self> {
let path = path.as_ref().join("matrix-sdk-state"); let path = path.as_ref().join("matrix-sdk-state");
let db = Config::new().temporary(false).path(path).open()?; let db = Config::new().temporary(false).path(&path).open()?;
let store_key: Option<DatabaseType> = db let store_key: Option<DatabaseType> = db
.get("store_key".encode())? .get("store_key".encode())?
@ -219,14 +239,14 @@ impl SledStore {
key key
}; };
SledStore::open_helper(db, Some(store_key)) SledStore::open_helper(db, Some(path), Some(store_key))
} }
pub fn open_with_path(path: impl AsRef<Path>) -> Result<Self> { pub fn open_with_path(path: impl AsRef<Path>) -> Result<Self> {
let path = path.as_ref().join("matrix-sdk-state"); let path = path.as_ref().join("matrix-sdk-state");
let db = Config::new().temporary(false).path(path).open()?; let db = Config::new().temporary(false).path(&path).open()?;
SledStore::open_helper(db, None) SledStore::open_helper(db, Some(path), None)
} }
fn serialize_event( fn serialize_event(

View File

@ -59,7 +59,7 @@ use crate::{
use super::{atomic_bool_deserializer, atomic_bool_serializer}; use super::{atomic_bool_deserializer, atomic_bool_serializer};
/// A read-only version of a `Device`. /// A read-only version of a `Device`.
#[derive(Debug, Clone, Serialize, Deserialize)] #[derive(Clone, Serialize, Deserialize)]
pub struct ReadOnlyDevice { pub struct ReadOnlyDevice {
user_id: Arc<UserId>, user_id: Arc<UserId>,
device_id: Arc<DeviceIdBox>, device_id: Arc<DeviceIdBox>,
@ -79,6 +79,19 @@ pub struct ReadOnlyDevice {
trust_state: Arc<Atomic<LocalTrust>>, trust_state: Arc<Atomic<LocalTrust>>,
} }
impl std::fmt::Debug for ReadOnlyDevice {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("ReadOnlyDevice")
.field("user_id", self.user_id())
.field("device_id", &self.device_id())
.field("display_name", self.display_name())
.field("keys", self.keys())
.field("deleted", &self.deleted.load(Ordering::SeqCst))
.field("trust_state", &self.trust_state)
.finish()
}
}
fn local_trust_serializer<S>(x: &Atomic<LocalTrust>, s: S) -> Result<S::Ok, S::Error> fn local_trust_serializer<S>(x: &Atomic<LocalTrust>, s: S) -> Result<S::Ok, S::Error>
where where
S: Serializer, S: Serializer,
@ -95,7 +108,7 @@ where
Ok(Arc::new(Atomic::new(value))) Ok(Arc::new(Atomic::new(value)))
} }
#[derive(Debug, Clone)] #[derive(Clone)]
/// A device represents a E2EE capable client of an user. /// A device represents a E2EE capable client of an user.
pub struct Device { pub struct Device {
pub(crate) inner: ReadOnlyDevice, pub(crate) inner: ReadOnlyDevice,
@ -105,6 +118,14 @@ pub struct Device {
pub(crate) device_owner_identity: Option<UserIdentities>, pub(crate) device_owner_identity: Option<UserIdentities>,
} }
impl std::fmt::Debug for Device {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("Device")
.field("device", &self.inner)
.finish()
}
}
impl Deref for Device { impl Deref for Device {
type Target = ReadOnlyDevice; type Target = ReadOnlyDevice;

View File

@ -15,7 +15,7 @@
use std::{ use std::{
collections::{HashMap, HashSet}, collections::{HashMap, HashSet},
convert::TryFrom, convert::TryFrom,
path::Path, path::{Path, PathBuf},
sync::Arc, sync::Arc,
}; };
@ -96,8 +96,9 @@ impl EncodeKey for (&str, &str, &str) {
} }
/// An in-memory only store that will forget all the E2EE key once it's dropped. /// An in-memory only store that will forget all the E2EE key once it's dropped.
#[derive(Debug, Clone)] #[derive(Clone)]
pub struct SledStore { pub struct SledStore {
path: Option<PathBuf>,
inner: Db, inner: Db,
pickle_key: Arc<PickleKey>, pickle_key: Arc<PickleKey>,
@ -121,6 +122,18 @@ pub struct SledStore {
values: Tree, values: Tree,
} }
impl std::fmt::Debug for SledStore {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
if let Some(path) = &self.path {
f.debug_struct("SledStore").field("path", &path).finish()
} else {
f.debug_struct("SledStore")
.field("path", &"memory store")
.finish()
}
}
}
impl From<TransactionError<serde_json::Error>> for CryptoStoreError { impl From<TransactionError<serde_json::Error>> for CryptoStoreError {
fn from(e: TransactionError<serde_json::Error>) -> Self { fn from(e: TransactionError<serde_json::Error>) -> Self {
match e { match e {
@ -135,18 +148,18 @@ impl SledStore {
/// passphrase to encrypt private data. /// passphrase to encrypt private data.
pub fn open_with_passphrase(path: impl AsRef<Path>, passphrase: Option<&str>) -> Result<Self> { pub fn open_with_passphrase(path: impl AsRef<Path>, passphrase: Option<&str>) -> Result<Self> {
let path = path.as_ref().join("matrix-sdk-crypto"); let path = path.as_ref().join("matrix-sdk-crypto");
let db = Config::new().temporary(false).path(path).open()?; let db = Config::new().temporary(false).path(&path).open()?;
SledStore::open_helper(db, passphrase) SledStore::open_helper(db, Some(path), passphrase)
} }
/// Create a sled based cryptostore using the given sled database. /// Create a sled based cryptostore using the given sled database.
/// The given passphrase will be used to encrypt private data. /// The given passphrase will be used to encrypt private data.
pub fn open_with_database(db: Db, passphrase: Option<&str>) -> Result<Self> { pub fn open_with_database(db: Db, passphrase: Option<&str>) -> Result<Self> {
SledStore::open_helper(db, passphrase) SledStore::open_helper(db, None, passphrase)
} }
fn open_helper(db: Db, passphrase: Option<&str>) -> Result<Self> { fn open_helper(db: Db, path: Option<PathBuf>, passphrase: Option<&str>) -> Result<Self> {
let account = db.open_tree("account")?; let account = db.open_tree("account")?;
let private_identity = db.open_tree("private_identity")?; let private_identity = db.open_tree("private_identity")?;
@ -171,6 +184,7 @@ impl SledStore {
}; };
Ok(Self { Ok(Self {
path,
inner: db, inner: db,
pickle_key: pickle_key.into(), pickle_key: pickle_key.into(),
account, account,