Check-in [f748e99b70]
Logged in as anonymous
Overview
Comment:regex in get_id was defunct, fix regex, fix logic to filter unknown domains
Downloads: Tarball | ZIP archive | SQL archive
Timelines: family | ancestors | descendants | both | trunk
Files: files | file ages | folders
SHA3-256: f748e99b701a463ac31bcb5d51c297564aa92527aa45988f26812d922cda0df1
User & Date: arcade on 2026-08-01 10:24:03.733
Other Links: manifest | tags
Context
2026-08-01
10:46
expand README check-in: 880ce86a7f user: arcade tags: trunk
10:24
regex in get_id was defunct, fix regex, fix logic to filter unknown domains check-in: f748e99b70 user: arcade tags: trunk
09:06
remove lazy_static check-in: 997fb1cff4 user: arcade tags: trunk
Changes
82
83
84
85
86
87
88
89

90
91
92
93
94
95
96
82
83
84
85
86
87
88

89
90
91
92
93
94
95
96







-
+







				domains.insert(domain);
			} else {
				panic!("[smtp2tg.toml] can't check of domains in \"domains\": {domain}");
			}
		}
		let domains = domains.into_iter().map(|s| escape(&s))
			.collect::<Vec<String>>().join("|");
		let address = Regex::new(&format!("^(?P<user>[a-z0-9][-a-z0-9])(@({domains}))$")).stack()?;
		let address = Regex::new(&format!("^[a-z0-9][-a-z0-9]*(@({domains}))?$")).stack()?;
		let relay = match settings.get_string("unknown")
			.context("[smtp2tg.toml] can't get \"unknown\" policy.\n")?.as_str()
		{
			"relay" => true,
			"deny" => false,
			_ => {
				bail!("[smtp2tg.toml] \"unknown\" should be either \"relay\" or \"deny\".\n");
104
105
106
107
108
109
110
111

112
113
114
115

116
117
118
119
120
121






122
123
124
125
126
127
128
104
105
106
107
108
109
110

111




112






113
114
115
116
117
118
119
120
121
122
123
124
125







-
+
-
-
-
-
+
-
-
-
-
-
-
+
+
+
+
+
+







			tg,
			fields,
			address,
		})
	}

	/// Returns id for provided email address
	pub fn get_id (&self, name_str: &str) -> Result<&ChatPeerId> {
	pub fn get_id (&self, name: &str) -> Result<&ChatPeerId> {
		// here we need to store String locally to borrow it after
		let mut link = name_str;
		let name: String;
		if let Some(caps) = self.address.captures(link) {
		if self.address.is_match(name) {
			name = caps["name"].to_string();
			link = &name;
		}
		match self.tg.get(link) {
			Ok(addr) => Ok(addr),
			Err(_) => Ok(&self.tg.default),
			match self.tg.get(name) {
				Ok(addr) => Ok(addr),
				Err(_) => Ok(&self.tg.default),
			}
		} else {
			bail!("Doesn't look like address from one of our domains.");
		}
	}

	/// Attempt to deliver one message
	async fn relay_mail (&self) -> Result<()> {
		if let Some(headers) = &self.headers {
			let mail = mail_parser::MessageParser::new().parse(&self.data)
35
36
37
38
39
40
41






42
43
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49







+
+
+
+
+
+


		("someone", 0),
		("root", -1),
		("unknown@example.com", 0),
	];
	for (email, id) in cases {
		assert_eq!(*server.get_id(email)?, ChatPeerId::from(id), "email [{email}] expected to return id [{id}]");
	}
	let cases = [
		"someone@otherdomain.net",
	];
	for email in cases {
		assert!(server.get_id(email).unwrap_err().to_string().contains("Doesn't look like address from one of our domains."), "email [{email}] expected to fail");
	}
	Ok(())
}