1use crate::db::Database;
2use crate::errors::*;
3use crate::signed::Signed;
4use bstr::{BString, ByteSlice};
5use chrono::{DateTime, NaiveDateTime, Utc};
6use futures::StreamExt;
7use sequoia_openpgp::Fingerprint;
8use std::str;
9
10pub type Latest = (DateTime<Utc>, Vec<u8>, Vec<u8>, BString, usize);
11
12pub fn parse_date(date: &str) -> Result<DateTime<Utc>> {
13 let datetime = NaiveDateTime::parse_from_str(date, "%a, %d %b %Y %T %Z")
14 .context("Failed to parse Date header")?;
15 Ok(datetime.and_utc())
16}
17
18pub fn extract_date_and_attachment(mut data: &[u8]) -> Option<(DateTime<Utc>, &[u8])> {
19 let mut date = None;
20 let mut attachment = "".as_bytes();
21 while !data.is_empty() {
22 let (line, trailing) = data.split_once_str(b"\n").unwrap_or((data, b""));
23 if line.is_empty() {
24 attachment = trailing;
25 break;
26 }
27
28 if let Some(value) = line.strip_prefix(b"Date: ") {
29 if let Ok(value) = str::from_utf8(value) {
30 debug!("Parsing date header: {value:?}");
31 date = parse_date(value).ok();
32 }
33 }
34
35 data = trailing;
36 }
37 Some((date?, attachment))
38}
39
40fn update_latest(
41 latest: &mut Option<Latest>,
42 key: Vec<u8>,
43 bytes: Vec<u8>,
44 max_allowed_datetime: DateTime<Utc>,
45) -> Result<()> {
46 let (signed, _trailing) = Signed::from_bytes(&bytes)?;
47 let content = signed.content;
48
49 let Some((date, attachment)) = extract_date_and_attachment(&content) else {
50 return Ok(());
51 };
52
53 if date > max_allowed_datetime {
54 let key = String::from_utf8_lossy(&key);
55 warn!("Skipping document with date from the future: {date:?}, {key}");
56 return Ok(());
57 }
58
59 let idx = content.len() - attachment.len();
60 let new = Some((date, key, bytes, content, idx));
61
62 if new > *latest {
66 *latest = new;
67 }
68
69 Ok(())
70}
71
72pub async fn find(
73 db: &Database,
74 fp: Fingerprint,
75 max_allowed_datetime: DateTime<Utc>,
76) -> Result<Option<Latest>> {
77 let prefix = format!("{fp}/");
78 let stream = db.scan_values(prefix.as_bytes());
79
80 let mut latest = None;
81
82 tokio::pin!(stream);
83 while let Some(item) = stream.next().await {
84 let (key, value) = item.context("Failed to read from database (scan-latest)")?;
85 update_latest(&mut latest, key, value, max_allowed_datetime)?;
86 }
87
88 Ok(latest)
89}
90
91#[cfg(test)]
92mod test {
93 use super::*;
94 use crate::db::header::CryptoHash;
95 use chrono::TimeZone;
96
97 #[test]
98 fn test_parse_date() {
99 assert_eq!(
100 parse_date("Wed, 21 Aug 2024 15:36:07 UTC").unwrap(),
101 Utc.with_ymd_and_hms(2024, 8, 21, 15, 36, 7).unwrap()
102 );
103 assert_eq!(
104 parse_date("Fri, 14 Feb 2025 11:28:01 UTC").unwrap(),
105 Utc.with_ymd_and_hms(2025, 2, 14, 11, 28, 1).unwrap()
106 );
107 assert_eq!(
108 parse_date("Sun, 05 Nov 2023 19:19:57 UTC").unwrap(),
109 Utc.with_ymd_and_hms(2023, 11, 5, 19, 19, 57).unwrap()
110 );
111 }
112
113 #[test]
114 fn extract_release_date() {
115 let data = b"Origin: Valve Software LLC
116Label: Steam launcher
117Codename: stable
118Date: Wed, 01 Mar 2023 19:01:42 UTC
119Architectures: i386 amd64
120Components: steam
121Description: Steam packages for Ubuntu and Debian
122MD5Sum:
123 2cc0cb39217ac21fb9d9e3078ffe1c95 2846 steam/binary-i386/Packages
124 685cf20f3ec2ac8b73c4619ca8a26bfa 1292 steam/binary-i386/Packages.gz
125 1bf3fd71424a1112a232f8617452bc38 135 steam/binary-i386/Release
126 0cbb5e2098896d0ec9398430eec59081 2222 steam/binary-amd64/Packages
127 baaca0b481c88853e597e5eff662b04a 1101 steam/binary-amd64/Packages.gz
128 92c8a3be7382bf8dbe080afc094c799a 136 steam/binary-amd64/Release
129 ce8c452267b4804c551a866a0e14936d 1058 steam/source/Sources
130 7372595c640f014ab5015417b05bf2b7 591 steam/source/Sources.gz
131 6809037802698e089478642ab605bf38 137 steam/source/Release
132SHA1:
133 9e97f7b06aad48a50815c6176e95a749553bdf15 2846 steam/binary-i386/Packages
134 f8c1cbabbb4443e98e225d7e4b632e9349fba43a 1292 steam/binary-i386/Packages.gz
135 137f598735523f918e676cb500218b70394d7265 135 steam/binary-i386/Release
136 fe9d79b187dd510d849bf04070a93e60cff3c450 2222 steam/binary-amd64/Packages
137 950c55d9408f711f86e173cde80627e42a28c895 1101 steam/binary-amd64/Packages.gz
138 6958f751e15104d4a727f38185ec9faf25d04a75 136 steam/binary-amd64/Release
139 5f7555981af1f82623b93e2e62a97c03d0e5b44c 1058 steam/source/Sources
140 b887a9ff370656af32631317d2184b39d44e9d37 591 steam/source/Sources.gz
141 aa51a6ea3e0664c790e78a62c7d4662725d1c35a 137 steam/source/Release
142SHA256:
143 8a33a3338e878e0bd993b28d660f4075ecfff9f2b9e8e056810dd50b2371eb43 2846 steam/binary-i386/Packages
144 8c3109fee36ffc26ac61941c3f243bfdd4932aa90390b89e6c825d9d706673fc 1292 steam/binary-i386/Packages.gz
145 d21b7028166ccdac26f4c8c1084dad81d0d1e45f82652bcf1b28d0277b795da0 135 steam/binary-i386/Release
146 6637cebce9fa077b22daac68f35bfa91493802fde021701b38f6f8a6866b547c 2222 steam/binary-amd64/Packages
147 4199ba44aeb45ebc0697378fe98738f10ff332cab03337529ddcd29ce4d0ac51 1101 steam/binary-amd64/Packages.gz
148 9e766d8dedb507da4c41cca732b3eff724f53630efa9dbc798ef78dfdfbc5b41 136 steam/binary-amd64/Release
149 87bc01cbcde97b917be01df34cd05772f638c3d8e93eddeba17eedb2d70a2f95 1058 steam/source/Sources
150 841ac95be57e35183644e4efed99dfc0d39b6039f049ebcf9815e4e54e3e4d38 591 steam/source/Sources.gz
151 4cc31b1d8142f8e6145c2331b198f92c825cf6677205d97227f90268ee8c50d0 137 steam/source/Release
152";
153 let (date, attachment) = extract_date_and_attachment(data).unwrap();
154 assert_eq!(date, Utc.with_ymd_and_hms(2023, 3, 1, 19, 1, 42).unwrap());
155 assert_eq!(attachment, b"");
156 }
157
158 #[test]
159 fn extract_attachment() {
160 let data = b"Date: Sat, 22 Feb 2025 05:33:44 UTC
161Commit: 07c76667ce66d38cf08bf1e331256d22d338b2a1
162
163\xc3\x28this is\n\narbitrary\nbinary\xf0\x28\x8c\x28";
164 let (date, attachment) = extract_date_and_attachment(data).unwrap();
165 assert_eq!(date, Utc.with_ymd_and_hms(2025, 2, 22, 5, 33, 44).unwrap());
166 assert_eq!(
167 attachment,
168 b"\xc3\x28this is\n\narbitrary\nbinary\xf0\x28\x8c\x28"
169 );
170 }
171
172 const RELEASE_DATA: &[&[u8]] = &[
173 b"-----BEGIN PGP SIGNED MESSAGE-----
174
175Origin: TorProject
176Suite: testing
177Codename: trixie
178Date: Fri, 15 Nov 2024 11:28:01 UTC
179Valid-Until: Wed, 25 Dec 2024 11:28:01 UTC
180Architectures: amd64 arm64 i386
181Components: main
182MD5Sum:
183 4f1c7cdf829350ecd5f19446f105c224 5155 main/binary-amd64/Packages
184 5efe887860f463dee1257876419c5ead 2452 main/binary-amd64/Packages.gz
185 8993e226d487ae15a57b295ee7163410 72 main/binary-amd64/Release
186 301e1861261a0cac8704012e48bf9ae0 5122 main/binary-arm64/Packages
187 5a8be3a82df40c1d67a83b6f74031b24 2432 main/binary-arm64/Packages.gz
188 04848f1e95e99ecd5266016b54f6ba3b 72 main/binary-arm64/Release
189 ebea07f2c2dee778846066370e6e8c89 5151 main/binary-i386/Packages
190 69db395f0f704f7c2002ccf3dd675874 2448 main/binary-i386/Packages.gz
191 c87b59e471c0b39de0cfca2638377f8f 71 main/binary-i386/Release
192 b3c0d559a60239b9ab703ba905aae6f5 2939 main/source/Sources
193 fb531fdc96ffc0afcc24ba04dd27fca4 1258 main/source/Sources.gz
194 704ca88fd2254271bed6e9700954c775 73 main/source/Release
195SHA1:
196 88549bebf05677460cd5f3737bba3308ddc00230 5155 main/binary-amd64/Packages
197 c93610bbfa153e7128ab46d46115a9d7d306a0e0 2452 main/binary-amd64/Packages.gz
198 4790dd0652995711f37417277d9f240f43264004 72 main/binary-amd64/Release
199 9648703f6299f925ccdb2e6db73c0dcaabe5a2a2 5122 main/binary-arm64/Packages
200 c5b3aadfaac20a671fac0f6f3020926afe1466a7 2432 main/binary-arm64/Packages.gz
201 559a5d2deafc73df93436224cae9eb13ce1476b7 72 main/binary-arm64/Release
202 acaaf2190ee353082b472faf65a25b1b90ae594c 5151 main/binary-i386/Packages
203 2a749e0d470886f56299662ae4830fc10d69eda2 2448 main/binary-i386/Packages.gz
204 2c099ef796776b4f026e324a181929a95cb6fd6f 71 main/binary-i386/Release
205 669806decc4fbb53899c8ad78ac46f290543b5fd 2939 main/source/Sources
206 dd38d54b49f079e5aa2100ef52a480f9a030be98 1258 main/source/Sources.gz
207 2ec604f75d95854298c93160692fa5d810497e8d 73 main/source/Release
208SHA256:
209 affbb204a6e0e18f8b4730bb2fd43f2fefd5c7c1c80e04db702909b38e68764d 5155 main/binary-amd64/Packages
210 823125c3308508e8280f3864acfa32ebde37dcde2b66625900871649d965f043 2452 main/binary-amd64/Packages.gz
211 1cd4765e05f5d3491b247aab90ae65b779d3b0a5fa93d1076afd87f41a6aef92 72 main/binary-amd64/Release
212 b9a81ec0de4b34c36727ac6403de0c69d078d06de3317ec287a7225e83c203d9 5122 main/binary-arm64/Packages
213 bb03be229acab70c79d3ff1a874c5c4eca6f2e76f7dfece63190aad3ec1504a2 2432 main/binary-arm64/Packages.gz
214 291d5c3dd3e5a5de74cf8ca0261f9881ca8e0d3ea07bbee096d137eacf861bda 72 main/binary-arm64/Release
215 41e7710fcee9b0cee79bed7875e79747c383608d772a3bed5b14edb139baba85 5151 main/binary-i386/Packages
216 b9ae9259fda7197e0d97d7eefe6e34482a80502a7f4d0cb9e5963c03b51a3670 2448 main/binary-i386/Packages.gz
217 03864d020cf80a7bd64d2f3a9122ad40482d2dfd776264534e172d518fe3136d 71 main/binary-i386/Release
218 8975f6acf34d666bca543d417913adb832b8b900fcc7aabe1c7671d65e5a6024 2939 main/source/Sources
219 e5e0e6695226a4945e873fab8eb694e9ab8af8d94c6dc6373d40968116fda3f8 1258 main/source/Sources.gz
220 fe0a611678e47cab4d8cc639eb7249cdfb506151360eab974388532b469753bd 73 main/source/Release
221-----BEGIN PGP SIGNATURE-----
222
223wsBzBAABCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmc3MEEACgkQdKlBuiGe
224yBBYZgf+Oe+kmqQSD10o1O1bNmlFnFv2e81qyAD9Ka96+wDdVzYsoQbd82EE8r9U
225tx566aC7fON1+sknc+z+vHlG0PWGrSxE1nzeSi1NoBWl5FjPAy/mPIlatgAfowjK
226G4JhAsJKAyKR7WBRWmjWUrSl+HHBP3aB/jcwvrdN2dV4UBVkWJKYWelRTXWmzXOR
227VcjmHsFQDkY42wXz8biVCDd+urVLtGLW04m8us/l1ZVSKKATZecTVWYmhD/u+0oH
228tBIlcVdR6VgRIhB4QcMLalZJ60kmy+oFz/UI+rId3bnAN4j3tELqfcBhlaC8aLDi
229v34DhYj76SPDEB4BdO8q0byuf0Smlw==
230=93Mo
231-----END PGP SIGNATURE-----
232",
233 b"-----BEGIN PGP SIGNED MESSAGE-----
234
235Origin: TorProject
236Suite: testing
237Codename: trixie
238Date: Fri, 14 Feb 2025 11:28:01 UTC
239Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
240Architectures: amd64 arm64 i386
241Components: main
242MD5Sum:
243 4f1c7cdf829350ecd5f19446f105c224 5155 main/binary-amd64/Packages
244 5efe887860f463dee1257876419c5ead 2452 main/binary-amd64/Packages.gz
245 8993e226d487ae15a57b295ee7163410 72 main/binary-amd64/Release
246 301e1861261a0cac8704012e48bf9ae0 5122 main/binary-arm64/Packages
247 5a8be3a82df40c1d67a83b6f74031b24 2432 main/binary-arm64/Packages.gz
248 04848f1e95e99ecd5266016b54f6ba3b 72 main/binary-arm64/Release
249 ebea07f2c2dee778846066370e6e8c89 5151 main/binary-i386/Packages
250 69db395f0f704f7c2002ccf3dd675874 2448 main/binary-i386/Packages.gz
251 c87b59e471c0b39de0cfca2638377f8f 71 main/binary-i386/Release
252 b3c0d559a60239b9ab703ba905aae6f5 2939 main/source/Sources
253 fb531fdc96ffc0afcc24ba04dd27fca4 1258 main/source/Sources.gz
254 704ca88fd2254271bed6e9700954c775 73 main/source/Release
255SHA1:
256 88549bebf05677460cd5f3737bba3308ddc00230 5155 main/binary-amd64/Packages
257 c93610bbfa153e7128ab46d46115a9d7d306a0e0 2452 main/binary-amd64/Packages.gz
258 4790dd0652995711f37417277d9f240f43264004 72 main/binary-amd64/Release
259 9648703f6299f925ccdb2e6db73c0dcaabe5a2a2 5122 main/binary-arm64/Packages
260 c5b3aadfaac20a671fac0f6f3020926afe1466a7 2432 main/binary-arm64/Packages.gz
261 559a5d2deafc73df93436224cae9eb13ce1476b7 72 main/binary-arm64/Release
262 acaaf2190ee353082b472faf65a25b1b90ae594c 5151 main/binary-i386/Packages
263 2a749e0d470886f56299662ae4830fc10d69eda2 2448 main/binary-i386/Packages.gz
264 2c099ef796776b4f026e324a181929a95cb6fd6f 71 main/binary-i386/Release
265 669806decc4fbb53899c8ad78ac46f290543b5fd 2939 main/source/Sources
266 dd38d54b49f079e5aa2100ef52a480f9a030be98 1258 main/source/Sources.gz
267 2ec604f75d95854298c93160692fa5d810497e8d 73 main/source/Release
268SHA256:
269 affbb204a6e0e18f8b4730bb2fd43f2fefd5c7c1c80e04db702909b38e68764d 5155 main/binary-amd64/Packages
270 823125c3308508e8280f3864acfa32ebde37dcde2b66625900871649d965f043 2452 main/binary-amd64/Packages.gz
271 1cd4765e05f5d3491b247aab90ae65b779d3b0a5fa93d1076afd87f41a6aef92 72 main/binary-amd64/Release
272 b9a81ec0de4b34c36727ac6403de0c69d078d06de3317ec287a7225e83c203d9 5122 main/binary-arm64/Packages
273 bb03be229acab70c79d3ff1a874c5c4eca6f2e76f7dfece63190aad3ec1504a2 2432 main/binary-arm64/Packages.gz
274 291d5c3dd3e5a5de74cf8ca0261f9881ca8e0d3ea07bbee096d137eacf861bda 72 main/binary-arm64/Release
275 41e7710fcee9b0cee79bed7875e79747c383608d772a3bed5b14edb139baba85 5151 main/binary-i386/Packages
276 b9ae9259fda7197e0d97d7eefe6e34482a80502a7f4d0cb9e5963c03b51a3670 2448 main/binary-i386/Packages.gz
277 03864d020cf80a7bd64d2f3a9122ad40482d2dfd776264534e172d518fe3136d 71 main/binary-i386/Release
278 8975f6acf34d666bca543d417913adb832b8b900fcc7aabe1c7671d65e5a6024 2939 main/source/Sources
279 e5e0e6695226a4945e873fab8eb694e9ab8af8d94c6dc6373d40968116fda3f8 1258 main/source/Sources.gz
280 fe0a611678e47cab4d8cc639eb7249cdfb506151360eab974388532b469753bd 73 main/source/Release
281-----BEGIN PGP SIGNATURE-----
282
283wsBzBAEBCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
284yBA7PQgA1CoBKtlyBwbiNxB7OhLEFcuSp3U0ufVXtof2R09TvoUut8E8TRrAl10c
285q/6YMRA5Wb/uYfrtf0eWlgpXyH442yVFFY+forYrCfrhY54GXQJA6lguL8ZMqUdS
286SlES1JzvX65L73guCtbRXpSlcuLT7iTbvHlIIU5QTOtYKo59KdmcF01KPtrLLen1
287fzdTlGxq7wPxQid3KuN3eZfZ20RUtU79amZxq8spdlZxN6eVU4orliMRR7YiLzIP
288EDMZ1vmPtHw4Hg24YGPC2OOzn2bUIb8TzQ3grbvc0BuvjokbPvZOG5j2jMEJjb+3
289RkvVS4tolFfLOk8EQrCD7CdxxLqvZw==
290=Ea8d
291-----END PGP SIGNATURE-----
292",
293 b"-----BEGIN PGP SIGNED MESSAGE-----
294
295Origin: TorProject
296Suite: stable
297Codename: bookworm
298Date: Fri, 14 Feb 2025 11:28:01 UTC
299Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
300Architectures: amd64 arm64 i386
301Components: main
302MD5Sum:
303 ef9461c1420699ca148523e82f1658ae 5165 main/binary-amd64/Packages
304 8472a30220841fd71471e513eea7feb5 2446 main/binary-amd64/Packages.gz
305 5a232710573bca3aae4b577c16ece1c1 71 main/binary-amd64/Release
306 f4bc0d019adf816ed328ef8fc6d14da8 5132 main/binary-arm64/Packages
307 6810832523f5872f3a0e9a6d3271932f 2427 main/binary-arm64/Packages.gz
308 132565cf1e259a93a021e651e2ab3cd4 71 main/binary-arm64/Release
309 66294d5c2544ddcc9de4a63307844213 5161 main/binary-i386/Packages
310 7954605c44cec2c6732b09f4bf5146f5 2445 main/binary-i386/Packages.gz
311 5768b889feb010e5d4a62ad2003a6da2 70 main/binary-i386/Release
312 82b6a307db03b9cbfb6a267a57e64fb2 2953 main/source/Sources
313 b7c2043f6c99a9e94d28401946d2d5aa 1258 main/source/Sources.gz
314 94aa68972888c3c4340efb5dd97b195e 72 main/source/Release
315SHA1:
316 cfa9e4e3aeb947faabb55eeee303ef6b3a8a7d9e 5165 main/binary-amd64/Packages
317 7af71b12e4d55a900d027a97a13fd925d17fbc08 2446 main/binary-amd64/Packages.gz
318 0f979d666f966c427fab567771f55d6f9b963b79 71 main/binary-amd64/Release
319 ec30ea663b574cf2ad6a7051b80733130a95967c 5132 main/binary-arm64/Packages
320 22d34250fe983afe37b3e09a39e4ed0cf503ffcd 2427 main/binary-arm64/Packages.gz
321 88b92baad3148570453a1ca4df4ac8f6c8b33c94 71 main/binary-arm64/Release
322 54f6e88fdab6f14055791f59f72f5707ae31ae2c 5161 main/binary-i386/Packages
323 c9f0e20778899974b6267219246efc5113bef700 2445 main/binary-i386/Packages.gz
324 c2f88e8b760b1fbd8e4fab14f02d7dd022309208 70 main/binary-i386/Release
325 48576f3f83997e38c1310c0a25affab6c9fabaa0 2953 main/source/Sources
326 859ac4cb8868b4b55253fd1ac8ceef2c010bc0e0 1258 main/source/Sources.gz
327 e495ccf6037e86ba98915df00c0fce0839703634 72 main/source/Release
328SHA256:
329 beab22bc6765408c14e65a66648d01b7c080f0f624c84a8c96fb0ec2e8ee32ee 5165 main/binary-amd64/Packages
330 90300ff39af1c8af397ccfd1a8fecffe26717b338f56b7b275c9207aad07ef10 2446 main/binary-amd64/Packages.gz
331 679b22e05826dc8eea366e3d9cc42471a9dbd03f95656d3a9541dfafcd82dc00 71 main/binary-amd64/Release
332 050f154f3d910bc349a9ff06b8d9c2f6ecfe89005fab4d576f817f6b841407b8 5132 main/binary-arm64/Packages
333 b3c372797cdf5aa2310f1d0459d6fd8f2bf17abfc76bb5cb70891995ee745b8d 2427 main/binary-arm64/Packages.gz
334 ffd961c4598ade54f231c2679cd0b7e8c346b66aa94cac0752d10deea94ee1d9 71 main/binary-arm64/Release
335 68e493ff92bdc6542ff3f86b8e18126c85131a3936313bc4ec868261e77778ed 5161 main/binary-i386/Packages
336 6691349d45f13e637acf77b52e4c6358e214336860ca012c4a1e6382cdf467e9 2445 main/binary-i386/Packages.gz
337 e9a73c169e4a69b67bfec28ff6fda7a5c2236310cd9efe1d60eae4fb5305c7fa 70 main/binary-i386/Release
338 9a17f06b2326c7c48accc85a76e063ed0986ebff994869d95c746a7159ae3f2a 2953 main/source/Sources
339 03850f5c767373134f44c5c38ce4e3978ad8128faa118f024ccb264e3d5bb83c 1258 main/source/Sources.gz
340 d8476d69da595bd80bfaef1aca6d58129be6ab51257f8d1873a5b85ff1398f49 72 main/source/Release
341-----BEGIN PGP SIGNATURE-----
342
343wsBzBAABCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
344yBBPUwf7BpPi7d6Pzs9LsPKTizSmkoBx3Lm/KBQDuDSpFhfJYk5yuViP4W3DKn0D
345T/MltNF5GFXdvH4Q65kQoTa+4CGc83iKbcej7jDo5q+cMXfOqg1hYi6opIEj9shG
3465mRqHWKkLJ96wnc8Mh+YAvK3vIAX40iwOMOlMfZQADBGK7H6gTx4/R4/pn4CgHdS
347StzttG8ektIx5lojv0FUUE94NQyF0uKtTqB0RUooTzlV/qLEczv8W9ra6kk2AJuD
3486xYp5LOKccdEMO4u27MykwD4MaPricDoErQe7ssD+RSp2fSa9nSnxIjiik4dr9lr
349VdqlFDMGH3w/JSHSz1UrespC1RjtMw==
350=TUnR
351-----END PGP SIGNATURE-----
352",
353 b"-----BEGIN PGP SIGNED MESSAGE-----
354
355Origin: TorProject
356Suite: unstable
357Codename: sid
358Date: Fri, 14 Feb 2025 11:28:01 UTC
359Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
360Architectures: amd64 arm64 i386
361Components: main
362MD5Sum:
363 2dcd5ffd7f2f64b7c38fa925d7e96a1e 6260 main/binary-amd64/Packages
364 cc6cfcd9826a8c8e8eb51d65c669b130 2915 main/binary-amd64/Packages.gz
365 20449ced16157eb8f05d42a478c33e3b 73 main/binary-amd64/Release
366 bc775e621485c01622f2397eeb67b8e4 5018 main/binary-arm64/Packages
367 3182269d9dc1cb2ef4e18e56e7ac59fd 2416 main/binary-arm64/Packages.gz
368 5ddfcea95c0f3ba08f348fafdc2ebaa9 73 main/binary-arm64/Release
369 299be9fd66e74f0fd79f5f4623ec4411 6254 main/binary-i386/Packages
370 43804ab9928c2362033ac99f15719714 2913 main/binary-i386/Packages.gz
371 6b9b53f0e38c1f9360e2b36e9219bf83 72 main/binary-i386/Release
372 bf88ece9d707203d82a2b14d8c93bdfe 2848 main/source/Sources
373 19685747ecc5d2c86c548ebc0de6590f 1239 main/source/Sources.gz
374 3e925b43fce2d4b8af85c7e785c6e401 74 main/source/Release
375SHA1:
376 b693045f159751607329ef6cf5a47091e6c9eb78 6260 main/binary-amd64/Packages
377 daf58cc1700106f872cfc05ab311976204da2f76 2915 main/binary-amd64/Packages.gz
378 c35fad9ab6e3c4100c30ca38fb6a2abba5b59871 73 main/binary-amd64/Release
379 58de7862604db3a87830814def98bb88da9eae28 5018 main/binary-arm64/Packages
380 4c18f89c5561660162f515a0dff512cfef7e0df3 2416 main/binary-arm64/Packages.gz
381 93f23ad9365f6eab9c51ff37056c6c10e993cb41 73 main/binary-arm64/Release
382 d34782b6e3aa5cd52b974a1f3975ad2992e27050 6254 main/binary-i386/Packages
383 a2712d6d50a38d45144bfb4583057f76aaee346e 2913 main/binary-i386/Packages.gz
384 357698f11a8138a7da6a483cca6d3b891f5cf52e 72 main/binary-i386/Release
385 ec0d9e1baa8368ea60e458f0d30370a78ceabeb2 2848 main/source/Sources
386 f43cb2d855e570991461daec3dffbdd402660597 1239 main/source/Sources.gz
387 8a76c8851861683bec52c7179f0af99288640f8d 74 main/source/Release
388SHA256:
389 63480240eb3597f4954914f83aeb4c306cec74e6d47921e03aefeed52845d7e5 6260 main/binary-amd64/Packages
390 7b6bab95507a72a44353f79c04057a586b17348bc6845190b1e9946ad4f2a34d 2915 main/binary-amd64/Packages.gz
391 6176a6b8747088b9d83774f369efed8fc4b1f22bafe037c47f500b505aa5fd70 73 main/binary-amd64/Release
392 3df4bea29a43aa15075d59d25a8a892702a45bd6e2dcc379f97ed3409b85155c 5018 main/binary-arm64/Packages
393 36309b5c3d598a2ac72aff088825d01c194d339041465287ec1eff477e8b274c 2416 main/binary-arm64/Packages.gz
394 e0abbf1c817cb66436db607a507c8b579fb059e3e54369ca979d8cbc0177e307 73 main/binary-arm64/Release
395 2887da6b3403ce4de428a1ec59aab76c5b15d6074ee7b4b15e40d9dd796b6afe 6254 main/binary-i386/Packages
396 1868b7f7c167f38eac694ad2fe62af9e0828f5176d4e50cf4ee0c78ffb8d3505 2913 main/binary-i386/Packages.gz
397 241bd9dee8cb13dd5bbc4b41d496d5e096dfd292db7bb0443df532ea2582cf26 72 main/binary-i386/Release
398 66b48d52df535c3b3c5841472524aaf3c3589a06195670f2ad309ba80dd1ba94 2848 main/source/Sources
399 b3871901256f870704056586c696edbd27af9535b580836b6f3d3130f124a69f 1239 main/source/Sources.gz
400 eafd75f908427c7b1b03f83a7fcd4884d4aced30433b64211c71a062d40b324f 74 main/source/Release
401-----BEGIN PGP SIGNATURE-----
402
403wsBzBAABCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
404yBDoqAf+N/nWI6wvXlqihgoMKGeUhkI+YKhu+1X89r8bLxLazgmQ1sAnj/cjPWCz
405x3XBOEOgfiwo7qUgsW9xYv8pg2JBbFugF/zOmI3kZ7MUCEmZC22ebapr0iRdJpBc
406xvXInkkBCYxFtFuGR5eDC+6v2idpj8i+S9UPkBh4osK641iEHzdv4w0dJynWVJNd
407pLM7TgmdEYzOwoCsSNoPySlOYGbNZQt/90b3bkh0YSeBzTBo5NDexNkl3xgcWkaW
408zD8TJGKfNwI7ExNiR9+Cfw/12QnE2jhuadKzDKHS5WI+qJArfFZR+m1H/seJnZnG
409b5XduXB/PK6BAcdfR9AFIgRwnvGoWg==
410=6F6z
411-----END PGP SIGNATURE-----
412",
413 b"-----BEGIN PGP SIGNED MESSAGE-----
414
415Origin: TorProject
416Suite: unstable
417Codename: sid
418Date: Fri, 14 Feb 2025 11:28:01 UTC
419Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
420Architectures: amd64 arm64 i386
421Components: main
422MD5Sum:
423 2dcd5ffd7f2f64b7c38fa925d7e96a1e 6260 main/binary-amd64/Packages
424 cc6cfcd9826a8c8e8eb51d65c669b130 2915 main/binary-amd64/Packages.gz
425 20449ced16157eb8f05d42a478c33e3b 73 main/binary-amd64/Release
426 bc775e621485c01622f2397eeb67b8e4 5018 main/binary-arm64/Packages
427 3182269d9dc1cb2ef4e18e56e7ac59fd 2416 main/binary-arm64/Packages.gz
428 5ddfcea95c0f3ba08f348fafdc2ebaa9 73 main/binary-arm64/Release
429 299be9fd66e74f0fd79f5f4623ec4411 6254 main/binary-i386/Packages
430 43804ab9928c2362033ac99f15719714 2913 main/binary-i386/Packages.gz
431 6b9b53f0e38c1f9360e2b36e9219bf83 72 main/binary-i386/Release
432 bf88ece9d707203d82a2b14d8c93bdfe 2848 main/source/Sources
433 19685747ecc5d2c86c548ebc0de6590f 1239 main/source/Sources.gz
434 3e925b43fce2d4b8af85c7e785c6e401 74 main/source/Release
435SHA1:
436 b693045f159751607329ef6cf5a47091e6c9eb78 6260 main/binary-amd64/Packages
437 daf58cc1700106f872cfc05ab311976204da2f76 2915 main/binary-amd64/Packages.gz
438 c35fad9ab6e3c4100c30ca38fb6a2abba5b59871 73 main/binary-amd64/Release
439 58de7862604db3a87830814def98bb88da9eae28 5018 main/binary-arm64/Packages
440 4c18f89c5561660162f515a0dff512cfef7e0df3 2416 main/binary-arm64/Packages.gz
441 93f23ad9365f6eab9c51ff37056c6c10e993cb41 73 main/binary-arm64/Release
442 d34782b6e3aa5cd52b974a1f3975ad2992e27050 6254 main/binary-i386/Packages
443 a2712d6d50a38d45144bfb4583057f76aaee346e 2913 main/binary-i386/Packages.gz
444 357698f11a8138a7da6a483cca6d3b891f5cf52e 72 main/binary-i386/Release
445 ec0d9e1baa8368ea60e458f0d30370a78ceabeb2 2848 main/source/Sources
446 f43cb2d855e570991461daec3dffbdd402660597 1239 main/source/Sources.gz
447 8a76c8851861683bec52c7179f0af99288640f8d 74 main/source/Release
448SHA256:
449 63480240eb3597f4954914f83aeb4c306cec74e6d47921e03aefeed52845d7e5 6260 main/binary-amd64/Packages
450 7b6bab95507a72a44353f79c04057a586b17348bc6845190b1e9946ad4f2a34d 2915 main/binary-amd64/Packages.gz
451 6176a6b8747088b9d83774f369efed8fc4b1f22bafe037c47f500b505aa5fd70 73 main/binary-amd64/Release
452 3df4bea29a43aa15075d59d25a8a892702a45bd6e2dcc379f97ed3409b85155c 5018 main/binary-arm64/Packages
453 36309b5c3d598a2ac72aff088825d01c194d339041465287ec1eff477e8b274c 2416 main/binary-arm64/Packages.gz
454 e0abbf1c817cb66436db607a507c8b579fb059e3e54369ca979d8cbc0177e307 73 main/binary-arm64/Release
455 2887da6b3403ce4de428a1ec59aab76c5b15d6074ee7b4b15e40d9dd796b6afe 6254 main/binary-i386/Packages
456 1868b7f7c167f38eac694ad2fe62af9e0828f5176d4e50cf4ee0c78ffb8d3505 2913 main/binary-i386/Packages.gz
457 241bd9dee8cb13dd5bbc4b41d496d5e096dfd292db7bb0443df532ea2582cf26 72 main/binary-i386/Release
458 66b48d52df535c3b3c5841472524aaf3c3589a06195670f2ad309ba80dd1ba94 2848 main/source/Sources
459 b3871901256f870704056586c696edbd27af9535b580836b6f3d3130f124a69f 1239 main/source/Sources.gz
460 eafd75f908427c7b1b03f83a7fcd4884d4aced30433b64211c71a062d40b324f 74 main/source/Release
461-----BEGIN PGP SIGNATURE-----
462
463wsBzBAEBCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
464yBApxwf9EAE4fnC6Iyhn0n15WQikVPojEcn2MPjS8r4OtBVHRHMal5js6ZDN15JE
465GmQZP7vHqC12Yxifmp2mOkoVlwVvGeHPwb0m/h2FSHy5P6CADq/9CPwjVYbVORkQ
466oWo4AOJu/jNnRe9wYQFCRO1mxzcms17Rv8d0UBN6bSLvwJH+Qpvr32v4JzaOomZN
467HfII2Te8vZzdptZdssBYupKO0hVCJIRYykrQBy3FbIQN6dzP7GD/oygoBsa1t7Cj
468JCGaSpnOBrFV5UwPuX+6k5J17cuF9c/d0E5rLzGnLiaYxl9Jk9deu/muvGKME/jk
469xmfGz8KEqUZylajBN7f6JfhPFpL1ZA==
470=sS4f
471-----END PGP SIGNATURE-----
472",
473 b"-----BEGIN PGP SIGNED MESSAGE-----
474
475Origin: TorProject
476Suite: testing
477Codename: trixie
478Date: Fri, 14 Feb 2025 11:28:01 UTC
479Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
480Architectures: amd64 arm64 i386
481Components: main
482MD5Sum:
483 4f1c7cdf829350ecd5f19446f105c224 5155 main/binary-amd64/Packages
484 5efe887860f463dee1257876419c5ead 2452 main/binary-amd64/Packages.gz
485 8993e226d487ae15a57b295ee7163410 72 main/binary-amd64/Release
486 301e1861261a0cac8704012e48bf9ae0 5122 main/binary-arm64/Packages
487 5a8be3a82df40c1d67a83b6f74031b24 2432 main/binary-arm64/Packages.gz
488 04848f1e95e99ecd5266016b54f6ba3b 72 main/binary-arm64/Release
489 ebea07f2c2dee778846066370e6e8c89 5151 main/binary-i386/Packages
490 69db395f0f704f7c2002ccf3dd675874 2448 main/binary-i386/Packages.gz
491 c87b59e471c0b39de0cfca2638377f8f 71 main/binary-i386/Release
492 b3c0d559a60239b9ab703ba905aae6f5 2939 main/source/Sources
493 fb531fdc96ffc0afcc24ba04dd27fca4 1258 main/source/Sources.gz
494 704ca88fd2254271bed6e9700954c775 73 main/source/Release
495SHA1:
496 88549bebf05677460cd5f3737bba3308ddc00230 5155 main/binary-amd64/Packages
497 c93610bbfa153e7128ab46d46115a9d7d306a0e0 2452 main/binary-amd64/Packages.gz
498 4790dd0652995711f37417277d9f240f43264004 72 main/binary-amd64/Release
499 9648703f6299f925ccdb2e6db73c0dcaabe5a2a2 5122 main/binary-arm64/Packages
500 c5b3aadfaac20a671fac0f6f3020926afe1466a7 2432 main/binary-arm64/Packages.gz
501 559a5d2deafc73df93436224cae9eb13ce1476b7 72 main/binary-arm64/Release
502 acaaf2190ee353082b472faf65a25b1b90ae594c 5151 main/binary-i386/Packages
503 2a749e0d470886f56299662ae4830fc10d69eda2 2448 main/binary-i386/Packages.gz
504 2c099ef796776b4f026e324a181929a95cb6fd6f 71 main/binary-i386/Release
505 669806decc4fbb53899c8ad78ac46f290543b5fd 2939 main/source/Sources
506 dd38d54b49f079e5aa2100ef52a480f9a030be98 1258 main/source/Sources.gz
507 2ec604f75d95854298c93160692fa5d810497e8d 73 main/source/Release
508SHA256:
509 affbb204a6e0e18f8b4730bb2fd43f2fefd5c7c1c80e04db702909b38e68764d 5155 main/binary-amd64/Packages
510 823125c3308508e8280f3864acfa32ebde37dcde2b66625900871649d965f043 2452 main/binary-amd64/Packages.gz
511 1cd4765e05f5d3491b247aab90ae65b779d3b0a5fa93d1076afd87f41a6aef92 72 main/binary-amd64/Release
512 b9a81ec0de4b34c36727ac6403de0c69d078d06de3317ec287a7225e83c203d9 5122 main/binary-arm64/Packages
513 bb03be229acab70c79d3ff1a874c5c4eca6f2e76f7dfece63190aad3ec1504a2 2432 main/binary-arm64/Packages.gz
514 291d5c3dd3e5a5de74cf8ca0261f9881ca8e0d3ea07bbee096d137eacf861bda 72 main/binary-arm64/Release
515 41e7710fcee9b0cee79bed7875e79747c383608d772a3bed5b14edb139baba85 5151 main/binary-i386/Packages
516 b9ae9259fda7197e0d97d7eefe6e34482a80502a7f4d0cb9e5963c03b51a3670 2448 main/binary-i386/Packages.gz
517 03864d020cf80a7bd64d2f3a9122ad40482d2dfd776264534e172d518fe3136d 71 main/binary-i386/Release
518 8975f6acf34d666bca543d417913adb832b8b900fcc7aabe1c7671d65e5a6024 2939 main/source/Sources
519 e5e0e6695226a4945e873fab8eb694e9ab8af8d94c6dc6373d40968116fda3f8 1258 main/source/Sources.gz
520 fe0a611678e47cab4d8cc639eb7249cdfb506151360eab974388532b469753bd 73 main/source/Release
521-----BEGIN PGP SIGNATURE-----
522
523wsBzBAABCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
524yBCu9gf/diaKUJFDU9Ed/av5Y3ClsGFUtRuHFMeTY4mfqVRSWj7eDhCjJqrfIxpJ
525TsVMMYghdrGG2Dl2M3npbT/HC7/1am+Zs914z4vsmnJKYhyIeb0I9WK89zNIg05q
526r7rT4MFuHC78HX8+Wvh8Oq8WWFj/eL/YZmVskDO3HISThE21N3DkDzRuu1Fxg4/m
5274clPWI4bXo+JD+A/FWvLISzEdlpWlNKq+SuarCKa76EV0Az+RiiLmj0/mEY1p/gI
5286VAinjieOVaw/Th5feF+JAhJ7wzKdoscVdv8MZ1yJijRAjBjDu4P2mYw0NCQipXO
529GVTwJIeTkG0B0NTYBrIpMgC9MyQQhQ==
530=7brN
531-----END PGP SIGNATURE-----
532",
533 b"-----BEGIN PGP SIGNED MESSAGE-----
534
535Origin: TorProject
536Suite: stable
537Codename: bookworm
538Date: Fri, 14 Feb 2025 11:28:01 UTC
539Valid-Until: Wed, 26 Mar 2025 11:28:01 UTC
540Architectures: amd64 arm64 i386
541Components: main
542MD5Sum:
543 ef9461c1420699ca148523e82f1658ae 5165 main/binary-amd64/Packages
544 8472a30220841fd71471e513eea7feb5 2446 main/binary-amd64/Packages.gz
545 5a232710573bca3aae4b577c16ece1c1 71 main/binary-amd64/Release
546 f4bc0d019adf816ed328ef8fc6d14da8 5132 main/binary-arm64/Packages
547 6810832523f5872f3a0e9a6d3271932f 2427 main/binary-arm64/Packages.gz
548 132565cf1e259a93a021e651e2ab3cd4 71 main/binary-arm64/Release
549 66294d5c2544ddcc9de4a63307844213 5161 main/binary-i386/Packages
550 7954605c44cec2c6732b09f4bf5146f5 2445 main/binary-i386/Packages.gz
551 5768b889feb010e5d4a62ad2003a6da2 70 main/binary-i386/Release
552 82b6a307db03b9cbfb6a267a57e64fb2 2953 main/source/Sources
553 b7c2043f6c99a9e94d28401946d2d5aa 1258 main/source/Sources.gz
554 94aa68972888c3c4340efb5dd97b195e 72 main/source/Release
555SHA1:
556 cfa9e4e3aeb947faabb55eeee303ef6b3a8a7d9e 5165 main/binary-amd64/Packages
557 7af71b12e4d55a900d027a97a13fd925d17fbc08 2446 main/binary-amd64/Packages.gz
558 0f979d666f966c427fab567771f55d6f9b963b79 71 main/binary-amd64/Release
559 ec30ea663b574cf2ad6a7051b80733130a95967c 5132 main/binary-arm64/Packages
560 22d34250fe983afe37b3e09a39e4ed0cf503ffcd 2427 main/binary-arm64/Packages.gz
561 88b92baad3148570453a1ca4df4ac8f6c8b33c94 71 main/binary-arm64/Release
562 54f6e88fdab6f14055791f59f72f5707ae31ae2c 5161 main/binary-i386/Packages
563 c9f0e20778899974b6267219246efc5113bef700 2445 main/binary-i386/Packages.gz
564 c2f88e8b760b1fbd8e4fab14f02d7dd022309208 70 main/binary-i386/Release
565 48576f3f83997e38c1310c0a25affab6c9fabaa0 2953 main/source/Sources
566 859ac4cb8868b4b55253fd1ac8ceef2c010bc0e0 1258 main/source/Sources.gz
567 e495ccf6037e86ba98915df00c0fce0839703634 72 main/source/Release
568SHA256:
569 beab22bc6765408c14e65a66648d01b7c080f0f624c84a8c96fb0ec2e8ee32ee 5165 main/binary-amd64/Packages
570 90300ff39af1c8af397ccfd1a8fecffe26717b338f56b7b275c9207aad07ef10 2446 main/binary-amd64/Packages.gz
571 679b22e05826dc8eea366e3d9cc42471a9dbd03f95656d3a9541dfafcd82dc00 71 main/binary-amd64/Release
572 050f154f3d910bc349a9ff06b8d9c2f6ecfe89005fab4d576f817f6b841407b8 5132 main/binary-arm64/Packages
573 b3c372797cdf5aa2310f1d0459d6fd8f2bf17abfc76bb5cb70891995ee745b8d 2427 main/binary-arm64/Packages.gz
574 ffd961c4598ade54f231c2679cd0b7e8c346b66aa94cac0752d10deea94ee1d9 71 main/binary-arm64/Release
575 68e493ff92bdc6542ff3f86b8e18126c85131a3936313bc4ec868261e77778ed 5161 main/binary-i386/Packages
576 6691349d45f13e637acf77b52e4c6358e214336860ca012c4a1e6382cdf467e9 2445 main/binary-i386/Packages.gz
577 e9a73c169e4a69b67bfec28ff6fda7a5c2236310cd9efe1d60eae4fb5305c7fa 70 main/binary-i386/Release
578 9a17f06b2326c7c48accc85a76e063ed0986ebff994869d95c746a7159ae3f2a 2953 main/source/Sources
579 03850f5c767373134f44c5c38ce4e3978ad8128faa118f024ccb264e3d5bb83c 1258 main/source/Sources.gz
580 d8476d69da595bd80bfaef1aca6d58129be6ab51257f8d1873a5b85ff1398f49 72 main/source/Release
581-----BEGIN PGP SIGNATURE-----
582
583wsBzBAEBCAAdFiEEImXrTLK/iNkAro0bdKlBuiGeyBAFAmevKMEACgkQdKlBuiGe
584yBAoDQf/Uii8ah8gAAoVqxe5RvUCUdI7rULIPcxfIt9G6ddJDXzvCkgMbq9VqxoL
585v+x6qdKjD9tAy+uoeWQygin/aUSD0uPC2d1XXdVvin9A/mTkUxa9C6f84ecxtaQP
586TnSNFaQuE6hUlmekB4AFKhBev0N25cezgJC86Cwxsjqub5h1R4anALvHYLqr8p1P
587k1LMCwN6nQVIy8dMz6RbN9o69qDIs7yUPhVG5RFN4us8g5A3YDOMFbLJUY2WAiCm
588t96GZIs+oOO03g7xqtJc9G67fULuo4TycW70P9yFk5A/+a0m0/ovWuvvjode9iDM
589hhRmafsYupear5ln4kdTQgJhH7k9zw==
590=VXJQ
591-----END PGP SIGNATURE-----
592",
593 ];
594
595 #[test]
596 fn test_datetime_tie() {
597 let mut latest = None;
598 for bytes in RELEASE_DATA {
599 let key = CryptoHash::calculate(bytes);
600 update_latest(
601 &mut latest,
602 key.0.into_bytes(),
603 bytes.to_vec(),
604 DateTime::<Utc>::MAX_UTC,
605 )
606 .unwrap();
607 }
608 assert_eq!(
609 latest,
610 Some((
611 Utc.with_ymd_and_hms(2025, 2, 14, 11, 28, 1).unwrap(),
612 "sha256:c4dde6759a31026a6a2b8d3a72dbd8290d0b831568d409ccf51660cdb52bf055".into(),
613 RELEASE_DATA[3].to_vec(),
614 Signed::from_bytes(RELEASE_DATA[3]).unwrap().0.content,
615 2986,
616 ))
617 );
618 }
619
620 #[test]
621 fn test_latest_datetime_capped() {
622 let mut latest = None;
623 for bytes in RELEASE_DATA {
624 let key = CryptoHash::calculate(bytes);
625 update_latest(
626 &mut latest,
627 key.0.into_bytes(),
628 bytes.to_vec(),
629 Utc.with_ymd_and_hms(2025, 1, 1, 1, 1, 1).unwrap(),
630 )
631 .unwrap();
632 }
633 assert_eq!(
634 latest,
635 Some((
636 Utc.with_ymd_and_hms(2024, 11, 15, 11, 28, 1).unwrap(),
637 "sha256:0204f8c76d22ae29164c18e5cdb615e9985b562f7d8d0c9a9e963e2076ab15e1".into(),
638 RELEASE_DATA[0].to_vec(),
639 Signed::from_bytes(RELEASE_DATA[0]).unwrap().0.content,
640 2988,
641 ))
642 );
643 }
644}