use std::path::PathBuf;
use super::SessionBackend;
use crate::secure_store::{self, SecureStore};
#[cfg(all(feature = "azure-secrets", not(feature = "keyring")))]
mod azure;
mod file;
#[cfg(feature = "keyring")]
mod keyring;
mod refusing;
#[cfg(all(feature = "azure-secrets", not(feature = "keyring")))]
pub(super) use azure::AzureBackend;
pub(super) use file::FileBackend;
#[cfg(feature = "keyring")]
pub(super) use keyring::KeyringBackend;
pub(super) use refusing::RefusingBackend;
pub(super) fn default_backend(
service_name: &str,
sessions_dir: PathBuf,
) -> Box<dyn SessionBackend> {
let _ = service_name;
match secure_store::override_from_env() {
Ok(Some(SecureStore::File)) => {
return Box::new(FileBackend {
sessions_dir,
reason: "VTI_SECURE_STORE=file",
});
}
Ok(Some(SecureStore::Os)) => {
#[cfg(not(feature = "keyring"))]
return Box::new(RefusingBackend {
reason: format!(
"{}=os asks for the OS credential store, but this build has no \
`keyring` feature compiled in. Rebuild with it, or choose \
`file` deliberately.",
secure_store::OVERRIDE_ENV
),
});
}
Ok(None) => {}
Err(msg) => {
return Box::new(RefusingBackend {
reason: format!("{msg} Until it is fixed, no session store is selected."),
});
}
}
compiled_default(service_name, sessions_dir)
}
fn compiled_default(service_name: &str, sessions_dir: PathBuf) -> Box<dyn SessionBackend> {
let _ = service_name;
let _ = &sessions_dir;
#[cfg(feature = "keyring")]
{
return Box::new(KeyringBackend {
service_name: service_name.to_string(),
});
}
#[cfg(all(feature = "azure-secrets", not(feature = "keyring")))]
{
return Box::new(AzureBackend {
vault_url: std::env::var("AZURE_KEYVAULT_URL").unwrap_or_default(),
secret_prefix: service_name.to_string(),
});
}
#[cfg(all(
feature = "config-session",
not(feature = "keyring"),
not(feature = "azure-secrets")
))]
{
return Box::new(FileBackend {
sessions_dir,
reason: "the `config-session` feature",
});
}
#[allow(unreachable_code)]
Box::new(RefusingBackend {
reason: format!(
"this build has no session store compiled in. Rebuild with one of the \
`keyring`, `azure-secrets` or `config-session` features, or set \
{}=file to accept a plaintext file at mode 0600.",
secure_store::OVERRIDE_ENV
),
})
}