diff --git a/Cargo.lock b/Cargo.lock index b6aaa98..0a57c32 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1855,7 +1855,7 @@ dependencies = [ [[package]] name = "tiny-encrypt" -version = "1.7.13" +version = "1.7.14" dependencies = [ "aes-gcm-stream", "base64", diff --git a/Cargo.toml b/Cargo.toml index 7d2c893..b238af3 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -1,6 +1,6 @@ [package] name = "tiny-encrypt" -version = "1.7.13" +version = "1.7.14" edition = "2021" license = "MIT" description = "A simple and tiny file encrypt tool" diff --git a/README.md b/README.md index 53737da..a2e1999 100644 --- a/README.md +++ b/README.md @@ -153,6 +153,7 @@ Environment | TINY_ENCRYPT_PIN | PIV Card PIN | | TINY_ENCRYPT_KEY_ID | Default Key ID | | TINY_ENCRYPT_AUTO_SELECT_KEY_IDS | Auto select Key IDs | +| TINY_ENCRYPT_AUTO_COMPRESS_EXTS | Auto compress file exts | | TINY_ENCRYPT_PIN_ENTRY | PIN entry command cli | | SECURE_EDITOR | Secure Editor | | EDITOR | Editor (Plaintext) | diff --git a/src/cmd_encrypt.rs b/src/cmd_encrypt.rs index b477c8c..0030ab1 100644 --- a/src/cmd_encrypt.rs +++ b/src/cmd_encrypt.rs @@ -7,10 +7,9 @@ use std::time::Instant; use clap::Args; use flate2::Compression; use rsa::Pkcs1v15Encrypt; -use rust_util::{debugging, failure, iff, information, opt_result, simple_error, success, util_size, warning, XResult}; use rust_util::util_time::UnixEpochTime; +use rust_util::{debugging, failure, iff, information, opt_result, simple_error, success, util_size, warning, XResult}; -use crate::{crypto_cryptor, crypto_simple, util, util_enc_file, util_env, util_gpg}; use crate::compress::GzStreamEncoder; use crate::config::{TinyEncryptConfig, TinyEncryptConfigEnvelop}; use crate::consts::{ENC_AES256_GCM_KYBER1204, ENC_AES256_GCM_P256, ENC_AES256_GCM_P384, ENC_AES256_GCM_X25519, ENC_CHACHA20_POLY1305_KYBER1204, ENC_CHACHA20_POLY1305_P256, ENC_CHACHA20_POLY1305_P384, ENC_CHACHA20_POLY1305_X25519, SALT_COMMENT, TINY_ENC_CONFIG_FILE, TINY_ENC_FILE_EXT, TINY_ENC_PEM_FILE_EXT, TINY_ENC_PEM_NAME}; @@ -24,6 +23,7 @@ use crate::util_ecdh::{ecdh_kyber1024, ecdh_p256, ecdh_p384, ecdh_x25519}; use crate::util_progress::Progress; use crate::util_rsa; use crate::wrap_key::{WrapKey, WrapKeyHeader}; +use crate::{crypto_cryptor, crypto_simple, util, util_enc_file, util_env, util_gpg}; #[derive(Debug, Args)] pub struct CmdEncrypt { @@ -185,7 +185,8 @@ pub fn encrypt_single_file_out(path: &PathBuf, path_out: &str, envelops: &[&Tiny let enc_encrypted_meta_bytes = opt_result!(enc_encrypted_meta.seal( cryptor, &key_nonce), "Seal enc-encrypted-meta failed: {}"); - let compress_level = get_compress_level(cmd_encrypt, cmd_encrypt.pem_output); + let compress_level = get_compress_level(cmd_encrypt, &path_display, cmd_encrypt.pem_output); + debugging!("Compress level: {:?}", compress_level); let enc_metadata = EncMetadata { comment: cmd_encrypt.comment.clone(), @@ -412,8 +413,16 @@ fn encrypt_envelop_gpg(key: &[u8], envelop: &TinyEncryptConfigEnvelop) -> XResul }) } -fn get_compress_level(cmd_encrypt: &CmdEncrypt, pem_output: bool) -> Option { - if cmd_encrypt.compress || util_env::get_default_compress().unwrap_or(false) { +fn get_compress_level(cmd_encrypt: &CmdEncrypt, path: &str, pem_output: bool) -> Option { + let mut auto_compress = false; + let path_parts = path.split(".").collect::>(); + let path_ext = path_parts[path_parts.len() - 1].to_lowercase(); + if let Some(auto_compress_file_exts) = util_env::get_auto_compress_file_exts() { + auto_compress = auto_compress_file_exts.contains(&path_ext); + debugging!("File ext: {} matches auto compress exts: {:?}", path_ext, auto_compress_file_exts); + } + + if auto_compress || cmd_encrypt.compress || util_env::get_default_compress().unwrap_or(false) { Some(cmd_encrypt.compress_level.unwrap_or_else(|| Compression::default().level())) } else if pem_output { Some(Compression::best().level()) diff --git a/src/util_env.rs b/src/util_env.rs index c339ae6..195cf5e 100644 --- a/src/util_env.rs +++ b/src/util_env.rs @@ -1,7 +1,7 @@ use std::env; -use rust_util::{debugging, util_env, warning}; use rust_util::util_env as rust_util_env; +use rust_util::{debugging, util_env, warning}; use crate::consts; @@ -12,6 +12,7 @@ pub const TINY_ENCRYPT_ENV_USE_DIALOGUER: &str = "TINY_ENCRYPT_USE_DIALOGUER"; pub const TINY_ENCRYPT_ENV_PIN: &str = "TINY_ENCRYPT_PIN"; pub const TINY_ENCRYPT_ENV_KEY_ID: &str = "TINY_ENCRYPT_KEY_ID"; pub const TINY_ENCRYPT_ENV_AUTO_SELECT_KEY_IDS: &str = "TINY_ENCRYPT_AUTO_SELECT_KEY_IDS"; +pub const TINY_ENCRYPT_EVN_AUTO_COMPRESS_EXTS: &str = "TINY_ENCRYPT_AUTO_COMPRESS_EXTS"; pub const TINY_ENCRYPT_ENV_GPG_COMMAND: &str = "TINY_ENCRYPT_GPG_COMMAND"; pub const TINY_ENCRYPT_ENV_NO_DEFAULT_PIN_HINT: &str = "TINY_ENCRYPT_NO_DEFAULT_PIN_HINT"; pub const TINY_ENCRYPT_ENV_PIN_ENTRY: &str = "TINY_ENCRYPT_PIN_ENTRY"; @@ -47,9 +48,11 @@ pub fn get_pin_entry() -> Option { } pub fn get_auto_select_key_ids() -> Option> { - env::var(TINY_ENCRYPT_ENV_AUTO_SELECT_KEY_IDS).ok().map(|key_ids| { - key_ids.split(',').map(ToString::to_string).collect::>() - }) + get_env_with_split(TINY_ENCRYPT_ENV_AUTO_SELECT_KEY_IDS) +} + +pub fn get_auto_compress_file_exts() -> Option> { + get_env_with_split(TINY_ENCRYPT_EVN_AUTO_COMPRESS_EXTS) } pub fn get_default_compress() -> Option { @@ -67,3 +70,11 @@ pub fn get_no_default_pin_hint() -> bool { pub fn get_use_dialoguer() -> bool { rust_util_env::is_env_on(TINY_ENCRYPT_ENV_USE_DIALOGUER) } + +fn get_env_with_split(env_name: &str) -> Option> { + let val = env::var(env_name).ok(); + debugging!("Environment variable {} = {:?}", env_name, &val); + val.map(|env_values| { + env_values.split(',').map(ToString::to_string).collect::>() + }) +}