1
0
Fork 0
mirror of https://gitlab.com/famedly/conduit.git synced 2025-07-02 16:38:36 +00:00
conduit/src/database/key_value/globals.rs

41 lines
1.4 KiB
Rust
Raw Normal View History

2022-09-07 13:25:51 +02:00
use ruma::signatures::Ed25519KeyPair;
2022-09-07 13:25:51 +02:00
use crate::{Result, service, database::KeyValueDatabase, Error, utils};
2022-09-07 13:25:51 +02:00
impl service::globals::Data for KeyValueDatabase {
fn load_keypair(&self) -> Result<Ed25519KeyPair> {
let keypair_bytes = self.globals.get(b"keypair")?.map_or_else(
2021-06-08 18:10:00 +02:00
|| {
let keypair = utils::generate_keypair();
2022-09-07 13:25:51 +02:00
self.globals.insert(b"keypair", &keypair)?;
2021-06-08 18:10:00 +02:00
Ok::<_, Error>(keypair)
},
|s| Ok(s.to_vec()),
)?;
2021-06-08 18:10:00 +02:00
let mut parts = keypair_bytes.splitn(2, |&b| b == 0xff);
let keypair = utils::string_from_bytes(
// 1. version
parts
.next()
.expect("splitn always returns at least one element"),
)
.map_err(|_| Error::bad_database("Invalid version bytes in keypair."))
.and_then(|version| {
// 2. key
parts
.next()
.ok_or_else(|| Error::bad_database("Invalid keypair format in database."))
.map(|key| (version, key))
})
.and_then(|(version, key)| {
2022-09-07 13:25:51 +02:00
Ed25519KeyPair::from_der(key, version)
.map_err(|_| Error::bad_database("Private or public keys are invalid."))
});
}
2022-09-07 13:25:51 +02:00
fn remove_keypair(&self) -> Result<()> {
self.globals.remove(b"keypair")?
}
}