From d591daa884158cc3d24cc6dcdbe7c42ea3fda396 Mon Sep 17 00:00:00 2001 From: Nadja Reitzenstein Date: Fri, 13 May 2022 18:24:47 +0200 Subject: [PATCH 1/4] Start on improving a few version thingies --- bffhd/env.rs | 8 ++++++++ bffhd/lib.rs | 5 ++--- build.rs | 2 +- 3 files changed, 11 insertions(+), 4 deletions(-) create mode 100644 bffhd/env.rs diff --git a/bffhd/env.rs b/bffhd/env.rs new file mode 100644 index 0000000..5411026 --- /dev/null +++ b/bffhd/env.rs @@ -0,0 +1,8 @@ +//! Information extracted from the (build) environment +//! + +/// The BFFH version, as an UTF-8 string +/// +/// This is of the format ".." if build as a normal release +/// or " ..-" if built from source +pub const VERSION: &'static str = env!("BFFHD_VERSION_STRING"); diff --git a/bffhd/lib.rs b/bffhd/lib.rs index 359a181..45a8466 100644 --- a/bffhd/lib.rs +++ b/bffhd/lib.rs @@ -31,6 +31,8 @@ pub mod capnp; pub mod utils; +pub mod env; + mod audit; mod keylog; mod logging; @@ -60,9 +62,6 @@ use crate::users::Users; use executor::pool::Executor; use signal_hook::consts::signal::*; -pub const VERSION_STRING: &'static str = env!("BFFHD_VERSION_STRING"); -pub const RELEASE_STRING: &'static str = env!("BFFHD_RELEASE_STRING"); - pub struct Diflouroborane { config: Config, executor: Executor<'static>, diff --git a/build.rs b/build.rs index 122be31..8fbf65c 100644 --- a/build.rs +++ b/build.rs @@ -32,7 +32,7 @@ fn main() { String::from_utf8(out.stdout).expect("git rev-list output was not valid UTF8"); let gitrev = owned_gitrev.trim(); let abbrev = match gitrev.len() { - 0 => "unknown", + 0 => "badsource", _ => &gitrev[0..9], }; From c435f76d084d4d5d24d98ea9a07415e9869f7f31 Mon Sep 17 00:00:00 2001 From: Nadja Reitzenstein Date: Sat, 14 May 2022 15:36:32 +0200 Subject: [PATCH 2/4] --version talks about API version too --- bffhd/capnp/connection.rs | 2 +- bffhd/lib.rs | 2 +- bin/bffhd/main.rs | 6 +++++- 3 files changed, 7 insertions(+), 3 deletions(-) diff --git a/bffhd/capnp/connection.rs b/bffhd/capnp/connection.rs index d950e50..f8517e9 100644 --- a/bffhd/capnp/connection.rs +++ b/bffhd/capnp/connection.rs @@ -51,7 +51,7 @@ impl bootstrap::Server for BootCap { let _guard = span.enter(); let mut builder = result.get(); builder.set_name("bffhd"); - builder.set_release(crate::RELEASE_STRING); + builder.set_release(crate::env::VERSION); Promise::ok(()) } diff --git a/bffhd/lib.rs b/bffhd/lib.rs index 45a8466..c7d457d 100644 --- a/bffhd/lib.rs +++ b/bffhd/lib.rs @@ -76,7 +76,7 @@ pub static RESOURCES: OnceCell = OnceCell::new(); impl Diflouroborane { pub fn new(config: Config) -> anyhow::Result { logging::init(&config.logging); - tracing::info!(version = VERSION_STRING, "Starting BFFH"); + tracing::info!(version = env::VERSION, "Starting BFFH"); let span = tracing::info_span!("setup"); let _guard = span.enter(); diff --git a/bin/bffhd/main.rs b/bin/bffhd/main.rs index a6a2f87..846e160 100644 --- a/bin/bffhd/main.rs +++ b/bin/bffhd/main.rs @@ -11,7 +11,11 @@ fn main() -> anyhow::Result<()> { // values for the name, description and version are pulled from `Cargo.toml`. let matches = Command::new(clap::crate_name!()) .version(clap::crate_version!()) - .long_version(diflouroborane::VERSION_STRING) + .long_version(&*format!("Diflouroborane {version} + \t Implementing API {apiver}", + version=diflouroborane::env::VERSION, + apiver="0.3") + ) .about(clap::crate_description!()) .arg( Arg::new("config") From 25df5bf5b2c7a005769872655bf72e3469ca7e93 Mon Sep 17 00:00:00 2001 From: Nadja Reitzenstein Date: Wed, 18 May 2022 17:01:03 +0200 Subject: [PATCH 3/4] Switch to shadow-rs Closes #58 --- Cargo.lock | 94 +++++++++++++++++++++++++++++++++++++++++++++++ Cargo.toml | 5 +++ bffhd/env.rs | 8 ---- bffhd/lib.rs | 3 +- bin/bffhd/main.rs | 42 ++++++++++----------- build.rs | 60 +----------------------------- 6 files changed, 122 insertions(+), 90 deletions(-) delete mode 100644 bffhd/env.rs diff --git a/Cargo.lock b/Cargo.lock index 6955d63..87b54fc 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -477,6 +477,9 @@ name = "cc" version = "1.0.73" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "2fff2a6927b3bb87f9595d67196a70493f627687a71d87a0d692242c33f58c11" +dependencies = [ + "jobserver", +] [[package]] name = "cfg-if" @@ -543,6 +546,26 @@ dependencies = [ "cache-padded", ] +[[package]] +name = "const_format" +version = "0.2.23" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "0936ffe6d0c8d6a51b3b0a73b2acbe925d786f346cf45bfddc8341d79fb7dc8a" +dependencies = [ + "const_format_proc_macros", +] + +[[package]] +name = "const_format_proc_macros" +version = "0.2.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "ef196d5d972878a48da7decb7686eded338b4858fbabeed513d63a7c98b2b82d" +dependencies = [ + "proc-macro2", + "quote", + "unicode-xid", +] + [[package]] name = "constant_time_eq" version = "0.1.5" @@ -820,6 +843,7 @@ dependencies = [ "serde", "serde_dhall", "serde_json", + "shadow-rs", "signal-hook", "signal-hook-async-std", "tempfile", @@ -1171,6 +1195,19 @@ dependencies = [ "syn", ] +[[package]] +name = "git2" +version = "0.14.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0155506aab710a86160ddb504a480d2964d7ab5b9e62419be69e0032bc5931c" +dependencies = [ + "bitflags", + "libc", + "libgit2-sys", + "log", + "url", +] + [[package]] name = "glob" version = "0.3.0" @@ -1291,6 +1328,12 @@ dependencies = [ "syn", ] +[[package]] +name = "is_debug" +version = "1.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "06d198e9919d9822d5f7083ba8530e04de87841eaf21ead9af8f2304efd57c89" + [[package]] name = "itertools" version = "0.9.0" @@ -1321,6 +1364,15 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1aab8fc367588b89dcee83ab0fd66b72b50b72fa1904d7095045ace2b0c81c35" +[[package]] +name = "jobserver" +version = "0.1.24" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "af25a77299a7f711a01975c35a6a424eb6862092cc2d6c72c4ed6cbc56dfc1fa" +dependencies = [ + "libc", +] + [[package]] name = "js-sys" version = "0.3.56" @@ -1364,6 +1416,30 @@ version = "0.2.120" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ad5c14e80759d0939d013e6ca49930e59fc53dd8e5009132f76240c179380c09" +[[package]] +name = "libgit2-sys" +version = "0.13.4+1.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "d0fa6563431ede25f5cc7f6d803c6afbc1c5d3ad3d4925d12c882bf2b526f5d1" +dependencies = [ + "cc", + "libc", + "libz-sys", + "pkg-config", +] + +[[package]] +name = "libz-sys" +version = "1.1.6" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "92e7e15d7610cce1d9752e137625f14e61a28cd45929b6e12e47b50fe154ee2e" +dependencies = [ + "cc", + "libc", + "pkg-config", + "vcpkg", +] + [[package]] name = "lightproc" version = "0.3.0" @@ -2283,6 +2359,18 @@ dependencies = [ "opaque-debug 0.3.0", ] +[[package]] +name = "shadow-rs" +version = "0.11.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f47e98e36909e951f4da3908f4475f969bec92a41734dd92e883aaa11c10294b" +dependencies = [ + "chrono", + "const_format", + "git2", + "is_debug", +] + [[package]] name = "sharded-slab" version = "0.1.4" @@ -2750,6 +2838,12 @@ dependencies = [ "version_check", ] +[[package]] +name = "vcpkg" +version = "0.2.15" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "accd4ea62f7bb7a82fe23066fb0957d48ef677f6eeb8215f372f52e48bb32426" + [[package]] name = "version_check" version = "0.9.4" diff --git a/Cargo.toml b/Cargo.toml index 49d7236..d50d460 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -103,6 +103,8 @@ async-compat = "0.2.1" url = "2.2.2" rustls-native-certs = "0.6.1" +shadow-rs = "0.11" + [dependencies.rsasl] git = "https://github.com/dequbed/rsasl.git" rev = "0b5012d0" @@ -113,5 +115,8 @@ features = ["unstable_custom_mechanism", "provider", "registry_static", "plain"] futures-test = "0.3.16" tempfile = "3.2" +[build-dependencies] +shadow-rs = "0.11" + [workspace] members = ["modules/*", "api"] diff --git a/bffhd/env.rs b/bffhd/env.rs deleted file mode 100644 index 5411026..0000000 --- a/bffhd/env.rs +++ /dev/null @@ -1,8 +0,0 @@ -//! Information extracted from the (build) environment -//! - -/// The BFFH version, as an UTF-8 string -/// -/// This is of the format ".." if build as a normal release -/// or " ..-" if built from source -pub const VERSION: &'static str = env!("BFFHD_VERSION_STRING"); diff --git a/bffhd/lib.rs b/bffhd/lib.rs index c7d457d..8aeecc8 100644 --- a/bffhd/lib.rs +++ b/bffhd/lib.rs @@ -31,7 +31,8 @@ pub mod capnp; pub mod utils; -pub mod env; +// Store build information in the `env` module. +shadow_rs::shadow!(env); mod audit; mod keylog; diff --git a/bin/bffhd/main.rs b/bin/bffhd/main.rs index 846e160..4507d90 100644 --- a/bin/bffhd/main.rs +++ b/bin/bffhd/main.rs @@ -11,32 +11,33 @@ fn main() -> anyhow::Result<()> { // values for the name, description and version are pulled from `Cargo.toml`. let matches = Command::new(clap::crate_name!()) .version(clap::crate_version!()) - .long_version(&*format!("Diflouroborane {version} - \t Implementing API {apiver}", - version=diflouroborane::env::VERSION, - apiver="0.3") - ) + .long_version(&*format!("{version}\n\ + FabAccess {apiver}\n\ + \t[{build_kind} build built on {build_time}]\n\ + \t {rustc_version}\n\t {cargo_version}", + version=diflouroborane::env::PKG_VERSION, + apiver="0.3", + rustc_version=diflouroborane::env::RUST_VERSION, + cargo_version=diflouroborane::env::CARGO_VERSION, + build_time=diflouroborane::env::BUILD_TIME_3339, + build_kind=diflouroborane::env::BUILD_RUST_CHANNEL)) .about(clap::crate_description!()) - .arg( - Arg::new("config") + .arg(Arg::new("config") .help("Path to the config file to use") .long("config") .short('c') - .takes_value(true), - ) + .takes_value(true)) .arg(Arg::new("verbosity") .help("Increase logging verbosity") .long("verbose") .short('v') .multiple_occurrences(true) .max_occurrences(3) - .conflicts_with("quiet") - ) + .conflicts_with("quiet")) .arg(Arg::new("quiet") .help("Decrease logging verbosity") .long("quiet") - .conflicts_with("verbosity") - ) + .conflicts_with("verbosity")) .arg(Arg::new("log format") .help("Use an alternative log formatter. Available: Full, Compact, Pretty") .long("log-format") @@ -50,26 +51,22 @@ fn main() -> anyhow::Result<()> { .arg( Arg::new("print default") .help("Print a default config to stdout instead of running") - .long("print-default"), - ) + .long("print-default")) .arg( Arg::new("check config") .help("Check config for validity") - .long("check"), - ) + .long("check")) .arg( Arg::new("dump") .help("Dump all internal databases") .long("dump") - .conflicts_with("load"), - ) + .conflicts_with("load")) .arg( Arg::new("load") .help("Load values into the internal databases") .long("load") .takes_value(true) - .conflicts_with("dump"), - ) + .conflicts_with("dump")) .arg(Arg::new("keylog") .help("log TLS keys into PATH. If no path is specified the value of the envvar SSLKEYLOGFILE is used.") .long("tls-key-log") @@ -77,8 +74,7 @@ fn main() -> anyhow::Result<()> { .takes_value(true) .max_values(1) .min_values(0) - .default_missing_value("") - ) + .default_missing_value("")) .get_matches(); let configpath = matches diff --git a/build.rs b/build.rs index 8fbf65c..37f84e1 100644 --- a/build.rs +++ b/build.rs @@ -1,60 +1,4 @@ -use std::process::Command; - fn main() { - println!(">>> Building version number..."); - - let rustc = std::env::var("RUSTC").unwrap(); - let out = Command::new(rustc) - .arg("--version") - .output() - .expect("failed to run `rustc --version`"); - let rustc_version = - String::from_utf8(out.stdout).expect("rustc --version returned invalid UTF-8"); - let rustc_version = rustc_version.trim(); - println!("cargo:rustc-env=CARGO_RUSTC_VERSION={}", rustc_version); - - println!("cargo:rerun-if-env-changed=BFFHD_BUILD_TAGGED_RELEASE"); - let tagged_release = option_env!("BFFHD_BUILD_TAGGED_RELEASE") == Some("1"); - let version_string = if tagged_release { - format!( - "{version} [{rustc}]", - version = env!("CARGO_PKG_VERSION"), - rustc = rustc_version - ) - } else { - // Build version number using the current git commit id - let out = Command::new("git") - .arg("rev-list") - .args(["HEAD", "-1"]) - .output() - .expect("failed to run `git rev-list HEAD -1`"); - let owned_gitrev = - String::from_utf8(out.stdout).expect("git rev-list output was not valid UTF8"); - let gitrev = owned_gitrev.trim(); - let abbrev = match gitrev.len() { - 0 => "badsource", - _ => &gitrev[0..9], - }; - - let out = Command::new("git") - .arg("log") - .args(["-1", "--format=%as"]) - .output() - .expect("failed to run `git log -1 --format=\"format:%as\"`"); - let commit_date = String::from_utf8(out.stdout).expect("git log output was not valid UTF8"); - let commit_date = commit_date.trim(); - - format!( - "{version} ({gitrev} {date}) [{rustc}]", - version = env!("CARGO_PKG_VERSION"), - gitrev = abbrev, - date = commit_date, - rustc = rustc_version - ) - }; - println!("cargo:rustc-env=BFFHD_VERSION_STRING={}", version_string); - println!( - "cargo:rustc-env=BFFHD_RELEASE_STRING=\"BFFH {}\"", - version_string - ); + // Extract build-time information using the `shadow-rs` crate + shadow_rs::new(); } From f905b1f375e91a93886363a9f97501943ae3b097 Mon Sep 17 00:00:00 2001 From: Nadja Reitzenstein Date: Wed, 18 May 2022 17:11:00 +0200 Subject: [PATCH 4/4] Slightly more logging during authentication --- bffhd/capnp/authenticationsystem.rs | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/bffhd/capnp/authenticationsystem.rs b/bffhd/capnp/authenticationsystem.rs index bab6b65..563ab1b 100644 --- a/bffhd/capnp/authenticationsystem.rs +++ b/bffhd/capnp/authenticationsystem.rs @@ -65,12 +65,16 @@ impl AuthenticationSystem for Authentication { Ok(Step::Done(data)) => { self.state = State::Finished; - let uid = pry!(session.get_property::().ok_or(capnp::Error::failed( - "Authentication didn't provide an authid as required".to_string() - ))); - let session = pry!(manager.open(uid.as_ref()).ok_or(capnp::Error::failed( - "Failed to lookup the given user".to_string() - ))); + let uid = pry!(session.get_property::().ok_or_else(|| { + tracing::warn!("Authentication didn't provide an authid as required."); + capnp::Error::failed( + "Authentication didn't provide an authid as required".to_string(), + ) + })); + let session = pry!(manager.open(uid.as_ref()).ok_or_else(|| { + tracing::warn!(uid = uid.as_str(), "Failed to lookup the given user"); + capnp::Error::failed("Failed to lookup the given user".to_string()) + })); let mut builder = builder.init_successful(); if data.is_some() {