feat: Adding AES GCM encryption.

This commit is contained in:
charlesgauthereau
2026-02-12 19:49:17 +01:00
parent 3c599e94de
commit e678cf4b06
2 changed files with 148 additions and 124 deletions
Generated
+94 -73
View File
@@ -163,9 +163,9 @@ checksum = "c08606f8c3cbf4ce6ec8e28fb0014a2c086708fe954eaa885384a6165172e7e8"
[[package]]
name = "aws-config"
version = "1.8.13"
version = "1.8.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c456581cb3c77fafcc8c67204a70680d40b61112d6da78c77bd31d945b65f1b5"
checksum = "8a8fc176d53d6fe85017f230405e3255cedb4a02221cb55ed6d76dccbbb099b2"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -193,9 +193,9 @@ dependencies = [
[[package]]
name = "aws-credential-types"
version = "1.2.11"
version = "1.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cd362783681b15d136480ad555a099e82ecd8e2d10a841e14dfd0078d67fee3"
checksum = "e26bbf46abc608f2dc61fd6cb3b7b0665497cc259a21520151ed98f8b37d2c79"
dependencies = [
"aws-smithy-async",
"aws-smithy-runtime-api",
@@ -215,9 +215,9 @@ dependencies = [
[[package]]
name = "aws-lc-sys"
version = "0.37.0"
version = "0.37.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5c34dda4df7017c8db52132f0f8a2e0f8161649d15723ed63fc00c82d0f2081a"
checksum = "b092fe214090261288111db7a2b2c2118e5a7f30dc2569f1732c4069a6840549"
dependencies = [
"cc",
"cmake",
@@ -227,9 +227,9 @@ dependencies = [
[[package]]
name = "aws-runtime"
version = "1.6.0"
version = "1.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c635c2dc792cb4a11ce1a4f392a925340d1bdf499289b5ec1ec6810954eb43f5"
checksum = "b0f92058d22a46adf53ec57a6a96f34447daf02bff52e8fb956c66bcd5c6ac12"
dependencies = [
"aws-credential-types",
"aws-sigv4",
@@ -241,6 +241,7 @@ dependencies = [
"aws-smithy-types",
"aws-types",
"bytes 1.11.1",
"bytes-utils",
"fastrand",
"http 0.2.12",
"http 1.4.0",
@@ -254,9 +255,9 @@ dependencies = [
[[package]]
name = "aws-sdk-s3"
version = "1.122.0"
version = "1.123.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "94c2ca0cba97e8e279eb6c0b2d0aa10db5959000e602ab2b7c02de6b85d4c19b"
checksum = "c018f22146966fdd493a664f62ee2483dff256b42a08c125ab6a084bde7b77fe"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -289,9 +290,9 @@ dependencies = [
[[package]]
name = "aws-sdk-sso"
version = "1.93.0"
version = "1.94.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9dcb38bb33fc0a11f1ffc3e3e85669e0a11a37690b86f77e75306d8f369146a0"
checksum = "699da1961a289b23842d88fe2984c6ff68735fdf9bdcbc69ceaeb2491c9bf434"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -313,9 +314,9 @@ dependencies = [
[[package]]
name = "aws-sdk-ssooidc"
version = "1.95.0"
version = "1.96.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ada8ffbea7bd1be1f53df1dadb0f8fdb04badb13185b3321b929d1ee3caad09"
checksum = "e3e3a4cb3b124833eafea9afd1a6cc5f8ddf3efefffc6651ef76a03cbc6b4981"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -337,9 +338,9 @@ dependencies = [
[[package]]
name = "aws-sdk-sts"
version = "1.97.0"
version = "1.98.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e6443ccadc777095d5ed13e21f5c364878c9f5bad4e35187a6cdbd863b0afcad"
checksum = "89c4f19655ab0856375e169865c91264de965bd74c407c7f1e403184b1049409"
dependencies = [
"aws-credential-types",
"aws-runtime",
@@ -362,9 +363,9 @@ dependencies = [
[[package]]
name = "aws-sigv4"
version = "1.3.8"
version = "1.4.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "efa49f3c607b92daae0c078d48a4571f599f966dce3caee5f1ea55c4d9073f99"
checksum = "68f6ae9b71597dc5fd115d52849d7a5556ad9265885ad3492ea8d73b93bbc46e"
dependencies = [
"aws-credential-types",
"aws-smithy-eventstream",
@@ -390,9 +391,9 @@ dependencies = [
[[package]]
name = "aws-smithy-async"
version = "1.2.11"
version = "1.2.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52eec3db979d18cb807fc1070961cc51d87d069abe9ab57917769687368a8c6c"
checksum = "3cba48474f1d6807384d06fec085b909f5807e16653c5af5c45dfe89539f0b70"
dependencies = [
"futures-util",
"pin-project-lite",
@@ -401,9 +402,9 @@ dependencies = [
[[package]]
name = "aws-smithy-checksums"
version = "0.64.3"
version = "0.64.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ddcf418858f9f3edd228acb8759d77394fed7531cce78d02bdda499025368439"
checksum = "a764fa7222922f6c0af8eea478b0ef1ba5ce1222af97e01f33ca5e957bd7f3b9"
dependencies = [
"aws-smithy-http",
"aws-smithy-types",
@@ -422,9 +423,9 @@ dependencies = [
[[package]]
name = "aws-smithy-eventstream"
version = "0.60.18"
version = "0.60.19"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "35b9c7354a3b13c66f60fe4616d6d1969c9fd36b1b5333a5dfb3ee716b33c588"
checksum = "1c0b3e587fbaa5d7f7e870544508af8ce82ea47cd30376e69e1e37c4ac746f79"
dependencies = [
"aws-smithy-types",
"bytes 1.11.1",
@@ -433,9 +434,9 @@ dependencies = [
[[package]]
name = "aws-smithy-http"
version = "0.63.3"
version = "0.63.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "630e67f2a31094ffa51b210ae030855cb8f3b7ee1329bdd8d085aaf61e8b97fc"
checksum = "af4a8a5fe3e4ac7ee871237c340bbce13e982d37543b65700f4419e039f5d78e"
dependencies = [
"aws-smithy-eventstream",
"aws-smithy-runtime-api",
@@ -455,9 +456,9 @@ dependencies = [
[[package]]
name = "aws-smithy-http-client"
version = "1.1.9"
version = "1.1.10"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "12fb0abf49ff0cab20fd31ac1215ed7ce0ea92286ba09e2854b42ba5cabe7525"
checksum = "0709f0083aa19b704132684bc26d3c868e06bd428ccc4373b0b55c3e8748a58b"
dependencies = [
"aws-smithy-async",
"aws-smithy-runtime-api",
@@ -485,27 +486,27 @@ dependencies = [
[[package]]
name = "aws-smithy-json"
version = "0.62.3"
version = "0.62.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3cb96aa208d62ee94104645f7b2ecaf77bf27edf161590b6224bfbac2832f979"
checksum = "27b3a779093e18cad88bbae08dc4261e1d95018c4c5b9356a52bcae7c0b6e9bb"
dependencies = [
"aws-smithy-types",
]
[[package]]
name = "aws-smithy-observability"
version = "0.2.4"
version = "0.2.5"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c0a46543fbc94621080b3cf553eb4cbbdc41dd9780a30c4756400f0139440a1d"
checksum = "4d3f39d5bb871aaf461d59144557f16d5927a5248a983a40654d9cf3b9ba183b"
dependencies = [
"aws-smithy-runtime-api",
]
[[package]]
name = "aws-smithy-query"
version = "0.60.13"
version = "0.60.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0cebbddb6f3a5bd81553643e9c7daf3cc3dc5b0b5f398ac668630e8a84e6fff0"
checksum = "05f76a580e3d8f8961e5d48763214025a2af65c2fa4cd1fb7f270a0e107a71b0"
dependencies = [
"aws-smithy-types",
"urlencoding",
@@ -513,9 +514,9 @@ dependencies = [
[[package]]
name = "aws-smithy-runtime"
version = "1.10.0"
version = "1.10.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3df87c14f0127a0d77eb261c3bc45d5b4833e2a1f63583ebfb728e4852134ee"
checksum = "8fd3dfc18c1ce097cf81fced7192731e63809829c6cbf933c1ec47452d08e1aa"
dependencies = [
"aws-smithy-async",
"aws-smithy-http",
@@ -538,9 +539,9 @@ dependencies = [
[[package]]
name = "aws-smithy-runtime-api"
version = "1.11.3"
version = "1.11.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49952c52f7eebb72ce2a754d3866cc0f87b97d2a46146b79f80f3a93fb2b3716"
checksum = "8c55e0837e9b8526f49e0b9bfa9ee18ddee70e853f5bc09c5d11ebceddcb0fec"
dependencies = [
"aws-smithy-async",
"aws-smithy-types",
@@ -555,9 +556,9 @@ dependencies = [
[[package]]
name = "aws-smithy-types"
version = "1.4.3"
version = "1.4.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3b3a26048eeab0ddeba4b4f9d51654c79af8c3b32357dc5f336cee85ab331c33"
checksum = "576b0d6991c9c32bc14fc340582ef148311f924d41815f641a308b5d11e8e7cd"
dependencies = [
"base64-simd",
"bytes 1.11.1",
@@ -581,18 +582,18 @@ dependencies = [
[[package]]
name = "aws-smithy-xml"
version = "0.60.13"
version = "0.60.14"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "11b2f670422ff42bf7065031e72b45bc52a3508bd089f743ea90731ca2b6ea57"
checksum = "b53543b4b86ed43f051644f704a98c7291b3618b67adf057ee77a366fa52fcaa"
dependencies = [
"xmlparser",
]
[[package]]
name = "aws-types"
version = "1.3.11"
version = "1.3.12"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1d980627d2dd7bfc32a3c025685a033eeab8d365cc840c631ef59d1b8f428164"
checksum = "6c50f3cdf47caa8d01f2be4a6663ea02418e892f9bbfd82c7b9a3a37eaccdd3a"
dependencies = [
"aws-credential-types",
"aws-smithy-async",
@@ -1083,9 +1084,9 @@ dependencies = [
[[package]]
name = "crypto-common"
version = "0.1.7"
version = "0.1.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "78c8292055d1c1df0cce5d180393dc8cce0abec0a7102adb6c7b1eef6016d60a"
checksum = "1bfb12502f3fc46cca1bb51ac28df9d618d813cdc3d2f25b9fe775a34af26bb3"
dependencies = [
"generic-array",
"typenum",
@@ -1164,9 +1165,9 @@ dependencies = [
[[package]]
name = "deranged"
version = "0.5.5"
version = "0.5.6"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ececcb659e7ba858fb4f10388c250a7252eb0a27373f1a72b8748afdd248e587"
checksum = "cc3dc5ad92c2e2d1c193bbbbdf2ea477cb81331de4f3103f267ca18368b988c4"
dependencies = [
"powerfmt",
]
@@ -1223,7 +1224,7 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9ed9a281f7bc9b7576e61468ba615a66a5c8cfdff42420a70aa82701a3b1e292"
dependencies = [
"block-buffer 0.10.4",
"crypto-common 0.1.7",
"crypto-common 0.1.6",
"subtle",
]
@@ -1541,9 +1542,9 @@ dependencies = [
[[package]]
name = "generic-array"
version = "0.14.7"
version = "0.14.9"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "85649ca51fd72272d7821adaf274ad91c288277713d9c18820d8499a7ff69e9a"
checksum = "4bb6743198531e02858aeaea5398fcc883e71851fcbcb5a2f773e2fb6cb1edf2"
dependencies = [
"typenum",
"version_check",
@@ -2200,9 +2201,9 @@ checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]]
name = "libc"
version = "0.2.180"
version = "0.2.181"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "bcc35a38544a891a5f7c865aca548a982ccb3b8650a5b06d0fd33a10283c56fc"
checksum = "459427e2af2b9c839b132acb702a1c654d95e10f8c326bfc2ad11310e458b1c5"
[[package]]
name = "libredox"
@@ -2212,7 +2213,7 @@ checksum = "3d0b95e02c851351f877147b7deea7b1afb1df71b63aa5f8270716e0c5720616"
dependencies = [
"bitflags 2.10.0",
"libc",
"redox_syscall 0.7.0",
"redox_syscall 0.7.1",
]
[[package]]
@@ -2631,6 +2632,24 @@ dependencies = [
"url 2.5.8",
]
[[package]]
name = "objc2-core-foundation"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2a180dd8642fa45cdb7dd721cd4c11b1cadd4929ce112ebd8b9f5803cc79d536"
dependencies = [
"bitflags 2.10.0",
]
[[package]]
name = "objc2-system-configuration"
version = "0.3.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7216bd11cbda54ccabcab84d523dc93b858ec75ecfb3a7d89513fa22464da396"
dependencies = [
"objc2-core-foundation",
]
[[package]]
name = "once_cell"
version = "1.21.3"
@@ -3151,9 +3170,9 @@ dependencies = [
[[package]]
name = "redox_syscall"
version = "0.7.0"
version = "0.7.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "49f3fe0889e69e2ae9e41f4d6c4c0181701d00e4697b356fb1f74173a5e0ee27"
checksum = "35985aa610addc02e24fc232012c86fd11f14111180f902b67e2d5331f8ebf2b"
dependencies = [
"bitflags 2.10.0",
]
@@ -3450,9 +3469,9 @@ checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d"
[[package]]
name = "ryu"
version = "1.0.22"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a50f4cf475b65d88e057964e0e9bb1f0aa9bbb2036dc65c64596b42932536984"
checksum = "9774ba4a74de5f7b1c1451ed6cd5285a32eddb5cccb8cc655a4e50009e06477f"
[[package]]
name = "same-file"
@@ -3823,9 +3842,9 @@ checksum = "13c2bddecc57b384dee18652358fb23172facb8a2c51ccc10d74c157bdea3292"
[[package]]
name = "syn"
version = "2.0.114"
version = "2.0.115"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d4d107df263a3013ef9b1879b0df87d706ff80f65a86ea879bd9c31f9b307c2a"
checksum = "6e614ed320ac28113fa64972c4262d5dbc89deacdfd00c34a3e4cea073243c12"
dependencies = [
"proc-macro2",
"quote",
@@ -3904,12 +3923,12 @@ dependencies = [
[[package]]
name = "tempfile"
version = "3.24.0"
version = "3.25.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "655da9c7eb6305c55742045d5a8d2037996d61d8de95806335c7c86ce0f82e9c"
checksum = "0136791f7c95b1f6dd99f9cc786b91bb81c3800b639b3478e561ddb7be95e5f1"
dependencies = [
"fastrand",
"getrandom 0.3.4",
"getrandom 0.4.1",
"once_cell",
"rustix",
"windows-sys 0.61.2",
@@ -4347,9 +4366,9 @@ dependencies = [
[[package]]
name = "toml"
version = "0.9.11+spec-1.1.0"
version = "0.9.12+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f3afc9a848309fe1aaffaed6e1546a7a14de1f935dc9d89d32afd9a44bab7c46"
checksum = "cf92845e79fc2e2def6a5d828f0801e29a2f8acc037becc5ab08595c7d5e9863"
dependencies = [
"indexmap",
"serde_core",
@@ -4371,9 +4390,9 @@ dependencies = [
[[package]]
name = "toml_parser"
version = "1.0.6+spec-1.1.0"
version = "1.0.8+spec-1.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a3198b4b0a8e11f09dd03e133c0280504d0801269e9afa46362ffde1cbeebf44"
checksum = "0742ff5ff03ea7e67c8ae6c93cac239e0d9784833362da3f9a9c1da8dfefcbdc"
dependencies = [
"winnow 0.7.14",
]
@@ -4550,9 +4569,9 @@ checksum = "5c1cb5db39152898a79168971543b1cb5020dff7fe43c8dc468b0885f5e29df5"
[[package]]
name = "unicode-ident"
version = "1.0.22"
version = "1.0.23"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9312f7c4f6ff9069b165498234ce8be658059c6728633667c526e27dc2cf1df5"
checksum = "537dd038a89878be9b64dd4bd1b260315c1bb94f4d784956b81e27a088d9a09e"
[[package]]
name = "unicode-normalization"
@@ -4876,11 +4895,13 @@ dependencies = [
[[package]]
name = "whoami"
version = "2.1.0"
version = "2.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8fae98cf96deed1b7572272dfc777713c249ae40aa1cf8862e091e8b745f5361"
checksum = "d6a5b12f9df4f978d2cfdb1bd3bac52433f44393342d7ee9c25f5a1c14c0f45d"
dependencies = [
"libc",
"libredox",
"objc2-system-configuration",
"wasite",
"web-sys",
]
@@ -5557,6 +5578,6 @@ dependencies = [
[[package]]
name = "zmij"
version = "1.0.19"
version = "1.0.21"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3ff05f8caa9038894637571ae6b9e29466c1f4f829d26c9b28f869a29cbe3445"
checksum = "b8848ee67ecc8aedbaf3e4122217aff892639231befc6a1b58d29fff4c2cabaa"
+54 -51
View File
@@ -1,5 +1,5 @@
#![allow(dead_code)]
#![warn(unused_assignments)]
use crate::core::context::Context;
use crate::domain::factory::DatabaseFactory;
use crate::services::api::models::agent::status::DatabaseStatus;
@@ -9,7 +9,7 @@ use crate::utils::file::decrypt_file_stream_gcm;
use anyhow::Result;
use reqwest::{Client, Url};
use serde::Serialize;
use std::path::Path;
use std::path::{Path, PathBuf};
use std::sync::Arc;
use tempfile::TempDir;
use tracing::{error, info};
@@ -113,72 +113,75 @@ impl RestoreService {
let bytes = response.bytes().await?;
let encrypted = if filename.ends_with(".tar.gz") {
false
} else if filename.ends_with(".tar.gz.enc") {
let is_legacy_file = if filename.ends_with(".sql") {
true
} else if filename.ends_with(".dump") {
true
} else {
return Ok(RestoreResult {
generated_id,
status: "failed".into(),
});
false
};
info!("Encrypted: {}", encrypted);
let downloaded_file = tmp_path.join(filename);
let downloaded_file = tmp_path.join(&filename);
tokio::fs::write(&downloaded_file, &bytes).await?;
info!("Backup downloaded to {}", downloaded_file.display());
let mut compressed_archive = downloaded_file.clone();
let backup_file_path: PathBuf = if !is_legacy_file {
let encrypted = if filename.ends_with(".tar.gz") {
false
} else if filename.ends_with(".tar.gz.enc") {
true
} else {
return Ok(RestoreResult {
generated_id,
status: "failed".into(),
});
};
if encrypted {
let new_name = downloaded_file
.file_name()
.and_then(|n| n.to_str())
.map(|n| n.strip_suffix(".enc").unwrap_or(n));
info!("Encrypted: {}", encrypted);
let new_compressed_archive = tmp_path.join(new_name.unwrap_or(""));
let mut compressed_archive = downloaded_file.clone();
match decrypt_file_stream_gcm(
downloaded_file,
new_compressed_archive.clone(),
ctx.edge_key.master_key_b64.clone(),
)
.await
{
Ok(_) => compressed_archive = new_compressed_archive,
Err(e) => {
if encrypted {
let new_name = downloaded_file
.file_name()
.and_then(|n| n.to_str())
.and_then(|n| n.strip_suffix(".enc"))
.ok_or_else(|| anyhow::anyhow!("Invalid encrypted filename"))?;
let new_compressed_archive = tmp_path.join(new_name);
decrypt_file_stream_gcm(
downloaded_file,
new_compressed_archive.clone(),
ctx.edge_key.master_key_b64.clone(),
)
.await
.map_err(|e| {
error!("Failed to decrypt file: {}", e);
return Ok(RestoreResult {
generated_id,
status: "failed".into(),
});
}
e
})?;
compressed_archive = new_compressed_archive;
}
}
let decompressed_files =
decompress_large_tar_gz(compressed_archive.as_path(), tmp_path).await?;
let decompressed_files =
decompress_large_tar_gz(compressed_archive.as_path(), tmp_path).await?;
info!("Decompressed_files {:#?}", decompressed_files);
if decompressed_files.is_empty() {
return Ok(RestoreResult {
generated_id,
status: "failed".into(),
});
}
if decompressed_files.is_empty() {
return Ok(RestoreResult {
generated_id,
status: "failed".into(),
});
}
let backup_file_path = if decompressed_files.len() == 1 {
decompressed_files.get(0).unwrap()
if decompressed_files.len() == 1 {
decompressed_files[0].clone()
} else {
compressed_archive
}
} else {
compressed_archive.as_path()
downloaded_file.clone()
};
info!("Decompressed file {}", backup_file_path.display());
let db_instance = DatabaseFactory::create_for_restore(cfg.clone(), &backup_file_path).await;
let reachable = db_instance.ping().await.unwrap_or(false);
info!("Reachable: {}", reachable);