Skip to content

Commit e6566e6

Browse files
committed
Merge remote-tracking branch 'dsaxton/blacklist'
2 parents 2184378 + 690e2b0 commit e6566e6

File tree

4 files changed

+94
-2
lines changed

4 files changed

+94
-2
lines changed

noteguard.toml

-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
21
pipeline = ["protected_events", "kinds", "content", "whitelist", "ratelimit"]
32

43
[filters.ratelimit]

src/filters/blacklist.rs

+39
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
use crate::{Action, InputMessage, NoteFilter, OutputMessage};
2+
use serde::Deserialize;
3+
4+
#[derive(Deserialize, Default)]
5+
pub struct Blacklist {
6+
pub pubkeys: Option<Vec<String>>,
7+
pub ips: Option<Vec<String>>,
8+
}
9+
10+
impl NoteFilter for Blacklist {
11+
fn filter_note(&mut self, msg: &InputMessage) -> OutputMessage {
12+
let reject_message = "blocked: pubkey/ip is blacklisted".to_string();
13+
if let Some(pubkeys) = &self.pubkeys {
14+
if pubkeys.contains(&msg.event.pubkey) {
15+
return OutputMessage::new(
16+
msg.event.id.clone(),
17+
Action::Reject,
18+
Some(reject_message),
19+
);
20+
}
21+
}
22+
23+
if let Some(ips) = &self.ips {
24+
if ips.contains(&msg.source_info) {
25+
return OutputMessage::new(
26+
msg.event.id.clone(),
27+
Action::Reject,
28+
Some(reject_message),
29+
);
30+
}
31+
}
32+
33+
OutputMessage::new(msg.event.id.clone(), Action::Accept, None)
34+
}
35+
36+
fn name(&self) -> &'static str {
37+
"blacklist"
38+
}
39+
}

src/filters/mod.rs

+2
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
mod blacklist;
12
mod content;
23
mod kinds;
34
mod protected_events;
@@ -7,6 +8,7 @@ mod whitelist;
78
#[cfg(feature = "forwarder")]
89
mod forwarder;
910

11+
pub use blacklist::Blacklist;
1012
pub use content::Content;
1113
pub use kinds::Kinds;
1214
pub use protected_events::ProtectedEvents;

src/main.rs

+53-1
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
use noteguard::filters::{Content, Kinds, ProtectedEvents, RateLimit, Whitelist};
1+
use noteguard::filters::{Blacklist, Content, Kinds, ProtectedEvents, RateLimit, Whitelist};
22

33
#[cfg(feature = "forwarder")]
44
use noteguard::filters::Forwarder;
@@ -47,6 +47,7 @@ impl Noteguard {
4747
fn register_builtin_filters(&mut self) {
4848
self.register_filter::<RateLimit>();
4949
self.register_filter::<Whitelist>();
50+
self.register_filter::<Blacklist>();
5051
self.register_filter::<ProtectedEvents>();
5152
self.register_filter::<Kinds>();
5253
self.register_filter::<Content>();
@@ -217,6 +218,7 @@ mod tests {
217218
let noteguard = Noteguard::new();
218219
assert!(noteguard.registered_filters.contains_key("ratelimit"));
219220
assert!(noteguard.registered_filters.contains_key("whitelist"));
221+
assert!(noteguard.registered_filters.contains_key("blacklist"));
220222
assert!(noteguard
221223
.registered_filters
222224
.contains_key("protected_events"));
@@ -315,6 +317,56 @@ mod tests {
315317
assert_eq!(output_message.action, Action::Reject);
316318
}
317319

320+
#[test]
321+
fn test_blacklist_reject() {
322+
let mut noteguard = Noteguard::new();
323+
324+
let config: Config = toml::from_str(
325+
r#"
326+
pipeline = ["blacklist"]
327+
[filters.blacklist]
328+
pubkeys = ["mock_pubkey"]
329+
"#,
330+
)
331+
.expect("Failed to parse config");
332+
333+
noteguard
334+
.load_config(&config)
335+
.expect("Failed to load config");
336+
337+
let input_message = create_mock_input_message("test_event_3", "new");
338+
let output_message = noteguard.run(input_message);
339+
340+
assert_eq!(output_message.action, Action::Reject);
341+
assert_eq!(
342+
output_message.msg.expect("Failed to get message"),
343+
"blocked: pubkey/ip is blacklisted".to_string()
344+
);
345+
}
346+
347+
#[test]
348+
fn test_blacklist_accept() {
349+
let mut noteguard = Noteguard::new();
350+
351+
let config: Config = toml::from_str(
352+
r#"
353+
pipeline = ["blacklist"]
354+
[filters.blacklist]
355+
pubkeys = ["not_blacklisted"]
356+
"#,
357+
)
358+
.expect("Failed to parse config");
359+
360+
noteguard
361+
.load_config(&config)
362+
.expect("Failed to load config");
363+
364+
let input_message = create_mock_input_message("test_event_4", "new");
365+
let output_message = noteguard.run(input_message);
366+
367+
assert_eq!(output_message.action, Action::Accept);
368+
}
369+
318370
#[test]
319371
fn test_deserialize_input_message() {
320372
let input_json = r#"

0 commit comments

Comments
 (0)