Authenticate using registry - part 2

This commit is contained in:
mdecimus
2026-02-05 18:41:23 +01:00
parent 0af735540d
commit 1a780ca294
83 changed files with 524 additions and 833 deletions

View File

@@ -4,6 +4,7 @@
* SPDX-License-Identifier: AGPL-3.0-only OR LicenseRef-SEL
*/
use arcstr::ArcStr;
use mail_auth::{MX, ResolverCache, Txt};
use quick_cache::{
Equivalent, Weighter,
@@ -71,6 +72,13 @@ impl<K: Eq + Hash + CacheItemWeight, V: Clone + CacheItemWeight> Cache<K, V> {
self.0.insert(key, value);
}
#[inline(always)]
pub fn update(&self, key: K, value: V) {
if let Err((key, value)) = self.0.replace(key, value, true) {
self.0.insert(key, value);
}
}
#[inline(always)]
pub fn remove<Q>(&self, key: &Q) -> Option<V>
where
@@ -220,9 +228,15 @@ impl CacheItemWeight for Box<str> {
}
}
impl<T> CacheItemWeight for Box<[T]> {
impl<T: CacheItemWeight> CacheItemWeight for Box<[T]> {
fn weight(&self) -> u64 {
(self.len() * std::mem::size_of::<T>()) as u64 + std::mem::size_of::<Box<[T]>>() as u64
std::mem::size_of::<Box<[T]>>() as u64 + self.iter().map(|item| item.weight()).sum::<u64>()
}
}
impl<T: CacheItemWeight> CacheItemWeight for Arc<[T]> {
fn weight(&self) -> u64 {
std::mem::size_of::<Arc<[T]>>() as u64 + self.iter().map(|item| item.weight()).sum::<u64>()
}
}
@@ -232,45 +246,28 @@ impl CacheItemWeight for u32 {
}
}
impl CacheItemWeight for Vec<IpAddr> {
impl CacheItemWeight for IpAddr {
fn weight(&self) -> u64 {
(self.len() * std::mem::size_of::<IpAddr>()) as u64
+ std::mem::size_of::<Vec<IpAddr>>() as u64
std::mem::size_of::<Vec<IpAddr>>() as u64
}
}
impl CacheItemWeight for Vec<Ipv4Addr> {
impl CacheItemWeight for Ipv4Addr {
fn weight(&self) -> u64 {
(self.len() * std::mem::size_of::<Ipv4Addr>()) as u64
+ std::mem::size_of::<Vec<Ipv4Addr>>() as u64
std::mem::size_of::<Vec<Ipv4Addr>>() as u64
}
}
impl CacheItemWeight for Vec<Ipv6Addr> {
impl CacheItemWeight for Ipv6Addr {
fn weight(&self) -> u64 {
(self.len() * std::mem::size_of::<Ipv6Addr>()) as u64
+ std::mem::size_of::<Vec<Ipv6Addr>>() as u64
std::mem::size_of::<Vec<Ipv6Addr>>() as u64
}
}
impl CacheItemWeight for Vec<MX> {
impl CacheItemWeight for MX {
fn weight(&self) -> u64 {
self.iter()
.map(|mx| {
mx.exchanges
.iter()
.map(|e| e.len() + std::mem::size_of::<MX>())
.sum::<usize>()
})
.sum::<usize>() as u64
+ std::mem::size_of::<Vec<MX>>() as u64
}
}
impl CacheItemWeight for Vec<String> {
fn weight(&self) -> u64 {
self.iter().map(|s| s.len()).sum::<usize>() as u64
+ std::mem::size_of::<Vec<String>>() as u64
self.exchanges.iter().map(|e| e.len() as u64).sum::<u64>()
+ std::mem::size_of::<MX>() as u64
}
}
@@ -280,18 +277,24 @@ impl CacheItemWeight for Txt {
}
}
impl CacheItemWeight for IpAddr {
fn weight(&self) -> u64 {
std::mem::size_of::<IpAddr>() as u64
}
}
impl CacheItemWeight for bool {
fn weight(&self) -> u64 {
std::mem::size_of::<bool>() as u64
}
}
impl CacheItemWeight for ArcStr {
fn weight(&self) -> u64 {
self.len() as u64 + std::mem::size_of::<ArcStr>() as u64
}
}
impl CacheItemWeight for () {
fn weight(&self) -> u64 {
0
}
}
impl<T: Clone + CacheItemWeight> TtlEntry<T> {
pub fn new(value: T, expires: Duration) -> Self {
Self {