tor_dircommon/
authority.rs1use std::net::SocketAddr;
7
8use derive_deftly::Deftly;
9use getset::Getters;
10use tor_config::define_list_builder_accessors;
11use tor_config::derive::prelude::*;
12use tor_llcrypto::pk::rsa::RsaIdentity;
13
14#[derive(Debug, Clone, Deftly, Eq, PartialEq, Getters)]
20#[derive_deftly(TorConfig)]
21pub struct AuthorityContacts {
22 #[deftly(tor_config(no_magic, setter(skip), default = "default_v3idents()"))]
29 #[getset(get = "pub")]
30 v3idents: Vec<RsaIdentity>,
31
32 #[deftly(tor_config(no_magic, setter(skip), default = "default_uploads()"))]
40 #[getset(get = "pub")]
41 uploads: Vec<Vec<SocketAddr>>,
42
43 #[deftly(tor_config(no_magic, setter(skip), default = "default_downloads()"))]
50 #[getset(get = "pub")]
51 downloads: Vec<Vec<SocketAddr>>,
52
53 #[deftly(tor_config(no_magic, setter(skip), default = "default_votes()"))]
60 #[getset(get = "pub")]
61 votes: Vec<Vec<SocketAddr>>,
62}
63
64define_list_builder_accessors! {
65 struct AuthorityContactsBuilder {
66 pub v3idents: [RsaIdentity],
67 pub uploads: [Vec<SocketAddr>],
68 pub downloads: [Vec<SocketAddr>],
69 pub votes: [Vec<SocketAddr>],
70 }
71}
72
73fn default_v3idents() -> Vec<RsaIdentity> {
75 fn rsa(hex: &str) -> RsaIdentity {
76 RsaIdentity::from_hex(hex).expect("invalid hex?!?")
77 }
78
79 vec![
80 rsa("27102BC123E7AF1D4741AE047E160C91ADC76B21"), rsa("0232AF901C31A04EE9848595AF9BB7620D4C5B2E"), rsa("E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58"), rsa("70849B868D606BAECFB6128C5E3D782029AA394F"), rsa("ED03BB616EB2F60BEC80151114BB25CEF515B226"), rsa("23D15D965BC35114467363C165C4F724B64B4F66"), rsa("49015F787433103580E3B66A1707A00E60F2D15B"), rsa("F533C81CEF0BC0267857C99B2F471ADF249FA232"), rsa("2F3DF9CA0E5D36F2685A2DA67184EB8DCB8CBA8C"), ]
90}
91
92fn default_uploads() -> Vec<Vec<SocketAddr>> {
97 fn sa(s: &str) -> SocketAddr {
99 s.parse().expect("invalid socket address?!?")
100 }
101
102 vec![
103 vec![
105 sa("204.13.164.118:80"),
106 sa("[2620:13:4000:6000::1000:118]:80"),
107 ],
108 vec![sa("193.23.244.244:80"), sa("[2001:678:558:1000::244]:80")],
110 vec![sa("45.66.35.11:80"), sa("[2a09:61c0::1337]:80")],
112 vec![sa("216.218.219.41:80"), sa("[2001:470:164:2::2]:80")],
114 vec![
116 sa("131.188.40.189:80"),
117 sa("[2001:638:a000:4140::ffff:189]:80"),
118 ],
119 vec![sa("199.58.81.140:80")],
121 vec![sa("171.25.193.9:443"), sa("[2001:67c:289c::9]:443")],
123 vec![sa("128.31.0.39:9231")],
125 vec![sa("217.196.147.77:80"), sa("[2a02:16a8:662:2203::1]:80")],
127 ]
128}
129
130fn default_downloads() -> Vec<Vec<SocketAddr>> {
132 default_uploads()
133}
134
135fn default_votes() -> Vec<Vec<SocketAddr>> {
137 default_uploads()
138}
139
140#[cfg(test)]
141mod test {
142 #![allow(clippy::bool_assert_comparison)]
144 #![allow(clippy::clone_on_copy)]
145 #![allow(clippy::dbg_macro)]
146 #![allow(clippy::mixed_attributes_style)]
147 #![allow(clippy::print_stderr)]
148 #![allow(clippy::print_stdout)]
149 #![allow(clippy::single_char_pattern)]
150 #![allow(clippy::unwrap_used)]
151 #![allow(clippy::unchecked_time_subtraction)]
152 #![allow(clippy::useless_vec)]
153 #![allow(clippy::needless_pass_by_value)]
154 #![allow(clippy::unnecessary_wraps)]
156
157 use super::*;
158
159 #[test]
160 fn default_auths() {
161 let dflt = AuthorityContacts::builder().build().unwrap();
162 assert_eq!(dflt.v3idents, default_v3idents());
163 assert_eq!(dflt.uploads, default_uploads());
164 assert_eq!(dflt.downloads, default_downloads());
165 assert_eq!(dflt.votes, default_votes());
166
167 assert_eq!(
168 dflt.v3idents[8],
169 RsaIdentity::from_hex("2F3DF9CA0E5D36F2685A2DA67184EB8DCB8CBA8C").unwrap()
170 );
171 assert_eq!(
172 dflt.uploads[8],
173 vec![
174 "217.196.147.77:80".parse().unwrap(),
175 "[2a02:16a8:662:2203::1]:80".parse().unwrap()
176 ]
177 );
178 assert_eq!(dflt.uploads[8], dflt.downloads[8]);
179 assert_eq!(dflt.uploads[8], dflt.votes[8]);
180 }
181}