use ed25519_dalek::VerifyingKey;
use rand::Rng;
use super::Instance;
use crate::{Database, Result, auth::crypto::format_public_key, crdt::Doc};
pub trait LegacyInstanceOps {
fn new_database(&self, settings: Doc, signing_key_name: impl AsRef<str>) -> Result<Database>;
fn new_database_default(&self, signing_key_name: impl AsRef<str>) -> Result<Database>;
fn add_private_key(&self, display_name: &str) -> Result<VerifyingKey>;
fn import_private_key(
&self,
key_id: &str,
signing_key: ed25519_dalek::SigningKey,
) -> Result<String>;
fn get_public_key(&self, key_id: &str) -> Result<VerifyingKey>;
fn get_formatted_public_key(&self, key_name: impl AsRef<str>) -> Result<String>;
}
impl LegacyInstanceOps for Instance {
fn new_database(&self, settings: Doc, signing_key_name: impl AsRef<str>) -> Result<Database> {
use crate::auth::AuthError;
let signing_key = match self
.inner
.backend
.get_private_key(signing_key_name.as_ref())?
{
Some(key) => key,
None => {
return Err(AuthError::KeyNotFound {
key_name: signing_key_name.as_ref().to_string(),
}
.into());
}
};
let database = Database::create(
settings,
self,
signing_key,
signing_key_name.as_ref().to_string(),
)?;
Ok(database)
}
fn new_database_default(&self, signing_key_name: impl AsRef<str>) -> Result<Database> {
let mut settings = Doc::new();
let unique_id = format!(
"database_{}",
rand::thread_rng()
.sample_iter(&rand::distributions::Alphanumeric)
.take(16)
.map(char::from)
.collect::<String>()
);
settings.set_string("database_id", unique_id);
self.new_database(settings, signing_key_name)
}
fn add_private_key(&self, display_name: &str) -> Result<VerifyingKey> {
use crate::auth::crypto::generate_keypair;
let (signing_key, verifying_key) = generate_keypair();
self.inner
.backend
.store_private_key(display_name, signing_key)?;
Ok(verifying_key)
}
fn import_private_key(
&self,
key_id: &str,
signing_key: ed25519_dalek::SigningKey,
) -> Result<String> {
self.inner.backend.store_private_key(key_id, signing_key)?;
Ok(key_id.to_string())
}
fn get_public_key(&self, key_id: &str) -> Result<VerifyingKey> {
use crate::instance::InstanceError;
let signing_key = self.inner.backend.get_private_key(key_id)?.ok_or_else(|| {
InstanceError::SigningKeyNotFound {
key_name: key_id.to_string(),
}
})?;
Ok(signing_key.verifying_key())
}
fn get_formatted_public_key(&self, key_name: impl AsRef<str>) -> Result<String> {
let public_key = self.get_public_key(key_name.as_ref())?;
Ok(format_public_key(&public_key))
}
}