use std::{num::NonZeroU32, path::PathBuf};
use clap::Parser;
use siguldry::protocol::KeyAlgorithm;
#[derive(Debug, Parser)]
#[command(version)]
pub struct Cli {
#[arg(long, short, env = "SIGULDRY_SERVER_CONFIG")]
pub config: Option<PathBuf>,
#[arg(long)]
pub span_events: bool,
#[arg(
long,
env = "SIGULDRY_SERVER_LOG",
default_value = "WARN,siguldry=INFO"
)]
pub log_filter: String,
#[command(subcommand)]
pub command: Command,
}
#[derive(clap::Subcommand, Debug)]
pub enum Command {
Listen {
#[arg(long, env = "CREDENTIALS_DIRECTORY")]
credentials_directory: PathBuf,
},
EnterPin {
#[arg(long, short)]
socket: PathBuf,
},
Config {
#[arg(
long,
env = "CREDENTIALS_DIRECTORY",
default_value = "/etc/credstore.encrypted/"
)]
credentials_directory: PathBuf,
},
#[command(subcommand)]
Manage(ManagementCommands),
}
#[derive(Debug, Clone, Copy, Default, PartialEq, Eq, Hash, clap::ValueEnum)]
pub enum OpenPgpProfile {
RFC9580,
#[default]
RFC4880,
}
impl From<OpenPgpProfile> for sequoia_openpgp::Profile {
fn from(value: OpenPgpProfile) -> Self {
match value {
OpenPgpProfile::RFC9580 => sequoia_openpgp::Profile::RFC9580,
OpenPgpProfile::RFC4880 => sequoia_openpgp::Profile::RFC4880,
}
}
}
#[derive(clap::Subcommand, Debug)]
pub enum ManagementCommands {
#[command(subcommand)]
Key(KeyCommands),
#[command(subcommand)]
Pkcs11(Pkcs11Commands),
#[command(subcommand)]
Users(UserCommands),
ImportSigul {
#[arg(short, long)]
binding_uri: Option<String>,
sigul_data_directory: PathBuf,
},
Migrate {},
}
#[derive(clap::Subcommand, Debug)]
pub enum Pkcs11Commands {
Register {
#[arg(long, default_value = "/usr/lib64/pkcs11/opensc-pkcs11.so")]
module: PathBuf,
#[arg(long, default_value = None)]
user_pin: Option<PathBuf>,
#[arg(long, default_value = None)]
password_file: Option<PathBuf>,
#[arg(short, long, default_value = None)]
slot_id: Option<u64>,
admin: String,
},
}
#[derive(clap::Subcommand, Debug)]
pub enum KeyCommands {
Create {
#[arg(short, long, value_enum, default_value_t)]
algorithm: KeyAlgorithm,
#[arg(long, value_enum, default_value_t)]
openpgp_profile: OpenPgpProfile,
#[arg(long, default_value = "730", value_parser = clap::value_parser!(u32).range(1..))]
x509_validity_days: u32,
#[arg(long, default_value = None)]
x509_common_name: Option<String>,
#[arg(long, default_value = None)]
x509_ca_key_name: Option<String>,
#[arg(long, default_value = None)]
x509_ca_cert_name: Option<String>,
#[arg(long, default_value = None)]
x509_ca_password_file: Option<PathBuf>,
#[arg(long, value_enum, default_value_t)]
x509_usage: siguldry::server::crypto::KeyUsage,
#[arg(long, default_value = None)]
password_file: Option<PathBuf>,
admin: String,
name: String,
},
X509 {
#[arg(short, long)]
user_name: String,
#[arg(short, long)]
key_name: String,
#[arg(short, long)]
common_name: String,
#[arg(long)]
validity_days: NonZeroU32,
#[arg(long)]
certificate_authority: Option<String>,
#[arg(long, default_value = None)]
ca_password_file: Option<PathBuf>,
#[arg(value_enum)]
usage: siguldry::server::crypto::KeyUsage,
},
List {},
}
#[derive(clap::Subcommand, Debug)]
pub enum UserCommands {
Create {
name: String,
},
Delete {
name: String,
},
GrantKeyAccess {
#[arg(long, default_value = None)]
pkcs11_binding_pin: Option<PathBuf>,
key: String,
existing_user: String,
#[arg(long, default_value = None)]
existing_user_password_file: Option<PathBuf>,
user: String,
#[arg(long, default_value = None)]
user_password_file: Option<PathBuf>,
},
RevokeKeyAccess {
key: String,
user: String,
},
List {},
}