This commit is contained in:
realisation 2023-10-17 11:04:07 -04:00
commit 57a655fcac
2 changed files with 54 additions and 42 deletions

View File

@ -169,7 +169,9 @@ async fn main() {
{
ip
} else {
println!( "\x1b[38;5;196mfailed to find public IPv4 address: booting as a routed node\x1b[0m");
println!(
"\x1b[38;5;196mfailed to find public IPv4 address: booting as a routed node\x1b[0m"
);
std::net::Ipv4Addr::LOCALHOST
}
};
@ -203,10 +205,14 @@ async fn main() {
} => (our, decoded_keyfile, encoded_keyfile),
};
println!("saving encrypted networking keys to {}/.keys", home_directory_path);
println!(
"saving encrypted networking keys to {}/.keys",
home_directory_path
);
fs::write(format!("{}/.keys", home_directory_path), encoded_keyfile)
.await.unwrap();
.await
.unwrap();
println!("registration complete!");
@ -215,7 +221,9 @@ async fn main() {
home_directory_path.clone(),
decoded_keyfile.file_key,
fs_config,
).await.expect("fs load failed!");
)
.await
.expect("fs load failed!");
let _ = kill_tx.send(true);
let _ = print_sender

View File

@ -9,8 +9,11 @@ use sha2::Sha256;
use std::sync::{Arc, Mutex};
use tokio::sync::{mpsc, oneshot};
use warp::{
http::{ StatusCode, header::{HeaderValue, SET_COOKIE}, },
Filter, Rejection, Reply,
http::{
header::{HeaderValue, SET_COOKIE},
StatusCode,
},
Filter, Rejection, Reply,
};
use crate::http_server;
@ -42,9 +45,8 @@ pub async fn register(
kill_rx: oneshot::Receiver<bool>,
ip: String,
port: u16,
keyfile: Vec<u8>
keyfile: Vec<u8>,
) {
let our_arc = Arc::new(Mutex::new(None));
let our_ws_info = our_arc.clone();
@ -60,29 +62,34 @@ pub async fn register(
.and(warp::fs::file("./src/register/build/index.html"));
let api = warp::path("has-keyfile")
.and(warp::get()
.and(
warp::get()
.and(warp::any().map(move || keyfile_has.clone()))
.and_then(handle_has_keyfile))
.or(warp::path("info")
.and(warp::get()
.and_then(handle_has_keyfile),
)
.or(warp::path("info").and(
warp::get()
.and(warp::any().map(move || ip.clone()))
.and(warp::any().map(move || our_ws_info.clone()))
.and(warp::any().map(move || net_keypair_ws_info.clone()))
.and_then(handle_info)))
.or(warp::path("vet-keyfile")
.and(warp::post()
.and(warp::body::content_length_limit(1024 * 16))
.and_then(handle_info),
))
.or(warp::path("vet-keyfile").and(
warp::post()
.and(warp::body::content_length_limit(1024 * 16))
.and(warp::body::json())
.and_then(handle_keyfile_check)))
.or(warp::path("boot")
.and(warp::put()
.and(warp::body::content_length_limit(1024 * 16))
.and_then(handle_keyfile_check),
))
.or(warp::path("boot").and(
warp::put()
.and(warp::body::content_length_limit(1024 * 16))
.and(warp::body::json())
.and(warp::any().map(move || tx.clone()))
.and(warp::any().map(move || our_arc.lock().unwrap().take().unwrap()))
.and(warp::any().map(move || net_keypair_arc.lock().unwrap().take().unwrap()))
.and(warp::any().map(move || keyfile_arc.lock().unwrap().take().unwrap()))
.and_then(handle_boot)));
.and_then(handle_boot),
));
let routes = static_files.or(react_app).or(api);
@ -95,25 +102,17 @@ pub async fn register(
.await;
}
async fn handle_has_keyfile(
keyfile: Arc<Mutex<Option<Vec<u8>>>>,
) -> Result<impl Reply, Rejection> {
async fn handle_has_keyfile(keyfile: Arc<Mutex<Option<Vec<u8>>>>) -> Result<impl Reply, Rejection> {
Ok(warp::reply::json(&keyfile.lock().unwrap().is_some()))
}
async fn handle_keyfile_check(
payload: KeyfileCheck
) -> Result<impl Reply, Rejection> {
async fn handle_keyfile_check(payload: KeyfileCheck) -> Result<impl Reply, Rejection> {
let keyfile = base64::decode(payload.keyfile).unwrap();
match keygen::decode_keyfile(keyfile, &payload.password) {
Ok(_) => Ok(warp::reply::with_status(warp::reply(), StatusCode::OK)),
Err(_) => Err(warp::reject()),
}
}
async fn handle_keyfile_gen(
@ -122,9 +121,7 @@ async fn handle_keyfile_gen(
networking_keypair: Arc<Mutex<Option<Document>>>,
jwt_secret: Arc<Mutex<Option<Vec<u8>>>>,
) -> Result<impl Reply, Rejection> {
Ok(warp::reply::with_status(warp::reply(), StatusCode::OK))
}
async fn handle_boot(
@ -160,13 +157,14 @@ async fn handle_boot(
let mut jwt_secret = [0u8, 32];
ring::rand::SecureRandom::fill(&seed, &mut jwt_secret).unwrap();
let networking_pair = signature::Ed25519KeyPair::from_pkcs8(networking_keypair.as_ref()).unwrap();
let networking_pair =
signature::Ed25519KeyPair::from_pkcs8(networking_keypair.as_ref()).unwrap();
Keyfile {
username: our.name.clone(),
routers: our.allowed_routers.clone(),
networking_keypair: signature::Ed25519KeyPair
::from_pkcs8(networking_keypair.as_ref()).unwrap(),
networking_keypair: signature::Ed25519KeyPair::from_pkcs8(networking_keypair.as_ref())
.unwrap(),
jwt_secret_bytes: jwt_secret.to_vec(),
file_key: keygen::generate_file_key(),
}
@ -188,7 +186,10 @@ async fn handle_boot(
None => return Err(warp::reject()),
};
sender.send((our.clone(), decoded_keyfile, encoded_keyfile.clone())).await.unwrap();
sender
.send((our.clone(), decoded_keyfile, encoded_keyfile.clone()))
.await
.unwrap();
let encoded_keyfile_str = match info.keyfile.clone().is_empty() {
true => base64::encode(encoded_keyfile),
@ -201,10 +202,14 @@ async fn handle_boot(
).into_response();
let headers = response.headers_mut();
headers.append(SET_COOKIE, HeaderValue::from_str(
&format!("uqbar-auth_{}={};", &our.name, &token)).unwrap());
headers.append(SET_COOKIE, HeaderValue::from_str(
&format!("uqbar-ws-auth_{}={};", &our.name, &token)).unwrap());
headers.append(
SET_COOKIE,
HeaderValue::from_str(&format!("uqbar-auth_{}={};", &our.name, &token)).unwrap(),
);
headers.append(
SET_COOKIE,
HeaderValue::from_str(&format!("uqbar-ws-auth_{}={};", &our.name, &token)).unwrap(),
);
Ok(response)
@ -237,7 +242,6 @@ async fn handle_info(
*our_arc.lock().unwrap() = Some(our.clone());
Ok(warp::reply::json(&our))
}
async fn handle_post(