Dont pass settings as parameter

This commit is contained in:
Felix Ableitner 2024-10-18 11:02:30 +02:00
parent 859dfb3f81
commit e87da6c5d1
55 changed files with 211 additions and 358 deletions

View file

@ -72,7 +72,6 @@ pub async fn create_comment_report(
&comment_report_view.creator.name, &comment_report_view.creator.name,
&comment_report_view.comment_creator.name, &comment_report_view.comment_creator.name,
&mut context.pool(), &mut context.pool(),
context.settings(),
) )
.await?; .await?;
} }

View file

@ -11,7 +11,10 @@ use lemmy_api_common::{
utils::{check_email_verified, check_registration_application, check_user_valid}, utils::{check_email_verified, check_registration_application, check_user_valid},
}; };
use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views::structs::{LocalUserView, SiteView};
use lemmy_utils::error::{LemmyErrorType, LemmyResult}; use lemmy_utils::{
error::{LemmyErrorType, LemmyResult},
settings::SETTINGS,
};
#[tracing::instrument(skip(context))] #[tracing::instrument(skip(context))]
pub async fn login( pub async fn login(
@ -44,11 +47,7 @@ pub async fn login(
// Check the totp if enabled // Check the totp if enabled
if local_user_view.local_user.totp_2fa_enabled { if local_user_view.local_user.totp_2fa_enabled {
check_totp_2fa_valid( check_totp_2fa_valid(&local_user_view, &data.totp_2fa_token, &SETTINGS.hostname)?;
&local_user_view,
&data.totp_2fa_token,
&context.settings().hostname,
)?;
} }
let jwt = Claims::generate(local_user_view.local_user.id, req, &context).await?; let jwt = Claims::generate(local_user_view.local_user.id, req, &context).await?;

View file

@ -23,6 +23,6 @@ pub async fn reset_password(
check_email_verified(&local_user_view, &site_view)?; check_email_verified(&local_user_view, &site_view)?;
// Email the pure token to the user. // Email the pure token to the user.
send_password_reset_email(&local_user_view, &mut context.pool(), context.settings()).await?; send_password_reset_email(&local_user_view, &mut context.pool()).await?;
Ok(Json(SuccessResponse::default())) Ok(Json(SuccessResponse::default()))
} }

View file

@ -64,13 +64,7 @@ pub async fn save_user_settings(
// if email was changed, check that it is not taken and send verification mail // if email was changed, check that it is not taken and send verification mail
if previous_email.deref() != email { if previous_email.deref() != email {
LocalUser::check_is_email_taken(&mut context.pool(), email).await?; LocalUser::check_is_email_taken(&mut context.pool(), email).await?;
send_verification_email( send_verification_email(&local_user_view, email, &mut context.pool()).await?;
&local_user_view,
email,
&mut context.pool(),
context.settings(),
)
.await?;
} }
} }

View file

@ -6,7 +6,7 @@ use lemmy_api_common::{
}; };
use lemmy_db_schema::source::local_user::{LocalUser, LocalUserUpdateForm}; use lemmy_db_schema::source::local_user::{LocalUser, LocalUserUpdateForm};
use lemmy_db_views::structs::LocalUserView; use lemmy_db_views::structs::LocalUserView;
use lemmy_utils::error::LemmyResult; use lemmy_utils::{error::LemmyResult, settings::SETTINGS};
/// Enable or disable two-factor-authentication. The current setting is determined from /// Enable or disable two-factor-authentication. The current setting is determined from
/// [LocalUser.totp_2fa_enabled]. /// [LocalUser.totp_2fa_enabled].
@ -25,7 +25,7 @@ pub async fn update_totp(
check_totp_2fa_valid( check_totp_2fa_valid(
&local_user_view, &local_user_view,
&Some(data.totp_token.clone()), &Some(data.totp_token.clone()),
&context.settings().hostname, &SETTINGS.hostname,
)?; )?;
// toggle the 2fa setting // toggle the 2fa setting

View file

@ -37,12 +37,7 @@ pub async fn verify_email(
if site_view.local_site.application_email_admins { if site_view.local_site.application_email_admins {
let local_user = LocalUserView::read(&mut context.pool(), local_user_id).await?; let local_user = LocalUserView::read(&mut context.pool(), local_user_id).await?;
send_new_applicant_email_to_admins( send_new_applicant_email_to_admins(&local_user.person.name, &mut context.pool()).await?;
&local_user.person.name,
&mut context.pool(),
context.settings(),
)
.await?;
} }
Ok(Json(SuccessResponse::default())) Ok(Json(SuccessResponse::default()))

View file

@ -67,7 +67,6 @@ pub async fn create_post_report(
&post_report_view.creator.name, &post_report_view.creator.name,
&post_report_view.post_creator.name, &post_report_view.post_creator.name,
&mut context.pool(), &mut context.pool(),
context.settings(),
) )
.await?; .await?;
} }

View file

@ -56,7 +56,6 @@ pub async fn create_pm_report(
&private_message_report_view.creator.name, &private_message_report_view.creator.name,
&private_message_report_view.private_message_creator.name, &private_message_report_view.private_message_creator.name,
&mut context.pool(), &mut context.pool(),
context.settings(),
) )
.await?; .await?;
} }

View file

@ -62,7 +62,7 @@ pub async fn approve_registration_application(
LocalUserView::read(&mut context.pool(), approved_user_id).await?; LocalUserView::read(&mut context.pool(), approved_user_id).await?;
if approved_local_user_view.local_user.email.is_some() { if approved_local_user_view.local_user.email.is_some() {
// Email sending may fail, but this won't revert the application approval // Email sending may fail, but this won't revert the application approval
send_application_approved_email(&approved_local_user_view, context.settings()).await?; send_application_approved_email(&approved_local_user_view).await?;
} }
}; };

View file

@ -26,6 +26,7 @@ use lemmy_db_views::structs::{CommentView, LocalUserView, PostView};
use lemmy_db_views_actor::structs::CommunityView; use lemmy_db_views_actor::structs::CommunityView;
use lemmy_utils::{ use lemmy_utils::{
error::LemmyResult, error::LemmyResult,
settings::SETTINGS,
utils::{markdown::markdown_to_html, mention::MentionData}, utils::{markdown::markdown_to_html, mention::MentionData},
}; };
@ -99,7 +100,7 @@ pub async fn send_local_notifs(
local_user_view: Option<&LocalUserView>, local_user_view: Option<&LocalUserView>,
) -> LemmyResult<Vec<LocalUserId>> { ) -> LemmyResult<Vec<LocalUserId>> {
let mut recipient_ids = Vec::new(); let mut recipient_ids = Vec::new();
let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname()); let inbox_link = format!("{}/inbox", SETTINGS.get_protocol_and_hostname());
// let person = my_local_user.person; // let person = my_local_user.person;
// Read the comment view to get extra info // Read the comment view to get extra info
@ -116,7 +117,7 @@ pub async fn send_local_notifs(
// Send the local mentions // Send the local mentions
for mention in mentions for mention in mentions
.iter() .iter()
.filter(|m| m.is_local(&context.settings().hostname) && m.name.ne(&person.name)) .filter(|m| m.is_local() && m.name.ne(&person.name))
{ {
let mention_name = mention.name.clone(); let mention_name = mention.name.clone();
let user_view = LocalUserView::read_from_name(&mut context.pool(), &mention_name).await; let user_view = LocalUserView::read_from_name(&mut context.pool(), &mention_name).await;
@ -147,7 +148,6 @@ pub async fn send_local_notifs(
&mention_user_view, &mention_user_view,
&lang.notification_mentioned_by_subject(&person.name), &lang.notification_mentioned_by_subject(&person.name),
&lang.notification_mentioned_by_body(&content, &inbox_link, &person.name), &lang.notification_mentioned_by_body(&content, &inbox_link, &person.name),
context.settings(),
) )
.await .await
} }
@ -199,7 +199,6 @@ pub async fn send_local_notifs(
&parent_user_view, &parent_user_view,
&lang.notification_comment_reply_subject(&person.name), &lang.notification_comment_reply_subject(&person.name),
&lang.notification_comment_reply_body(&content, &inbox_link, &person.name), &lang.notification_comment_reply_body(&content, &inbox_link, &person.name),
context.settings(),
) )
.await .await
} }
@ -245,7 +244,6 @@ pub async fn send_local_notifs(
&parent_user_view, &parent_user_view,
&lang.notification_post_reply_subject(&person.name), &lang.notification_post_reply_subject(&person.name),
&lang.notification_post_reply_body(&content, &inbox_link, &person.name), &lang.notification_post_reply_body(&content, &inbox_link, &person.name),
context.settings(),
) )
.await .await
} }

View file

@ -7,7 +7,10 @@ use lemmy_db_schema::{
sensitive::SensitiveString, sensitive::SensitiveString,
source::login_token::{LoginToken, LoginTokenCreateForm}, source::login_token::{LoginToken, LoginTokenCreateForm},
}; };
use lemmy_utils::error::{LemmyErrorExt, LemmyErrorType, LemmyResult}; use lemmy_utils::{
error::{LemmyErrorExt, LemmyErrorType, LemmyResult},
settings::SETTINGS,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
#[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)] #[derive(Debug, Serialize, Deserialize, Clone, PartialEq, Eq, Hash)]
@ -38,7 +41,7 @@ impl Claims {
req: HttpRequest, req: HttpRequest,
context: &LemmyContext, context: &LemmyContext,
) -> LemmyResult<SensitiveString> { ) -> LemmyResult<SensitiveString> {
let hostname = context.settings().hostname.clone(); let hostname = SETTINGS.hostname.clone();
let my_claims = Claims { let my_claims = Claims {
sub: user_id.0.to_string(), sub: user_id.0.to_string(),
iss: hostname, iss: hostname,

View file

@ -4,10 +4,7 @@ use lemmy_db_schema::{
source::secret::Secret, source::secret::Secret,
utils::{build_db_pool_for_tests, ActualDbPool, DbPool}, utils::{build_db_pool_for_tests, ActualDbPool, DbPool},
}; };
use lemmy_utils::{ use lemmy_utils::{rate_limit::RateLimitCell, settings::SETTINGS};
rate_limit::RateLimitCell,
settings::{structs::Settings, SETTINGS},
};
use reqwest_middleware::{ClientBuilder, ClientWithMiddleware}; use reqwest_middleware::{ClientBuilder, ClientWithMiddleware};
use std::sync::Arc; use std::sync::Arc;
@ -42,9 +39,6 @@ impl LemmyContext {
pub fn client(&self) -> &ClientWithMiddleware { pub fn client(&self) -> &ClientWithMiddleware {
&self.client &self.client
} }
pub fn settings(&self) -> &'static Settings {
&SETTINGS
}
pub fn secret(&self) -> &Secret { pub fn secret(&self) -> &Secret {
&self.secret &self.secret
} }
@ -72,7 +66,7 @@ impl LemmyContext {
let context = LemmyContext::create(pool, client, secret, rate_limit_cell.clone()); let context = LemmyContext::create(pool, client, secret, rate_limit_cell.clone());
FederationConfig::builder() FederationConfig::builder()
.domain(context.settings().hostname.clone()) .domain(SETTINGS.hostname.clone())
.app_data(context) .app_data(context)
.debug(true) .debug(true)
// Dont allow any network fetches // Dont allow any network fetches

View file

@ -19,7 +19,10 @@ use lemmy_db_schema::{
}; };
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyError, LemmyErrorType, LemmyResult}, error::{LemmyError, LemmyErrorType, LemmyResult},
settings::structs::{PictrsImageMode, Settings}, settings::{
structs::{PictrsImageMode, Settings},
SETTINGS,
},
REQWEST_TIMEOUT, REQWEST_TIMEOUT,
VERSION, VERSION,
}; };
@ -296,7 +299,7 @@ pub async fn purge_image_from_pictrs(image_url: &Url, context: &LemmyContext) ->
.next_back() .next_back()
.ok_or(LemmyErrorType::ImageUrlMissingLastPathSegment)?; .ok_or(LemmyErrorType::ImageUrlMissingLastPathSegment)?;
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let purge_url = format!("{}internal/purge?alias={}", pictrs_config.url, alias); let purge_url = format!("{}internal/purge?alias={}", pictrs_config.url, alias);
let pictrs_api_key = pictrs_config let pictrs_api_key = pictrs_config
@ -323,7 +326,7 @@ pub async fn delete_image_from_pictrs(
delete_token: &str, delete_token: &str,
context: &LemmyContext, context: &LemmyContext,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let url = format!( let url = format!(
"{}image/delete/{}/{}", "{}image/delete/{}/{}",
pictrs_config.url, &delete_token, &alias pictrs_config.url, &delete_token, &alias
@ -341,7 +344,7 @@ pub async fn delete_image_from_pictrs(
/// Retrieves the image with local pict-rs and generates a thumbnail. Returns the thumbnail url. /// Retrieves the image with local pict-rs and generates a thumbnail. Returns the thumbnail url.
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
async fn generate_pictrs_thumbnail(image_url: &Url, context: &LemmyContext) -> LemmyResult<Url> { async fn generate_pictrs_thumbnail(image_url: &Url, context: &LemmyContext) -> LemmyResult<Url> {
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
match pictrs_config.image_mode() { match pictrs_config.image_mode() {
PictrsImageMode::None => return Ok(image_url.clone()), PictrsImageMode::None => return Ok(image_url.clone()),
@ -357,7 +360,7 @@ async fn generate_pictrs_thumbnail(image_url: &Url, context: &LemmyContext) -> L
"{}image/download?url={}&resize={}", "{}image/download?url={}&resize={}",
pictrs_config.url, pictrs_config.url,
encode(image_url.as_str()), encode(image_url.as_str()),
context.settings().pictrs_config()?.max_thumbnail_size SETTINGS.pictrs_config()?.max_thumbnail_size
); );
let res = context let res = context
@ -382,7 +385,7 @@ async fn generate_pictrs_thumbnail(image_url: &Url, context: &LemmyContext) -> L
pictrs_alias: image.file.clone(), pictrs_alias: image.file.clone(),
pictrs_delete_token: image.delete_token.clone(), pictrs_delete_token: image.delete_token.clone(),
}; };
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let thumbnail_url = image.thumbnail_url(&protocol_and_hostname)?; let thumbnail_url = image.thumbnail_url(&protocol_and_hostname)?;
// Also store the details for the image // Also store the details for the image
@ -400,7 +403,7 @@ pub async fn fetch_pictrs_proxied_image_details(
image_url: &Url, image_url: &Url,
context: &LemmyContext, context: &LemmyContext,
) -> LemmyResult<PictrsFileDetails> { ) -> LemmyResult<PictrsFileDetails> {
let pictrs_url = context.settings().pictrs_config()?.url; let pictrs_url = SETTINGS.pictrs_config()?.url;
let encoded_image_url = encode(image_url.as_str()); let encoded_image_url = encode(image_url.as_str());
// Pictrs needs you to fetch the proxied image before you can fetch the details // Pictrs needs you to fetch the proxied image before you can fetch the details

View file

@ -50,7 +50,7 @@ use lemmy_utils::{
email::{send_email, translations::Lang}, email::{send_email, translations::Lang},
error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult}, error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult},
rate_limit::{ActionType, BucketConfig}, rate_limit::{ActionType, BucketConfig},
settings::structs::{PictrsImageMode, Settings}, settings::{structs::PictrsImageMode, SETTINGS},
utils::{ utils::{
markdown::{image_links::markdown_rewrite_image_links, markdown_check_for_blocked_urls}, markdown::{image_links::markdown_rewrite_image_links, markdown_check_for_blocked_urls},
slurs::{build_slur_regex, remove_slurs}, slurs::{build_slur_regex, remove_slurs},
@ -409,26 +409,13 @@ pub fn honeypot_check(honeypot: &Option<String>) -> LemmyResult<()> {
} }
} }
pub async fn send_email_to_user( pub async fn send_email_to_user(local_user_view: &LocalUserView, subject: &str, body: &str) {
local_user_view: &LocalUserView,
subject: &str,
body: &str,
settings: &Settings,
) {
if local_user_view.person.banned || !local_user_view.local_user.send_notifications_to_email { if local_user_view.person.banned || !local_user_view.local_user.send_notifications_to_email {
return; return;
} }
if let Some(user_email) = &local_user_view.local_user.email { if let Some(user_email) = &local_user_view.local_user.email {
match send_email( match send_email(subject, user_email, &local_user_view.person.name, body).await {
subject,
user_email,
&local_user_view.person.name,
body,
settings,
)
.await
{
Ok(_o) => _o, Ok(_o) => _o,
Err(e) => warn!("{}", e), Err(e) => warn!("{}", e),
}; };
@ -438,7 +425,6 @@ pub async fn send_email_to_user(
pub async fn send_password_reset_email( pub async fn send_password_reset_email(
user: &LocalUserView, user: &LocalUserView,
pool: &mut DbPool<'_>, pool: &mut DbPool<'_>,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
// Generate a random token // Generate a random token
let token = uuid::Uuid::new_v4().to_string(); let token = uuid::Uuid::new_v4().to_string();
@ -446,10 +432,10 @@ pub async fn send_password_reset_email(
let email = &user.local_user.email.clone().expect("email"); let email = &user.local_user.email.clone().expect("email");
let lang = get_interface_language(user); let lang = get_interface_language(user);
let subject = &lang.password_reset_subject(&user.person.name); let subject = &lang.password_reset_subject(&user.person.name);
let protocol_and_hostname = settings.get_protocol_and_hostname(); let protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let reset_link = format!("{}/password_change/{}", protocol_and_hostname, &token); let reset_link = format!("{}/password_change/{}", protocol_and_hostname, &token);
let body = &lang.password_reset_body(reset_link, &user.person.name); let body = &lang.password_reset_body(reset_link, &user.person.name);
send_email(subject, email, &user.person.name, body, settings).await?; send_email(subject, email, &user.person.name, body).await?;
// Insert the row after successful send, to avoid using daily reset limit while // Insert the row after successful send, to avoid using daily reset limit while
// email sending is broken. // email sending is broken.
@ -463,7 +449,6 @@ pub async fn send_verification_email(
user: &LocalUserView, user: &LocalUserView,
new_email: &str, new_email: &str,
pool: &mut DbPool<'_>, pool: &mut DbPool<'_>,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let form = EmailVerificationForm { let form = EmailVerificationForm {
local_user_id: user.local_user.id, local_user_id: user.local_user.id,
@ -472,15 +457,15 @@ pub async fn send_verification_email(
}; };
let verify_link = format!( let verify_link = format!(
"{}/verify_email/{}", "{}/verify_email/{}",
settings.get_protocol_and_hostname(), SETTINGS.get_protocol_and_hostname(),
&form.verification_token &form.verification_token
); );
EmailVerification::create(pool, &form).await?; EmailVerification::create(pool, &form).await?;
let lang = get_interface_language(user); let lang = get_interface_language(user);
let subject = lang.verify_email_subject(&settings.hostname); let subject = lang.verify_email_subject(&SETTINGS.hostname);
let body = lang.verify_email_body(&settings.hostname, &user.person.name, verify_link); let body = lang.verify_email_body(&SETTINGS.hostname, &user.person.name, verify_link);
send_email(&subject, new_email, &user.person.name, &body, settings).await?; send_email(&subject, new_email, &user.person.name, &body).await?;
Ok(()) Ok(())
} }
@ -554,37 +539,33 @@ pub async fn get_url_blocklist(context: &LemmyContext) -> LemmyResult<RegexSet>
) )
} }
pub async fn send_application_approved_email( pub async fn send_application_approved_email(user: &LocalUserView) -> LemmyResult<()> {
user: &LocalUserView,
settings: &Settings,
) -> LemmyResult<()> {
let email = &user.local_user.email.clone().expect("email"); let email = &user.local_user.email.clone().expect("email");
let lang = get_interface_language(user); let lang = get_interface_language(user);
let subject = lang.registration_approved_subject(&user.person.actor_id); let subject = lang.registration_approved_subject(&user.person.actor_id);
let body = lang.registration_approved_body(&settings.hostname); let body = lang.registration_approved_body(&SETTINGS.hostname);
send_email(&subject, email, &user.person.name, &body, settings).await send_email(&subject, email, &user.person.name, &body).await
} }
/// Send a new applicant email notification to all admins /// Send a new applicant email notification to all admins
pub async fn send_new_applicant_email_to_admins( pub async fn send_new_applicant_email_to_admins(
applicant_username: &str, applicant_username: &str,
pool: &mut DbPool<'_>, pool: &mut DbPool<'_>,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
// Collect the admins with emails // Collect the admins with emails
let admins = LocalUserView::list_admins_with_emails(pool).await?; let admins = LocalUserView::list_admins_with_emails(pool).await?;
let applications_link = &format!( let applications_link = &format!(
"{}/registration_applications", "{}/registration_applications",
settings.get_protocol_and_hostname(), SETTINGS.get_protocol_and_hostname(),
); );
for admin in &admins { for admin in &admins {
let email = &admin.local_user.email.clone().expect("email"); let email = &admin.local_user.email.clone().expect("email");
let lang = get_interface_language_from_settings(admin); let lang = get_interface_language_from_settings(admin);
let subject = lang.new_application_subject(&settings.hostname, applicant_username); let subject = lang.new_application_subject(&SETTINGS.hostname, applicant_username);
let body = lang.new_application_body(applications_link); let body = lang.new_application_body(applications_link);
send_email(&subject, email, &admin.person.name, &body, settings).await?; send_email(&subject, email, &admin.person.name, &body).await?;
} }
Ok(()) Ok(())
} }
@ -594,19 +575,18 @@ pub async fn send_new_report_email_to_admins(
reporter_username: &str, reporter_username: &str,
reported_username: &str, reported_username: &str,
pool: &mut DbPool<'_>, pool: &mut DbPool<'_>,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
// Collect the admins with emails // Collect the admins with emails
let admins = LocalUserView::list_admins_with_emails(pool).await?; let admins = LocalUserView::list_admins_with_emails(pool).await?;
let reports_link = &format!("{}/reports", settings.get_protocol_and_hostname(),); let reports_link = &format!("{}/reports", SETTINGS.get_protocol_and_hostname(),);
for admin in &admins { for admin in &admins {
let email = &admin.local_user.email.clone().expect("email"); let email = &admin.local_user.email.clone().expect("email");
let lang = get_interface_language_from_settings(admin); let lang = get_interface_language_from_settings(admin);
let subject = lang.new_report_subject(&settings.hostname, reported_username, reporter_username); let subject = lang.new_report_subject(&SETTINGS.hostname, reported_username, reporter_username);
let body = lang.new_report_body(reports_link); let body = lang.new_report_body(reports_link);
send_email(&subject, email, &admin.person.name, &body, settings).await?; send_email(&subject, email, &admin.person.name, &body).await?;
} }
Ok(()) Ok(())
} }
@ -956,7 +936,6 @@ pub enum EndpointType {
pub fn generate_local_apub_endpoint( pub fn generate_local_apub_endpoint(
endpoint_type: EndpointType, endpoint_type: EndpointType,
name: &str, name: &str,
domain: &str,
) -> Result<DbUrl, ParseError> { ) -> Result<DbUrl, ParseError> {
let point = match endpoint_type { let point = match endpoint_type {
EndpointType::Community => "c", EndpointType::Community => "c",
@ -966,6 +945,7 @@ pub fn generate_local_apub_endpoint(
EndpointType::PrivateMessage => "private_message", EndpointType::PrivateMessage => "private_message",
}; };
let domain = &SETTINGS.get_protocol_and_hostname();
Ok(Url::parse(&format!("{domain}/{point}/{name}"))?.into()) Ok(Url::parse(&format!("{domain}/{point}/{name}"))?.into())
} }
@ -977,8 +957,8 @@ pub fn generate_inbox_url(actor_id: &DbUrl) -> Result<DbUrl, ParseError> {
Ok(Url::parse(&format!("{actor_id}/inbox"))?.into()) Ok(Url::parse(&format!("{actor_id}/inbox"))?.into())
} }
pub fn generate_shared_inbox_url(settings: &Settings) -> LemmyResult<DbUrl> { pub fn generate_shared_inbox_url() -> LemmyResult<DbUrl> {
let url = format!("{}/inbox", settings.get_protocol_and_hostname()); let url = format!("{}/inbox", SETTINGS.get_protocol_and_hostname());
Ok(Url::parse(&url)?.into()) Ok(Url::parse(&url)?.into())
} }
@ -1044,7 +1024,7 @@ pub async fn process_markdown(
markdown_check_for_blocked_urls(&text, url_blocklist)?; markdown_check_for_blocked_urls(&text, url_blocklist)?;
if context.settings().pictrs_config()?.image_mode() == PictrsImageMode::ProxyAllImages { if SETTINGS.pictrs_config()?.image_mode() == PictrsImageMode::ProxyAllImages {
let (text, links) = markdown_rewrite_image_links(text); let (text, links) = markdown_rewrite_image_links(text);
RemoteImage::create(&mut context.pool(), links.clone()).await?; RemoteImage::create(&mut context.pool(), links.clone()).await?;
@ -1053,8 +1033,7 @@ pub async fn process_markdown(
// Insert image details for the remote image // Insert image details for the remote image
let details_res = fetch_pictrs_proxied_image_details(&link, context).await; let details_res = fetch_pictrs_proxied_image_details(&link, context).await;
if let Ok(details) = details_res { if let Ok(details) = details_res {
let proxied = let proxied = build_proxied_image_url(&link, &SETTINGS.get_protocol_and_hostname())?;
build_proxied_image_url(&link, &context.settings().get_protocol_and_hostname())?;
let details_form = details.build_image_details_form(&proxied); let details_form = details.build_image_details_form(&proxied);
ImageDetails::create(&mut context.pool(), &details_form).await?; ImageDetails::create(&mut context.pool(), &details_form).await?;
} }
@ -1089,12 +1068,12 @@ async fn proxy_image_link_internal(
context: &LemmyContext, context: &LemmyContext,
) -> LemmyResult<DbUrl> { ) -> LemmyResult<DbUrl> {
// Dont rewrite links pointing to local domain. // Dont rewrite links pointing to local domain.
if link.domain() == Some(&context.settings().hostname) { if link.domain() == Some(&SETTINGS.hostname) {
Ok(link.into()) Ok(link.into())
} else if image_mode == PictrsImageMode::ProxyAllImages { } else if image_mode == PictrsImageMode::ProxyAllImages {
RemoteImage::create(&mut context.pool(), vec![link.clone()]).await?; RemoteImage::create(&mut context.pool(), vec![link.clone()]).await?;
let proxied = build_proxied_image_url(&link, &context.settings().get_protocol_and_hostname())?; let proxied = build_proxied_image_url(&link, &SETTINGS.get_protocol_and_hostname())?;
// This should fail softly, since pictrs might not even be running // This should fail softly, since pictrs might not even be running
let details_res = fetch_pictrs_proxied_image_details(&link, context).await; let details_res = fetch_pictrs_proxied_image_details(&link, context).await;
@ -1112,12 +1091,7 @@ async fn proxy_image_link_internal(
/// Rewrite a link to go through `/api/v3/image_proxy` endpoint. This is only for remote urls and /// Rewrite a link to go through `/api/v3/image_proxy` endpoint. This is only for remote urls and
/// if image_proxy setting is enabled. /// if image_proxy setting is enabled.
pub(crate) async fn proxy_image_link(link: Url, context: &LemmyContext) -> LemmyResult<DbUrl> { pub(crate) async fn proxy_image_link(link: Url, context: &LemmyContext) -> LemmyResult<DbUrl> {
proxy_image_link_internal( proxy_image_link_internal(link, SETTINGS.pictrs_config()?.image_mode(), context).await
link,
context.settings().pictrs_config()?.image_mode(),
context,
)
.await
} }
pub async fn proxy_image_link_opt_api( pub async fn proxy_image_link_opt_api(

View file

@ -74,11 +74,7 @@ pub async fn create_community(
} }
// Double check for duplicate community actor_ids // Double check for duplicate community actor_ids
let community_actor_id = generate_local_apub_endpoint( let community_actor_id = generate_local_apub_endpoint(EndpointType::Community, &data.name)?;
EndpointType::Community,
&data.name,
&context.settings().get_protocol_and_hostname(),
)?;
let community_dupe = let community_dupe =
Community::read_from_apub_id(&mut context.pool(), &community_actor_id).await?; Community::read_from_apub_id(&mut context.pool(), &community_actor_id).await?;
if community_dupe.is_some() { if community_dupe.is_some() {
@ -97,7 +93,7 @@ pub async fn create_community(
private_key: Some(keypair.private_key), private_key: Some(keypair.private_key),
followers_url: Some(generate_followers_url(&community_actor_id)?), followers_url: Some(generate_followers_url(&community_actor_id)?),
inbox_url: Some(generate_inbox_url(&community_actor_id)?), inbox_url: Some(generate_inbox_url(&community_actor_id)?),
shared_inbox_url: Some(generate_shared_inbox_url(context.settings())?), shared_inbox_url: Some(generate_shared_inbox_url()?),
posting_restricted_to_mods: data.posting_restricted_to_mods, posting_restricted_to_mods: data.posting_restricted_to_mods,
visibility: data.visibility, visibility: data.visibility,
..CommunityInsertForm::new( ..CommunityInsertForm::new(

View file

@ -23,6 +23,7 @@ use lemmy_db_schema::{
use lemmy_db_views::structs::{LocalUserView, PrivateMessageView}; use lemmy_db_views::structs::{LocalUserView, PrivateMessageView};
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyErrorExt, LemmyErrorType, LemmyResult}, error::{LemmyErrorExt, LemmyErrorType, LemmyResult},
settings::SETTINGS,
utils::{markdown::markdown_to_html, validation::is_valid_body_field}, utils::{markdown::markdown_to_html, validation::is_valid_body_field},
}; };
@ -63,14 +64,13 @@ pub async fn create_private_message(
let recipient_id = data.recipient_id; let recipient_id = data.recipient_id;
let local_recipient = LocalUserView::read_person(&mut context.pool(), recipient_id).await?; let local_recipient = LocalUserView::read_person(&mut context.pool(), recipient_id).await?;
let lang = get_interface_language(&local_recipient); let lang = get_interface_language(&local_recipient);
let inbox_link = format!("{}/inbox", context.settings().get_protocol_and_hostname()); let inbox_link = format!("{}/inbox", SETTINGS.get_protocol_and_hostname());
let sender_name = &local_user_view.person.name; let sender_name = &local_user_view.person.name;
let content = markdown_to_html(&content); let content = markdown_to_html(&content);
send_email_to_user( send_email_to_user(
&local_recipient, &local_recipient,
&lang.notification_private_message_subject(sender_name), &lang.notification_private_message_subject(sender_name),
&lang.notification_private_message_body(inbox_link, &content, sender_name), &lang.notification_private_message_body(inbox_link, &content, sender_name),
context.settings(),
) )
.await; .await;
} }

View file

@ -28,6 +28,7 @@ use lemmy_db_schema::{
use lemmy_db_views::structs::{LocalUserView, SiteView}; use lemmy_db_views::structs::{LocalUserView, SiteView};
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyErrorType, LemmyResult}, error::{LemmyErrorType, LemmyResult},
settings::SETTINGS,
utils::{ utils::{
slurs::{check_slurs, check_slurs_opt}, slurs::{check_slurs, check_slurs_opt},
validation::{ validation::{
@ -54,8 +55,8 @@ pub async fn create_site(
validate_create_payload(&local_site, &data)?; validate_create_payload(&local_site, &data)?;
let actor_id: DbUrl = Url::parse(&context.settings().get_protocol_and_hostname())?.into(); let actor_id: DbUrl = Url::parse(&SETTINGS.get_protocol_and_hostname())?.into();
let inbox_url = Some(generate_shared_inbox_url(context.settings())?); let inbox_url = Some(generate_shared_inbox_url()?);
let keypair = generate_actor_keypair()?; let keypair = generate_actor_keypair()?;
let slur_regex = local_site_to_slur_regex(&local_site); let slur_regex = local_site_to_slur_regex(&local_site);

View file

@ -161,8 +161,7 @@ pub async fn register(
// Email the admins, only if email verification is not required // Email the admins, only if email verification is not required
if local_site.application_email_admins && !local_site.require_email_verification { if local_site.application_email_admins && !local_site.require_email_verification {
send_new_applicant_email_to_admins(&data.username, &mut context.pool(), context.settings()) send_new_applicant_email_to_admins(&data.username, &mut context.pool()).await?;
.await?;
} }
let mut login_response = LoginResponse { let mut login_response = LoginResponse {
@ -409,17 +408,13 @@ async fn create_person(
) -> Result<Person, LemmyError> { ) -> Result<Person, LemmyError> {
let actor_keypair = generate_actor_keypair()?; let actor_keypair = generate_actor_keypair()?;
is_valid_actor_name(&username, local_site.actor_name_max_length as usize)?; is_valid_actor_name(&username, local_site.actor_name_max_length as usize)?;
let actor_id = generate_local_apub_endpoint( let actor_id = generate_local_apub_endpoint(EndpointType::Person, &username)?;
EndpointType::Person,
&username,
&context.settings().get_protocol_and_hostname(),
)?;
// Register the new person // Register the new person
let person_form = PersonInsertForm { let person_form = PersonInsertForm {
actor_id: Some(actor_id.clone()), actor_id: Some(actor_id.clone()),
inbox_url: Some(generate_inbox_url(&actor_id)?), inbox_url: Some(generate_inbox_url(&actor_id)?),
shared_inbox_url: Some(generate_shared_inbox_url(context.settings())?), shared_inbox_url: Some(generate_shared_inbox_url()?),
private_key: Some(actor_keypair.private_key), private_key: Some(actor_keypair.private_key),
..PersonInsertForm::new(username.clone(), actor_keypair.public_key, instance_id) ..PersonInsertForm::new(username.clone(), actor_keypair.public_key, instance_id)
}; };
@ -487,7 +482,6 @@ async fn send_verification_email_if_required(
.clone() .clone()
.expect("invalid verification email"), .expect("invalid verification email"),
&mut context.pool(), &mut context.pool(),
context.settings(),
) )
.await?; .await?;

View file

@ -41,6 +41,7 @@ use lemmy_db_schema::{
}; };
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyError, LemmyResult}, error::{LemmyError, LemmyResult},
settings::SETTINGS,
LemmyErrorType, LemmyErrorType,
}; };
use url::Url; use url::Url;
@ -69,10 +70,7 @@ impl BlockUser {
kind: BlockType::Block, kind: BlockType::Block,
remove_data, remove_data,
summary: reason, summary: reason,
id: generate_activity_id( id: generate_activity_id(BlockType::Block)?,
BlockType::Block,
&context.settings().get_protocol_and_hostname(),
)?,
audience, audience,
end_time: expires, end_time: expires,
}) })
@ -136,7 +134,7 @@ impl ActivityHandler for BlockUser {
.inner() .inner()
.domain() .domain()
.ok_or(LemmyErrorType::UrlWithoutDomain)?; .ok_or(LemmyErrorType::UrlWithoutDomain)?;
if context.settings().hostname == domain { if SETTINGS.hostname == domain {
return Err( return Err(
anyhow!("Site bans from remote instance can't affect user's home instance").into(), anyhow!("Site bans from remote instance can't affect user's home instance").into(),
); );

View file

@ -50,10 +50,7 @@ impl UndoBlockUser {
None None
}; };
let id = generate_activity_id( let id = generate_activity_id(UndoType::Undo)?;
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?;
let undo = UndoBlockUser { let undo = UndoBlockUser {
actor: mod_.id().into(), actor: mod_.id().into(),
to: vec![public()], to: vec![public()],

View file

@ -81,15 +81,13 @@ impl AnnounceActivity {
pub(crate) fn new( pub(crate) fn new(
object: RawAnnouncableActivities, object: RawAnnouncableActivities,
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>,
) -> LemmyResult<AnnounceActivity> { ) -> LemmyResult<AnnounceActivity> {
let inner_kind = object let inner_kind = object
.other .other
.get("type") .get("type")
.and_then(serde_json::Value::as_str) .and_then(serde_json::Value::as_str)
.unwrap_or("other"); .unwrap_or("other");
let id = let id = generate_announce_activity_id(inner_kind)?;
generate_announce_activity_id(inner_kind, &context.settings().get_protocol_and_hostname())?;
Ok(AnnounceActivity { Ok(AnnounceActivity {
actor: community.id().into(), actor: community.id().into(),
to: vec![public()], to: vec![public()],
@ -111,7 +109,7 @@ impl AnnounceActivity {
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let announce = AnnounceActivity::new(object.clone(), community, context)?; let announce = AnnounceActivity::new(object.clone(), community)?;
let inboxes = ActivitySendTargets::to_local_community_followers(community.id); let inboxes = ActivitySendTargets::to_local_community_followers(community.id);
send_lemmy_activity(context, announce, community, inboxes.clone(), false).await?; send_lemmy_activity(context, announce, community, inboxes.clone(), false).await?;
@ -122,17 +120,14 @@ impl AnnounceActivity {
// Hack: need to convert Page into a format which can be sent as activity, which requires // Hack: need to convert Page into a format which can be sent as activity, which requires
// adding actor field. // adding actor field.
let announcable_page = RawAnnouncableActivities { let announcable_page = RawAnnouncableActivities {
id: generate_activity_id( id: generate_activity_id(AnnounceType::Announce)?,
AnnounceType::Announce,
&context.settings().get_protocol_and_hostname(),
)?,
actor: c.actor.clone().into_inner(), actor: c.actor.clone().into_inner(),
other: serde_json::to_value(c.object)? other: serde_json::to_value(c.object)?
.as_object() .as_object()
.expect("is object") .expect("is object")
.clone(), .clone(),
}; };
let announce_compat = AnnounceActivity::new(announcable_page, community, context)?; let announce_compat = AnnounceActivity::new(announcable_page, community)?;
send_lemmy_activity(context, announce_compat, community, inboxes, false).await?; send_lemmy_activity(context, announce_compat, community, inboxes, false).await?;
} }
Ok(()) Ok(())

View file

@ -47,10 +47,7 @@ impl CollectionAdd {
actor: &ApubPerson, actor: &ApubPerson,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let id = generate_activity_id( let id = generate_activity_id(AddType::Add)?;
AddType::Add,
&context.settings().get_protocol_and_hostname(),
)?;
let add = CollectionAdd { let add = CollectionAdd {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],
@ -73,10 +70,7 @@ impl CollectionAdd {
actor: &ApubPerson, actor: &ApubPerson,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let id = generate_activity_id( let id = generate_activity_id(AddType::Add)?;
AddType::Add,
&context.settings().get_protocol_and_hostname(),
)?;
let add = CollectionAdd { let add = CollectionAdd {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],

View file

@ -42,10 +42,7 @@ impl CollectionRemove {
actor: &ApubPerson, actor: &ApubPerson,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let id = generate_activity_id( let id = generate_activity_id(RemoveType::Remove)?;
RemoveType::Remove,
&context.settings().get_protocol_and_hostname(),
)?;
let remove = CollectionRemove { let remove = CollectionRemove {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],
@ -68,10 +65,7 @@ impl CollectionRemove {
actor: &ApubPerson, actor: &ApubPerson,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let id = generate_activity_id( let id = generate_activity_id(RemoveType::Remove)?;
RemoveType::Remove,
&context.settings().get_protocol_and_hostname(),
)?;
let remove = CollectionRemove { let remove = CollectionRemove {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],

View file

@ -130,10 +130,7 @@ pub(crate) async fn send_lock_post(
let community: ApubCommunity = Community::read(&mut context.pool(), post.community_id) let community: ApubCommunity = Community::read(&mut context.pool(), post.community_id)
.await? .await?
.into(); .into();
let id = generate_activity_id( let id = generate_activity_id(LockType::Lock)?;
LockType::Lock,
&context.settings().get_protocol_and_hostname(),
)?;
let community_id = community.actor_id.inner().clone(); let community_id = community.actor_id.inner().clone();
let lock = LockPage { let lock = LockPage {
actor: actor.actor_id.clone().into(), actor: actor.actor_id.clone().into(),
@ -147,10 +144,7 @@ pub(crate) async fn send_lock_post(
let activity = if locked { let activity = if locked {
AnnouncableActivities::LockPost(lock) AnnouncableActivities::LockPost(lock)
} else { } else {
let id = generate_activity_id( let id = generate_activity_id(UndoType::Undo)?;
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?;
let undo = UndoLockPage { let undo = UndoLockPage {
actor: lock.actor.clone(), actor: lock.actor.clone(),
to: vec![public()], to: vec![public()],

View file

@ -44,10 +44,7 @@ impl Report {
let actor: ApubPerson = actor.into(); let actor: ApubPerson = actor.into();
let community: ApubCommunity = community.into(); let community: ApubCommunity = community.into();
let kind = FlagType::Flag; let kind = FlagType::Flag;
let id = generate_activity_id( let id = generate_activity_id(kind.clone())?;
kind.clone(),
&context.settings().get_protocol_and_hostname(),
)?;
let report = Report { let report = Report {
actor: actor.id().into(), actor: actor.id().into(),
to: [community.id().into()], to: [community.id().into()],

View file

@ -36,10 +36,7 @@ pub(crate) async fn send_update_community(
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let community: ApubCommunity = community.into(); let community: ApubCommunity = community.into();
let actor: ApubPerson = actor.into(); let actor: ApubPerson = actor.into();
let id = generate_activity_id( let id = generate_activity_id(UpdateType::Update)?;
UpdateType::Update,
&context.settings().get_protocol_and_hostname(),
)?;
let update = UpdateCommunity { let update = UpdateCommunity {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],

View file

@ -62,10 +62,7 @@ impl CreateOrUpdateNote {
.await? .await?
.into(); .into();
let id = generate_activity_id( let id = generate_activity_id(kind.clone())?;
kind.clone(),
&context.settings().get_protocol_and_hostname(),
)?;
let note = ApubComment(comment).into_json(&context).await?; let note = ApubComment(comment).into_json(&context).await?;
let create_or_update = CreateOrUpdateNote { let create_or_update = CreateOrUpdateNote {

View file

@ -43,10 +43,7 @@ impl CreateOrUpdatePage {
kind: CreateOrUpdateType, kind: CreateOrUpdateType,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<CreateOrUpdatePage> { ) -> LemmyResult<CreateOrUpdatePage> {
let id = generate_activity_id( let id = generate_activity_id(kind.clone())?;
kind.clone(),
&context.settings().get_protocol_and_hostname(),
)?;
Ok(CreateOrUpdatePage { Ok(CreateOrUpdatePage {
actor: actor.id().into(), actor: actor.id().into(),
to: vec![public()], to: vec![public()],

View file

@ -26,10 +26,7 @@ pub(crate) async fn send_create_or_update_pm(
let actor: ApubPerson = pm_view.creator.into(); let actor: ApubPerson = pm_view.creator.into();
let recipient: ApubPerson = pm_view.recipient.into(); let recipient: ApubPerson = pm_view.recipient.into();
let id = generate_activity_id( let id = generate_activity_id(kind.clone())?;
kind.clone(),
&context.settings().get_protocol_and_hostname(),
)?;
let create_or_update = CreateOrUpdateChatMessage { let create_or_update = CreateOrUpdateChatMessage {
id: id.clone(), id: id.clone(),
actor: actor.id().into(), actor: actor.id().into(),

View file

@ -87,12 +87,8 @@ impl Delete {
to: Url, to: Url,
community: Option<&Community>, community: Option<&Community>,
summary: Option<String>, summary: Option<String>,
context: &Data<LemmyContext>,
) -> LemmyResult<Delete> { ) -> LemmyResult<Delete> {
let id = generate_activity_id( let id = generate_activity_id(DeleteType::Delete)?;
DeleteType::Delete,
&context.settings().get_protocol_and_hostname(),
)?;
let cc: Option<Url> = community.map(|c| c.actor_id.clone().into()); let cc: Option<Url> = community.map(|c| c.actor_id.clone().into());
Ok(Delete { Ok(Delete {
actor: actor.actor_id.clone().into(), actor: actor.actor_id.clone().into(),

View file

@ -60,10 +60,10 @@ pub(crate) async fn send_apub_delete_in_community(
let actor = ApubPerson::from(actor); let actor = ApubPerson::from(actor);
let is_mod_action = reason.is_some(); let is_mod_action = reason.is_some();
let activity = if deleted { let activity = if deleted {
let delete = Delete::new(&actor, object, public(), Some(&community), reason, context)?; let delete = Delete::new(&actor, object, public(), Some(&community), reason)?;
AnnouncableActivities::Delete(delete) AnnouncableActivities::Delete(delete)
} else { } else {
let undo = UndoDelete::new(&actor, object, public(), Some(&community), reason, context)?; let undo = UndoDelete::new(&actor, object, public(), Some(&community), reason)?;
AnnouncableActivities::UndoDelete(undo) AnnouncableActivities::UndoDelete(undo)
}; };
send_activity_in_community( send_activity_in_community(
@ -92,10 +92,10 @@ pub(crate) async fn send_apub_delete_private_message(
let deletable = DeletableObjects::PrivateMessage(pm.into()); let deletable = DeletableObjects::PrivateMessage(pm.into());
let inbox = ActivitySendTargets::to_inbox(recipient.shared_inbox_or_inbox()); let inbox = ActivitySendTargets::to_inbox(recipient.shared_inbox_or_inbox());
if deleted { if deleted {
let delete: Delete = Delete::new(actor, deletable, recipient.id(), None, None, &context)?; let delete: Delete = Delete::new(actor, deletable, recipient.id(), None, None)?;
send_lemmy_activity(&context, delete, actor, inbox, true).await?; send_lemmy_activity(&context, delete, actor, inbox, true).await?;
} else { } else {
let undo = UndoDelete::new(actor, deletable, recipient.id(), None, None, &context)?; let undo = UndoDelete::new(actor, deletable, recipient.id(), None, None)?;
send_lemmy_activity(&context, undo, actor, inbox, true).await?; send_lemmy_activity(&context, undo, actor, inbox, true).await?;
}; };
Ok(()) Ok(())
@ -109,7 +109,7 @@ pub async fn send_apub_delete_user(
let person: ApubPerson = person.into(); let person: ApubPerson = person.into();
let deletable = DeletableObjects::Person(person.clone()); let deletable = DeletableObjects::Person(person.clone());
let mut delete: Delete = Delete::new(&person, deletable, public(), None, None, &context)?; let mut delete: Delete = Delete::new(&person, deletable, public(), None, None)?;
delete.remove_data = Some(remove_data); delete.remove_data = Some(remove_data);
let inboxes = ActivitySendTargets::to_all_instances(); let inboxes = ActivitySendTargets::to_all_instances();

View file

@ -71,14 +71,10 @@ impl UndoDelete {
to: Url, to: Url,
community: Option<&Community>, community: Option<&Community>,
summary: Option<String>, summary: Option<String>,
context: &Data<LemmyContext>,
) -> LemmyResult<UndoDelete> { ) -> LemmyResult<UndoDelete> {
let object = Delete::new(actor, object, to.clone(), community, summary, context)?; let object = Delete::new(actor, object, to.clone(), community, summary)?;
let id = generate_activity_id( let id = generate_activity_id(UndoType::Undo)?;
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?;
let cc: Option<Url> = community.map(|c| c.actor_id.clone().into()); let cc: Option<Url> = community.map(|c| c.actor_id.clone().into());
Ok(UndoDelete { Ok(UndoDelete {
actor: actor.actor_id.clone().into(), actor: actor.actor_id.clone().into(),

View file

@ -27,10 +27,7 @@ impl AcceptFollow {
to: Some([person.id().into()]), to: Some([person.id().into()]),
object: follow, object: follow,
kind: AcceptType::Accept, kind: AcceptType::Accept,
id: generate_activity_id( id: generate_activity_id(AcceptType::Accept)?,
AcceptType::Accept,
&context.settings().get_protocol_and_hostname(),
)?,
}; };
let inbox = ActivitySendTargets::to_inbox(person.shared_inbox_or_inbox()); let inbox = ActivitySendTargets::to_inbox(person.shared_inbox_or_inbox());
send_lemmy_activity(context, accept, &user_or_community, inbox, true).await send_lemmy_activity(context, accept, &user_or_community, inbox, true).await

View file

@ -33,17 +33,13 @@ impl Follow {
pub(in crate::activities::following) fn new( pub(in crate::activities::following) fn new(
actor: &ApubPerson, actor: &ApubPerson,
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>,
) -> LemmyResult<Follow> { ) -> LemmyResult<Follow> {
Ok(Follow { Ok(Follow {
actor: actor.id().into(), actor: actor.id().into(),
object: community.id().into(), object: community.id().into(),
to: Some([community.id().into()]), to: Some([community.id().into()]),
kind: FollowType::Follow, kind: FollowType::Follow,
id: generate_activity_id( id: generate_activity_id(FollowType::Follow)?,
FollowType::Follow,
&context.settings().get_protocol_and_hostname(),
)?,
}) })
} }
@ -53,7 +49,7 @@ impl Follow {
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let follow = Follow::new(actor, community, context)?; let follow = Follow::new(actor, community)?;
let inbox = if community.local { let inbox = if community.local {
ActivitySendTargets::empty() ActivitySendTargets::empty()
} else { } else {

View file

@ -30,16 +30,13 @@ impl UndoFollow {
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>, context: &Data<LemmyContext>,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let object = Follow::new(actor, community, context)?; let object = Follow::new(actor, community)?;
let undo = UndoFollow { let undo = UndoFollow {
actor: actor.id().into(), actor: actor.id().into(),
to: Some([community.id().into()]), to: Some([community.id().into()]),
object, object,
kind: UndoType::Undo, kind: UndoType::Undo,
id: generate_activity_id( id: generate_activity_id(UndoType::Undo)?,
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?,
}; };
let inbox = if community.local { let inbox = if community.local {
ActivitySendTargets::empty() ActivitySendTargets::empty()

View file

@ -42,7 +42,10 @@ use lemmy_db_schema::{
traits::Crud, traits::Crud,
}; };
use lemmy_db_views_actor::structs::{CommunityPersonBanView, CommunityView}; use lemmy_db_views_actor::structs::{CommunityPersonBanView, CommunityView};
use lemmy_utils::error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult}; use lemmy_utils::{
error::{LemmyError, LemmyErrorExt, LemmyErrorType, LemmyResult},
settings::SETTINGS,
};
use serde::Serialize; use serde::Serialize;
use tracing::info; use tracing::info;
use url::{ParseError, Url}; use url::{ParseError, Url};
@ -142,10 +145,11 @@ pub(crate) fn check_community_deleted_or_removed(community: &Community) -> Lemmy
/// Generate a unique ID for an activity, in the format: /// Generate a unique ID for an activity, in the format:
/// `http(s)://example.com/receive/create/202daf0a-1489-45df-8d2e-c8a3173fed36` /// `http(s)://example.com/receive/create/202daf0a-1489-45df-8d2e-c8a3173fed36`
fn generate_activity_id<T>(kind: T, protocol_and_hostname: &str) -> Result<Url, ParseError> fn generate_activity_id<T>(kind: T) -> Result<Url, ParseError>
where where
T: ToString, T: ToString,
{ {
let protocol_and_hostname = &SETTINGS.get_protocol_and_hostname();
let id = format!( let id = format!(
"{}/activities/{}/{}", "{}/activities/{}/{}",
protocol_and_hostname, protocol_and_hostname,
@ -156,10 +160,8 @@ where
} }
/// like generate_activity_id but also add the inner kind for easier debugging /// like generate_activity_id but also add the inner kind for easier debugging
fn generate_announce_activity_id( fn generate_announce_activity_id(inner_kind: &str) -> Result<Url, ParseError> {
inner_kind: &str, let protocol_and_hostname = &SETTINGS.get_protocol_and_hostname();
protocol_and_hostname: &str,
) -> Result<Url, ParseError> {
let id = format!( let id = format!(
"{}/activities/{}/{}/{}", "{}/activities/{}/{}/{}",
protocol_and_hostname, protocol_and_hostname,

View file

@ -40,13 +40,13 @@ pub(crate) async fn send_like_activity(
let empty = ActivitySendTargets::empty(); let empty = ActivitySendTargets::empty();
// score of 1 means upvote, -1 downvote, 0 undo a previous vote // score of 1 means upvote, -1 downvote, 0 undo a previous vote
if score != 0 { if score != 0 {
let vote = Vote::new(object_id, &actor, &community, score.try_into()?, &context)?; let vote = Vote::new(object_id, &actor, &community, score.try_into()?)?;
let activity = AnnouncableActivities::Vote(vote); let activity = AnnouncableActivities::Vote(vote);
send_activity_in_community(activity, &actor, &community, empty, false, &context).await send_activity_in_community(activity, &actor, &community, empty, false, &context).await
} else { } else {
// Lemmy API doesn't distinguish between Undo/Like and Undo/Dislike, so we hardcode it here. // Lemmy API doesn't distinguish between Undo/Like and Undo/Dislike, so we hardcode it here.
let vote = Vote::new(object_id, &actor, &community, VoteType::Like, &context)?; let vote = Vote::new(object_id, &actor, &community, VoteType::Like)?;
let undo_vote = UndoVote::new(vote, &actor, &community, &context)?; let undo_vote = UndoVote::new(vote, &actor, &community)?;
let activity = AnnouncableActivities::UndoVote(undo_vote); let activity = AnnouncableActivities::UndoVote(undo_vote);
send_activity_in_community(activity, &actor, &community, empty, false, &context).await send_activity_in_community(activity, &actor, &community, empty, false, &context).await
} }

View file

@ -27,16 +27,12 @@ impl UndoVote {
vote: Vote, vote: Vote,
actor: &ApubPerson, actor: &ApubPerson,
community: &ApubCommunity, community: &ApubCommunity,
context: &Data<LemmyContext>,
) -> LemmyResult<Self> { ) -> LemmyResult<Self> {
Ok(UndoVote { Ok(UndoVote {
actor: actor.id().into(), actor: actor.id().into(),
object: vote, object: vote,
kind: UndoType::Undo, kind: UndoType::Undo,
id: generate_activity_id( id: generate_activity_id(UndoType::Undo)?,
UndoType::Undo,
&context.settings().get_protocol_and_hostname(),
)?,
audience: Some(community.id().into()), audience: Some(community.id().into()),
}) })
} }

View file

@ -28,13 +28,12 @@ impl Vote {
actor: &ApubPerson, actor: &ApubPerson,
community: &ApubCommunity, community: &ApubCommunity,
kind: VoteType, kind: VoteType,
context: &Data<LemmyContext>,
) -> LemmyResult<Vote> { ) -> LemmyResult<Vote> {
Ok(Vote { Ok(Vote {
actor: actor.id().into(), actor: actor.id().into(),
object: object_id, object: object_id,
kind: kind.clone(), kind: kind.clone(),
id: generate_activity_id(kind, &context.settings().get_protocol_and_hostname())?, id: generate_activity_id(kind)?,
audience: Some(community.id().into()), audience: Some(community.id().into()),
}) })
} }

View file

@ -57,7 +57,7 @@ impl Collection for ApubCommunityOutbox {
) )
.await?; .await?;
let announcable = AnnouncableActivities::CreateOrUpdatePost(create); let announcable = AnnouncableActivities::CreateOrUpdatePost(create);
let announce = AnnounceActivity::new(announcable.try_into()?, owner, data)?; let announce = AnnounceActivity::new(announcable.try_into()?, owner)?;
ordered_items.push(announce); ordered_items.push(announce);
} }

View file

@ -8,6 +8,7 @@ use lemmy_api_common::{
use lemmy_db_schema::{newtypes::InstanceId, source::instance::Instance}; use lemmy_db_schema::{newtypes::InstanceId, source::instance::Instance};
use lemmy_utils::{ use lemmy_utils::{
error::LemmyResult, error::LemmyResult,
settings::SETTINGS,
utils::markdown::image_links::{markdown_find_links, markdown_handle_title}, utils::markdown::image_links::{markdown_find_links, markdown_handle_title},
}; };
use url::Url; use url::Url;
@ -52,7 +53,7 @@ pub async fn markdown_rewrite_remote_links(
} }
pub(crate) async fn to_local_url(url: &str, context: &Data<LemmyContext>) -> Option<Url> { pub(crate) async fn to_local_url(url: &str, context: &Data<LemmyContext>) -> Option<Url> {
let local_domain = &context.settings().get_protocol_and_hostname(); let local_domain = &SETTINGS.get_protocol_and_hostname();
let object_id = ObjectId::<SearchableObjects>::parse(url).ok()?; let object_id = ObjectId::<SearchableObjects>::parse(url).ok()?;
if object_id.inner().domain() == Some(local_domain) { if object_id.inner().domain() == Some(local_domain) {
return None; return None;
@ -61,10 +62,10 @@ pub(crate) async fn to_local_url(url: &str, context: &Data<LemmyContext>) -> Opt
match dereferenced { match dereferenced {
SearchableObjects::PostOrComment(pc) => match *pc { SearchableObjects::PostOrComment(pc) => match *pc {
PostOrComment::Post(post) => { PostOrComment::Post(post) => {
generate_local_apub_endpoint(EndpointType::Post, &post.id.to_string(), local_domain) generate_local_apub_endpoint(EndpointType::Post, &post.id.to_string())
} }
PostOrComment::Comment(comment) => { PostOrComment::Comment(comment) => {
generate_local_apub_endpoint(EndpointType::Comment, &comment.id.to_string(), local_domain) generate_local_apub_endpoint(EndpointType::Comment, &comment.id.to_string())
} }
} }
.ok() .ok()
@ -87,8 +88,8 @@ async fn format_actor_url(
instance_id: InstanceId, instance_id: InstanceId,
context: &LemmyContext, context: &LemmyContext,
) -> LemmyResult<Url> { ) -> LemmyResult<Url> {
let local_protocol_and_hostname = context.settings().get_protocol_and_hostname(); let local_protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let local_hostname = &context.settings().hostname; let local_hostname = &SETTINGS.hostname;
let instance = Instance::read(&mut context.pool(), instance_id).await?; let instance = Instance::read(&mut context.pool(), instance_id).await?;
let url = if &instance.domain != local_hostname { let url = if &instance.domain != local_hostname {
format!( format!(

View file

@ -17,7 +17,10 @@ use lemmy_db_schema::{
source::{activity::SentActivity, community::Community}, source::{activity::SentActivity, community::Community},
CommunityVisibility, CommunityVisibility,
}; };
use lemmy_utils::error::{LemmyErrorType, LemmyResult}; use lemmy_utils::{
error::{LemmyErrorType, LemmyResult},
settings::SETTINGS,
};
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::{ops::Deref, time::Duration}; use std::{ops::Deref, time::Duration};
use tokio::time::timeout; use tokio::time::timeout;
@ -98,10 +101,9 @@ pub(crate) async fn get_activity(
info: web::Path<ActivityQuery>, info: web::Path<ActivityQuery>,
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> LemmyResult<HttpResponse> { ) -> LemmyResult<HttpResponse> {
let settings = context.settings();
let activity_id = Url::parse(&format!( let activity_id = Url::parse(&format!(
"{}/activities/{}/{}", "{}/activities/{}/{}",
settings.get_protocol_and_hostname(), SETTINGS.get_protocol_and_hostname(),
info.type_, info.type_,
info.id info.id
))? ))?

View file

@ -7,7 +7,7 @@ use activitypub_federation::{config::Data, traits::Object};
use actix_web::HttpResponse; use actix_web::HttpResponse;
use lemmy_api_common::context::LemmyContext; use lemmy_api_common::context::LemmyContext;
use lemmy_db_schema::source::site::Site; use lemmy_db_schema::source::site::Site;
use lemmy_utils::error::LemmyResult; use lemmy_utils::{error::LemmyResult, settings::SETTINGS};
use url::Url; use url::Url;
pub(crate) async fn get_apub_site_http(context: Data<LemmyContext>) -> LemmyResult<HttpResponse> { pub(crate) async fn get_apub_site_http(context: Data<LemmyContext>) -> LemmyResult<HttpResponse> {
@ -18,11 +18,8 @@ pub(crate) async fn get_apub_site_http(context: Data<LemmyContext>) -> LemmyResu
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
pub(crate) async fn get_apub_site_outbox(context: Data<LemmyContext>) -> LemmyResult<HttpResponse> { pub(crate) async fn get_apub_site_outbox() -> LemmyResult<HttpResponse> {
let outbox_id = format!( let outbox_id = format!("{}/site_outbox", SETTINGS.get_protocol_and_hostname());
"{}/site_outbox",
context.settings().get_protocol_and_hostname()
);
let outbox = EmptyOutbox::new(Url::parse(&outbox_id)?)?; let outbox = EmptyOutbox::new(Url::parse(&outbox_id)?)?;
create_apub_response(&outbox) create_apub_response(&outbox)
} }

View file

@ -11,6 +11,7 @@ use lemmy_db_schema::{
}; };
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyError, LemmyErrorType, LemmyResult}, error::{LemmyError, LemmyErrorType, LemmyResult},
settings::SETTINGS,
CACHE_DURATION_FEDERATION, CACHE_DURATION_FEDERATION,
}; };
use moka::future::Cache; use moka::future::Cache;
@ -166,8 +167,7 @@ pub(crate) async fn check_apub_id_valid_with_strictness(
.domain() .domain()
.ok_or(LemmyErrorType::UrlWithoutDomain)? .ok_or(LemmyErrorType::UrlWithoutDomain)?
.to_string(); .to_string();
let local_instance = context let local_instance = SETTINGS
.settings()
.get_hostname_without_port() .get_hostname_without_port()
.expect("local hostname is valid"); .expect("local hostname is valid");
if domain == local_instance { if domain == local_instance {
@ -186,8 +186,7 @@ pub(crate) async fn check_apub_id_valid_with_strictness(
.iter() .iter()
.map(|i| i.domain.clone()) .map(|i| i.domain.clone())
.collect::<Vec<String>>(); .collect::<Vec<String>>();
let local_instance = context let local_instance = SETTINGS
.settings()
.get_hostname_without_port() .get_hostname_without_port()
.expect("local hostname is valid"); .expect("local hostname is valid");
allowed_and_local.push(local_instance); allowed_and_local.push(local_instance);

View file

@ -67,7 +67,7 @@ pub async fn collect_non_local_mentions(
let mentions = scrape_text_for_mentions(&comment.content) let mentions = scrape_text_for_mentions(&comment.content)
.into_iter() .into_iter()
// Filter only the non-local ones // Filter only the non-local ones
.filter(|m| !m.is_local(&context.settings().hostname)); .filter(|m| !m.is_local());
for mention in mentions { for mention in mentions {
let identifier = format!("{}@{}", mention.name, mention.domain); let identifier = format!("{}@{}", mention.name, mention.domain);

View file

@ -42,6 +42,7 @@ use lemmy_db_schema::{
use lemmy_db_views_actor::structs::CommunityFollowerView; use lemmy_db_views_actor::structs::CommunityFollowerView;
use lemmy_utils::{ use lemmy_utils::{
error::{LemmyError, LemmyResult}, error::{LemmyError, LemmyResult},
settings::SETTINGS,
spawn_try_task, spawn_try_task,
utils::markdown::markdown_to_html, utils::markdown::markdown_to_html,
}; };
@ -247,7 +248,7 @@ impl ApubCommunity {
let inboxes: Vec<Url> = follows let inboxes: Vec<Url> = follows
.into_iter() .into_iter()
.map(Into::into) .map(Into::into)
.filter(|inbox: &Url| inbox.host_str() != Some(&context.settings().hostname)) .filter(|inbox: &Url| inbox.host_str() != Some(&SETTINGS.hostname))
// Don't send to blocked instances // Don't send to blocked instances
.filter(|inbox| check_apub_id_valid(inbox, &local_site_data).is_ok()) .filter(|inbox| check_apub_id_valid(inbox, &local_site_data).is_ok())
.collect(); .collect();

View file

@ -5,7 +5,7 @@ use lemmy_api_common::{
lemmy_utils::settings::structs::FederationWorkerConfig, lemmy_utils::settings::structs::FederationWorkerConfig,
}; };
use lemmy_db_schema::{newtypes::InstanceId, source::instance::Instance}; use lemmy_db_schema::{newtypes::InstanceId, source::instance::Instance};
use lemmy_utils::error::LemmyResult; use lemmy_utils::{error::LemmyResult, settings::SETTINGS};
use stats::receive_print_stats; use stats::receive_print_stats;
use std::{collections::HashMap, time::Duration}; use std::{collections::HashMap, time::Duration};
use tokio::{ use tokio::{
@ -105,7 +105,7 @@ impl SendManager {
"Starting federation workers for process count {} and index {}", "Starting federation workers for process count {} and index {}",
self.opts.process_count, process_index self.opts.process_count, process_index
); );
let local_domain = self.context.settings().get_hostname_without_port()?; let local_domain = SETTINGS.get_hostname_without_port()?;
let mut pool = self.context.pool(); let mut pool = self.context.pool();
loop { loop {
let mut total_count = 0; let mut total_count = 0;

View file

@ -492,7 +492,7 @@ mod test {
actor_id: Some(actor_id.clone()), actor_id: Some(actor_id.clone()),
private_key: (Some(actor_keypair.private_key)), private_key: (Some(actor_keypair.private_key)),
inbox_url: Some(generate_inbox_url(&actor_id)?), inbox_url: Some(generate_inbox_url(&actor_id)?),
shared_inbox_url: Some(generate_shared_inbox_url(context.settings())?), shared_inbox_url: Some(generate_shared_inbox_url()?),
..PersonInsertForm::new("alice".to_string(), actor_keypair.public_key, instance.id) ..PersonInsertForm::new("alice".to_string(), actor_keypair.public_key, instance.id)
}; };
let person = Person::create(&mut context.pool(), &person_form).await?; let person = Person::create(&mut context.pool(), &person_form).await?;

View file

@ -23,6 +23,7 @@ use lemmy_db_views_actor::{
use lemmy_utils::{ use lemmy_utils::{
cache_header::cache_1hour, cache_header::cache_1hour,
error::{LemmyError, LemmyErrorType, LemmyResult}, error::{LemmyError, LemmyErrorType, LemmyResult},
settings::SETTINGS,
utils::markdown::{markdown_to_html, sanitize_html}, utils::markdown::{markdown_to_html, sanitize_html},
}; };
use rss::{ use rss::{
@ -166,12 +167,12 @@ async fn get_feed_data(
.list(&site_view.site, &mut context.pool()) .list(&site_view.site, &mut context.pool())
.await?; .await?;
let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; let items = create_post_items(posts)?;
let mut channel = Channel { let mut channel = Channel {
namespaces: RSS_NAMESPACE.clone(), namespaces: RSS_NAMESPACE.clone(),
title: format!("{} - {}", site_view.site.name, listing_type), title: format!("{} - {}", site_view.site.name, listing_type),
link: context.settings().get_protocol_and_hostname(), link: SETTINGS.get_protocol_and_hostname(),
items, items,
..Default::default() ..Default::default()
}; };
@ -275,7 +276,7 @@ async fn get_feed_user(
.list(&site_view.site, &mut context.pool()) .list(&site_view.site, &mut context.pool())
.await?; .await?;
let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; let items = create_post_items(posts)?;
let channel = Channel { let channel = Channel {
namespaces: RSS_NAMESPACE.clone(), namespaces: RSS_NAMESPACE.clone(),
title: format!("{} - {}", sanitize_xml(site_view.site.name), person.name), title: format!("{} - {}", sanitize_xml(site_view.site.name), person.name),
@ -315,7 +316,7 @@ async fn get_feed_community(
.list(&site_view.site, &mut context.pool()) .list(&site_view.site, &mut context.pool())
.await?; .await?;
let items = create_post_items(posts, &context.settings().get_protocol_and_hostname())?; let items = create_post_items(posts)?;
let mut channel = Channel { let mut channel = Channel {
namespaces: RSS_NAMESPACE.clone(), namespaces: RSS_NAMESPACE.clone(),
@ -356,8 +357,8 @@ async fn get_feed_front(
.list(&site_view.site, &mut context.pool()) .list(&site_view.site, &mut context.pool())
.await?; .await?;
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let items = create_post_items(posts, &protocol_and_hostname)?; let items = create_post_items(posts)?;
let mut channel = Channel { let mut channel = Channel {
namespaces: RSS_NAMESPACE.clone(), namespaces: RSS_NAMESPACE.clone(),
title: format!("{} - Subscribed", sanitize_xml(site_view.site.name)), title: format!("{} - Subscribed", sanitize_xml(site_view.site.name)),
@ -406,7 +407,7 @@ async fn get_feed_inbox(context: &LemmyContext, jwt: &str) -> LemmyResult<Channe
.list(&mut context.pool()) .list(&mut context.pool())
.await?; .await?;
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let items = create_reply_and_mention_items(replies, mentions, &protocol_and_hostname)?; let items = create_reply_and_mention_items(replies, mentions, &protocol_and_hostname)?;
let mut channel = Channel { let mut channel = Channel {
@ -493,7 +494,8 @@ fn build_item(
} }
#[tracing::instrument(skip_all)] #[tracing::instrument(skip_all)]
fn create_post_items(posts: Vec<PostView>, protocol_and_hostname: &str) -> LemmyResult<Vec<Item>> { fn create_post_items(posts: Vec<PostView>) -> LemmyResult<Vec<Item>> {
let protocol_and_hostname = &SETTINGS.get_protocol_and_hostname();
let mut items: Vec<Item> = Vec::new(); let mut items: Vec<Item> = Vec::new();
for p in posts { for p in posts {

View file

@ -17,7 +17,12 @@ use lemmy_db_schema::source::{
local_site::LocalSite, local_site::LocalSite,
}; };
use lemmy_db_views::structs::LocalUserView; use lemmy_db_views::structs::LocalUserView;
use lemmy_utils::{error::LemmyResult, rate_limit::RateLimitCell, REQWEST_TIMEOUT}; use lemmy_utils::{
error::LemmyResult,
rate_limit::RateLimitCell,
settings::SETTINGS,
REQWEST_TIMEOUT,
};
use reqwest::Body; use reqwest::Body;
use reqwest_middleware::{ClientWithMiddleware, RequestBuilder}; use reqwest_middleware::{ClientWithMiddleware, RequestBuilder};
use serde::Deserialize; use serde::Deserialize;
@ -135,7 +140,7 @@ async fn upload(
context: web::Data<LemmyContext>, context: web::Data<LemmyContext>,
) -> LemmyResult<HttpResponse> { ) -> LemmyResult<HttpResponse> {
// TODO: check rate limit here // TODO: check rate limit here
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let image_url = format!("{}image", pictrs_config.url); let image_url = format!("{}image", pictrs_config.url);
let mut client_req = adapt_request(&req, &client, image_url); let mut client_req = adapt_request(&req, &client, image_url);
@ -159,7 +164,7 @@ async fn upload(
pictrs_delete_token: image.delete_token.to_string(), pictrs_delete_token: image.delete_token.to_string(),
}; };
let protocol_and_hostname = context.settings().get_protocol_and_hostname(); let protocol_and_hostname = SETTINGS.get_protocol_and_hostname();
let thumbnail_url = image.thumbnail_url(&protocol_and_hostname)?; let thumbnail_url = image.thumbnail_url(&protocol_and_hostname)?;
// Also store the details for the image // Also store the details for the image
@ -187,7 +192,7 @@ async fn full_res(
let name = &filename.into_inner(); let name = &filename.into_inner();
// If there are no query params, the URL is original // If there are no query params, the URL is original
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let processed_url = params.process_url(name, &pictrs_config.url); let processed_url = params.process_url(name, &pictrs_config.url);
@ -234,7 +239,7 @@ async fn delete(
) -> LemmyResult<HttpResponse> { ) -> LemmyResult<HttpResponse> {
let (token, file) = components.into_inner(); let (token, file) = components.into_inner();
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let url = format!("{}image/delete/{}/{}", pictrs_config.url, &token, &file); let url = format!("{}image/delete/{}/{}", pictrs_config.url, &token, &file);
let mut client_req = adapt_request(&req, &client, url); let mut client_req = adapt_request(&req, &client, url);
@ -262,7 +267,7 @@ pub async fn image_proxy(
// for arbitrary purposes. // for arbitrary purposes.
RemoteImage::validate(&mut context.pool(), url.clone().into()).await?; RemoteImage::validate(&mut context.pool(), url.clone().into()).await?;
let pictrs_config = context.settings().pictrs_config()?; let pictrs_config = SETTINGS.pictrs_config()?;
let processed_url = params.process_url(&params.url, &pictrs_config.url); let processed_url = params.process_url(&params.url, &pictrs_config.url);

View file

@ -5,6 +5,7 @@ use lemmy_db_views::structs::SiteView;
use lemmy_utils::{ use lemmy_utils::{
cache_header::{cache_1hour, cache_3days}, cache_header::{cache_1hour, cache_3days},
error::LemmyResult, error::LemmyResult,
settings::SETTINGS,
VERSION, VERSION,
}; };
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@ -29,13 +30,13 @@ pub fn config(cfg: &mut web::ServiceConfig) {
); );
} }
async fn node_info_well_known(context: web::Data<LemmyContext>) -> LemmyResult<HttpResponse> { async fn node_info_well_known() -> LemmyResult<HttpResponse> {
let node_info = NodeInfoWellKnown { let node_info = NodeInfoWellKnown {
links: vec![NodeInfoWellKnownLinks { links: vec![NodeInfoWellKnownLinks {
rel: Url::parse("http://nodeinfo.diaspora.software/ns/schema/2.1")?, rel: Url::parse("http://nodeinfo.diaspora.software/ns/schema/2.1")?,
href: Url::parse(&format!( href: Url::parse(&format!(
"{}/nodeinfo/2.1", "{}/nodeinfo/2.1",
&context.settings().get_protocol_and_hostname(), &SETTINGS.get_protocol_and_hostname(),
))?, ))?,
}], }],
}; };

View file

@ -9,7 +9,7 @@ use lemmy_db_schema::{
traits::ApubActor, traits::ApubActor,
CommunityVisibility, CommunityVisibility,
}; };
use lemmy_utils::{cache_header::cache_3days, error::LemmyResult}; use lemmy_utils::{cache_header::cache_3days, error::LemmyResult, settings::SETTINGS};
use serde::Deserialize; use serde::Deserialize;
use std::collections::HashMap; use std::collections::HashMap;
use url::Url; use url::Url;
@ -38,10 +38,10 @@ async fn get_webfinger_response(
) -> LemmyResult<HttpResponse> { ) -> LemmyResult<HttpResponse> {
let name = extract_webfinger_name(&info.resource, &context)?; let name = extract_webfinger_name(&info.resource, &context)?;
let links = if name == context.settings().hostname { let links = if name == SETTINGS.hostname {
// webfinger response for instance actor (required for mastodon authorized fetch) // webfinger response for instance actor (required for mastodon authorized fetch)
let url = Url::parse(&context.settings().get_protocol_and_hostname())?; let url = Url::parse(&SETTINGS.get_protocol_and_hostname())?;
vec![webfinger_link_for_actor(Some(url), "none", &context)] vec![webfinger_link_for_actor(Some(url), "none")]
} else { } else {
// webfinger response for user/community // webfinger response for user/community
let user_id: Option<Url> = Person::read_from_name(&mut context.pool(), name, false) let user_id: Option<Url> = Person::read_from_name(&mut context.pool(), name, false)
@ -65,8 +65,8 @@ async fn get_webfinger_response(
// Mastodon seems to prioritize the last webfinger item in case of duplicates. Put // Mastodon seems to prioritize the last webfinger item in case of duplicates. Put
// community last so that it gets prioritized. For Lemmy the order doesn't matter. // community last so that it gets prioritized. For Lemmy the order doesn't matter.
vec![ vec![
webfinger_link_for_actor(user_id, "Person", &context), webfinger_link_for_actor(user_id, "Person"),
webfinger_link_for_actor(community_id, "Group", &context), webfinger_link_for_actor(community_id, "Group"),
] ]
} }
.into_iter() .into_iter()
@ -90,11 +90,7 @@ async fn get_webfinger_response(
} }
} }
fn webfinger_link_for_actor( fn webfinger_link_for_actor(url: Option<Url>, kind: &str) -> Vec<WebfingerLink> {
url: Option<Url>,
kind: &str,
context: &LemmyContext,
) -> Vec<WebfingerLink> {
if let Some(url) = url { if let Some(url) = url {
let type_key = "https://www.w3.org/ns/activitystreams#type" let type_key = "https://www.w3.org/ns/activitystreams#type"
.parse() .parse()
@ -120,7 +116,7 @@ fn webfinger_link_for_actor(
if kind == "Person" { if kind == "Person" {
let template = format!( let template = format!(
"{}/activitypub/externalInteraction?uri={{uri}}", "{}/activitypub/externalInteraction?uri={{uri}}",
context.settings().get_protocol_and_hostname() SETTINGS.get_protocol_and_hostname()
); );
vec.push(WebfingerLink { vec.push(WebfingerLink {
rel: Some("http://ostatus.org/schema/1.0/subscribe".into()), rel: Some("http://ostatus.org/schema/1.0/subscribe".into()),

View file

@ -1,6 +1,6 @@
use crate::{ use crate::{
error::{LemmyErrorExt, LemmyErrorType, LemmyResult}, error::{LemmyErrorExt, LemmyErrorType, LemmyResult},
settings::structs::Settings, settings::SETTINGS,
}; };
use html2text; use html2text;
use lettre::{ use lettre::{
@ -24,10 +24,9 @@ pub async fn send_email(
to_email: &str, to_email: &str,
to_username: &str, to_username: &str,
html: &str, html: &str,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let email_config = settings.email.clone().ok_or(LemmyErrorType::NoEmailSetup)?; let email_config = SETTINGS.email.clone().ok_or(LemmyErrorType::NoEmailSetup)?;
let domain = settings.hostname.clone(); let domain = SETTINGS.hostname.clone();
let (smtp_server, smtp_port) = { let (smtp_server, smtp_port) = {
let email_and_port = email_config.smtp_server.split(':').collect::<Vec<&str>>(); let email_and_port = email_config.smtp_server.split(':').collect::<Vec<&str>>();
@ -56,7 +55,7 @@ pub async fn send_email(
Some(to_username.to_string()), Some(to_username.to_string()),
Address::from_str(to_email).expect("email to address isn't valid"), Address::from_str(to_email).expect("email to address isn't valid"),
)) ))
.message_id(Some(format!("<{}@{}>", Uuid::new_v4(), settings.hostname))) .message_id(Some(format!("<{}@{}>", Uuid::new_v4(), SETTINGS.hostname)))
.subject(subject) .subject(subject)
.multipart(MultiPart::alternative_plain_html( .multipart(MultiPart::alternative_plain_html(
plain_text, plain_text,

View file

@ -1,3 +1,4 @@
use crate::settings::SETTINGS;
use itertools::Itertools; use itertools::Itertools;
use regex::Regex; use regex::Regex;
use std::sync::LazyLock; use std::sync::LazyLock;
@ -13,8 +14,8 @@ pub struct MentionData {
} }
impl MentionData { impl MentionData {
pub fn is_local(&self, hostname: &str) -> bool { pub fn is_local(&self) -> bool {
hostname.eq(&self.domain) SETTINGS.hostname.eq(&self.domain)
} }
pub fn full_name(&self) -> String { pub fn full_name(&self) -> String {
format!("@{}@{}", &self.name, &self.domain) format!("@{}@{}", &self.name, &self.domain)

View file

@ -34,7 +34,10 @@ use lemmy_db_schema::{
traits::Crud, traits::Crud,
utils::{get_conn, naive_now, DbPool}, utils::{get_conn, naive_now, DbPool},
}; };
use lemmy_utils::{error::LemmyResult, settings::structs::Settings}; use lemmy_utils::{
error::LemmyResult,
settings::{structs::Settings, SETTINGS},
};
use tracing::info; use tracing::info;
use url::Url; use url::Url;
@ -43,24 +46,21 @@ pub async fn run_advanced_migrations(
settings: &Settings, settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
let protocol_and_hostname = &settings.get_protocol_and_hostname(); let protocol_and_hostname = &settings.get_protocol_and_hostname();
user_updates_2020_04_02(pool, protocol_and_hostname).await?; user_updates_2020_04_02(pool).await?;
community_updates_2020_04_02(pool, protocol_and_hostname).await?; community_updates_2020_04_02(pool).await?;
post_updates_2020_04_03(pool, protocol_and_hostname).await?; post_updates_2020_04_03(pool).await?;
comment_updates_2020_04_03(pool, protocol_and_hostname).await?; comment_updates_2020_04_03(pool).await?;
private_message_updates_2020_05_05(pool, protocol_and_hostname).await?; private_message_updates_2020_05_05(pool).await?;
post_thumbnail_url_updates_2020_07_27(pool, protocol_and_hostname).await?; post_thumbnail_url_updates_2020_07_27(pool, protocol_and_hostname).await?;
apub_columns_2021_02_02(pool, settings).await?; apub_columns_2021_02_02(pool).await?;
instance_actor_2022_01_28(pool, protocol_and_hostname, settings).await?; instance_actor_2022_01_28(pool, protocol_and_hostname).await?;
regenerate_public_keys_2022_07_05(pool).await?; regenerate_public_keys_2022_07_05(pool).await?;
initialize_local_site_2022_10_10(pool, settings).await?; initialize_local_site_2022_10_10(pool).await?;
Ok(()) Ok(())
} }
async fn user_updates_2020_04_02( async fn user_updates_2020_04_02(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
protocol_and_hostname: &str,
) -> LemmyResult<()> {
use lemmy_db_schema::schema::person::dsl::{actor_id, local, person}; use lemmy_db_schema::schema::person::dsl::{actor_id, local, person};
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
@ -80,7 +80,6 @@ async fn user_updates_2020_04_02(
actor_id: Some(generate_local_apub_endpoint( actor_id: Some(generate_local_apub_endpoint(
EndpointType::Person, EndpointType::Person,
&cperson.name, &cperson.name,
protocol_and_hostname,
)?), )?),
private_key: Some(Some(keypair.private_key)), private_key: Some(Some(keypair.private_key)),
public_key: Some(keypair.public_key), public_key: Some(keypair.public_key),
@ -96,10 +95,7 @@ async fn user_updates_2020_04_02(
Ok(()) Ok(())
} }
async fn community_updates_2020_04_02( async fn community_updates_2020_04_02(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
protocol_and_hostname: &str,
) -> LemmyResult<()> {
use lemmy_db_schema::schema::community::dsl::{actor_id, community, local}; use lemmy_db_schema::schema::community::dsl::{actor_id, community, local};
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
@ -114,11 +110,8 @@ async fn community_updates_2020_04_02(
for ccommunity in &incorrect_communities { for ccommunity in &incorrect_communities {
let keypair = generate_actor_keypair()?; let keypair = generate_actor_keypair()?;
let community_actor_id = generate_local_apub_endpoint( let community_actor_id =
EndpointType::Community, generate_local_apub_endpoint(EndpointType::Community, &ccommunity.name)?;
&ccommunity.name,
protocol_and_hostname,
)?;
let form = CommunityUpdateForm { let form = CommunityUpdateForm {
actor_id: Some(community_actor_id.clone()), actor_id: Some(community_actor_id.clone()),
@ -136,10 +129,7 @@ async fn community_updates_2020_04_02(
Ok(()) Ok(())
} }
async fn post_updates_2020_04_03( async fn post_updates_2020_04_03(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
protocol_and_hostname: &str,
) -> LemmyResult<()> {
use lemmy_db_schema::schema::post::dsl::{ap_id, local, post}; use lemmy_db_schema::schema::post::dsl::{ap_id, local, post};
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
@ -153,11 +143,7 @@ async fn post_updates_2020_04_03(
.await?; .await?;
for cpost in &incorrect_posts { for cpost in &incorrect_posts {
let apub_id = generate_local_apub_endpoint( let apub_id = generate_local_apub_endpoint(EndpointType::Post, &cpost.id.to_string())?;
EndpointType::Post,
&cpost.id.to_string(),
protocol_and_hostname,
)?;
Post::update( Post::update(
pool, pool,
cpost.id, cpost.id,
@ -174,10 +160,7 @@ async fn post_updates_2020_04_03(
Ok(()) Ok(())
} }
async fn comment_updates_2020_04_03( async fn comment_updates_2020_04_03(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
protocol_and_hostname: &str,
) -> LemmyResult<()> {
use lemmy_db_schema::schema::comment::dsl::{ap_id, comment, local}; use lemmy_db_schema::schema::comment::dsl::{ap_id, comment, local};
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
@ -191,11 +174,7 @@ async fn comment_updates_2020_04_03(
.await?; .await?;
for ccomment in &incorrect_comments { for ccomment in &incorrect_comments {
let apub_id = generate_local_apub_endpoint( let apub_id = generate_local_apub_endpoint(EndpointType::Comment, &ccomment.id.to_string())?;
EndpointType::Comment,
&ccomment.id.to_string(),
protocol_and_hostname,
)?;
Comment::update( Comment::update(
pool, pool,
ccomment.id, ccomment.id,
@ -212,10 +191,7 @@ async fn comment_updates_2020_04_03(
Ok(()) Ok(())
} }
async fn private_message_updates_2020_05_05( async fn private_message_updates_2020_05_05(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
protocol_and_hostname: &str,
) -> LemmyResult<()> {
use lemmy_db_schema::schema::private_message::dsl::{ap_id, local, private_message}; use lemmy_db_schema::schema::private_message::dsl::{ap_id, local, private_message};
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
@ -229,11 +205,7 @@ async fn private_message_updates_2020_05_05(
.await?; .await?;
for cpm in &incorrect_pms { for cpm in &incorrect_pms {
let apub_id = generate_local_apub_endpoint( let apub_id = generate_local_apub_endpoint(EndpointType::PrivateMessage, &cpm.id.to_string())?;
EndpointType::PrivateMessage,
&cpm.id.to_string(),
protocol_and_hostname,
)?;
PrivateMessage::update( PrivateMessage::update(
pool, pool,
cpm.id, cpm.id,
@ -282,7 +254,7 @@ async fn post_thumbnail_url_updates_2020_07_27(
/// We are setting inbox and follower URLs for local and remote actors alike, because for now /// We are setting inbox and follower URLs for local and remote actors alike, because for now
/// all federated instances are also Lemmy and use the same URL scheme. /// all federated instances are also Lemmy and use the same URL scheme.
async fn apub_columns_2021_02_02(pool: &mut DbPool<'_>, settings: &Settings) -> LemmyResult<()> { async fn apub_columns_2021_02_02(pool: &mut DbPool<'_>) -> LemmyResult<()> {
let conn = &mut get_conn(pool).await?; let conn = &mut get_conn(pool).await?;
info!("Running apub_columns_2021_02_02"); info!("Running apub_columns_2021_02_02");
{ {
@ -294,7 +266,7 @@ async fn apub_columns_2021_02_02(pool: &mut DbPool<'_>, settings: &Settings) ->
for p in &persons { for p in &persons {
let inbox_url_ = generate_inbox_url(&p.actor_id)?; let inbox_url_ = generate_inbox_url(&p.actor_id)?;
let shared_inbox_url_ = generate_shared_inbox_url(settings)?; let shared_inbox_url_ = generate_shared_inbox_url()?;
diesel::update(person.find(p.id)) diesel::update(person.find(p.id))
.set(( .set((
inbox_url.eq(inbox_url_), inbox_url.eq(inbox_url_),
@ -320,7 +292,7 @@ async fn apub_columns_2021_02_02(pool: &mut DbPool<'_>, settings: &Settings) ->
for c in &communities { for c in &communities {
let followers_url_ = generate_followers_url(&c.actor_id)?; let followers_url_ = generate_followers_url(&c.actor_id)?;
let inbox_url_ = generate_inbox_url(&c.actor_id)?; let inbox_url_ = generate_inbox_url(&c.actor_id)?;
let shared_inbox_url_ = generate_shared_inbox_url(settings)?; let shared_inbox_url_ = generate_shared_inbox_url()?;
diesel::update(community.find(c.id)) diesel::update(community.find(c.id))
.set(( .set((
followers_url.eq(followers_url_), followers_url.eq(followers_url_),
@ -342,7 +314,6 @@ async fn apub_columns_2021_02_02(pool: &mut DbPool<'_>, settings: &Settings) ->
async fn instance_actor_2022_01_28( async fn instance_actor_2022_01_28(
pool: &mut DbPool<'_>, pool: &mut DbPool<'_>,
protocol_and_hostname: &str, protocol_and_hostname: &str,
settings: &Settings,
) -> LemmyResult<()> { ) -> LemmyResult<()> {
info!("Running instance_actor_2021_09_29"); info!("Running instance_actor_2021_09_29");
if let Ok(site_view) = SiteView::read_local(pool).await { if let Ok(site_view) = SiteView::read_local(pool).await {
@ -356,7 +327,7 @@ async fn instance_actor_2022_01_28(
let site_form = SiteUpdateForm { let site_form = SiteUpdateForm {
actor_id: Some(actor_id.clone().into()), actor_id: Some(actor_id.clone().into()),
last_refreshed_at: Some(naive_now()), last_refreshed_at: Some(naive_now()),
inbox_url: Some(generate_shared_inbox_url(settings)?), inbox_url: Some(generate_shared_inbox_url()?),
private_key: Some(Some(key_pair.private_key)), private_key: Some(Some(key_pair.private_key)),
public_key: Some(key_pair.public_key), public_key: Some(key_pair.public_key),
..Default::default() ..Default::default()
@ -427,10 +398,7 @@ async fn regenerate_public_keys_2022_07_05(pool: &mut DbPool<'_>) -> LemmyResult
/// ///
/// If a site already exists, the DB migration should generate a local_site row. /// If a site already exists, the DB migration should generate a local_site row.
/// This will only be run for brand new sites. /// This will only be run for brand new sites.
async fn initialize_local_site_2022_10_10( async fn initialize_local_site_2022_10_10(pool: &mut DbPool<'_>) -> LemmyResult<()> {
pool: &mut DbPool<'_>,
settings: &Settings,
) -> LemmyResult<()> {
info!("Running initialize_local_site_2022_10_10"); info!("Running initialize_local_site_2022_10_10");
// Check to see if local_site exists // Check to see if local_site exists
@ -439,26 +407,23 @@ async fn initialize_local_site_2022_10_10(
} }
info!("No Local Site found, creating it."); info!("No Local Site found, creating it.");
let domain = settings let domain = SETTINGS
.get_hostname_without_port() .get_hostname_without_port()
.expect("must have domain"); .expect("must have domain");
// Upsert this to the instance table // Upsert this to the instance table
let instance = Instance::read_or_create(pool, domain).await?; let instance = Instance::read_or_create(pool, domain).await?;
if let Some(setup) = &settings.setup { if let Some(setup) = &SETTINGS.setup {
let person_keypair = generate_actor_keypair()?; let person_keypair = generate_actor_keypair()?;
let person_actor_id = generate_local_apub_endpoint( let person_actor_id =
EndpointType::Person, generate_local_apub_endpoint(EndpointType::Person, &setup.admin_username)?;
&setup.admin_username,
&settings.get_protocol_and_hostname(),
)?;
// Register the user if there's a site setup // Register the user if there's a site setup
let person_form = PersonInsertForm { let person_form = PersonInsertForm {
actor_id: Some(person_actor_id.clone()), actor_id: Some(person_actor_id.clone()),
inbox_url: Some(generate_inbox_url(&person_actor_id)?), inbox_url: Some(generate_inbox_url(&person_actor_id)?),
shared_inbox_url: Some(generate_shared_inbox_url(settings)?), shared_inbox_url: Some(generate_shared_inbox_url()?),
private_key: Some(person_keypair.private_key), private_key: Some(person_keypair.private_key),
..PersonInsertForm::new( ..PersonInsertForm::new(
setup.admin_username.clone(), setup.admin_username.clone(),
@ -478,9 +443,9 @@ async fn initialize_local_site_2022_10_10(
// Add an entry for the site table // Add an entry for the site table
let site_key_pair = generate_actor_keypair()?; let site_key_pair = generate_actor_keypair()?;
let site_actor_id = Url::parse(&settings.get_protocol_and_hostname())?; let site_actor_id = Url::parse(&SETTINGS.get_protocol_and_hostname())?;
let name = settings let name = SETTINGS
.setup .setup
.clone() .clone()
.map(|s| s.site_name) .map(|s| s.site_name)
@ -488,7 +453,7 @@ async fn initialize_local_site_2022_10_10(
let site_form = SiteInsertForm { let site_form = SiteInsertForm {
actor_id: Some(site_actor_id.clone().into()), actor_id: Some(site_actor_id.clone().into()),
last_refreshed_at: Some(naive_now()), last_refreshed_at: Some(naive_now()),
inbox_url: Some(generate_shared_inbox_url(settings)?), inbox_url: Some(generate_shared_inbox_url()?),
private_key: Some(site_key_pair.private_key), private_key: Some(site_key_pair.private_key),
public_key: Some(site_key_pair.public_key), public_key: Some(site_key_pair.public_key),
@ -498,7 +463,7 @@ async fn initialize_local_site_2022_10_10(
// Finally create the local_site row // Finally create the local_site row
let local_site_form = LocalSiteInsertForm { let local_site_form = LocalSiteInsertForm {
site_setup: Some(settings.setup.is_some()), site_setup: Some(SETTINGS.setup.is_some()),
..LocalSiteInsertForm::new(site.id) ..LocalSiteInsertForm::new(site.id)
}; };
let local_site = LocalSite::create(pool, &local_site_form).await?; let local_site = LocalSite::create(pool, &local_site_form).await?;