Fix review comments

This commit is contained in:
Felix Ableitner 2019-12-26 20:48:13 +01:00
parent 4e952af00c
commit b7c24a372b
12 changed files with 53 additions and 43 deletions

1
.gitignore vendored
View file

@ -2,4 +2,3 @@ ansible/inventory
ansible/passwords/ ansible/passwords/
build/ build/
.idea/ .idea/
docker/dev/config/config.hjson

View file

@ -38,7 +38,7 @@ FROM alpine:3.10
RUN apk add libpq RUN apk add libpq
# Copy resources # Copy resources
COPY server/config /config COPY server/config/defaults.hjson /config/defaults.hjson
COPY --from=rust /app/server/target/x86_64-unknown-linux-musl/release/lemmy_server /app/lemmy COPY --from=rust /app/server/target/x86_64-unknown-linux-musl/release/lemmy_server /app/lemmy
COPY --from=node /app/ui/dist /app/dist COPY --from=node /app/ui/dist /app/dist

View file

@ -69,7 +69,7 @@ RUN addgroup --gid 1000 lemmy
RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
# Copy resources # Copy resources
COPY server/config /app/config COPY server/config/defaults.hjson /config/defaults.hjson
COPY --from=rust /app/server/ready /app/lemmy COPY --from=rust /app/server/ready /app/lemmy
COPY --from=node /app/ui/dist /app/dist COPY --from=node /app/ui/dist /app/dist

View file

@ -69,7 +69,7 @@ RUN addgroup --gid 1000 lemmy
RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
# Copy resources # Copy resources
COPY server/config /config COPY server/config/defaults.hjson /config/defaults.hjson
COPY --from=rust /app/server/ready /app/lemmy COPY --from=rust /app/server/ready /app/lemmy
COPY --from=node /app/ui/dist /app/dist COPY --from=node /app/ui/dist /app/dist

View file

@ -65,7 +65,7 @@ RUN addgroup --gid 1000 lemmy
RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy RUN adduser --disabled-password --shell /bin/sh --uid 1000 --ingroup lemmy lemmy
# Copy resources # Copy resources
COPY server/config /app/config COPY server/config/defaults.hjson /config/defaults.hjson
COPY --from=rust /app/server/ready /app/lemmy COPY --from=rust /app/server/ready /app/lemmy
COPY --from=node /app/ui/dist /app/dist COPY --from=node /app/ui/dist /app/dist

View file

@ -1,19 +1,19 @@
{ {
# settings related to the postgresql database # settings related to the postgresql database
database: { database: {
# username to connect to postgres # username to connect to postgres
user: "lemmy" user: "lemmy"
# password to connect to postgres # password to connect to postgres
password: "password" password: "password"
# host where postgres is running # host where postgres is running
host: "localhost" host: "localhost"
# port where postgres can be accessed # port where postgres can be accessed
port: 5432 port: 5432
# name of the postgres database for lemmy # name of the postgres database for lemmy
database: "lemmy" database: "lemmy"
# maximum number of active sql connections # maximum number of active sql connections
pool_size: 5 pool_size: 5
} }
# the domain name of your instance (eg "dev.lemmy.ml") # the domain name of your instance (eg "dev.lemmy.ml")
hostname: "rrr" hostname: "rrr"
# address where lemmy should listen for incoming requests # address where lemmy should listen for incoming requests

View file

@ -69,8 +69,8 @@ impl Community {
.first::<Self>(conn) .first::<Self>(conn)
} }
pub fn get_community_url(community_name: &str) -> String { pub fn get_url(&self) -> String {
format!("https://{}/c/{}", Settings::get().hostname, community_name) format!("https://{}/c/{}", Settings::get().hostname, self.name)
} }
} }

View file

@ -1,7 +1,7 @@
use super::*; use super::*;
use crate::schema::password_reset_request; use crate::schema::password_reset_request;
use crate::schema::password_reset_request::dsl::*; use crate::schema::password_reset_request::dsl::*;
use sha2::{Sha256, Digest}; use sha2::{Digest, Sha256};
#[derive(Queryable, Identifiable, PartialEq, Debug)] #[derive(Queryable, Identifiable, PartialEq, Debug)]
#[table_name = "password_reset_request"] #[table_name = "password_reset_request"]

View file

@ -151,8 +151,8 @@ impl User_ {
} }
} }
pub fn get_user_profile_url(username: &str) -> String { pub fn get_profile_url(&self) -> String {
format!("https://{}/u/{}", Settings::get().hostname, username) format!("https://{}/u/{}", Settings::get().hostname, self.name)
} }
pub fn find_by_jwt(conn: &PgConnection, jwt: &str) -> Result<Self, Error> { pub fn find_by_jwt(conn: &PgConnection, jwt: &str) -> Result<Self, Error> {

View file

@ -111,7 +111,7 @@ fn get_feed_user(sort_type: &SortType, user_name: String) -> Result<String, Erro
let site_view = SiteView::read(&conn)?; let site_view = SiteView::read(&conn)?;
let user = User_::find_by_username(&conn, &user_name)?; 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) let posts = PostQueryBuilder::create(&conn)
.listing_type(ListingType::All) .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 site_view = SiteView::read(&conn)?;
let community = Community::read_from_name(&conn, community_name)?; 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) let posts = PostQueryBuilder::create(&conn)
.listing_type(ListingType::All) .listing_type(ListingType::All)

View file

@ -11,7 +11,6 @@ pub extern crate actix;
pub extern crate actix_web; pub extern crate actix_web;
pub extern crate bcrypt; pub extern crate bcrypt;
pub extern crate chrono; pub extern crate chrono;
pub extern crate sha2;
pub extern crate dotenv; pub extern crate dotenv;
pub extern crate jsonwebtoken; pub extern crate jsonwebtoken;
pub extern crate lettre; pub extern crate lettre;
@ -20,6 +19,7 @@ pub extern crate rand;
pub extern crate regex; pub extern crate regex;
pub extern crate serde; pub extern crate serde;
pub extern crate serde_json; pub extern crate serde_json;
pub extern crate sha2;
pub extern crate strum; pub extern crate strum;
pub mod api; pub mod api;

View file

@ -4,6 +4,7 @@ use crate::Settings;
use actix_web::body::Body; use actix_web::body::Body;
use actix_web::web::Query; use actix_web::web::Query;
use actix_web::HttpResponse; use actix_web::HttpResponse;
use regex::Regex;
use serde::Deserialize; use serde::Deserialize;
use serde_json::json; use serde_json::json;
@ -12,6 +13,14 @@ pub struct Params {
resource: String, 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 /// Responds to webfinger requests of the following format. There isn't any real documentation for
/// this, but it described in this blog post: /// this, but it described in this blog post:
/// https://mastodon.social/.well-known/webfinger?resource=acct:gargron@mastodon.social /// 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: /// You can also view the webfinger response that Mastodon sends:
/// https://radical.town/.well-known/webfinger?resource=acct:felix@radical.town /// https://radical.town/.well-known/webfinger?resource=acct:felix@radical.town
pub fn get_webfinger_response(info: Query<Params>) -> HttpResponse<Body> { 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 let regex_parsed = WEBFINGER_COMMUNITY_REGEX
// best compatibility with existing implementations. We could also support an alternative name .captures(&info.resource)
// like "group", and encourage others to use that. .map(|c| c.get(1));
let community_identifier = info.resource.replace("acct:", ""); // TODO: replace this with .flatten() once we are running rust 1.40
let split_identifier: Vec<&str> = community_identifier.split("@").collect(); let regex_parsed_flattened = match regex_parsed {
let community_name = split_identifier[0]; Some(s) => s,
// It looks like Mastodon does not return webfinger requests for users from other instances, so we None => None,
// don't do that either. };
if split_identifier.len() != 2 || split_identifier[1] != Settings::get().hostname { let community_name = match regex_parsed_flattened {
return HttpResponse::NotFound().finish(); Some(c) => c.as_str(),
} None => return HttpResponse::NotFound().finish(),
};
// Make sure the requested community exists. // Make sure the requested community exists.
let conn = establish_connection(); 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(), 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!({ let json = json!({
"subject": info.resource, "subject": info.resource,
@ -54,7 +64,8 @@ pub fn get_webfinger_response(info: Query<Params>) -> HttpResponse<Body> {
{ {
"rel": "self", "rel": "self",
"type": "application/activity+json", "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 // 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") .content_type("application/activity+json")
.body(json.to_string()); .body(json.to_string())
} }