Add key handling implementation
Signed-off-by: trivernis <trivernis@protonmail.com>pull/1/head
parent
cc8d18d288
commit
ba005fc7bf
@ -0,0 +1,37 @@
|
||||
use vented::server::VentedServer;
|
||||
use crate::utils::result::SnekcloudResult;
|
||||
use vented::crypto::SecretKey;
|
||||
use std::path::PathBuf;
|
||||
use vented::server::data::Node;
|
||||
use vented::WaitGroup;
|
||||
|
||||
pub struct SnekcloudServer {
|
||||
inner: VentedServer,
|
||||
listen_addresses: Vec<String>,
|
||||
listeners: Vec<WaitGroup>,
|
||||
}
|
||||
|
||||
impl SnekcloudServer {
|
||||
/// Creates a new snekcloud server with the provided keys and number of threads
|
||||
pub fn new(id: String, private_key: SecretKey, keys: Vec<Node>, num_threads: usize) -> Self {
|
||||
Self {
|
||||
inner: VentedServer::new(id, private_key, keys, num_threads),
|
||||
listen_addresses: Vec::new(),
|
||||
listeners: Vec::new(),
|
||||
}
|
||||
}
|
||||
|
||||
/// Adds an address the server should listen on
|
||||
pub fn add_listen_address(&mut self, address: String) {
|
||||
self.listen_addresses.push(address);
|
||||
}
|
||||
|
||||
/// Starts listening on all addresses
|
||||
pub fn run(&mut self) -> SnekcloudResult<()> {
|
||||
for address in &self.listen_addresses {
|
||||
self.listeners.push(self.inner.listen(address.clone()))
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
@ -0,0 +1,67 @@
|
||||
use std::path::PathBuf;
|
||||
use vented::crypto::{SecretKey, PublicKey};
|
||||
use std::fs;
|
||||
use crate::utils::result::{SnekcloudResult, SnekcloudError};
|
||||
use vented::server::data::Node;
|
||||
|
||||
const PRIVATE_KEY_HEADER_LINE: &str = "---BEGIN-SNEKCLOUD-PRIVATE-KEY---\n";
|
||||
const PRIVATE_KEY_FOOTER_LINE: &str = "\n---END-SNEKCLOUD-PRIVATE-KEY---";
|
||||
|
||||
const PUBLIC_KEY_HEADER_LINE: &str = "---BEGIN-SNEKCLOUD-PUBLIC-KEY---\n";
|
||||
const PUBLIC_KEY_FOOTER_LINE: &str = "\n---END-SNEKCLOUD-PUBLIC-KEY---";
|
||||
|
||||
/// Reads a folder of node public keys
|
||||
pub fn read_node_keys(path: &PathBuf) -> SnekcloudResult<Vec<Node>> {
|
||||
let dir_content = path.read_dir()?;
|
||||
|
||||
let content = dir_content
|
||||
.filter_map(|entry| {
|
||||
let entry = entry.ok()?;
|
||||
|
||||
Some((entry.metadata().ok()?, entry))
|
||||
})
|
||||
.filter(|(meta, _)|meta.is_file())
|
||||
.filter_map(|(_, entry)|{
|
||||
let key = read_public_key(&entry.path()).ok()?;
|
||||
|
||||
let file_name = entry.file_name();
|
||||
let file_name = file_name.to_string_lossy();
|
||||
let node_id = file_name.trim_end_matches(".pub");
|
||||
|
||||
Some(Node {public_key: key, address: None, id: node_id.to_string()})
|
||||
}).collect();
|
||||
|
||||
Ok(content)
|
||||
}
|
||||
|
||||
/// Reads the private key from a file
|
||||
pub fn read_private_key(filename: &PathBuf) -> SnekcloudResult<SecretKey> {
|
||||
let content = fs::read_to_string(filename)?;
|
||||
|
||||
let bytes = extract_key(content, PUBLIC_KEY_HEADER_LINE, PUBLIC_KEY_FOOTER_LINE)?;
|
||||
|
||||
Ok(SecretKey::from(bytes))
|
||||
}
|
||||
|
||||
/// Reads the public key from a file
|
||||
pub fn read_public_key(filename: &PathBuf) -> SnekcloudResult<PublicKey> {
|
||||
let content = fs::read_to_string(filename)?;
|
||||
let bytes = extract_key(content, PUBLIC_KEY_HEADER_LINE, PUBLIC_KEY_FOOTER_LINE)?;
|
||||
|
||||
Ok(PublicKey::from(bytes))
|
||||
}
|
||||
|
||||
/// Extracts a base64 encoded key between the prefix and suffix
|
||||
fn extract_key(content: String, prefix: &str, suffix: &str) -> SnekcloudResult<[u8; 32]> {
|
||||
let mut content = content.strip_prefix(prefix).ok_or(SnekcloudError::InvalidKey)?;
|
||||
content = content.strip_suffix(suffix).ok_or(SnekcloudError::InvalidKey)?;
|
||||
|
||||
let key = base64::decode(content)?;
|
||||
if key.len() != 32 {
|
||||
return Err(SnekcloudError::InvalidKey);
|
||||
}
|
||||
let mut key_bytes = [0u8; 32];
|
||||
key_bytes.copy_from_slice(&key[..]);
|
||||
|
||||
Ok(key_bytes)
|
||||
}
|
@ -1 +1,2 @@
|
||||
pub mod result;
|
||||
pub mod result;
|
||||
pub mod keys;
|
Loading…
Reference in New Issue