From 06417ff69e772f24ffd7fb2b025f879463d8c51f Mon Sep 17 00:00:00 2001 From: kieran Date: Tue, 7 Jan 2025 12:00:46 +0000 Subject: [PATCH] image-cache: use sha256 hash of url for key --- Cargo.lock | 1 + Cargo.toml | 1 + crates/notedeck/Cargo.toml | 1 + crates/notedeck/src/imgcache.rs | 15 +++++++++++++-- 4 files changed, 16 insertions(+), 2 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 64d7c7ea..eeefe65b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -2505,6 +2505,7 @@ dependencies = [ "security-framework", "serde", "serde_json", + "sha2", "strum", "strum_macros", "tempfile", diff --git a/Cargo.toml b/Cargo.toml index 20b1c77b..60cf1f1a 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -52,6 +52,7 @@ url = "2.5.2" urlencoding = "2.1.3" uuid = { version = "1.10.0", features = ["v4"] } security-framework = "2.11.0" +sha2 = "0.10.8" [profile.small] inherits = 'release' diff --git a/crates/notedeck/Cargo.toml b/crates/notedeck/Cargo.toml index 31bdfba2..b8138641 100644 --- a/crates/notedeck/Cargo.toml +++ b/crates/notedeck/Cargo.toml @@ -22,6 +22,7 @@ serde = { workspace = true } hex = { workspace = true } thiserror = { workspace = true } puffin = { workspace = true, optional = true } +sha2 = { workspace = true } [dev-dependencies] tempfile = { workspace = true } diff --git a/crates/notedeck/src/imgcache.rs b/crates/notedeck/src/imgcache.rs index 4a78fc00..00f6a1f1 100644 --- a/crates/notedeck/src/imgcache.rs +++ b/crates/notedeck/src/imgcache.rs @@ -5,9 +5,12 @@ use poll_promise::Promise; use egui::ColorImage; use std::collections::HashMap; -use std::fs::File; +use std::fs::{create_dir_all, File}; +use hex::ToHex; +use sha2::Digest; use std::path; +use std::path::PathBuf; pub type ImageCacheValue = Promise>; pub type ImageCacheMap = HashMap; @@ -46,6 +49,9 @@ impl ImageCache { pub fn write(cache_dir: &path::Path, url: &str, data: ColorImage) -> Result<()> { let file_path = cache_dir.join(Self::key(url)); + if let Some(p) = file_path.parent() { + create_dir_all(p)?; + } let file = File::options() .write(true) .create(true) @@ -64,7 +70,12 @@ impl ImageCache { } pub fn key(url: &str) -> String { - base32::encode(base32::Alphabet::Crockford, url.as_bytes()) + let k: String = sha2::Sha256::digest(url.as_bytes()).encode_hex(); + PathBuf::from(&k[0..2]) + .join(&k[2..4]) + .join(k) + .to_string_lossy() + .to_string() } pub fn map(&self) -> &ImageCacheMap {