refactor: split

This commit is contained in:
shimun 2022-12-24 16:55:42 +01:00
parent e1da57a407
commit 1b8b304ebc
Signed by: shimun
GPG Key ID: E0420647856EA39E
15 changed files with 187 additions and 94 deletions

50
Cargo.lock generated
View File

@ -1607,7 +1607,46 @@ dependencies = [
] ]
[[package]] [[package]]
name = "ssh-cert-dist" name = "ssh-cert-dist-client"
version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"axum-extra",
"chrono",
"clap",
"rand 0.8.5",
"reqwest",
"serde",
"ssh-cert-dist-common",
"ssh-key",
"tempfile",
"thiserror",
"tokio",
"tracing",
"tracing-subscriber",
"url",
]
[[package]]
name = "ssh-cert-dist-common"
version = "0.1.0"
dependencies = [
"anyhow",
"async-trait",
"axum",
"axum-extra",
"serde",
"ssh-key",
"tempfile",
"thiserror",
"tokio",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "ssh-cert-dist-server"
version = "0.1.0" version = "0.1.0"
dependencies = [ dependencies = [
"anyhow", "anyhow",
@ -1618,8 +1657,8 @@ dependencies = [
"clap", "clap",
"jwt-compact", "jwt-compact",
"rand 0.8.5", "rand 0.8.5",
"reqwest",
"serde", "serde",
"ssh-cert-dist-common",
"ssh-key", "ssh-key",
"tempfile", "tempfile",
"thiserror", "thiserror",
@ -1628,13 +1667,13 @@ dependencies = [
"tower-http", "tower-http",
"tracing", "tracing",
"tracing-subscriber", "tracing-subscriber",
"url",
] ]
[[package]] [[package]]
name = "ssh-encoding" name = "ssh-encoding"
version = "0.1.0" version = "0.1.0"
source = "git+https://github.com/a-dma/SSH.git?branch=u2f_signatures#ce0c34c935acd2caf7174d33039ec1c4557119de" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "19cfdc32e0199062113edf41f344fbf784b8205a94600233c84eb838f45191e1"
dependencies = [ dependencies = [
"base64ct", "base64ct",
"pem-rfc7468", "pem-rfc7468",
@ -1644,7 +1683,8 @@ dependencies = [
[[package]] [[package]]
name = "ssh-key" name = "ssh-key"
version = "0.5.1" version = "0.5.1"
source = "git+https://github.com/a-dma/SSH.git?branch=u2f_signatures#ce0c34c935acd2caf7174d33039ec1c4557119de" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "288d8f5562af5a3be4bda308dd374b2c807b940ac370b5efa1c99311da91d9a1"
dependencies = [ dependencies = [
"ed25519-dalek", "ed25519-dalek",
"num-bigint-dig", "num-bigint-dig",

View File

@ -1,43 +1,8 @@
[package] [workspace]
name = "ssh-cert-dist"
version = "0.1.0"
authors = ["shimun <shimun@shimun.net>"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html members = [
"common",
[features] "server",
default = [ "client", "reload", "info", "authorized" ] "client",
reload = [] ]
authorized =[ "dep:jwt-compact" ]
index = []
info = [ "axum/json", "ssh-key/serde" ]
client = [ "dep:url", "dep:reqwest" ]
[dependencies]
anyhow = "1.0.66"
async-trait = "0.1.59"
axum = { version = "0.6.1", features = ["http2"] }
axum-extra = { version = "0.4.1", features = ["typed-routing"] }
chrono = "0.4.23"
clap = { version = "4.0.29", features = ["env", "derive"] }
jwt-compact = { version = "0.6.0", features = ["serde_cbor", "std", "clock"], optional = true }
rand = "0.8.5"
reqwest = { version = "0.11.13", optional = true }
serde = { version = "1.0.148", features = ["derive"] }
ssh-key = { version = "0.5.1", features = ["ed25519", "p256", "p384", "rsa", "signature"] }
thiserror = "1.0.37"
tokio = { version = "1.22.0", features = ["io-std", "test-util", "tracing", "macros", "fs"] }
tower = { version = "0.4.13", features = ["util"] }
tower-http = { version = "0.3.4", features = ["map-request-body", "trace"] }
tracing = { version = "0.1.37", features = ["release_max_level_debug"] }
tracing-subscriber = "0.3.16"
url = { version = "2.3.1", optional = true }
[patch.crates-io]
ssh-key = { git = "https://github.com/a-dma/SSH.git", branch = "u2f_signatures" }
[dev-dependencies]
tempfile = "3.3.0"

31
client/Cargo.toml Normal file
View File

@ -0,0 +1,31 @@
[package]
name = "ssh-cert-dist-client"
version = "0.1.0"
authors = ["shimun <shimun@shimun.net>"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
anyhow = "1.0.66"
async-trait = "0.1.59"
axum-extra = { version = "0.4.1", features = ["typed-routing"] }
chrono = "0.4.23"
clap = { version = "4.0.29", features = ["env", "derive"] }
rand = "0.8.5"
reqwest = { version = "0.11.13", optional = true }
serde = { version = "1.0.148", features = ["derive"] }
ssh-key = { version = "0.5.1", features = ["ed25519", "p256", "p384", "rsa", "signature"] }
thiserror = "1.0.37"
tokio = { version = "1.22.0", features = ["io-std", "test-util", "tracing", "macros", "fs"] }
tracing = { version = "0.1.37", features = ["release_max_level_debug"] }
tracing-subscriber = "0.3.16"
url = { version = "2.3.1" }
ssh-cert-dist-common = { path = "../common" }
[patch.crates-io]
ssh-key = { git = "https://github.com/a-dma/SSH.git", branch = "u2f_signatures" }
[dev-dependencies]
tempfile = "3.3.0"

View File

@ -3,7 +3,7 @@ use axum_extra::routing::TypedPath;
use clap::{Args, Parser, Subcommand}; use clap::{Args, Parser, Subcommand};
use reqwest::{Client, StatusCode}; use reqwest::{Client, StatusCode};
use ssh_key::Certificate; use ssh_key::Certificate;
use std::io::{stdin}; use std::io::stdin;
use std::path::PathBuf; use std::path::PathBuf;
use std::time::{Duration, SystemTime}; use std::time::{Duration, SystemTime};
use tokio::fs; use tokio::fs;
@ -11,10 +11,7 @@ use tracing::{debug, error, info, instrument, trace};
use url::Url; use url::Url;
use crate::certs::load_cert; use ssh_cert_dist_common::*;
use crate::certs::read_dir;
use crate::env_key;
use crate::routes::*;
#[derive(Parser)] #[derive(Parser)]
pub struct ClientArgs { pub struct ClientArgs {
@ -46,7 +43,7 @@ pub struct UploadArgs {
files: Vec<PathBuf>, files: Vec<PathBuf>,
} }
#[derive(Args)] #[derive(Parser)]
pub struct ClientCommand { pub struct ClientCommand {
#[clap(subcommand)] #[clap(subcommand)]
cmd: ClientCommands, cmd: ClientCommands,

10
client/src/main.rs Normal file
View File

@ -0,0 +1,10 @@
use clap::Parser;
mod client;
#[tokio::main(flavor = "current_thread")]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
client::run(client::ClientCommand::parse()).await
}

26
common/Cargo.toml Normal file
View File

@ -0,0 +1,26 @@
[package]
name = "ssh-cert-dist-common"
version = "0.1.0"
authors = ["shimun <shimun@shimun.net>"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies]
anyhow = "1.0.66"
async-trait = "0.1.59"
axum = { version = "0.6.1" }
axum-extra = { version = "0.4.1", features = ["typed-routing"] }
serde = { version = "1.0.148", features = ["derive"] }
ssh-key = { version = "0.5.1", features = ["ed25519", "p256", "p384", "rsa", "signature"] }
thiserror = "1.0.37"
tokio = { version = "1.22.0", features = ["io-std", "test-util", "tracing", "macros", "fs"] }
tracing = { version = "0.1.37", features = ["release_max_level_debug"] }
tracing-subscriber = "0.3.16"
[patch.crates-io]
ssh-key = { git = "https://github.com/a-dma/SSH.git", branch = "u2f_signatures" }
[dev-dependencies]
tempfile = "3.3.0"

6
common/src/lib.rs Normal file
View File

@ -0,0 +1,6 @@
mod certs;
mod routes;
mod util;
pub use certs::*;
pub use routes::*;

View File

@ -1,3 +1,4 @@
use async_trait::async_trait;
use axum_extra::routing::TypedPath; use axum_extra::routing::TypedPath;
use serde::Deserialize; use serde::Deserialize;

6
common/src/util.rs Normal file
View File

@ -0,0 +1,6 @@
#[macro_export]
macro_rules! env_key {
( $var:expr ) => {
concat!("SSH_CD_", $var)
};
}

41
server/Cargo.toml Normal file
View File

@ -0,0 +1,41 @@
[package]
name = "ssh-cert-dist-server"
version = "0.1.0"
authors = ["shimun <shimun@shimun.net>"]
edition = "2021"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[features]
default = [ "reload", "info", "authorized" ]
reload = []
authorized =[ "dep:jwt-compact" ]
index = []
info = [ "axum/json", "ssh-key/serde" ]
[dependencies]
anyhow = "1.0.66"
async-trait = "0.1.59"
axum = { version = "0.6.1", features = ["http2"] }
axum-extra = { version = "0.4.1", features = ["typed-routing"] }
chrono = "0.4.23"
clap = { version = "4.0.29", features = ["env", "derive"] }
jwt-compact = { version = "0.6.0", features = ["serde_cbor", "std", "clock"], optional = true }
rand = "0.8.5"
serde = { version = "1.0.148", features = ["derive"] }
ssh-key = { version = "0.5.1", features = ["ed25519", "p256", "p384", "rsa", "signature"] }
thiserror = "1.0.37"
tokio = { version = "1.22.0", features = ["io-std", "test-util", "tracing", "macros", "fs"] }
tower = { version = "0.4.13", features = ["util"] }
tower-http = { version = "0.3.4", features = ["map-request-body", "trace"] }
tracing = { version = "0.1.37", features = ["release_max_level_debug"] }
tracing-subscriber = "0.3.16"
ssh-cert-dist-common = { path = "../common" }
[patch.crates-io]
ssh-key = { git = "https://github.com/a-dma/SSH.git", branch = "u2f_signatures" }
[dev-dependencies]
tempfile = "3.3.0"

View File

@ -6,12 +6,10 @@ use std::path::{self, PathBuf};
use std::sync::Arc; use std::sync::Arc;
use std::time::{Duration, SystemTime}; use std::time::{Duration, SystemTime};
use crate::certs::{load_cert_by_id, read_certs, read_pubkey, store_cert};
use crate::env_key;
use crate::routes::*;
use anyhow::Context; use anyhow::Context;
use axum::body; use axum::body;
use axum::extract::{Query, State}; use axum::extract::{Query, State};
use ssh_cert_dist_common::*;
use axum::{http::StatusCode, response::IntoResponse, Json, Router}; use axum::{http::StatusCode, response::IntoResponse, Json, Router};
use axum_extra::routing::RouterExt; use axum_extra::routing::RouterExt;

View File

@ -1,8 +1,6 @@
use super::ApiError; use super::ApiError;
use anyhow::Context; use anyhow::Context;
use axum::{ use axum::{async_trait, body::BoxBody, extract::FromRequest, http::Request};
async_trait, body::BoxBody, extract::FromRequest, http::Request,
};
use ssh_key::{Certificate, SshSig}; use ssh_key::{Certificate, SshSig};
use tracing::trace; use tracing::trace;

10
server/src/main.rs Normal file
View File

@ -0,0 +1,10 @@
use clap::Parser;
mod api;
#[tokio::main(flavor = "current_thread")]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
api::run(api::ApiArgs::parse()).await
}

View File

@ -1,36 +0,0 @@
use api::ApiArgs;
use clap::Parser;
#[cfg(feature = "client")]
use client::ClientCommand;
mod api;
mod certs;
#[cfg(feature = "client")]
mod client;
mod routes;
#[macro_export]
macro_rules! env_key {
( $var:expr ) => {
concat!("SSH_CD_", $var)
};
}
#[derive(Parser)]
enum Command {
Server(ApiArgs),
#[cfg(feature = "client")]
Client(ClientCommand),
}
#[tokio::main(flavor = "current_thread")]
async fn main() -> anyhow::Result<()> {
tracing_subscriber::fmt::init();
match Command::parse() {
Command::Server(args) => api::run(args).await?,
#[cfg(feature = "client")]
Command::Client(args) => client::run(args).await?,
}
Ok(())
}