forked from janek/mostr
fix(main): safer key persistence
This commit is contained in:
parent
17b3334aea
commit
3dca6a4b23
45
src/main.rs
45
src/main.rs
|
@ -3,7 +3,7 @@ use std::collections::{HashMap, VecDeque};
|
||||||
use std::env::{args, var};
|
use std::env::{args, var};
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::fs::File;
|
use std::fs::File;
|
||||||
use std::io::{BufRead, BufReader};
|
use std::io::{BufRead, BufReader, Write};
|
||||||
use std::iter::once;
|
use std::iter::once;
|
||||||
use std::ops::Sub;
|
use std::ops::Sub;
|
||||||
use std::path::PathBuf;
|
use std::path::PathBuf;
|
||||||
|
@ -140,7 +140,8 @@ pub(crate) enum MostrMessage {
|
||||||
}
|
}
|
||||||
|
|
||||||
#[tokio::main]
|
#[tokio::main]
|
||||||
async fn main() {
|
async fn main() -> Result<()> {
|
||||||
|
// TODO preserve prompt lines
|
||||||
let mut rl = Editor::new();
|
let mut rl = Editor::new();
|
||||||
|
|
||||||
let mut args = args().skip(1).peekable();
|
let mut args = args().skip(1).peekable();
|
||||||
|
@ -164,19 +165,31 @@ async fn main() {
|
||||||
let keysfile = config_dir.join("key");
|
let keysfile = config_dir.join("key");
|
||||||
let relayfile = config_dir.join("relays");
|
let relayfile = config_dir.join("relays");
|
||||||
|
|
||||||
let keys = match fs::read_to_string(&keysfile).map(|s| Keys::from_str(&s)) {
|
let keys = if let Ok(Ok(key)) = fs::read_to_string(&keysfile).map(|s| Keys::from_str(&s)) {
|
||||||
Ok(Ok(key)) => key,
|
key
|
||||||
_ => {
|
} else {
|
||||||
warn!("Could not read keys from {}", keysfile.to_string_lossy());
|
warn!("Could not read keys from {}", keysfile.to_string_lossy());
|
||||||
let keys = or_warn!(rl.readline("Secret key? "))
|
let line = rl.readline("Secret key? (leave blank to generate and save a new keypair) ")?;
|
||||||
.and_then(|s| or_warn!(Keys::from_str(&s)))
|
let keys = if line.is_empty() {
|
||||||
.unwrap_or_else(|| {
|
info!("Generating and persisting new key");
|
||||||
info!("Generating and persisting new key");
|
Keys::generate()
|
||||||
Keys::generate()
|
} else {
|
||||||
});
|
Keys::from_str(&line).inspect_err(|_| eprintln!())?
|
||||||
or_warn!(fs::write(&keysfile, keys.secret_key().unwrap().to_string()));
|
};
|
||||||
keys
|
let mut file = match File::create_new(&keysfile) {
|
||||||
}
|
Ok(file) => file,
|
||||||
|
Err(e) => {
|
||||||
|
let line = rl.readline(&format!("Overwrite {}? (enter anything to abort) ", keysfile.to_string_lossy()))?;
|
||||||
|
if line.is_empty() {
|
||||||
|
File::create(&keysfile)?
|
||||||
|
} else {
|
||||||
|
eprintln!();
|
||||||
|
Err(e)?
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
file.write_all(keys.secret_key().unwrap().to_string().as_bytes())?;
|
||||||
|
keys
|
||||||
};
|
};
|
||||||
|
|
||||||
let client = Client::new(&keys);
|
let client = Client::new(&keys);
|
||||||
|
@ -647,4 +660,6 @@ async fn main() {
|
||||||
|
|
||||||
info!("Submitting pending updates...");
|
info!("Submitting pending updates...");
|
||||||
or_warn!(sender.await);
|
or_warn!(sender.await);
|
||||||
|
|
||||||
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue