monosecret 0.4.1

Declarative secrets, every environment, any provider
Documentation
use std::path::PathBuf;

pub struct FieldSpec<T> {
	pub env_key: &'static str,
	pub field: fn(&super::SopsConfig) -> &Option<T>,
	pub field_mut: fn(&mut super::SopsConfig) -> &mut Option<T>,
	pub url_key: &'static str,
}

pub struct CredentialSpec {
	pub name: &'static str,
	pub env_key: &'static str,
}

pub const AGE_KEY: &str = "age_key";
pub const AWS_SECRET_ACCESS_KEY: &str = "aws_secret_access_key";
pub const AZURE_CLIENT_SECRET: &str = "azure_client_secret";
pub const HC_VAULT_TOKEN: &str = "hc_vault_token";
pub const HUAWEI_SDK_AK: &str = "huawei_sdk_ak";
pub const HUAWEI_SDK_SK: &str = "huawei_sdk_sk";
pub const GOOGLE_OAUTH_ACCESS_TOKEN: &str = "google_oauth_access_token";

/// Secret values accepted through a provider alias's `credentials` map.
///
/// The SOPS process inherits the matching environment variables when no
/// provider credential is supplied. Injected credentials override that
/// ambient fallback for this child process only.
pub static CREDENTIAL_FIELDS: &[CredentialSpec] = &[
	CredentialSpec {
		name: AGE_KEY,
		env_key: "SOPS_AGE_KEY",
	},
	CredentialSpec {
		name: AWS_SECRET_ACCESS_KEY,
		env_key: "AWS_SECRET_ACCESS_KEY",
	},
	CredentialSpec {
		name: AZURE_CLIENT_SECRET,
		env_key: "AZURE_CLIENT_SECRET",
	},
	CredentialSpec {
		name: HC_VAULT_TOKEN,
		env_key: "VAULT_TOKEN",
	},
	CredentialSpec {
		name: HUAWEI_SDK_AK,
		env_key: "HUAWEICLOUD_SDK_AK",
	},
	CredentialSpec {
		name: HUAWEI_SDK_SK,
		env_key: "HUAWEICLOUD_SDK_SK",
	},
	CredentialSpec {
		name: GOOGLE_OAUTH_ACCESS_TOKEN,
		env_key: "GOOGLE_OAUTH_ACCESS_TOKEN",
	},
];

/// Non-secret SOPS settings which may be carried by the provider URI and are
/// translated to the environment variables understood by the SOPS CLI.
pub static STRING_FIELDS: &[FieldSpec<String>] = &[
	FieldSpec {
		field: |c| &c.age_key_cmd,
		field_mut: |c| &mut c.age_key_cmd,
		url_key: "age_key_cmd",
		env_key: "SOPS_AGE_KEY_CMD",
	},
	FieldSpec {
		field: |c| &c.age_recipients,
		field_mut: |c| &mut c.age_recipients,
		url_key: "age_recipients",
		env_key: "SOPS_AGE_RECIPIENTS",
	},
	FieldSpec {
		field: |c| &c.age_ssh_private_key_cmd,
		field_mut: |c| &mut c.age_ssh_private_key_cmd,
		url_key: "age_ssh_private_key_cmd",
		env_key: "SOPS_AGE_SSH_PRIVATE_KEY_CMD",
	},
	FieldSpec {
		field: |c| &c.kms_arn,
		field_mut: |c| &mut c.kms_arn,
		url_key: "kms_arn",
		env_key: "SOPS_KMS_ARN",
	},
	FieldSpec {
		field: |c| &c.aws_profile,
		field_mut: |c| &mut c.aws_profile,
		url_key: "aws_profile",
		env_key: "AWS_PROFILE",
	},
	FieldSpec {
		field: |c| &c.aws_access_key_id,
		field_mut: |c| &mut c.aws_access_key_id,
		url_key: "aws_access_key_id",
		env_key: "AWS_ACCESS_KEY_ID",
	},
	FieldSpec {
		field: |c| &c.aws_region,
		field_mut: |c| &mut c.aws_region,
		url_key: "aws_region",
		env_key: "AWS_REGION",
	},
	FieldSpec {
		field: |c| &c.azure_client_id,
		field_mut: |c| &mut c.azure_client_id,
		url_key: "azure_client_id",
		env_key: "AZURE_CLIENT_ID",
	},
	FieldSpec {
		field: |c| &c.azure_tenant_id,
		field_mut: |c| &mut c.azure_tenant_id,
		url_key: "azure_tenant_id",
		env_key: "AZURE_TENANT_ID",
	},
	FieldSpec {
		field: |c| &c.azure_keyvault_urls,
		field_mut: |c| &mut c.azure_keyvault_urls,
		url_key: "azure_keyvault_urls",
		env_key: "SOPS_AZURE_KEYVAULT_URLS",
	},
	FieldSpec {
		field: |c| &c.gcp_kms_client_type,
		field_mut: |c| &mut c.gcp_kms_client_type,
		url_key: "gcp_kms_client_type",
		env_key: "SOPS_GCP_KMS_CLIENT_TYPE",
	},
	FieldSpec {
		field: |c| &c.gcp_kms_endpoint,
		field_mut: |c| &mut c.gcp_kms_endpoint,
		url_key: "gcp_kms_endpoint",
		env_key: "SOPS_GCP_KMS_ENDPOINT",
	},
	FieldSpec {
		field: |c| &c.gcp_kms_ids,
		field_mut: |c| &mut c.gcp_kms_ids,
		url_key: "gcp_kms_ids",
		env_key: "SOPS_GCP_KMS_IDS",
	},
	FieldSpec {
		field: |c| &c.gcp_kms_universe_domain,
		field_mut: |c| &mut c.gcp_kms_universe_domain,
		url_key: "gcp_kms_universe_domain",
		env_key: "SOPS_GCP_KMS_UNIVERSE_DOMAIN",
	},
	FieldSpec {
		field: |c| &c.pgp_fp,
		field_mut: |c| &mut c.pgp_fp,
		url_key: "pgp_fp",
		env_key: "SOPS_PGP_FP",
	},
	FieldSpec {
		field: |c| &c.gpg_exec,
		field_mut: |c| &mut c.gpg_exec,
		url_key: "gpg_exec",
		env_key: "SOPS_GPG_EXEC",
	},
	FieldSpec {
		field: |c| &c.hc_vault_addr,
		field_mut: |c| &mut c.hc_vault_addr,
		url_key: "hc_vault_addr",
		env_key: "VAULT_ADDR",
	},
	FieldSpec {
		field: |c| &c.hc_vault_allowlist,
		field_mut: |c| &mut c.hc_vault_allowlist,
		url_key: "hc_vault_allowlist",
		env_key: "SOPS_HC_VAULT_ALLOWLIST",
	},
	FieldSpec {
		field: |c| &c.huawei_sdk_project_id,
		field_mut: |c| &mut c.huawei_sdk_project_id,
		url_key: "huawei_sdk_project_id",
		env_key: "HUAWEICLOUD_SDK_PROJECT_ID",
	},
	FieldSpec {
		field: |c| &c.huawei_kms_ids,
		field_mut: |c| &mut c.huawei_kms_ids,
		url_key: "huawei_kms_ids",
		env_key: "SOPS_HUAWEICLOUD_KMS_IDS",
	},
	FieldSpec {
		field: |c| &c.sops_decryption_order,
		field_mut: |c| &mut c.sops_decryption_order,
		url_key: "sops_decryption_order",
		env_key: "SOPS_DECRYPTION_ORDER",
	},
	FieldSpec {
		field: |c| &c.sops_editor,
		field_mut: |c| &mut c.sops_editor,
		url_key: "sops_editor",
		env_key: "SOPS_EDITOR",
	},
	FieldSpec {
		field: |c| &c.sops_enable_local_keyservice,
		field_mut: |c| &mut c.sops_enable_local_keyservice,
		url_key: "sops_enable_local_keyservice",
		env_key: "SOPS_ENABLE_LOCAL_KEYSERVICE",
	},
	FieldSpec {
		field: |c| &c.sops_keyservice,
		field_mut: |c| &mut c.sops_keyservice,
		url_key: "sops_keyservice",
		env_key: "SOPS_KEYSERVICE",
	},
];

pub static PATHBUF_FIELDS: &[FieldSpec<PathBuf>] = &[
	FieldSpec {
		field: |c| &c.age_key_file,
		field_mut: |c| &mut c.age_key_file,
		url_key: "age_key_file",
		env_key: "SOPS_AGE_KEY_FILE",
	},
	FieldSpec {
		field: |c| &c.age_ssh_private_key_file,
		field_mut: |c| &mut c.age_ssh_private_key_file,
		url_key: "age_ssh_private_key_file",
		env_key: "SOPS_AGE_SSH_PRIVATE_KEY_FILE",
	},
	FieldSpec {
		field: |c| &c.sops_config,
		field_mut: |c| &mut c.sops_config,
		url_key: "sops_config",
		env_key: "SOPS_CONFIG",
	},
];