diff --git a/Cargo.lock b/Cargo.lock index 7c709ffa6..65f718b3e 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1896,6 +1896,7 @@ dependencies = [ "chrono", "diesel", "lazy_static", + "lemmy_utils", "log", "regex", "serde 1.0.116", diff --git a/config/defaults.hjson b/config/defaults.hjson index 1da2a16cf..62fa98a6d 100644 --- a/config/defaults.hjson +++ b/config/defaults.hjson @@ -31,6 +31,8 @@ bind: "0.0.0.0" # port where lemmy should listen for incoming requests port: 8536 + # whether tls is required for activitypub. only disable this for debugging, never for producion. + tls_enabled: true # json web token for authorization between server and client jwt_secret: "changeme" # address where pictrs is available @@ -58,8 +60,6 @@ federation: { # whether to enable activitypub federation. this feature is in alpha, do not enable in production. enabled: false - # whether tls is required for activitypub. only disable this for debugging, never for producion. - tls_enabled: true # comma separated list of instances with which federation is allowed allowed_instances: "" # comma separated list of instances which are blocked from federating diff --git a/docker/federation/docker-compose.yml b/docker/federation/docker-compose.yml index b4181e5d2..8f01eadf7 100644 --- a/docker/federation/docker-compose.yml +++ b/docker/federation/docker-compose.yml @@ -43,7 +43,7 @@ services: - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_alpha:5432/lemmy - LEMMY_JWT_SECRET=changeme - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false + - LEMMY_TLS_ENABLED=false - LEMMY_FEDERATION__ALLOWED_INSTANCES=lemmy-beta,lemmy-gamma,lemmy-delta,lemmy-epsilon - LEMMY_PORT=8541 - LEMMY_SETUP__ADMIN_USERNAME=lemmy_alpha @@ -82,7 +82,7 @@ services: - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_beta:5432/lemmy - LEMMY_JWT_SECRET=changeme - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false + - LEMMY_TLS_ENABLED=false - LEMMY_FEDERATION__ALLOWED_INSTANCES=lemmy-alpha,lemmy-gamma,lemmy-delta,lemmy-epsilon - LEMMY_PORT=8551 - LEMMY_SETUP__ADMIN_USERNAME=lemmy_beta @@ -121,7 +121,7 @@ services: - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_gamma:5432/lemmy - LEMMY_JWT_SECRET=changeme - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false + - LEMMY_TLS_ENABLED=false - LEMMY_FEDERATION__ALLOWED_INSTANCES=lemmy-alpha,lemmy-beta,lemmy-delta,lemmy-epsilon - LEMMY_PORT=8561 - LEMMY_SETUP__ADMIN_USERNAME=lemmy_gamma @@ -161,7 +161,7 @@ services: - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_delta:5432/lemmy - LEMMY_JWT_SECRET=changeme - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false + - LEMMY_TLS_ENABLED=false - LEMMY_FEDERATION__ALLOWED_INSTANCES=lemmy-beta - LEMMY_PORT=8571 - LEMMY_SETUP__ADMIN_USERNAME=lemmy_delta @@ -201,7 +201,7 @@ services: - LEMMY_DATABASE_URL=postgres://lemmy:password@postgres_epsilon:5432/lemmy - LEMMY_JWT_SECRET=changeme - LEMMY_FEDERATION__ENABLED=true - - LEMMY_FEDERATION__TLS_ENABLED=false + - LEMMY_TLS_ENABLED=false - LEMMY_FEDERATION__BLOCKED_INSTANCES=lemmy-alpha - LEMMY_PORT=8581 - LEMMY_SETUP__ADMIN_USERNAME=lemmy_epsilon diff --git a/lemmy_api/src/user.rs b/lemmy_api/src/user.rs index e2b73c53e..4e6269268 100644 --- a/lemmy_api/src/user.rs +++ b/lemmy_api/src/user.rs @@ -913,7 +913,7 @@ impl Perform for PasswordReset { // TODO no i18n support here. let user_email = &user.email.expect("email"); let subject = &format!("Password reset for {}", user.name); - let hostname = &format!("https://{}", Settings::get().hostname); //TODO add https for now. + let hostname = &Settings::get().get_protocol_and_hostname(); let html = &format!("

Password Reset Request for {}


Click here to reset your password", user.name, hostname, &token); match send_email(subject, user_email, &user.name, html) { Ok(_o) => _o, @@ -977,8 +977,6 @@ impl Perform for CreatePrivateMessage { let data: &CreatePrivateMessage = &self; let user = get_user_from_jwt(&data.auth, context.pool()).await?; - let hostname = &format!("https://{}", Settings::get().hostname); - let content_slurs_removed = remove_slurs(&data.content.to_owned()); let private_message_form = PrivateMessageForm { @@ -1034,7 +1032,9 @@ impl Perform for CreatePrivateMessage { ); let html = &format!( "

Private Message


{} - {}

inbox", - user.name, &content_slurs_removed, hostname + user.name, + &content_slurs_removed, + Settings::get().get_protocol_and_hostname() ); match send_email(subject, &email, &recipient_user.name, html) { Ok(_o) => _o, diff --git a/lemmy_apub/src/activities.rs b/lemmy_apub/src/activities.rs index 3b1b12ab3..18781ef42 100644 --- a/lemmy_apub/src/activities.rs +++ b/lemmy_apub/src/activities.rs @@ -4,7 +4,7 @@ use activitystreams::{ object::AsObject, }; use lemmy_db::{community::Community, user::User_}; -use lemmy_utils::{apub::get_apub_protocol_string, settings::Settings, LemmyError}; +use lemmy_utils::{settings::Settings, LemmyError}; use lemmy_websocket::LemmyContext; use serde::{export::fmt::Debug, Serialize}; use url::{ParseError, Url}; @@ -40,9 +40,8 @@ where T: ToString, { let id = format!( - "{}://{}/activities/{}/{}", - get_apub_protocol_string(), - Settings::get().hostname, + "{}/activities/{}/{}", + Settings::get().get_protocol_and_hostname(), kind.to_string().to_lowercase(), Uuid::new_v4() ); diff --git a/lemmy_apub/src/community.rs b/lemmy_apub/src/community.rs index 8a41e8866..715b765b3 100644 --- a/lemmy_apub/src/community.rs +++ b/lemmy_apub/src/community.rs @@ -44,8 +44,8 @@ use lemmy_db::{ }; use lemmy_structs::blocking; use lemmy_utils::{ - apub::get_apub_protocol_string, location_info, + settings::Settings, utils::{check_slurs, check_slurs_opt, convert_datetime}, LemmyError, }; @@ -299,7 +299,7 @@ impl ActorType for Community { }; Ok(Url::parse(&format!( "{}://{}{}/inbox", - get_apub_protocol_string(), + Settings::get().get_protocol_string(), domain, port, ))?) diff --git a/lemmy_apub/src/fetcher.rs b/lemmy_apub/src/fetcher.rs index 4ce4082cd..3f2109ecb 100644 --- a/lemmy_apub/src/fetcher.rs +++ b/lemmy_apub/src/fetcher.rs @@ -27,9 +27,9 @@ use lemmy_db::{ }; use lemmy_structs::{blocking, site::SearchResponse}; use lemmy_utils::{ - apub::get_apub_protocol_string, location_info, request::{retry, RecvError}, + settings::Settings, LemmyError, }; use lemmy_websocket::LemmyContext; @@ -117,7 +117,12 @@ pub async fn search_by_apub_id( return Err(anyhow!("Invalid search query: {}", query).into()); }; - let url = format!("{}://{}{}", get_apub_protocol_string(), instance, name); + let url = format!( + "{}://{}{}", + Settings::get().get_protocol_string(), + instance, + name + ); Url::parse(&url)? } else { Url::parse(&query)? diff --git a/lemmy_apub/src/lib.rs b/lemmy_apub/src/lib.rs index 22eb9fbe0..3f37c5d3c 100644 --- a/lemmy_apub/src/lib.rs +++ b/lemmy_apub/src/lib.rs @@ -32,7 +32,6 @@ use chrono::NaiveDateTime; use lemmy_db::{activity::do_insert_activity, user::User_, DbPool}; use lemmy_structs::{blocking, WebFingerResponse}; use lemmy_utils::{ - apub::get_apub_protocol_string, location_info, request::{retry, RecvError}, settings::Settings, @@ -97,7 +96,7 @@ fn check_is_apub_id_valid(apub_id: &Url) -> Result<(), LemmyError> { }; } - if apub_id.scheme() != get_apub_protocol_string() { + if apub_id.scheme() != Settings::get().get_protocol_string() { return Err(anyhow!("invalid apub id scheme: {:?}", apub_id.scheme()).into()); } @@ -319,7 +318,7 @@ pub async fn fetch_webfinger_url( ) -> Result { let fetch_url = format!( "{}://{}/.well-known/webfinger?resource=acct:{}@{}", - get_apub_protocol_string(), + Settings::get().get_protocol_string(), mention.domain, mention.name, mention.domain diff --git a/lemmy_db/Cargo.toml b/lemmy_db/Cargo.toml index 814c169fa..904b16937 100644 --- a/lemmy_db/Cargo.toml +++ b/lemmy_db/Cargo.toml @@ -8,6 +8,7 @@ name = "lemmy_db" path = "src/lib.rs" [dependencies] +lemmy_utils = { path = "../lemmy_utils" } diesel = { version = "1.4", features = ["postgres","chrono","r2d2","64-column-tables","serde_json"] } chrono = { version = "0.4", features = ["serde"] } serde = { version = "1.0", features = ["derive"] } diff --git a/lemmy_db/src/user.rs b/lemmy_db/src/user.rs index f2c20e947..15fb592c7 100644 --- a/lemmy_db/src/user.rs +++ b/lemmy_db/src/user.rs @@ -6,6 +6,7 @@ use crate::{ }; use bcrypt::{hash, DEFAULT_COST}; use diesel::{dsl::*, result::Error, *}; +use lemmy_utils::settings::Settings; use serde::Serialize; #[derive(Clone, Queryable, Identifiable, PartialEq, Debug, Serialize)] @@ -151,7 +152,12 @@ impl User_ { } pub fn get_profile_url(&self, hostname: &str) -> String { - format!("https://{}/u/{}", hostname, self.name) + format!( + "{}://{}/u/{}", + Settings::get().get_protocol_string(), + hostname, + self.name + ) } pub fn upsert(conn: &PgConnection, user_form: &UserForm) -> Result { diff --git a/lemmy_structs/src/lib.rs b/lemmy_structs/src/lib.rs index 3efe0bead..9b67866a9 100644 --- a/lemmy_structs/src/lib.rs +++ b/lemmy_structs/src/lib.rs @@ -77,7 +77,7 @@ fn do_send_local_notifs( do_send_email: bool, ) -> Vec { let mut recipient_ids = Vec::new(); - let hostname = &format!("https://{}", Settings::get().hostname); + let hostname = &Settings::get().get_protocol_and_hostname(); // Send the local mentions for mention in mentions diff --git a/lemmy_utils/src/apub.rs b/lemmy_utils/src/apub.rs index 08e7a4491..4f6ec22f0 100644 --- a/lemmy_utils/src/apub.rs +++ b/lemmy_utils/src/apub.rs @@ -35,14 +35,6 @@ pub enum EndpointType { PrivateMessage, } -pub fn get_apub_protocol_string() -> &'static str { - if Settings::get().federation.tls_enabled { - "https" - } else { - "http" - } -} - /// Generates the ActivityPub ID for a given object type and ID. pub fn make_apub_endpoint(endpoint_type: EndpointType, name: &str) -> Url { let point = match endpoint_type { @@ -54,9 +46,8 @@ pub fn make_apub_endpoint(endpoint_type: EndpointType, name: &str) -> Url { }; Url::parse(&format!( - "{}://{}/{}/{}", - get_apub_protocol_string(), - Settings::get().hostname, + "{}/{}/{}", + Settings::get().get_protocol_and_hostname(), point, name )) diff --git a/lemmy_utils/src/request.rs b/lemmy_utils/src/request.rs index 4aa70c6fd..cbd778c6e 100644 --- a/lemmy_utils/src/request.rs +++ b/lemmy_utils/src/request.rs @@ -1,4 +1,4 @@ -use crate::{apub::get_apub_protocol_string, settings::Settings, LemmyError}; +use crate::{settings::Settings, LemmyError}; use anyhow::anyhow; use log::error; use percent_encoding::{utf8_percent_encode, NON_ALPHANUMERIC}; @@ -149,9 +149,8 @@ pub async fn fetch_iframely_and_pictrs_data( // The full urls are necessary for federation let pictrs_thumbnail = if let Some(pictrs_hash) = pictrs_hash { Some(format!( - "{}://{}/pictrs/image/{}", - get_apub_protocol_string(), - Settings::get().hostname, + "{}/pictrs/image/{}", + Settings::get().get_protocol_and_hostname(), pictrs_hash )) } else { diff --git a/lemmy_utils/src/settings.rs b/lemmy_utils/src/settings.rs index 82bdceb21..d3775c4b4 100644 --- a/lemmy_utils/src/settings.rs +++ b/lemmy_utils/src/settings.rs @@ -12,6 +12,7 @@ pub struct Settings { pub hostname: String, pub bind: IpAddr, pub port: u16, + pub tls_enabled: bool, pub jwt_secret: String, pub pictrs_url: String, pub rate_limit: RateLimitConfig, @@ -68,7 +69,6 @@ pub struct DatabaseConfig { #[derive(Debug, Deserialize, Clone)] pub struct FederationConfig { pub enabled: bool, - pub tls_enabled: bool, pub allowed_instances: String, pub blocked_instances: String, } @@ -157,6 +157,21 @@ impl Settings { blocked_instances } + /// Returns either "http" or "https", depending on tls_enabled setting + pub fn get_protocol_string(&self) -> &'static str { + if self.tls_enabled { + "https" + } else { + "http" + } + } + + /// Returns something like `http://localhost` or `https://dev.lemmy.ml`, + /// with the correct protocol and hostname. + pub fn get_protocol_and_hostname(&self) -> String { + format!("{}://{}", self.get_protocol_string(), self.hostname) + } + pub fn save_config_file(data: &str) -> Result { fs::write(CONFIG_FILE, data)?; diff --git a/src/code_migrations.rs b/src/code_migrations.rs index 6a69035da..6743fb298 100644 --- a/src/code_migrations.rs +++ b/src/code_migrations.rs @@ -13,7 +13,7 @@ use lemmy_db::{ Crud, }; use lemmy_utils::{ - apub::{generate_actor_keypair, get_apub_protocol_string, make_apub_endpoint, EndpointType}, + apub::{generate_actor_keypair, make_apub_endpoint, EndpointType}, settings::Settings, LemmyError, }; @@ -206,9 +206,8 @@ fn post_thumbnail_url_updates_2020_07_27(conn: &PgConnection) -> Result<(), Lemm info!("Running post_thumbnail_url_updates_2020_07_27"); let domain_prefix = format!( - "{}://{}/pictrs/image/", - get_apub_protocol_string(), - Settings::get().hostname + "{}/pictrs/image/", + Settings::get().get_protocol_and_hostname(), ); let incorrect_thumbnails = post.filter(thumbnail_url.not_like("http%")); diff --git a/src/routes/feeds.rs b/src/routes/feeds.rs index 2c36ac233..f9111169a 100644 --- a/src/routes/feeds.rs +++ b/src/routes/feeds.rs @@ -71,7 +71,7 @@ fn get_feed_all_data(conn: &PgConnection, sort_type: &SortType) -> Result Result Result { let mut i = ItemBuilder::default(); i.title(format!("Reply from {}", creator_name)); - let author_url = format!("https://{}/u/{}", Settings::get().hostname, creator_name); + let author_url = format!( + "{}/u/{}", + Settings::get().get_protocol_and_hostname(), + creator_name + ); i.author(format!( "/u/{} (link)", creator_name, author_url @@ -306,7 +313,11 @@ fn create_post_items(posts: Vec) -> Result, LemmyError> { i.title(p.name); - let author_url = format!("https://{}/u/{}", Settings::get().hostname, p.creator_name); + let author_url = format!( + "{}/u/{}", + Settings::get().get_protocol_and_hostname(), + p.creator_name + ); i.author(format!( "/u/{} (link)", p.creator_name, author_url @@ -315,7 +326,11 @@ fn create_post_items(posts: Vec) -> Result, LemmyError> { let dt = DateTime::::from_utc(p.published, Utc); i.pub_date(dt.to_rfc2822()); - let post_url = format!("https://{}/post/{}", Settings::get().hostname, p.id); + let post_url = format!( + "{}/post/{}", + Settings::get().get_protocol_and_hostname(), + p.id + ); i.comments(post_url.to_owned()); let guid = GuidBuilder::default() .permalink(true) @@ -325,8 +340,8 @@ fn create_post_items(posts: Vec) -> Result, LemmyError> { i.guid(guid); let community_url = format!( - "https://{}/c/{}", - Settings::get().hostname, + "{}/c/{}", + Settings::get().get_protocol_and_hostname(), p.community_name ); diff --git a/src/routes/nodeinfo.rs b/src/routes/nodeinfo.rs index 984151c42..c41be0e94 100644 --- a/src/routes/nodeinfo.rs +++ b/src/routes/nodeinfo.rs @@ -3,7 +3,7 @@ use anyhow::anyhow; use lemmy_api::version; use lemmy_db::site_view::SiteView; use lemmy_structs::blocking; -use lemmy_utils::{apub::get_apub_protocol_string, settings::Settings, LemmyError}; +use lemmy_utils::{settings::Settings, LemmyError}; use lemmy_websocket::LemmyContext; use serde::{Deserialize, Serialize}; use url::Url; @@ -19,9 +19,8 @@ async fn node_info_well_known() -> Result, LemmyError> { links: NodeInfoWellKnownLinks { rel: Url::parse("http://nodeinfo.diaspora.software/ns/schema/2.0")?, href: Url::parse(&format!( - "{}://{}/nodeinfo/2.0.json", - get_apub_protocol_string(), - Settings::get().hostname + "{}/nodeinfo/2.0.json", + Settings::get().get_protocol_and_hostname() ))?, }, };