Provider starting to use new config
This commit is contained in:
@@ -161,24 +161,6 @@ pub fn execute(matches: &ArgMatches) {
|
||||
config.get_clients_ledger_path()
|
||||
);
|
||||
|
||||
// key will be loaded directly provider in just a moment
|
||||
let key_pair = ServiceProvider::load_sphinx_keys(&config);
|
||||
|
||||
// stupid temporary hack
|
||||
let private_bytes = key_pair.private_key().to_bytes();
|
||||
let public_bytes = key_pair.public_key().to_bytes();
|
||||
|
||||
let old_startup_config = provider::Config {
|
||||
client_socket_address: config.get_clients_listening_address(),
|
||||
directory_server: config.get_presence_directory_server(),
|
||||
mix_socket_address: config.get_mix_listening_address(),
|
||||
// identity keys are wrapper for encryption keys so this temporary hack will work to just make it compile once
|
||||
public_key: MixIdentityPublicKey::from_bytes(public_bytes.as_ref()),
|
||||
secret_key: MixIdentityPrivateKey::from_bytes(private_bytes.as_ref()),
|
||||
store_dir: Default::default(),
|
||||
};
|
||||
|
||||
let provider = ServiceProvider::new(old_startup_config);
|
||||
|
||||
let provider = ServiceProvider::new(config);
|
||||
provider.start().unwrap()
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
use crate::provider::storage::{ClientStorage, StoreError};
|
||||
use crate::provider::ClientLedger;
|
||||
use crypto::encryption;
|
||||
use crypto::identity::MixIdentityPrivateKey;
|
||||
use futures::lock::Mutex as FMutex;
|
||||
use hmac::{Hmac, Mac};
|
||||
@@ -54,14 +55,14 @@ impl From<io::Error> for ClientProcessingError {
|
||||
pub(crate) struct ClientProcessingData {
|
||||
store_dir: PathBuf,
|
||||
registered_clients_ledger: Arc<FMutex<ClientLedger>>,
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
secret_key: encryption::PrivateKey,
|
||||
}
|
||||
|
||||
impl ClientProcessingData {
|
||||
pub(crate) fn new(
|
||||
store_dir: PathBuf,
|
||||
registered_clients_ledger: Arc<FMutex<ClientLedger>>,
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
secret_key: encryption::PrivateKey,
|
||||
) -> Self {
|
||||
ClientProcessingData {
|
||||
store_dir,
|
||||
@@ -132,7 +133,7 @@ impl ClientRequestProcessor {
|
||||
|
||||
let auth_token = ClientRequestProcessor::generate_new_auth_token(
|
||||
req.destination_address.to_vec(),
|
||||
processing_data.secret_key,
|
||||
&processing_data.secret_key,
|
||||
);
|
||||
if !unlocked_ledger.has_token(&auth_token) {
|
||||
unlocked_ledger.insert_token(auth_token.clone(), req.destination_address);
|
||||
@@ -153,7 +154,7 @@ impl ClientRequestProcessor {
|
||||
std::fs::create_dir_all(full_store_dir)
|
||||
}
|
||||
|
||||
fn generate_new_auth_token(data: Vec<u8>, key: MixIdentityPrivateKey) -> AuthToken {
|
||||
fn generate_new_auth_token(data: Vec<u8>, key: &encryption::PrivateKey) -> AuthToken {
|
||||
// also note that `new_varkey` doesn't even have an execution branch returning an error
|
||||
let mut auth_token_raw = HmacSha256::new_varkey(&key.to_bytes())
|
||||
.expect("HMAC should be able take key of any size");
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use crate::provider::storage::StoreData;
|
||||
use crypto::encryption;
|
||||
use crypto::identity::MixIdentityPrivateKey;
|
||||
use log::{error, warn};
|
||||
use sphinx::{ProcessedPacket, SphinxPacket};
|
||||
@@ -37,12 +38,12 @@ impl From<std::io::Error> for MixProcessingError {
|
||||
// ProcessingData defines all data required to correctly unwrap sphinx packets
|
||||
#[derive(Debug, Clone)]
|
||||
pub(crate) struct MixProcessingData {
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
secret_key: encryption::PrivateKey,
|
||||
pub(crate) store_dir: PathBuf,
|
||||
}
|
||||
|
||||
impl MixProcessingData {
|
||||
pub(crate) fn new(secret_key: MixIdentityPrivateKey, store_dir: PathBuf) -> Self {
|
||||
pub(crate) fn new(secret_key: encryption::PrivateKey, store_dir: PathBuf) -> Self {
|
||||
MixProcessingData {
|
||||
secret_key,
|
||||
store_dir,
|
||||
@@ -70,7 +71,7 @@ impl MixPacketProcessor {
|
||||
}
|
||||
};
|
||||
let (client_address, client_surb_id, payload) =
|
||||
match packet.process(read_processing_data.secret_key.as_scalar()) {
|
||||
match packet.process(read_processing_data.secret_key.inner()) {
|
||||
Ok(ProcessedPacket::ProcessedPacketFinalHop(client_address, surb_id, payload)) => {
|
||||
(client_address, surb_id, payload)
|
||||
}
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
use crate::config::persistance::pathfinder::ProviderPathfinder;
|
||||
use crate::config::Config;
|
||||
use crate::provider::client_handling::{ClientProcessingData, ClientRequestProcessor};
|
||||
use crate::provider::mix_handling::{MixPacketProcessor, MixProcessingData};
|
||||
use crate::provider::storage::ClientStorage;
|
||||
@@ -28,15 +29,6 @@ mod storage;
|
||||
const STORED_MESSAGE_FILENAME_LENGTH: usize = 16;
|
||||
const MESSAGE_RETRIEVAL_LIMIT: usize = 5;
|
||||
|
||||
pub struct Config {
|
||||
pub client_socket_address: SocketAddr,
|
||||
pub directory_server: String,
|
||||
pub mix_socket_address: SocketAddr,
|
||||
pub public_key: MixIdentityPublicKey,
|
||||
pub secret_key: MixIdentityPrivateKey,
|
||||
pub store_dir: PathBuf,
|
||||
}
|
||||
|
||||
#[derive(Debug)]
|
||||
pub enum ProviderError {
|
||||
TcpListenerBindingError,
|
||||
@@ -102,29 +94,34 @@ impl ClientLedger {
|
||||
}
|
||||
|
||||
pub struct ServiceProvider {
|
||||
directory_server: String,
|
||||
mix_network_address: SocketAddr,
|
||||
client_network_address: SocketAddr,
|
||||
public_key: MixIdentityPublicKey,
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
store_dir: PathBuf,
|
||||
config: Config,
|
||||
sphinx_keypair: encryption::KeyPair,
|
||||
registered_clients_ledger: ClientLedger,
|
||||
}
|
||||
|
||||
impl ServiceProvider {
|
||||
pub fn new(config: Config) -> Self {
|
||||
let sphinx_keypair = Self::load_sphinx_keys(&config);
|
||||
|
||||
ServiceProvider {
|
||||
mix_network_address: config.mix_socket_address,
|
||||
client_network_address: config.client_socket_address,
|
||||
secret_key: config.secret_key,
|
||||
public_key: config.public_key,
|
||||
store_dir: PathBuf::from(config.store_dir.clone()),
|
||||
config,
|
||||
sphinx_keypair,
|
||||
// TODO: load initial ledger from file
|
||||
registered_clients_ledger: ClientLedger::new(),
|
||||
directory_server: config.directory_server.clone(),
|
||||
}
|
||||
}
|
||||
|
||||
fn load_sphinx_keys(config_file: &Config) -> encryption::KeyPair {
|
||||
let sphinx_keypair = PemStore::new(ProviderPathfinder::new_from_config(&config_file))
|
||||
.read_encryption()
|
||||
.expect("Failed to read stored sphinx key files");
|
||||
println!(
|
||||
"Public encryption key: {}\nFor time being, it is identical to identity keys",
|
||||
sphinx_keypair.public_key().to_base58_string()
|
||||
);
|
||||
sphinx_keypair
|
||||
}
|
||||
|
||||
async fn process_mixnet_socket_connection(
|
||||
mut socket: tokio::net::TcpStream,
|
||||
processing_data: Arc<RwLock<MixProcessingData>>,
|
||||
@@ -239,7 +236,7 @@ impl ServiceProvider {
|
||||
|
||||
async fn start_mixnet_listening(
|
||||
address: SocketAddr,
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
secret_key: encryption::PrivateKey,
|
||||
store_dir: PathBuf,
|
||||
) -> Result<(), ProviderError> {
|
||||
let mut listener = tokio::net::TcpListener::bind(address).await?;
|
||||
@@ -261,7 +258,7 @@ impl ServiceProvider {
|
||||
address: SocketAddr,
|
||||
store_dir: PathBuf,
|
||||
client_ledger: Arc<FMutex<ClientLedger>>,
|
||||
secret_key: MixIdentityPrivateKey,
|
||||
secret_key: encryption::PrivateKey,
|
||||
) -> Result<(), ProviderError> {
|
||||
let mut listener = tokio::net::TcpListener::bind(address).await?;
|
||||
let processing_data =
|
||||
@@ -279,19 +276,6 @@ impl ServiceProvider {
|
||||
}
|
||||
}
|
||||
|
||||
// TODO: make private and change config import path
|
||||
pub fn load_sphinx_keys(config_file: &crate::config::Config) -> encryption::KeyPair {
|
||||
let sphinx_keypair = PemStore::new(ProviderPathfinder::new_from_config(&config_file))
|
||||
.read_encryption()
|
||||
.expect("Failed to read stored sphinx key files");
|
||||
println!(
|
||||
"Public encryption key: {}\nFor time being, it is identical to identity keys",
|
||||
sphinx_keypair.public_key().to_base58_string()
|
||||
);
|
||||
sphinx_keypair
|
||||
}
|
||||
|
||||
// Note: this now consumes the provider
|
||||
pub fn start(self) -> Result<(), Box<dyn std::error::Error>> {
|
||||
// Create the runtime, probably later move it to Provider struct itself?
|
||||
// TODO: figure out the difference between Runtime and Handle
|
||||
@@ -301,25 +285,30 @@ impl ServiceProvider {
|
||||
let initial_client_ledger = self.registered_clients_ledger;
|
||||
let thread_shareable_ledger = initial_client_ledger.add_arc_futures_mutex();
|
||||
|
||||
let presence_notifier = presence::Notifier::new(
|
||||
self.directory_server,
|
||||
self.client_network_address.clone(),
|
||||
self.mix_network_address.clone(),
|
||||
self.public_key,
|
||||
thread_shareable_ledger.clone(),
|
||||
let notifier_config = presence::NotifierConfig::new(
|
||||
self.config.get_presence_directory_server(),
|
||||
self.config.get_mix_announce_address(),
|
||||
self.config.get_clients_announce_address(),
|
||||
self.sphinx_keypair.public_key().to_base58_string(),
|
||||
self.config.get_presence_sending_delay(),
|
||||
);
|
||||
|
||||
let presence_future = rt.spawn(presence_notifier.run());
|
||||
let presence_future = rt.spawn({
|
||||
let presence_notifier =
|
||||
presence::Notifier::new(notifier_config, thread_shareable_ledger.clone());
|
||||
presence_notifier.run()
|
||||
});
|
||||
|
||||
let mix_future = rt.spawn(ServiceProvider::start_mixnet_listening(
|
||||
self.mix_network_address,
|
||||
self.secret_key.clone(),
|
||||
self.store_dir.clone(),
|
||||
self.config.get_mix_listening_address(),
|
||||
*self.sphinx_keypair.private_key(),
|
||||
self.config.get_clients_inboxes_dir(),
|
||||
));
|
||||
let client_future = rt.spawn(ServiceProvider::start_client_listening(
|
||||
self.client_network_address,
|
||||
self.store_dir.clone(),
|
||||
self.config.get_clients_listening_address(),
|
||||
self.config.get_clients_inboxes_dir(),
|
||||
thread_shareable_ledger,
|
||||
self.secret_key,
|
||||
*self.sphinx_keypair.private_key(),
|
||||
));
|
||||
// Spawn the root task
|
||||
rt.block_on(async {
|
||||
|
||||
Reference in New Issue
Block a user