tuwunel_service/threepid/
mod.rs1mod binding;
8mod canonical;
9mod pending;
10mod ratelimit;
11
12use std::{
13 collections::HashMap,
14 net::IpAddr,
15 sync::{Arc, Mutex},
16 time::Instant,
17};
18
19use ruma::{MilliSecondsSinceUnixEpoch, OwnedDeviceId, OwnedUserId, thirdparty::Medium};
20use serde::{Deserialize, Serialize};
21use tuwunel_core::{Result, smallstr::SmallString, utils::MutexMap};
22use tuwunel_database::{Database, Map};
23
24pub use self::{canonical::canonicalize_email, pending::PendingOutcome};
30
31type Ratelimiter<K> = Mutex<HashMap<K, (Instant, f64)>>;
34
35type EmailKey = SmallString<[u8; 48]>;
38
39pub struct Service {
45 db: Data,
46 pending_mutex: MutexMap<String, ()>,
47 claim_mutex: MutexMap<UiaaKey, ()>,
48 ip_ratelimiter: Ratelimiter<IpAddr>,
49 address_ratelimiter: Ratelimiter<EmailKey>,
50}
51
52struct Data {
53 database: Arc<Database>,
54 userid_email: Arc<Map>,
55 email_userid: Arc<Map>,
56 threepidsid_pending: Arc<Map>,
57 userdevicesessionid_threepid: Arc<Map>,
58}
59
60pub type UiaaSessionId = SmallString<[u8; 32]>;
66
67pub type UiaaKey = (OwnedUserId, OwnedDeviceId, UiaaSessionId);
72
73#[derive(Clone, Debug, Deserialize, Serialize)]
76struct Binding {
77 medium: Medium,
78 validated_at: MilliSecondsSinceUnixEpoch,
79 added_at: MilliSecondsSinceUnixEpoch,
80}
81
82#[derive(Clone, Debug)]
88pub struct Association {
89 pub medium: Medium,
91
92 pub address: String,
94}
95
96impl crate::Service for Service {
97 fn build(args: &crate::Args<'_>) -> Result<Arc<Self>> {
98 Ok(Arc::new(Self {
99 db: Data {
100 database: args.db.clone(),
101 userid_email: args.db["userid_email"].clone(),
102 email_userid: args.db["email_userid"].clone(),
103 threepidsid_pending: args.db["threepidsid_pending"].clone(),
104 userdevicesessionid_threepid: args.db["userdevicesessionid_threepid"].clone(),
105 },
106 pending_mutex: MutexMap::new(),
107 claim_mutex: MutexMap::new(),
108 ip_ratelimiter: Mutex::new(HashMap::new()),
109 address_ratelimiter: Mutex::new(HashMap::new()),
110 }))
111 }
112
113 fn name(&self) -> &str { crate::service::make_name(std::module_path!()) }
114}