Rewrite mention_to_address and parse_acct_uri, remove unnecessary regexp
This commit is contained in:
parent
477839345c
commit
de9bc7f35e
3 changed files with 17 additions and 22 deletions
|
@ -214,6 +214,9 @@ impl Actor {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// See also: USERNAME_RE in models::profiles::validators
|
||||||
|
const ACTOR_ADDRESS_RE: &str = r"(?P<username>[\w\.-]+)@(?P<hostname>[\w\.-]+)";
|
||||||
|
|
||||||
pub struct ActorAddress {
|
pub struct ActorAddress {
|
||||||
pub username: String,
|
pub username: String,
|
||||||
pub hostname: String,
|
pub hostname: String,
|
||||||
|
@ -230,9 +233,6 @@ impl ActorAddress {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// See also: USERNAME_RE in models::profiles::validators
|
|
||||||
pub const ACTOR_ADDRESS_RE: &str = r"(?P<username>[\w\.-]+)@(?P<hostname>[\w\.-]+)";
|
|
||||||
|
|
||||||
impl FromStr for ActorAddress {
|
impl FromStr for ActorAddress {
|
||||||
type Err = ValidationError;
|
type Err = ValidationError;
|
||||||
|
|
||||||
|
@ -390,9 +390,9 @@ mod tests {
|
||||||
const INSTANCE_URL: &str = "https://example.com";
|
const INSTANCE_URL: &str = "https://example.com";
|
||||||
|
|
||||||
#[test]
|
#[test]
|
||||||
fn test_actor_address_parsing() {
|
fn test_actor_address_parse_address() {
|
||||||
let value = "user_1@example.com";
|
let value = "user_1@example.com";
|
||||||
let actor_address = value.parse::<ActorAddress>().unwrap();
|
let actor_address: ActorAddress = value.parse().unwrap();
|
||||||
assert_eq!(actor_address.username, "user_1");
|
assert_eq!(actor_address.username, "user_1");
|
||||||
assert_eq!(actor_address.hostname, "example.com");
|
assert_eq!(actor_address.hostname, "example.com");
|
||||||
assert_eq!(actor_address.to_string(), value);
|
assert_eq!(actor_address.to_string(), value);
|
||||||
|
|
|
@ -11,7 +11,6 @@ use crate::models::profiles::types::DbActorProfile;
|
||||||
use super::links::is_inside_code_block;
|
use super::links::is_inside_code_block;
|
||||||
|
|
||||||
// See also: ACTOR_ADDRESS_RE in activitypub::actors::types
|
// See also: ACTOR_ADDRESS_RE in activitypub::actors::types
|
||||||
const MENTION_RE: &str = r"@?(?P<username>[\w\.-]+)@(?P<hostname>.+)";
|
|
||||||
const MENTION_SEARCH_RE: &str = r"(?m)(?P<before>^|\s|>|[\(])@(?P<mention>[^\s<]+)";
|
const MENTION_SEARCH_RE: &str = r"(?m)(?P<before>^|\s|>|[\(])@(?P<mention>[^\s<]+)";
|
||||||
const MENTION_SEARCH_SECONDARY_RE: &str = r"^(?P<username>[\w\.-]+)(@(?P<hostname>[\w\.-]+\w))?(?P<after>[\.,:?\)]?)$";
|
const MENTION_SEARCH_SECONDARY_RE: &str = r"^(?P<username>[\w\.-]+)(@(?P<hostname>[\w\.-]+\w))?(?P<after>[\.,:?\)]?)$";
|
||||||
|
|
||||||
|
@ -106,13 +105,10 @@ pub fn replace_mentions(
|
||||||
pub fn mention_to_address(
|
pub fn mention_to_address(
|
||||||
mention: &str,
|
mention: &str,
|
||||||
) -> Result<ActorAddress, ValidationError> {
|
) -> Result<ActorAddress, ValidationError> {
|
||||||
let mention_re = Regex::new(MENTION_RE).unwrap();
|
// @ prefix is optional
|
||||||
let mention_caps = mention_re.captures(mention)
|
let actor_address = mention.strip_prefix('@')
|
||||||
.ok_or(ValidationError("invalid mention tag"))?;
|
.unwrap_or(mention)
|
||||||
let actor_address = ActorAddress {
|
.parse()?;
|
||||||
username: mention_caps["username"].to_string(),
|
|
||||||
hostname: mention_caps["hostname"].to_string(),
|
|
||||||
};
|
|
||||||
Ok(actor_address)
|
Ok(actor_address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -209,6 +205,10 @@ mod tests {
|
||||||
let address_2 = mention_to_address(mention).unwrap();
|
let address_2 = mention_to_address(mention).unwrap();
|
||||||
assert_eq!(address_2.acct("server.info"), "user@example.com");
|
assert_eq!(address_2.acct("server.info"), "user@example.com");
|
||||||
|
|
||||||
|
let mention_without_prefix = "user@test.com";
|
||||||
|
let address_3 = mention_to_address(mention_without_prefix).unwrap();
|
||||||
|
assert_eq!(address_3.to_string(), mention_without_prefix);
|
||||||
|
|
||||||
let short_mention = "@user";
|
let short_mention = "@user";
|
||||||
let result = mention_to_address(short_mention);
|
let result = mention_to_address(short_mention);
|
||||||
assert_eq!(result.is_err(), true);
|
assert_eq!(result.is_err(), true);
|
||||||
|
|
|
@ -1,8 +1,7 @@
|
||||||
use actix_web::{get, web, HttpResponse};
|
use actix_web::{get, web, HttpResponse};
|
||||||
use regex::Regex;
|
|
||||||
use tokio_postgres::GenericClient;
|
use tokio_postgres::GenericClient;
|
||||||
|
|
||||||
use crate::activitypub::actors::types::{ActorAddress, ACTOR_ADDRESS_RE};
|
use crate::activitypub::actors::types::ActorAddress;
|
||||||
use crate::activitypub::constants::AP_MEDIA_TYPE;
|
use crate::activitypub::constants::AP_MEDIA_TYPE;
|
||||||
use crate::activitypub::identifiers::{
|
use crate::activitypub::identifiers::{
|
||||||
local_actor_id,
|
local_actor_id,
|
||||||
|
@ -21,13 +20,9 @@ use super::types::{
|
||||||
|
|
||||||
// https://datatracker.ietf.org/doc/html/rfc7565#section-7
|
// https://datatracker.ietf.org/doc/html/rfc7565#section-7
|
||||||
fn parse_acct_uri(uri: &str) -> Result<ActorAddress, ValidationError> {
|
fn parse_acct_uri(uri: &str) -> Result<ActorAddress, ValidationError> {
|
||||||
let uri_regexp = Regex::new(&format!("acct:{}", ACTOR_ADDRESS_RE)).unwrap();
|
let actor_address = uri.strip_prefix("acct:")
|
||||||
let uri_caps = uri_regexp.captures(uri)
|
.ok_or(ValidationError("invalid query target"))?
|
||||||
.ok_or(ValidationError("invalid query target"))?;
|
.parse()?;
|
||||||
let actor_address = ActorAddress {
|
|
||||||
username: uri_caps["username"].to_string(),
|
|
||||||
hostname: uri_caps["hostname"].to_string(),
|
|
||||||
};
|
|
||||||
Ok(actor_address)
|
Ok(actor_address)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue