mirror of
https://git.verdigado.com/NB-Public/simple-wkd.git
synced 2024-10-30 05:05:52 +01:00
Add toml settings
This commit is contained in:
parent
d3a1860a2d
commit
291e0070c4
8 changed files with 121 additions and 18 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -1,2 +1,3 @@
|
||||||
/target
|
/target
|
||||||
/data
|
/data
|
||||||
|
/wkd.toml
|
54
Cargo.lock
generated
54
Cargo.lock
generated
|
@ -1902,6 +1902,15 @@ dependencies = [
|
||||||
"serde",
|
"serde",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "serde_spanned"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "0efd8caf556a6cebd3b285caf480045fcc1ac04f6bd786b09a6f11af30c4fcf4"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "serde_urlencoded"
|
name = "serde_urlencoded"
|
||||||
version = "0.7.1"
|
version = "0.7.1"
|
||||||
|
@ -1956,6 +1965,7 @@ version = "0.1.0"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"actix-web",
|
"actix-web",
|
||||||
"chrono",
|
"chrono",
|
||||||
|
"once_cell",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"sequoia-net",
|
"sequoia-net",
|
||||||
"sequoia-openpgp",
|
"sequoia-openpgp",
|
||||||
|
@ -1963,6 +1973,7 @@ dependencies = [
|
||||||
"serde_json",
|
"serde_json",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"tokio",
|
"tokio",
|
||||||
|
"toml",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
|
@ -2200,6 +2211,40 @@ dependencies = [
|
||||||
"tracing",
|
"tracing",
|
||||||
]
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml"
|
||||||
|
version = "0.7.3"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "b403acf6f2bb0859c93c7f0d967cb4a75a7ac552100f9322faf64dc047669b21"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"toml_edit",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_datetime"
|
||||||
|
version = "0.6.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "3ab8ed2edee10b50132aed5f331333428b011c99402b5a534154ed15746f9622"
|
||||||
|
dependencies = [
|
||||||
|
"serde",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "toml_edit"
|
||||||
|
version = "0.19.8"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "239410c8609e8125456927e6707163a3b1fdb40561e4b803bc041f466ccfdc13"
|
||||||
|
dependencies = [
|
||||||
|
"indexmap",
|
||||||
|
"serde",
|
||||||
|
"serde_spanned",
|
||||||
|
"toml_datetime",
|
||||||
|
"winnow",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "tower-service"
|
name = "tower-service"
|
||||||
version = "0.3.2"
|
version = "0.3.2"
|
||||||
|
@ -2648,6 +2693,15 @@ version = "0.48.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
checksum = "1a515f5799fe4961cb532f983ce2b23082366b898e52ffbce459c86f67c8378a"
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "winnow"
|
||||||
|
version = "0.4.1"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "ae8970b36c66498d8ff1d66685dc86b91b29db0c7739899012f63a63814b4b28"
|
||||||
|
dependencies = [
|
||||||
|
"memchr",
|
||||||
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "winreg"
|
name = "winreg"
|
||||||
version = "0.10.1"
|
version = "0.10.1"
|
||||||
|
|
|
@ -8,6 +8,7 @@ edition = "2021"
|
||||||
[dependencies]
|
[dependencies]
|
||||||
actix-web = "4.3.1"
|
actix-web = "4.3.1"
|
||||||
chrono = "0.4.24"
|
chrono = "0.4.24"
|
||||||
|
once_cell = "1.17.1"
|
||||||
rand = "0.8.5"
|
rand = "0.8.5"
|
||||||
sequoia-net = "0.27.0"
|
sequoia-net = "0.27.0"
|
||||||
sequoia-openpgp = "1.14.0"
|
sequoia-openpgp = "1.14.0"
|
||||||
|
@ -15,3 +16,4 @@ serde = { version = "1.0.160", features = ["derive"] }
|
||||||
serde_json = "1.0.96"
|
serde_json = "1.0.96"
|
||||||
thiserror = "1.0.40"
|
thiserror = "1.0.40"
|
||||||
tokio = { version = "1.27.0", features = ["time"] }
|
tokio = { version = "1.27.0", features = ["time"] }
|
||||||
|
toml = "0.7.3"
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
use crate::errors::Error;
|
use crate::errors::Error;
|
||||||
use crate::management::{delete_key, Action, Pending};
|
use crate::management::{delete_key, Action, Pending};
|
||||||
|
use crate::pending_path;
|
||||||
|
use crate::settings::SETTINGS;
|
||||||
use crate::utils::{get_email_from_cert, parse_pem};
|
use crate::utils::{get_email_from_cert, parse_pem};
|
||||||
use crate::PENDING;
|
|
||||||
use crate::{pending_path, PATH, VARIANT};
|
|
||||||
|
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
|
@ -28,7 +28,12 @@ pub fn confirm_action(token: &str) -> Result<(), Error> {
|
||||||
Some(domain) => domain.to_string(),
|
Some(domain) => domain.to_string(),
|
||||||
None => return Err(Error::ParseEmail),
|
None => return Err(Error::ParseEmail),
|
||||||
};
|
};
|
||||||
match sequoia_net::wkd::insert(PATH, domain, VARIANT, &cert) {
|
match sequoia_net::wkd::insert(
|
||||||
|
&SETTINGS.folder_structure.root_folder,
|
||||||
|
domain,
|
||||||
|
SETTINGS.variant,
|
||||||
|
&cert,
|
||||||
|
) {
|
||||||
Ok(_) => (),
|
Ok(_) => (),
|
||||||
Err(_) => return Err(Error::AddingKey),
|
Err(_) => return Err(Error::AddingKey),
|
||||||
}
|
}
|
||||||
|
|
13
src/main.rs
13
src/main.rs
|
@ -1,8 +1,10 @@
|
||||||
mod confirmation;
|
mod confirmation;
|
||||||
mod errors;
|
mod errors;
|
||||||
mod management;
|
mod management;
|
||||||
|
mod settings;
|
||||||
mod utils;
|
mod utils;
|
||||||
|
|
||||||
|
use crate::settings::SETTINGS;
|
||||||
use crate::utils::key_exists;
|
use crate::utils::key_exists;
|
||||||
|
|
||||||
use self::confirmation::{confirm_action, send_confirmation_email};
|
use self::confirmation::{confirm_action, send_confirmation_email};
|
||||||
|
@ -10,18 +12,11 @@ use self::management::{clean_stale, store_pending_addition, store_pending_deleti
|
||||||
use self::utils::{gen_random_token, get_email_from_cert, parse_pem};
|
use self::utils::{gen_random_token, get_email_from_cert, parse_pem};
|
||||||
|
|
||||||
use actix_web::{get, post, web, App, HttpServer, Result};
|
use actix_web::{get, post, web, App, HttpServer, Result};
|
||||||
use sequoia_net::wkd::Variant;
|
|
||||||
use serde::Deserialize;
|
use serde::Deserialize;
|
||||||
use std::fs;
|
use std::fs;
|
||||||
use std::path::Path;
|
use std::path::Path;
|
||||||
use tokio::{task, time};
|
use tokio::{task, time};
|
||||||
|
|
||||||
const PATH: &str = "data";
|
|
||||||
const PENDING: &str = "pending";
|
|
||||||
const MAX_AGE: i64 = 0;
|
|
||||||
const VARIANT: Variant = Variant::Advanced;
|
|
||||||
const PORT: u16 = 8080;
|
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
struct Pem {
|
struct Pem {
|
||||||
key: String,
|
key: String,
|
||||||
|
@ -44,11 +39,11 @@ async fn main() -> std::io::Result<()> {
|
||||||
let mut metronome = time::interval(time::Duration::from_secs(60 * 60 * 3));
|
let mut metronome = time::interval(time::Duration::from_secs(60 * 60 * 3));
|
||||||
loop {
|
loop {
|
||||||
metronome.tick().await;
|
metronome.tick().await;
|
||||||
clean_stale(MAX_AGE).unwrap();
|
clean_stale(SETTINGS.max_age).unwrap();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
HttpServer::new(|| App::new().service(submit).service(confirm).service(delete))
|
HttpServer::new(|| App::new().service(submit).service(confirm).service(delete))
|
||||||
.bind(("127.0.0.1", PORT))?
|
.bind(("127.0.0.1", SETTINGS.port))?
|
||||||
.run()
|
.run()
|
||||||
.await
|
.await
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
use crate::errors::Error;
|
use crate::errors::Error;
|
||||||
|
use crate::pending_path;
|
||||||
|
use crate::settings::SETTINGS;
|
||||||
use crate::utils::get_user_file_path;
|
use crate::utils::get_user_file_path;
|
||||||
use crate::PENDING;
|
|
||||||
use crate::{pending_path, PATH};
|
|
||||||
|
|
||||||
use chrono::Utc;
|
use chrono::Utc;
|
||||||
use serde::{Deserialize, Serialize};
|
use serde::{Deserialize, Serialize};
|
||||||
|
@ -95,7 +95,7 @@ pub fn clean_stale(max_age: i64) -> Result<(), Error> {
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn delete_key(email: &str) -> Result<(), Error> {
|
pub fn delete_key(email: &str) -> Result<(), Error> {
|
||||||
let path = Path::new(PATH).join(get_user_file_path(email)?);
|
let path = Path::new(&SETTINGS.folder_structure.root_folder).join(get_user_file_path(email)?);
|
||||||
match fs::remove_file(path) {
|
match fs::remove_file(path) {
|
||||||
Ok(_) => Ok(()),
|
Ok(_) => Ok(()),
|
||||||
Err(_) => Err(Error::Inaccessible),
|
Err(_) => Err(Error::Inaccessible),
|
||||||
|
|
45
src/settings.rs
Normal file
45
src/settings.rs
Normal file
|
@ -0,0 +1,45 @@
|
||||||
|
use std::fs;
|
||||||
|
|
||||||
|
use once_cell::sync::Lazy;
|
||||||
|
use sequoia_net::wkd::Variant;
|
||||||
|
use serde::{Deserialize, Serialize};
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct Settings {
|
||||||
|
#[serde(with = "VariantDef")]
|
||||||
|
pub variant: Variant,
|
||||||
|
pub max_age: i64,
|
||||||
|
pub port: u16,
|
||||||
|
pub folder_structure: FolderStructure,
|
||||||
|
pub smtp_settings: MailSettings,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct FolderStructure {
|
||||||
|
pub root_folder: String,
|
||||||
|
pub pending_folder: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
pub struct MailSettings {
|
||||||
|
pub smtp_host: String,
|
||||||
|
pub smtp_username: String,
|
||||||
|
pub smtp_password: String,
|
||||||
|
pub smtp_port: u16,
|
||||||
|
pub mail_from: String,
|
||||||
|
pub mail_subject: String,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug)]
|
||||||
|
#[serde(remote = "Variant")]
|
||||||
|
pub enum VariantDef {
|
||||||
|
Advanced,
|
||||||
|
Direct,
|
||||||
|
}
|
||||||
|
|
||||||
|
fn get_settings() -> Settings {
|
||||||
|
let content = fs::read_to_string("wkd.toml").unwrap();
|
||||||
|
toml::from_str(&content).unwrap()
|
||||||
|
}
|
||||||
|
|
||||||
|
pub static SETTINGS: Lazy<Settings> = Lazy::new(get_settings);
|
|
@ -1,5 +1,5 @@
|
||||||
use crate::errors::Error;
|
use crate::errors::Error;
|
||||||
use crate::{PATH, PENDING, VARIANT};
|
use crate::settings::SETTINGS;
|
||||||
|
|
||||||
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
use rand::{distributions::Alphanumeric, thread_rng, Rng};
|
||||||
use sequoia_net::wkd::Url;
|
use sequoia_net::wkd::Url;
|
||||||
|
@ -9,7 +9,8 @@ use std::path::{Path, PathBuf};
|
||||||
#[macro_export]
|
#[macro_export]
|
||||||
macro_rules! pending_path {
|
macro_rules! pending_path {
|
||||||
() => {
|
() => {
|
||||||
Path::new(PATH).join(PENDING)
|
Path::new(&SETTINGS.folder_structure.root_folder)
|
||||||
|
.join(&SETTINGS.folder_structure.pending_folder)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -45,7 +46,7 @@ pub fn get_user_file_path(email: &str) -> Result<PathBuf, Error> {
|
||||||
Ok(wkd_url) => wkd_url,
|
Ok(wkd_url) => wkd_url,
|
||||||
Err(_) => return Err(Error::PathGeneration),
|
Err(_) => return Err(Error::PathGeneration),
|
||||||
};
|
};
|
||||||
match wkd_url.to_file_path(VARIANT) {
|
match wkd_url.to_file_path(SETTINGS.variant) {
|
||||||
Ok(path) => Ok(path),
|
Ok(path) => Ok(path),
|
||||||
Err(_) => Err(Error::PathGeneration),
|
Err(_) => Err(Error::PathGeneration),
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue