use crate::{Event, Kind, RelayUrl, TagKind, TagStandard};
pub fn is_valid_auth_event(event: &Event, relay_url: &RelayUrl, challenge: &str) -> bool {
if event.kind != Kind::Authentication {
return false;
}
match event.tags.find_standardized(TagKind::Relay) {
Some(TagStandard::Relay(url)) => {
if url != relay_url {
return false;
}
}
Some(..) | None => return false,
}
match event.tags.find_standardized(TagKind::Challenge) {
Some(TagStandard::Challenge(c)) => {
if c != challenge {
return false;
}
}
Some(..) | None => return false,
}
true
}
#[cfg(all(test, feature = "std"))]
mod tests {
use super::*;
use crate::{EventBuilder, Keys};
#[test]
fn test_valid_auth_event() {
let keys = Keys::generate();
let relay_url = RelayUrl::parse("wss://relay.damus.io").unwrap();
let challenge = "1234567890";
let event = EventBuilder::auth(challenge, relay_url.clone())
.sign_with_keys(&keys)
.unwrap();
assert!(is_valid_auth_event(&event, &relay_url, challenge));
}
#[test]
fn test_invalid_auth_event() {
let keys = Keys::generate();
let relay_url = RelayUrl::parse("wss://relay.damus.io").unwrap();
let challenge = "1234567890";
let event = EventBuilder::auth("abcd", relay_url.clone())
.sign_with_keys(&keys)
.unwrap();
assert!(!is_valid_auth_event(&event, &relay_url, challenge));
let event = EventBuilder::auth(challenge, RelayUrl::parse("wss://example.com").unwrap())
.sign_with_keys(&keys)
.unwrap();
assert!(!is_valid_auth_event(&event, &relay_url, challenge));
let event = EventBuilder::text_note("abcd")
.sign_with_keys(&keys)
.unwrap();
assert!(!is_valid_auth_event(&event, &relay_url, challenge));
}
}