Fixed Basic Serialization/Deserialization to json

This commit is contained in:
onyinyang 2023-07-21 13:11:21 -04:00
parent ef1ceafffe
commit 572928a271
No known key found for this signature in database
GPG Key ID: 156A6435430C2036
5 changed files with 53 additions and 30 deletions

20
Cargo.lock generated
View File

@ -1319,9 +1319,9 @@ checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.60" version = "1.0.66"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dec2b086b7a862cf4de201096214fa870344cf922b2b30c167badb3af3195406" checksum = "18fb31db3f9bddb2ea821cde30a9f70117e3f119938b5ee630b7403aa6e2ead9"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -1661,9 +1661,9 @@ dependencies = [
[[package]] [[package]]
name = "serde" name = "serde"
version = "1.0.164" version = "1.0.174"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9e8c8cf938e98f769bc164923b06dce91cea1751522f46f8466461af04c9027d" checksum = "3b88756493a5bd5e5395d53baa70b194b05764ab85b59e43e4b8f4e1192fa9b1"
dependencies = [ dependencies = [
"serde_derive", "serde_derive",
] ]
@ -1679,9 +1679,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_derive" name = "serde_derive"
version = "1.0.164" version = "1.0.174"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d9735b638ccc51c28bf6914d90a2e9725b377144fc612c49a611fddd1b631d68" checksum = "6e5c3a298c7f978e53536f95a63bdc4c4a64550582f31a0359a9afda6aede62e"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -1690,9 +1690,9 @@ dependencies = [
[[package]] [[package]]
name = "serde_json" name = "serde_json"
version = "1.0.97" version = "1.0.103"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bdf3bf93142acad5821c99197022e170842cdbc1c30482b98750c688c640842a" checksum = "d03b412469450d4404fe8499a268edd7f8b79fecb074b0d812ad64ca21f4031b"
dependencies = [ dependencies = [
"itoa", "itoa",
"ryu", "ryu",
@ -1833,9 +1833,9 @@ checksum = "734676eb262c623cec13c3155096e08d1f8f29adce39ba17948b18dad1e54142"
[[package]] [[package]]
name = "syn" name = "syn"
version = "2.0.18" version = "2.0.27"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "32d41677bcbe24c20c52e7c70b0d8db04134c5d1066bf98662e2871ad200ea3e" checksum = "b60f673f44a8255b9c8c657daf66a596d435f2da81a555b06dc644d080ba45e0"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",

View File

@ -21,13 +21,13 @@ tokio = { version = "1", features = ["full", "macros", "signal"] }
rand = "0.8.5" rand = "0.8.5"
serde = { version = "1.0", features = ["derive", "rc"] } serde = { version = "1.0", features = ["derive", "rc"] }
serde_with = "3.0.0" serde_with = "3.0.0"
serde_json = "1.0.87"
zkp = "0.8.0" zkp = "0.8.0"
lox-library = { path = "../lox-library", version = "0.1.0"} lox-library = { path = "../lox-library", version = "0.1.0"}
lox_utils = { path = "../lox-utils", version = "0.1.0"} lox_utils = { path = "../lox-utils", version = "0.1.0"}
rdsys_backend = { path = "../rdsys-backend-api", version = "0.2"} rdsys_backend = { path = "../rdsys-backend-api", version = "0.2"}
clap = { version = "4.3.17", features = ["derive"] } clap = { version = "4.3.17", features = ["derive"] }
serde_json = "1.0.103"
[dependencies.chrono] [dependencies.chrono]
version = "0.4.19" version = "0.4.19"

View File

@ -12,12 +12,14 @@ use lox_library::{BridgeAuth, BridgeDb};
use rdsys_backend::{proto::ResourceDiff, start_stream}; use rdsys_backend::{proto::ResourceDiff, start_stream};
use serde::Deserialize; use serde::Deserialize;
use std::env;
use std::{ use std::{
convert::Infallible, convert::Infallible,
error::Error,
fs::File, fs::File,
io::BufReader, io::BufReader,
net::SocketAddr, net::SocketAddr,
path::PathBuf, path::{Path, PathBuf},
sync::{Arc, Mutex}, sync::{Arc, Mutex},
time::Duration, time::Duration,
}; };
@ -44,11 +46,11 @@ async fn shutdown_signal() {
#[derive(Parser, Debug)] #[derive(Parser, Debug)]
#[command(author, version, about, long_about = None)] #[command(author, version, about, long_about = None)]
struct Args { struct Args {
/// Name of the person to greet /// Name/path of the configuration file
#[arg(short, long, default_value = "config.json")] #[arg(short, long, default_value = "config.json")]
config: PathBuf, config: PathBuf,
/// Number of times to greet /// Optional name/path of the db file
#[arg(short, long)] #[arg(short, long)]
db: Option<PathBuf>, db: Option<PathBuf>,
} }
@ -120,17 +122,36 @@ async fn create_context_manager(
} }
} }
fn read_context_from_file<P: AsRef<Path>>(
path: P,
) -> Result<lox_context::LoxServerContext, Box<dyn Error>> {
let file = File::open(path)?;
let reader = BufReader::new(file);
let context = serde_json::from_reader(reader)?;
Ok(context)
}
// Context Manager handles the Lox BridgeDB and Bridge Authority, ensuring // Context Manager handles the Lox BridgeDB and Bridge Authority, ensuring
// that the DB can be updated from the rdsys stream and client requests // that the DB can be updated from the rdsys stream and client requests
// can be responded to with an updated BridgeDB state // can be responded to with an updated BridgeDB state
async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receiver<Command>) { async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receiver<Command>) {
let context: lox_context::LoxServerContext; let context: lox_context::LoxServerContext;
if let Some(existing_db) = db_path.as_deref() { if let Some(existing_db) = db_path.as_deref() {
let file = File::open(existing_db).expect("Should have been able to read config.json file"); context = read_context_from_file(existing_db).unwrap();
let reader = BufReader::new(file); } else {
// Read the JSON contents of the file as a ResourceIn let current_path = env::current_dir().expect("Unable to access current dir");
context = if let Some(last_modified_file) = std::fs::read_dir(current_path)
serde_json::from_reader(reader).expect("Reading SerializableContext from JSON failed."); .expect("Couldn't read local directory")
.flatten() // Remove failed
.filter(|f| {
f.metadata().unwrap().is_file()
&& (f.file_name().into_string().unwrap().contains("_lox.json"))
}) // Filter out directories (only consider files)
.max_by_key(|x| x.metadata().unwrap().modified().unwrap())
// Get the most recently modified file
{
println!("Reading from file {:?}", last_modified_file);
context = read_context_from_file(&last_modified_file.path()).unwrap();
} else { } else {
let new_db = BridgeDb::new(); let new_db = BridgeDb::new();
let new_ba = BridgeAuth::new(new_db.pubkey); let new_ba = BridgeAuth::new(new_db.pubkey);
@ -141,6 +162,7 @@ async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receive
to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())), to_be_replaced_bridges: Arc::new(Mutex::new(Vec::new())),
}; };
} }
}
while let Some(cmd) = context_rx.recv().await { while let Some(cmd) = context_rx.recv().await {
use Command::*; use Command::*;
@ -287,7 +309,7 @@ async fn context_manager(db_path: Option<PathBuf>, mut context_rx: mpsc::Receive
*/ */
context.allocate_leftover_bridges(); context.allocate_leftover_bridges();
context.encrypt_table(); context.encrypt_table();
let mut date = Local::now().format("%Y-%m-%d").to_string(); let mut date = Local::now().format("%Y-%m-%d_%H:%M:%S").to_string();
let path = "_lox.json"; let path = "_lox.json";
date.push_str(path); date.push_str(path);
let file = File::create(&date).expect("Unable to write to file!"); let file = File::create(&date).expect("Unable to write to file!");

View File

@ -17,7 +17,7 @@ bincode = "1"
chrono = "0.4" chrono = "0.4"
rand = "0.7" rand = "0.7"
serde = "1.0.164" serde = "1.0.164"
serde_with = "3.0.0" serde_with = {version = "3.0.0", features = ["json"]}
sha2 = "0.9" sha2 = "0.9"
statistical = "1.0.0" statistical = "1.0.0"
lazy_static = "1" lazy_static = "1"

View File

@ -237,7 +237,7 @@ struct K {
/// the encrypted buckets. The encrypted buckets will be exposed to the /// the encrypted buckets. The encrypted buckets will be exposed to the
/// users of the system, and each user credential will contain the /// users of the system, and each user credential will contain the
/// decryption key for one bucket. /// decryption key for one bucket.
//#[serde_as] #[serde_as]
#[derive(Debug, Default, Serialize, Deserialize)] #[derive(Debug, Default, Serialize, Deserialize)]
pub struct BridgeTable { pub struct BridgeTable {
// All structures in the bridgetable are indexed by counter // All structures in the bridgetable are indexed by counter
@ -246,6 +246,7 @@ pub struct BridgeTable {
pub buckets: HashMap<u32, [BridgeLine; MAX_BRIDGES_PER_BUCKET]>, pub buckets: HashMap<u32, [BridgeLine; MAX_BRIDGES_PER_BUCKET]>,
pub encbuckets: HashMap<u32, EncryptedBucket>, pub encbuckets: HashMap<u32, EncryptedBucket>,
/// Individual bridges that are reachable /// Individual bridges that are reachable
#[serde_as(as = "HashMap<serde_with::json::JsonString, _>")]
pub reachable: HashMap<BridgeLine, Vec<(u32, usize)>>, pub reachable: HashMap<BridgeLine, Vec<(u32, usize)>>,
/// bucket ids of "hot spare" buckets. These buckets are not handed /// bucket ids of "hot spare" buckets. These buckets are not handed
/// to users, nor do they have any Migration credentials pointing to /// to users, nor do they have any Migration credentials pointing to