diff options
author | Felix Ableitner <me@nutomic.com> | 2019-12-26 20:48:13 +0100 |
---|---|---|
committer | Felix Ableitner <me@nutomic.com> | 2019-12-27 17:30:46 +0100 |
commit | b7c24a372bfe80057d71edef856afd985714f660 (patch) | |
tree | cf8636830bbe49ac452d95d586c1b5b3c6874753 /server/src | |
parent | 4e952af00c43c75b7c03e672eff3f809daef6e69 (diff) |
Fix review comments
Diffstat (limited to 'server/src')
-rw-r--r-- | server/src/db/community.rs | 4 | ||||
-rw-r--r-- | server/src/db/password_reset_request.rs | 2 | ||||
-rw-r--r-- | server/src/db/user.rs | 4 | ||||
-rw-r--r-- | server/src/feeds.rs | 4 | ||||
-rw-r--r-- | server/src/lib.rs | 2 | ||||
-rw-r--r-- | server/src/webfinger.rs | 45 |
6 files changed, 36 insertions, 25 deletions
diff --git a/server/src/db/community.rs b/server/src/db/community.rs index 74579535..e8bf5bbc 100644 --- a/server/src/db/community.rs +++ b/server/src/db/community.rs @@ -69,8 +69,8 @@ impl Community { .first::<Self>(conn) } - pub fn get_community_url(community_name: &str) -> String { - format!("https://{}/c/{}", Settings::get().hostname, community_name) + pub fn get_url(&self) -> String { + format!("https://{}/c/{}", Settings::get().hostname, self.name) } } diff --git a/server/src/db/password_reset_request.rs b/server/src/db/password_reset_request.rs index d620f179..337b2e6b 100644 --- a/server/src/db/password_reset_request.rs +++ b/server/src/db/password_reset_request.rs @@ -1,7 +1,7 @@ use super::*; use crate::schema::password_reset_request; use crate::schema::password_reset_request::dsl::*; -use sha2::{Sha256, Digest}; +use sha2::{Digest, Sha256}; #[derive(Queryable, Identifiable, PartialEq, Debug)] #[table_name = "password_reset_request"] diff --git a/server/src/db/user.rs b/server/src/db/user.rs index 21407e58..c636f4e6 100644 --- a/server/src/db/user.rs +++ b/server/src/db/user.rs @@ -151,8 +151,8 @@ impl User_ { } } - pub fn get_user_profile_url(username: &str) -> String { - format!("https://{}/u/{}", Settings::get().hostname, username) + pub fn get_profile_url(&self) -> String { + format!("https://{}/u/{}", Settings::get().hostname, self.name) } pub fn find_by_jwt(conn: &PgConnection, jwt: &str) -> Result<Self, Error> { diff --git a/server/src/feeds.rs b/server/src/feeds.rs index c735688b..c624bcc5 100644 --- a/server/src/feeds.rs +++ b/server/src/feeds.rs @@ -111,7 +111,7 @@ fn get_feed_user(sort_type: &SortType, user_name: String) -> Result<String, Erro let site_view = SiteView::read(&conn)?; let user = User_::find_by_username(&conn, &user_name)?; - let user_url = User_::get_user_profile_url(&user_name); + let user_url = user.get_profile_url(); let posts = PostQueryBuilder::create(&conn) .listing_type(ListingType::All) @@ -135,7 +135,7 @@ fn get_feed_community(sort_type: &SortType, community_name: String) -> Result<St let site_view = SiteView::read(&conn)?; let community = Community::read_from_name(&conn, community_name)?; - let community_url = Community::get_community_url(&community.name); + let community_url = community.get_url(); let posts = PostQueryBuilder::create(&conn) .listing_type(ListingType::All) diff --git a/server/src/lib.rs b/server/src/lib.rs index 79cd7122..ed76b22b 100644 --- a/server/src/lib.rs +++ b/server/src/lib.rs @@ -11,7 +11,6 @@ pub extern crate actix; pub extern crate actix_web; pub extern crate bcrypt; pub extern crate chrono; -pub extern crate sha2; pub extern crate dotenv; pub extern crate jsonwebtoken; pub extern crate lettre; @@ -20,6 +19,7 @@ pub extern crate rand; pub extern crate regex; pub extern crate serde; pub extern crate serde_json; +pub extern crate sha2; pub extern crate strum; pub mod api; diff --git a/server/src/webfinger.rs b/server/src/webfinger.rs index 47e2037b..55894745 100644 --- a/server/src/webfinger.rs +++ b/server/src/webfinger.rs @@ -4,6 +4,7 @@ use crate::Settings; use actix_web::body::Body; use actix_web::web::Query; use actix_web::HttpResponse; +use regex::Regex; use serde::Deserialize; use serde_json::json; @@ -12,6 +13,14 @@ pub struct Params { resource: String, } +lazy_static! { + static ref WEBFINGER_COMMUNITY_REGEX: Regex = Regex::new(&format!( + "^group:([a-z0-9_]{{3, 20}})@{}$", + Settings::get().hostname + )) + .unwrap(); +} + /// Responds to webfinger requests of the following format. There isn't any real documentation for /// this, but it described in this blog post: /// https://mastodon.social/.well-known/webfinger?resource=acct:gargron@mastodon.social @@ -19,26 +28,27 @@ pub struct Params { /// You can also view the webfinger response that Mastodon sends: /// https://radical.town/.well-known/webfinger?resource=acct:felix@radical.town pub fn get_webfinger_response(info: Query<Params>) -> HttpResponse<Body> { - // NOTE: Calling the parameter "account" maybe doesn't really make sense, but should give us the - // best compatibility with existing implementations. We could also support an alternative name - // like "group", and encourage others to use that. - let community_identifier = info.resource.replace("acct:", ""); - let split_identifier: Vec<&str> = community_identifier.split("@").collect(); - let community_name = split_identifier[0]; - // It looks like Mastodon does not return webfinger requests for users from other instances, so we - // don't do that either. - if split_identifier.len() != 2 || split_identifier[1] != Settings::get().hostname { - return HttpResponse::NotFound().finish(); - } + let regex_parsed = WEBFINGER_COMMUNITY_REGEX + .captures(&info.resource) + .map(|c| c.get(1)); + // TODO: replace this with .flatten() once we are running rust 1.40 + let regex_parsed_flattened = match regex_parsed { + Some(s) => s, + None => None, + }; + let community_name = match regex_parsed_flattened { + Some(c) => c.as_str(), + None => return HttpResponse::NotFound().finish(), + }; // Make sure the requested community exists. let conn = establish_connection(); - match Community::read_from_name(&conn, community_name.to_owned()) { + let community = match Community::read_from_name(&conn, community_name.to_string()) { + Ok(o) => o, Err(_) => return HttpResponse::NotFound().finish(), - Ok(c) => c, }; - let community_url = Community::get_community_url(&community_name); + let community_url = community.get_url(); let json = json!({ "subject": info.resource, @@ -54,7 +64,8 @@ pub fn get_webfinger_response(info: Query<Params>) -> HttpResponse<Body> { { "rel": "self", "type": "application/activity+json", - "href": community_url // Yes this is correct, this link doesn't include the `.json` extension + // Yes this is correct, this link doesn't include the `.json` extension + "href": community_url } // TODO: this also needs to return the subscribe link once that's implemented //{ @@ -63,7 +74,7 @@ pub fn get_webfinger_response(info: Query<Params>) -> HttpResponse<Body> { //} ] }); - return HttpResponse::Ok() + HttpResponse::Ok() .content_type("application/activity+json") - .body(json.to_string()); + .body(json.to_string()) } |