mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-10-03 00:31:58 +00:00
Merge branch 'main' into language-tagging
This commit is contained in:
commit
f10c575113
42 changed files with 232 additions and 494 deletions
|
@ -42,7 +42,7 @@ impl Perform for HideCommunity {
|
|||
let community_form = CommunityForm {
|
||||
name: read_community.name,
|
||||
title: read_community.title,
|
||||
description: read_community.description.to_owned(),
|
||||
description: Some(read_community.description.to_owned()),
|
||||
hidden: Some(data.hidden),
|
||||
updated: Some(naive_now()),
|
||||
..CommunityForm::default()
|
||||
|
|
|
@ -3,7 +3,7 @@ use actix_web::web::Data;
|
|||
use bcrypt::verify;
|
||||
use lemmy_api_common::{
|
||||
person::{Login, LoginResponse},
|
||||
utils::{blocking, check_registration_application},
|
||||
utils::{blocking, check_registration_application, check_user_valid},
|
||||
};
|
||||
use lemmy_db_schema::source::site::Site;
|
||||
use lemmy_db_views::structs::LocalUserView;
|
||||
|
@ -39,6 +39,11 @@ impl Perform for Login {
|
|||
if !valid {
|
||||
return Err(LemmyError::from_message("password_incorrect"));
|
||||
}
|
||||
check_user_valid(
|
||||
local_user_view.person.banned,
|
||||
local_user_view.person.ban_expires,
|
||||
local_user_view.person.deleted,
|
||||
)?;
|
||||
|
||||
let site = blocking(context.pool(), Site::read_local_site).await??;
|
||||
if site.require_email_verification && !local_user_view.local_user.email_verified {
|
||||
|
|
|
@ -1,5 +1,7 @@
|
|||
use crate::{request::purge_image_from_pictrs, sensitive::Sensitive, site::FederatedInstances};
|
||||
use chrono::NaiveDateTime;
|
||||
use lemmy_db_schema::{
|
||||
impls::person::is_banned,
|
||||
newtypes::{CommunityId, LocalUserId, PersonId, PostId},
|
||||
source::{
|
||||
comment::Comment,
|
||||
|
@ -129,15 +131,11 @@ pub async fn get_local_user_view_from_jwt(
|
|||
let local_user_id = LocalUserId(claims.sub);
|
||||
let local_user_view =
|
||||
blocking(pool, move |conn| LocalUserView::read(conn, local_user_id)).await??;
|
||||
// Check for a site ban
|
||||
if local_user_view.person.is_banned() {
|
||||
return Err(LemmyError::from_message("site_ban"));
|
||||
}
|
||||
|
||||
// Check for user deletion
|
||||
if local_user_view.person.deleted {
|
||||
return Err(LemmyError::from_message("deleted"));
|
||||
}
|
||||
check_user_valid(
|
||||
local_user_view.person.banned,
|
||||
local_user_view.person.ban_expires,
|
||||
local_user_view.person.deleted,
|
||||
)?;
|
||||
|
||||
check_validator_time(&local_user_view.local_user.validator_time, &claims)?;
|
||||
|
||||
|
@ -146,7 +144,7 @@ pub async fn get_local_user_view_from_jwt(
|
|||
|
||||
/// Checks if user's token was issued before user's password reset.
|
||||
pub fn check_validator_time(
|
||||
validator_time: &chrono::NaiveDateTime,
|
||||
validator_time: &NaiveDateTime,
|
||||
claims: &Claims,
|
||||
) -> Result<(), LemmyError> {
|
||||
let user_validation_time = validator_time.timestamp();
|
||||
|
@ -169,30 +167,6 @@ pub async fn get_local_user_view_from_jwt_opt(
|
|||
}
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip_all)]
|
||||
pub async fn get_local_user_settings_view_from_jwt(
|
||||
jwt: &Sensitive<String>,
|
||||
pool: &DbPool,
|
||||
secret: &Secret,
|
||||
) -> Result<LocalUserSettingsView, LemmyError> {
|
||||
let claims = Claims::decode(jwt.as_ref(), &secret.jwt_secret)
|
||||
.map_err(|e| e.with_message("not_logged_in"))?
|
||||
.claims;
|
||||
let local_user_id = LocalUserId(claims.sub);
|
||||
let local_user_view = blocking(pool, move |conn| {
|
||||
LocalUserSettingsView::read(conn, local_user_id)
|
||||
})
|
||||
.await??;
|
||||
// Check for a site ban
|
||||
if local_user_view.person.is_banned() {
|
||||
return Err(LemmyError::from_message("site_ban"));
|
||||
}
|
||||
|
||||
check_validator_time(&local_user_view.local_user.validator_time, &claims)?;
|
||||
|
||||
Ok(local_user_view)
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip_all)]
|
||||
pub async fn get_local_user_settings_view_from_jwt_opt(
|
||||
jwt: Option<&Sensitive<String>>,
|
||||
|
@ -200,12 +174,45 @@ pub async fn get_local_user_settings_view_from_jwt_opt(
|
|||
secret: &Secret,
|
||||
) -> Result<Option<LocalUserSettingsView>, LemmyError> {
|
||||
match jwt {
|
||||
Some(jwt) => Ok(Some(
|
||||
get_local_user_settings_view_from_jwt(jwt, pool, secret).await?,
|
||||
)),
|
||||
Some(jwt) => {
|
||||
let claims = Claims::decode(jwt.as_ref(), &secret.jwt_secret)
|
||||
.map_err(|e| e.with_message("not_logged_in"))?
|
||||
.claims;
|
||||
let local_user_id = LocalUserId(claims.sub);
|
||||
let local_user_view = blocking(pool, move |conn| {
|
||||
LocalUserSettingsView::read(conn, local_user_id)
|
||||
})
|
||||
.await??;
|
||||
check_user_valid(
|
||||
local_user_view.person.banned,
|
||||
local_user_view.person.ban_expires,
|
||||
local_user_view.person.deleted,
|
||||
)?;
|
||||
|
||||
check_validator_time(&local_user_view.local_user.validator_time, &claims)?;
|
||||
|
||||
Ok(Some(local_user_view))
|
||||
}
|
||||
None => Ok(None),
|
||||
}
|
||||
}
|
||||
pub fn check_user_valid(
|
||||
banned: bool,
|
||||
ban_expires: Option<NaiveDateTime>,
|
||||
deleted: bool,
|
||||
) -> Result<(), LemmyError> {
|
||||
// Check for a site ban
|
||||
if is_banned(banned, ban_expires) {
|
||||
return Err(LemmyError::from_message("site_ban"));
|
||||
}
|
||||
|
||||
// check for account deletion
|
||||
if deleted {
|
||||
return Err(LemmyError::from_message("deleted"));
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
|
||||
#[tracing::instrument(skip_all)]
|
||||
pub async fn check_community_ban(
|
||||
|
|
|
@ -26,7 +26,7 @@ use lemmy_db_schema::{
|
|||
site::Site,
|
||||
},
|
||||
traits::{Crud, Followable, Joinable},
|
||||
utils::diesel_option_overwrite_to_url,
|
||||
utils::{diesel_option_overwrite, diesel_option_overwrite_to_url},
|
||||
};
|
||||
use lemmy_db_views_actor::structs::CommunityView;
|
||||
use lemmy_utils::{
|
||||
|
@ -60,6 +60,7 @@ impl PerformCrud for CreateCommunity {
|
|||
// Check to make sure the icon and banners are urls
|
||||
let icon = diesel_option_overwrite_to_url(&data.icon)?;
|
||||
let banner = diesel_option_overwrite_to_url(&data.banner)?;
|
||||
let description = diesel_option_overwrite(&data.description);
|
||||
|
||||
check_slurs(&data.name, &context.settings().slur_regex())?;
|
||||
check_slurs(&data.title, &context.settings().slur_regex())?;
|
||||
|
@ -87,7 +88,7 @@ impl PerformCrud for CreateCommunity {
|
|||
let community_form = CommunityForm {
|
||||
name: data.name.to_owned(),
|
||||
title: data.title.to_owned(),
|
||||
description: data.description.to_owned(),
|
||||
description,
|
||||
icon,
|
||||
banner,
|
||||
nsfw: data.nsfw,
|
||||
|
|
|
@ -9,7 +9,7 @@ use lemmy_db_schema::{
|
|||
newtypes::PersonId,
|
||||
source::community::{Community, CommunityForm},
|
||||
traits::Crud,
|
||||
utils::{diesel_option_overwrite_to_url, naive_now},
|
||||
utils::{diesel_option_overwrite, diesel_option_overwrite_to_url, naive_now},
|
||||
};
|
||||
use lemmy_db_views_actor::structs::CommunityModeratorView;
|
||||
use lemmy_utils::{error::LemmyError, utils::check_slurs_opt, ConnectionId};
|
||||
|
@ -31,6 +31,7 @@ impl PerformCrud for EditCommunity {
|
|||
|
||||
let icon = diesel_option_overwrite_to_url(&data.icon)?;
|
||||
let banner = diesel_option_overwrite_to_url(&data.banner)?;
|
||||
let description = diesel_option_overwrite(&data.description);
|
||||
|
||||
check_slurs_opt(&data.title, &context.settings().slur_regex())?;
|
||||
check_slurs_opt(&data.description, &context.settings().slur_regex())?;
|
||||
|
@ -55,7 +56,7 @@ impl PerformCrud for EditCommunity {
|
|||
let community_form = CommunityForm {
|
||||
name: read_community.name,
|
||||
title: data.title.to_owned().unwrap_or(read_community.title),
|
||||
description: data.description.to_owned(),
|
||||
description,
|
||||
icon,
|
||||
banner,
|
||||
nsfw: data.nsfw,
|
||||
|
|
|
@ -25,17 +25,12 @@ use lemmy_db_schema::{
|
|||
post::{Post, PostForm, PostLike, PostLikeForm},
|
||||
},
|
||||
traits::{Crud, Likeable},
|
||||
utils::diesel_option_overwrite,
|
||||
};
|
||||
use lemmy_db_views_actor::structs::CommunityView;
|
||||
use lemmy_utils::{
|
||||
error::LemmyError,
|
||||
utils::{
|
||||
check_slurs,
|
||||
check_slurs_opt,
|
||||
clean_optional_text,
|
||||
clean_url_params,
|
||||
is_valid_post_title,
|
||||
},
|
||||
utils::{check_slurs, check_slurs_opt, clean_url_params, is_valid_post_title},
|
||||
ConnectionId,
|
||||
};
|
||||
use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
|
||||
|
@ -62,6 +57,10 @@ impl PerformCrud for CreatePost {
|
|||
check_slurs_opt(&data.body, slur_regex)?;
|
||||
honeypot_check(&data.honeypot)?;
|
||||
|
||||
let data_url = data.url.as_ref();
|
||||
let url = Some(data_url.map(clean_url_params).map(Into::into)); // TODO no good way to handle a "clear"
|
||||
let body = diesel_option_overwrite(&data.body);
|
||||
|
||||
if !is_valid_post_title(&data.name) {
|
||||
return Err(LemmyError::from_message("invalid_post_title"));
|
||||
}
|
||||
|
@ -86,11 +85,10 @@ impl PerformCrud for CreatePost {
|
|||
}
|
||||
|
||||
// Fetch post links and pictrs cached image
|
||||
let data_url = data.url.as_ref();
|
||||
let (metadata_res, thumbnail_url) =
|
||||
fetch_site_data(context.client(), context.settings(), data_url).await;
|
||||
let (embed_title, embed_description, embed_video_url) = metadata_res
|
||||
.map(|u| (u.title, u.description, u.embed_video_url))
|
||||
.map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
|
||||
.unwrap_or_default();
|
||||
|
||||
let language_id = Some(
|
||||
|
@ -104,16 +102,16 @@ impl PerformCrud for CreatePost {
|
|||
|
||||
let post_form = PostForm {
|
||||
name: data.name.trim().to_owned(),
|
||||
url: data_url.map(|u| clean_url_params(u.to_owned()).into()),
|
||||
body: clean_optional_text(&data.body),
|
||||
url,
|
||||
body,
|
||||
community_id: data.community_id,
|
||||
creator_id: local_user_view.person.id,
|
||||
nsfw: data.nsfw,
|
||||
embed_title,
|
||||
embed_description,
|
||||
embed_video_url,
|
||||
thumbnail_url,
|
||||
language_id,
|
||||
thumbnail_url: Some(thumbnail_url),
|
||||
..PostForm::default()
|
||||
};
|
||||
|
||||
|
|
|
@ -19,11 +19,11 @@ use lemmy_db_schema::{
|
|||
post::{Post, PostForm},
|
||||
},
|
||||
traits::Crud,
|
||||
utils::naive_now,
|
||||
utils::{diesel_option_overwrite, naive_now},
|
||||
};
|
||||
use lemmy_utils::{
|
||||
error::LemmyError,
|
||||
utils::{check_slurs_opt, clean_optional_text, clean_url_params, is_valid_post_title},
|
||||
utils::{check_slurs_opt, clean_url_params, is_valid_post_title},
|
||||
ConnectionId,
|
||||
};
|
||||
use lemmy_websocket::{send::send_post_ws_message, LemmyContext, UserOperationCrud};
|
||||
|
@ -44,6 +44,13 @@ impl PerformCrud for EditPost {
|
|||
let local_user_view =
|
||||
get_local_user_view_from_jwt(&data.auth, context.pool(), context.secret()).await?;
|
||||
|
||||
let data_url = data.url.as_ref();
|
||||
|
||||
// TODO No good way to handle a clear.
|
||||
// Issue link: https://github.com/LemmyNet/lemmy/issues/2287
|
||||
let url = Some(data_url.map(clean_url_params).map(Into::into));
|
||||
let body = diesel_option_overwrite(&data.body);
|
||||
|
||||
let slur_regex = &context.settings().slur_regex();
|
||||
check_slurs_opt(&data.name, slur_regex)?;
|
||||
check_slurs_opt(&data.body, slur_regex)?;
|
||||
|
@ -75,7 +82,7 @@ impl PerformCrud for EditPost {
|
|||
let (metadata_res, thumbnail_url) =
|
||||
fetch_site_data(context.client(), context.settings(), data_url).await;
|
||||
let (embed_title, embed_description, embed_video_url) = metadata_res
|
||||
.map(|u| (u.title, u.description, u.embed_video_url))
|
||||
.map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
|
||||
.unwrap_or_default();
|
||||
|
||||
let language_id = Some(
|
||||
|
@ -91,15 +98,15 @@ impl PerformCrud for EditPost {
|
|||
creator_id: orig_post.creator_id.to_owned(),
|
||||
community_id: orig_post.community_id,
|
||||
name: data.name.to_owned().unwrap_or(orig_post.name),
|
||||
url: data_url.map(|u| clean_url_params(u.to_owned()).into()),
|
||||
body: clean_optional_text(&data.body),
|
||||
url,
|
||||
body,
|
||||
nsfw: data.nsfw,
|
||||
updated: Some(naive_now()),
|
||||
embed_title,
|
||||
embed_description,
|
||||
embed_video_url,
|
||||
thumbnail_url,
|
||||
language_id,
|
||||
thumbnail_url: Some(thumbnail_url),
|
||||
..PostForm::default()
|
||||
};
|
||||
|
||||
|
|
|
@ -40,6 +40,7 @@ impl PerformCrud for EditSite {
|
|||
let sidebar = diesel_option_overwrite(&data.sidebar);
|
||||
let description = diesel_option_overwrite(&data.description);
|
||||
let application_question = diesel_option_overwrite(&data.application_question);
|
||||
let legal_information = diesel_option_overwrite(&data.legal_information);
|
||||
let icon = diesel_option_overwrite_to_url(&data.icon)?;
|
||||
let banner = diesel_option_overwrite_to_url(&data.banner)?;
|
||||
|
||||
|
@ -84,7 +85,7 @@ impl PerformCrud for EditSite {
|
|||
private_instance: data.private_instance,
|
||||
default_theme: data.default_theme.clone(),
|
||||
default_post_listing_type: data.default_post_listing_type.clone(),
|
||||
legal_information: data.legal_information.clone(),
|
||||
legal_information,
|
||||
..SiteForm::default()
|
||||
};
|
||||
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
{
|
||||
"actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": "http://ds9.lemmy.ml/post/1",
|
||||
"cc": [
|
||||
"https://www.w3.org/ns/activitystreams#Public"
|
||||
|
|
|
@ -1,8 +1,5 @@
|
|||
{
|
||||
"actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": "http://ds9.lemmy.ml/comment/1",
|
||||
"cc": [
|
||||
"https://www.w3.org/ns/activitystreams#Public"
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
{
|
||||
"actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": {
|
||||
"actor": "http://enterprise.lemmy.ml/u/lemmy_beta",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": "http://ds9.lemmy.ml/post/1",
|
||||
"cc": [
|
||||
"https://www.w3.org/ns/activitystreams#Public"
|
||||
|
|
|
@ -1,13 +1,7 @@
|
|||
{
|
||||
"actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": {
|
||||
"actor": "http://ds9.lemmy.ml/u/lemmy_alpha",
|
||||
"to": [
|
||||
"http://enterprise.lemmy.ml/c/main"
|
||||
],
|
||||
"object": "http://ds9.lemmy.ml/comment/1",
|
||||
"cc": [
|
||||
"https://www.w3.org/ns/activitystreams#Public"
|
||||
|
|
7
crates/apub/assets/mastodon/activities/like_page.json
Normal file
7
crates/apub/assets/mastodon/activities/like_page.json
Normal file
|
@ -0,0 +1,7 @@
|
|||
{
|
||||
"@context":"https://www.w3.org/ns/activitystreams",
|
||||
"id":"https://mastodon.madrid/users/felix#likes/212340",
|
||||
"type":"Like",
|
||||
"actor":"https://mastodon.madrid/users/felix",
|
||||
"object":"https://ds9.lemmy.ml/post/147"
|
||||
}
|
12
crates/apub/assets/mastodon/activities/undo_like_page.json
Normal file
12
crates/apub/assets/mastodon/activities/undo_like_page.json
Normal file
|
@ -0,0 +1,12 @@
|
|||
{
|
||||
"@context":"https://www.w3.org/ns/activitystreams",
|
||||
"id":"https://mastodon.madrid/users/felix#likes/212341/undo",
|
||||
"type":"Undo",
|
||||
"actor":"https://mastodon.madrid/users/felix",
|
||||
"object": {
|
||||
"id":"https://mastodon.madrid/users/felix#likes/212341",
|
||||
"type":"Like",
|
||||
"actor":"https://mastodon.madrid/users/felix",
|
||||
"object":"https://ds9.lemmy.ml/post/147"
|
||||
}
|
||||
}
|
|
@ -11,10 +11,12 @@ use activitypub_federation::{
|
|||
utils::verify_urls_match,
|
||||
};
|
||||
use activitystreams_kinds::activity::AcceptType;
|
||||
use lemmy_api_common::utils::blocking;
|
||||
use lemmy_api_common::{community::CommunityResponse, utils::blocking};
|
||||
use lemmy_db_schema::{source::community::CommunityFollower, traits::Followable};
|
||||
use lemmy_db_views::structs::LocalUserView;
|
||||
use lemmy_db_views_actor::structs::CommunityView;
|
||||
use lemmy_utils::error::LemmyError;
|
||||
use lemmy_websocket::LemmyContext;
|
||||
use lemmy_websocket::{messages::SendUserRoomMessage, LemmyContext, UserOperation};
|
||||
use url::Url;
|
||||
|
||||
impl AcceptFollowCommunity {
|
||||
|
@ -76,21 +78,47 @@ impl ActivityHandler for AcceptFollowCommunity {
|
|||
context: &Data<LemmyContext>,
|
||||
request_counter: &mut i32,
|
||||
) -> Result<(), LemmyError> {
|
||||
let person = self
|
||||
let community = self
|
||||
.actor
|
||||
.dereference(context, local_instance(context), request_counter)
|
||||
.await?;
|
||||
let community = self
|
||||
let person = self
|
||||
.object
|
||||
.actor
|
||||
.dereference(context, local_instance(context), request_counter)
|
||||
.await?;
|
||||
// This will throw an error if no follow was requested
|
||||
let community_id = community.id;
|
||||
let person_id = person.id;
|
||||
blocking(context.pool(), move |conn| {
|
||||
CommunityFollower::follow_accepted(conn, person.id, community.id)
|
||||
CommunityFollower::follow_accepted(conn, community_id, person_id)
|
||||
})
|
||||
.await??;
|
||||
|
||||
// Send the Subscribed message over websocket
|
||||
// Re-read the community_view to get the new SubscribedType
|
||||
let community_view = blocking(context.pool(), move |conn| {
|
||||
CommunityView::read(conn, community_id, Some(person_id))
|
||||
})
|
||||
.await??;
|
||||
|
||||
// Get the local_user_id
|
||||
let local_recipient_id = blocking(context.pool(), move |conn| {
|
||||
LocalUserView::read_person(conn, person_id)
|
||||
})
|
||||
.await??
|
||||
.local_user
|
||||
.id;
|
||||
|
||||
let response = CommunityResponse { community_view };
|
||||
|
||||
context.chat_server().do_send(SendUserRoomMessage {
|
||||
op: UserOperation::FollowCommunity,
|
||||
response,
|
||||
local_recipient_id,
|
||||
websocket_id: None,
|
||||
});
|
||||
|
||||
Ok(())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -46,14 +46,13 @@ impl UndoVote {
|
|||
.await??
|
||||
.into();
|
||||
|
||||
let object = Vote::new(object, actor, &community, kind.clone(), context)?;
|
||||
let object = Vote::new(object, actor, kind.clone(), context)?;
|
||||
let id = generate_activity_id(
|
||||
UndoType::Undo,
|
||||
&context.settings().get_protocol_and_hostname(),
|
||||
)?;
|
||||
let undo_vote = UndoVote {
|
||||
actor: ObjectId::new(actor.actor_id()),
|
||||
to: vec![community.actor_id()],
|
||||
object,
|
||||
cc: vec![public()],
|
||||
kind: UndoType::Undo,
|
||||
|
|
|
@ -31,13 +31,11 @@ impl Vote {
|
|||
pub(in crate::activities::voting) fn new(
|
||||
object: &PostOrComment,
|
||||
actor: &ApubPerson,
|
||||
community: &ApubCommunity,
|
||||
kind: VoteType,
|
||||
context: &LemmyContext,
|
||||
) -> Result<Vote, LemmyError> {
|
||||
Ok(Vote {
|
||||
actor: ObjectId::new(actor.actor_id()),
|
||||
to: vec![community.actor_id()],
|
||||
object: ObjectId::new(object.ap_id()),
|
||||
cc: vec![public()],
|
||||
kind: kind.clone(),
|
||||
|
@ -59,7 +57,7 @@ impl Vote {
|
|||
})
|
||||
.await??
|
||||
.into();
|
||||
let vote = Vote::new(object, actor, &community, kind, context)?;
|
||||
let vote = Vote::new(object, actor, kind, context)?;
|
||||
|
||||
let activity = AnnouncableActivities::Vote(vote);
|
||||
send_activity_in_community(activity, actor, &community, vec![], context).await
|
||||
|
|
|
@ -197,3 +197,43 @@ impl ActivityHandler for GroupInboxActivities {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
mod tests {
|
||||
use crate::{
|
||||
activity_lists::{GroupInboxActivities, PersonInboxActivities, SiteInboxActivities},
|
||||
protocol::tests::test_parse_lemmy_item,
|
||||
};
|
||||
|
||||
#[test]
|
||||
fn test_group_inbox() {
|
||||
test_parse_lemmy_item::<GroupInboxActivities>("assets/lemmy/activities/following/follow.json")
|
||||
.unwrap();
|
||||
test_parse_lemmy_item::<GroupInboxActivities>(
|
||||
"assets/lemmy/activities/create_or_update/create_note.json",
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_person_inbox() {
|
||||
test_parse_lemmy_item::<PersonInboxActivities>("assets/lemmy/activities/following/accept.json")
|
||||
.unwrap();
|
||||
test_parse_lemmy_item::<PersonInboxActivities>(
|
||||
"assets/lemmy/activities/create_or_update/create_note.json",
|
||||
)
|
||||
.unwrap();
|
||||
test_parse_lemmy_item::<PersonInboxActivities>(
|
||||
"assets/lemmy/activities/create_or_update/create_private_message.json",
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
fn test_site_inbox() {
|
||||
test_parse_lemmy_item::<SiteInboxActivities>(
|
||||
"assets/lemmy/activities/deletion/delete_user.json",
|
||||
)
|
||||
.unwrap();
|
||||
}
|
||||
}
|
||||
|
|
|
@ -56,6 +56,7 @@ where
|
|||
for<'de2> <ActorT as ApubObject>::ApubType: serde::Deserialize<'de2>,
|
||||
{
|
||||
let activity_value: Value = serde_json::from_str(&payload)?;
|
||||
debug!("Received activity {:#}", payload.as_str());
|
||||
let activity: Activity = serde_json::from_value(activity_value.clone())?;
|
||||
// Log the activity, so we avoid receiving and parsing it twice.
|
||||
let insert = insert_activity(activity.id(), activity_value, false, true, context.pool()).await?;
|
||||
|
|
|
@ -180,11 +180,11 @@ impl ApubObject for ApubPost {
|
|||
(None, page.image.map(|i| i.url.into()))
|
||||
};
|
||||
let (embed_title, embed_description, embed_video_url) = metadata_res
|
||||
.map(|u| (u.title, u.description, u.embed_video_url))
|
||||
.map(|u| (Some(u.title), Some(u.description), Some(u.embed_video_url)))
|
||||
.unwrap_or_default();
|
||||
let body_slurs_removed =
|
||||
read_from_string_or_source_opt(&page.content, &page.media_type, &page.source)
|
||||
.map(|s| remove_slurs(&s, &context.settings().slur_regex()));
|
||||
.map(|s| Some(remove_slurs(&s, &context.settings().slur_regex())));
|
||||
let language = page.language.map(|l| l.identifier);
|
||||
let language = blocking(context.pool(), move |conn| {
|
||||
Language::read_id_from_code_opt(conn, language.as_deref())
|
||||
|
@ -193,7 +193,7 @@ impl ApubObject for ApubPost {
|
|||
|
||||
PostForm {
|
||||
name: page.name.clone(),
|
||||
url: url.map(Into::into),
|
||||
url: Some(url.map(Into::into)),
|
||||
body: body_slurs_removed,
|
||||
creator_id: creator.id,
|
||||
community_id: community.id,
|
||||
|
@ -207,7 +207,7 @@ impl ApubObject for ApubPost {
|
|||
embed_title,
|
||||
embed_description,
|
||||
embed_video_url,
|
||||
thumbnail_url,
|
||||
thumbnail_url: Some(thumbnail_url),
|
||||
ap_id: Some(page.id.clone().into()),
|
||||
local: Some(false),
|
||||
language_id: language,
|
||||
|
|
|
@ -45,6 +45,8 @@ mod tests {
|
|||
test_json::<Delete>("assets/mastodon/activities/delete.json").unwrap();
|
||||
test_json::<FollowCommunity>("assets/mastodon/activities/follow.json").unwrap();
|
||||
test_json::<UndoFollowCommunity>("assets/mastodon/activities/undo_follow.json").unwrap();
|
||||
test_json::<Vote>("assets/mastodon/activities/like_page.json").unwrap();
|
||||
test_json::<UndoVote>("assets/mastodon/activities/undo_like_page.json").unwrap();
|
||||
}
|
||||
|
||||
#[test]
|
||||
|
|
|
@ -11,10 +11,8 @@ use url::Url;
|
|||
#[serde(rename_all = "camelCase")]
|
||||
pub struct UndoVote {
|
||||
pub(crate) actor: ObjectId<ApubPerson>,
|
||||
#[serde(deserialize_with = "deserialize_one_or_many")]
|
||||
pub(crate) to: Vec<Url>,
|
||||
pub(crate) object: Vote,
|
||||
#[serde(deserialize_with = "deserialize_one_or_many")]
|
||||
#[serde(deserialize_with = "deserialize_one_or_many", default)]
|
||||
pub(crate) cc: Vec<Url>,
|
||||
#[serde(rename = "type")]
|
||||
pub(crate) kind: UndoType,
|
||||
|
|
|
@ -14,10 +14,8 @@ use url::Url;
|
|||
#[serde(rename_all = "camelCase")]
|
||||
pub struct Vote {
|
||||
pub(crate) actor: ObjectId<ApubPerson>,
|
||||
#[serde(deserialize_with = "deserialize_one_or_many")]
|
||||
pub(crate) to: Vec<Url>,
|
||||
pub(crate) object: ObjectId<PostOrComment>,
|
||||
#[serde(deserialize_with = "deserialize_one_or_many")]
|
||||
#[serde(deserialize_with = "deserialize_one_or_many", default)]
|
||||
pub(crate) cc: Vec<Url>,
|
||||
#[serde(rename = "type")]
|
||||
pub(crate) kind: VoteType,
|
||||
|
|
|
@ -78,7 +78,11 @@ impl Group {
|
|||
CommunityForm {
|
||||
name: self.preferred_username.clone(),
|
||||
title: self.name.unwrap_or(self.preferred_username),
|
||||
description: read_from_string_or_source_opt(&self.summary, &None, &self.source),
|
||||
description: Some(read_from_string_or_source_opt(
|
||||
&self.summary,
|
||||
&None,
|
||||
&self.source,
|
||||
)),
|
||||
removed: None,
|
||||
published: self.published.map(|u| u.naive_local()),
|
||||
updated: self.updated.map(|u| u.naive_local()),
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
use crate::{
|
||||
newtypes::{DbUrl, PersonId},
|
||||
schema::person::dsl::*,
|
||||
source::person::{Person, PersonForm, PersonSafe},
|
||||
source::person::{Person, PersonForm},
|
||||
traits::{ApubActor, Crud},
|
||||
utils::{functions::lower, naive_now},
|
||||
};
|
||||
|
@ -258,10 +258,6 @@ impl Person {
|
|||
.get_result::<Self>(conn)
|
||||
}
|
||||
|
||||
pub fn is_banned(&self) -> bool {
|
||||
is_banned(self.banned, self.ban_expires)
|
||||
}
|
||||
|
||||
pub fn leave_admin(conn: &PgConnection, person_id: PersonId) -> Result<Self, Error> {
|
||||
diesel::update(person.find(person_id))
|
||||
.set(admin.eq(false))
|
||||
|
@ -278,13 +274,7 @@ impl Person {
|
|||
}
|
||||
}
|
||||
|
||||
impl PersonSafe {
|
||||
pub fn is_banned(&self) -> bool {
|
||||
is_banned(self.banned, self.ban_expires)
|
||||
}
|
||||
}
|
||||
|
||||
fn is_banned(banned_: bool, expires: Option<chrono::NaiveDateTime>) -> bool {
|
||||
pub fn is_banned(banned_: bool, expires: Option<chrono::NaiveDateTime>) -> bool {
|
||||
if let Some(expires) = expires {
|
||||
banned_ && expires.gt(&naive_now())
|
||||
} else {
|
||||
|
|
|
@ -44,7 +44,6 @@ pub enum ListingType {
|
|||
All,
|
||||
Local,
|
||||
Subscribed,
|
||||
Community,
|
||||
}
|
||||
|
||||
#[derive(EnumString, Display, Debug, Serialize, Deserialize, Clone, Copy)]
|
||||
|
|
|
@ -59,7 +59,7 @@ pub struct CommunitySafe {
|
|||
pub struct CommunityForm {
|
||||
pub name: String,
|
||||
pub title: String,
|
||||
pub description: Option<String>,
|
||||
pub description: Option<Option<String>>,
|
||||
pub removed: Option<bool>,
|
||||
pub published: Option<chrono::NaiveDateTime>,
|
||||
pub updated: Option<chrono::NaiveDateTime>,
|
||||
|
|
|
@ -38,18 +38,18 @@ pub struct PostForm {
|
|||
pub creator_id: PersonId,
|
||||
pub community_id: CommunityId,
|
||||
pub nsfw: Option<bool>,
|
||||
pub url: Option<DbUrl>,
|
||||
pub body: Option<String>,
|
||||
pub url: Option<Option<DbUrl>>,
|
||||
pub body: Option<Option<String>>,
|
||||
pub removed: Option<bool>,
|
||||
pub locked: Option<bool>,
|
||||
pub published: Option<chrono::NaiveDateTime>,
|
||||
pub updated: Option<chrono::NaiveDateTime>,
|
||||
pub deleted: Option<bool>,
|
||||
pub stickied: Option<bool>,
|
||||
pub embed_title: Option<String>,
|
||||
pub embed_description: Option<String>,
|
||||
pub embed_video_url: Option<DbUrl>,
|
||||
pub thumbnail_url: Option<DbUrl>,
|
||||
pub embed_title: Option<Option<String>>,
|
||||
pub embed_description: Option<Option<String>>,
|
||||
pub embed_video_url: Option<Option<DbUrl>>,
|
||||
pub thumbnail_url: Option<Option<DbUrl>>,
|
||||
pub ap_id: Option<DbUrl>,
|
||||
pub local: Option<bool>,
|
||||
pub language_id: Option<LanguageId>,
|
||||
|
|
|
@ -60,5 +60,5 @@ pub struct SiteForm {
|
|||
pub public_key: Option<String>,
|
||||
pub default_theme: Option<String>,
|
||||
pub default_post_listing_type: Option<String>,
|
||||
pub legal_information: Option<String>,
|
||||
pub legal_information: Option<Option<String>>,
|
||||
}
|
||||
|
|
|
@ -1,9 +1,5 @@
|
|||
use crate::structs::CommentView;
|
||||
use diesel::{
|
||||
dsl::*,
|
||||
result::{Error, Error::QueryBuilderError},
|
||||
*,
|
||||
};
|
||||
use diesel::{dsl::*, result::Error, *};
|
||||
use lemmy_db_schema::{
|
||||
aggregates::structs::CommentAggregates,
|
||||
newtypes::{CommentId, CommunityId, DbUrl, PersonId, PostId},
|
||||
|
@ -232,7 +228,7 @@ impl<'a> CommentQueryBuilder<'a> {
|
|||
pub fn create(conn: &'a PgConnection) -> Self {
|
||||
CommentQueryBuilder {
|
||||
conn,
|
||||
listing_type: None,
|
||||
listing_type: Some(ListingType::All),
|
||||
sort: None,
|
||||
community_id: None,
|
||||
community_actor_id: None,
|
||||
|
@ -445,22 +441,17 @@ impl<'a> CommentQueryBuilder<'a> {
|
|||
.or(community_follower::person_id.eq(person_id_join)),
|
||||
)
|
||||
}
|
||||
ListingType::Community => {
|
||||
if self.community_actor_id.is_none() && self.community_id.is_none() {
|
||||
return Err(QueryBuilderError("No community actor or id given".into()));
|
||||
} else {
|
||||
if let Some(community_id) = self.community_id {
|
||||
query = query.filter(post::community_id.eq(community_id));
|
||||
}
|
||||
|
||||
if let Some(community_actor_id) = self.community_actor_id {
|
||||
query = query.filter(community::actor_id.eq(community_actor_id))
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
if let Some(community_id) = self.community_id {
|
||||
query = query.filter(post::community_id.eq(community_id));
|
||||
}
|
||||
|
||||
if let Some(community_actor_id) = self.community_actor_id {
|
||||
query = query.filter(community::actor_id.eq(community_actor_id))
|
||||
}
|
||||
|
||||
if self.saved_only.unwrap_or(false) {
|
||||
query = query.filter(comment_saved::id.is_not_null());
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@ use crate::structs::{LocalUserView, PostView};
|
|||
use diesel::{
|
||||
dsl::*,
|
||||
pg::Pg,
|
||||
result::{Error, Error::QueryBuilderError},
|
||||
result::{Error},
|
||||
*,
|
||||
};
|
||||
use lemmy_db_schema::{
|
||||
|
@ -186,7 +186,7 @@ impl<'a> PostQueryBuilder<'a> {
|
|||
pub fn create(conn: &'a PgConnection) -> Self {
|
||||
PostQueryBuilder {
|
||||
conn,
|
||||
listing_type: None,
|
||||
listing_type: Some(ListingType::All),
|
||||
sort: None,
|
||||
creator_id: None,
|
||||
community_id: None,
|
||||
|
@ -372,26 +372,21 @@ impl<'a> PostQueryBuilder<'a> {
|
|||
.or(community_follower::person_id.eq(person_id_join)),
|
||||
)
|
||||
}
|
||||
ListingType::Community => {
|
||||
if self.community_actor_id.is_none() && self.community_id.is_none() {
|
||||
return Err(QueryBuilderError("No community actor or id given".into()));
|
||||
} else {
|
||||
if let Some(community_id) = self.community_id {
|
||||
query = query
|
||||
.filter(post::community_id.eq(community_id))
|
||||
.then_order_by(post_aggregates::stickied.desc());
|
||||
}
|
||||
|
||||
if let Some(community_actor_id) = self.community_actor_id {
|
||||
query = query
|
||||
.filter(community::actor_id.eq(community_actor_id))
|
||||
.then_order_by(post_aggregates::stickied.desc());
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if let Some(community_id) = self.community_id {
|
||||
query = query
|
||||
.filter(post::community_id.eq(community_id))
|
||||
.then_order_by(post_aggregates::stickied.desc());
|
||||
}
|
||||
|
||||
if let Some(community_actor_id) = self.community_actor_id {
|
||||
query = query
|
||||
.filter(community::actor_id.eq(community_actor_id))
|
||||
.then_order_by(post_aggregates::stickied.desc());
|
||||
}
|
||||
|
||||
if let Some(url_search) = self.url_search {
|
||||
query = query.filter(post::url.eq(url_search));
|
||||
}
|
||||
|
@ -538,7 +533,6 @@ mod tests {
|
|||
},
|
||||
traits::{Blockable, Crud, Likeable},
|
||||
utils::establish_unpooled_connection,
|
||||
ListingType,
|
||||
SortType,
|
||||
SubscribedType,
|
||||
};
|
||||
|
@ -774,7 +768,6 @@ mod tests {
|
|||
let data = init_data(&conn);
|
||||
|
||||
let mut read_post_listings_with_person = PostQueryBuilder::create(&conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(SortType::New)
|
||||
.community_id(data.inserted_community.id);
|
||||
read_post_listings_with_person.show_bot_accounts = Some(false);
|
||||
|
@ -809,7 +802,6 @@ mod tests {
|
|||
let data = init_data(&conn);
|
||||
|
||||
let read_post_listing_multiple_no_person = PostQueryBuilder::create(&conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(SortType::New)
|
||||
.community_id(data.inserted_community.id)
|
||||
.list()
|
||||
|
@ -848,7 +840,6 @@ mod tests {
|
|||
CommunityBlock::block(&conn, &community_block).unwrap();
|
||||
|
||||
let mut read_post_listings_with_person_after_block = PostQueryBuilder::create(&conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(SortType::New)
|
||||
.community_id(data.inserted_community.id);
|
||||
read_post_listings_with_person_after_block.show_bot_accounts = Some(true);
|
||||
|
@ -899,7 +890,6 @@ mod tests {
|
|||
let data = init_data(&conn);
|
||||
|
||||
let read_post_listings_no_user = PostQueryBuilder::create(&conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(SortType::New)
|
||||
.community_id(data.inserted_community.id)
|
||||
.list()
|
||||
|
@ -911,7 +901,6 @@ mod tests {
|
|||
assert_eq!(fr, read_post_listings_no_user[1].post.language_id);
|
||||
|
||||
let mut read_post_listings_with_user = PostQueryBuilder::create(&conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(SortType::New)
|
||||
.community_id(data.inserted_community.id);
|
||||
read_post_listings_with_user.my_local_user_id = Some(data.inserted_local_user.id);
|
||||
|
|
|
@ -107,7 +107,7 @@ impl<'a> CommunityQueryBuilder<'a> {
|
|||
CommunityQueryBuilder {
|
||||
conn,
|
||||
my_person_id: None,
|
||||
listing_type: None,
|
||||
listing_type: Some(ListingType::All),
|
||||
sort: None,
|
||||
show_nsfw: None,
|
||||
search_term: None,
|
||||
|
|
|
@ -213,7 +213,6 @@ fn get_feed_community(
|
|||
let community = Community::read_from_name(conn, community_name, false)?;
|
||||
|
||||
let posts = PostQueryBuilder::create(conn)
|
||||
.listing_type(ListingType::Community)
|
||||
.sort(*sort_type)
|
||||
.community_id(community.id)
|
||||
.limit(RSS_FETCH_LIMIT)
|
||||
|
|
|
@ -165,29 +165,17 @@ pub fn get_ip(conn_info: &ConnectionInfo) -> IpAddr {
|
|||
)
|
||||
}
|
||||
|
||||
pub fn clean_url_params(mut url: Url) -> Url {
|
||||
pub fn clean_url_params(url: &Url) -> Url {
|
||||
let mut url_out = url.to_owned();
|
||||
if url.query().is_some() {
|
||||
let new_query = url
|
||||
.query_pairs()
|
||||
.filter(|q| !CLEAN_URL_PARAMS_REGEX.is_match(&q.0))
|
||||
.map(|q| format!("{}={}", q.0, q.1))
|
||||
.join("&");
|
||||
url.set_query(Some(&new_query));
|
||||
}
|
||||
url
|
||||
}
|
||||
|
||||
pub fn clean_optional_text(text: &Option<String>) -> Option<String> {
|
||||
if let Some(text) = text {
|
||||
let trimmed = text.trim();
|
||||
if trimmed.is_empty() {
|
||||
None
|
||||
} else {
|
||||
Some(trimmed.to_owned())
|
||||
}
|
||||
} else {
|
||||
None
|
||||
url_out.set_query(Some(&new_query));
|
||||
}
|
||||
url_out
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
|
@ -198,12 +186,12 @@ mod tests {
|
|||
#[test]
|
||||
fn test_clean_url_params() {
|
||||
let url = Url::parse("https://example.com/path/123?utm_content=buffercf3b2&utm_medium=social&username=randomuser&id=123").unwrap();
|
||||
let cleaned = clean_url_params(url);
|
||||
let cleaned = clean_url_params(&url);
|
||||
let expected = Url::parse("https://example.com/path/123?username=randomuser&id=123").unwrap();
|
||||
assert_eq!(expected.to_string(), cleaned.to_string());
|
||||
|
||||
let url = Url::parse("https://example.com/path/123").unwrap();
|
||||
let cleaned = clean_url_params(url.clone());
|
||||
let cleaned = clean_url_params(&url);
|
||||
assert_eq!(url.to_string(), cleaned.to_string());
|
||||
}
|
||||
|
||||
|
|
|
@ -1,75 +0,0 @@
|
|||
# Pleroma Docker setup taken from
|
||||
# https://github.com/jordemort/docker-pleroma
|
||||
|
||||
FROM ubuntu:20.04 AS unzip
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends unzip
|
||||
|
||||
# docker buildx will fill these in
|
||||
ARG TARGETARCH=amd64
|
||||
ARG TARGETVARIANT=
|
||||
|
||||
# Clone the release build into a temporary directory and unpack it
|
||||
# We use ADD here to bust the cache if the pleroma release changes
|
||||
# We use a separate layer for extraction so we don't end up with junk
|
||||
# from ADD left over in the final image.
|
||||
ADD https://git.pleroma.social/api/v4/projects/2/jobs/artifacts/stable/download?job=${TARGETARCH}${TARGETVARIANT:+${TARGETVARIANT}l} /tmp/pleroma.zip
|
||||
|
||||
RUN mkdir -p /opt/pleroma && \
|
||||
unzip /tmp/pleroma.zip -d /tmp/ && \
|
||||
mv /tmp/release/* /opt/pleroma
|
||||
|
||||
# Ok, really build the container now
|
||||
FROM ubuntu:20.04 AS pleroma
|
||||
|
||||
ENV DEBIAN_FRONTEND=noninteractive
|
||||
|
||||
ARG SOAPBOXVERSION=1.2.3
|
||||
|
||||
RUN apt-get update && \
|
||||
apt-get install -y --no-install-recommends \
|
||||
ca-certificates curl dumb-init ffmpeg gnupg imagemagick libimage-exiftool-perl libmagic-dev libncurses5 locales postgresql-client-12 unzip && \
|
||||
apt-get clean
|
||||
|
||||
RUN echo 'en_US.UTF-8 UTF-8' > /etc/locale.gen && \
|
||||
locale-gen
|
||||
|
||||
ENV LANG en_US.UTF-8
|
||||
ENV LANGUAGE en_US:en
|
||||
ENV LC_ALL en_US.UTF-8
|
||||
|
||||
RUN mkdir -p /etc/pleroma /var/lib/pleroma/static /var/lib/pleroma/uploads && \
|
||||
adduser --system --shell /bin/false --home /opt/pleroma --group pleroma && \
|
||||
chown -vR pleroma /etc/pleroma /var/lib/pleroma
|
||||
|
||||
COPY --chown=pleroma:pleroma --from=unzip /opt/pleroma/ /opt/pleroma/
|
||||
|
||||
VOLUME [ "/etc/pleroma", "/var/lib/pleroma/uploads", "/var/lib/pleroma/static" ]
|
||||
|
||||
ADD https://gitlab.com/soapbox-pub/soapbox-fe/-/jobs/artifacts/v${SOAPBOXVERSION}/download?job=build-production /tmp/soapbox-fe.zip
|
||||
RUN chown pleroma /tmp/soapbox-fe.zip
|
||||
|
||||
USER pleroma
|
||||
|
||||
COPY run-pleroma.sh /opt/pleroma/bin/
|
||||
|
||||
ENTRYPOINT [ "/usr/bin/dumb-init" ]
|
||||
|
||||
WORKDIR /opt/pleroma
|
||||
|
||||
ENV PATH=/opt/pleroma/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
|
||||
ENV PLEROMA_CONFIG_PATH=/etc/pleroma/config.exs
|
||||
|
||||
EXPOSE 4000
|
||||
|
||||
STOPSIGNAL SIGTERM
|
||||
|
||||
HEALTHCHECK \
|
||||
--start-period=2m \
|
||||
--interval=5m \
|
||||
CMD curl --fail http://localhost:4000/api/v1/instance || exit 1
|
||||
|
||||
CMD [ "run-pleroma.sh" ]
|
|
@ -1,83 +0,0 @@
|
|||
version: '3.3'
|
||||
|
||||
services:
|
||||
nginx:
|
||||
image: nginx:1-alpine
|
||||
ports:
|
||||
- "8540:8540"
|
||||
volumes:
|
||||
- ./nginx.conf:/etc/nginx/nginx.conf
|
||||
restart: always
|
||||
depends_on:
|
||||
- pictrs
|
||||
- lemmy-ui
|
||||
|
||||
pictrs:
|
||||
restart: always
|
||||
image: asonix/pictrs:0.3.1
|
||||
user: 991:991
|
||||
volumes:
|
||||
- ./volumes/pictrs:/mnt
|
||||
|
||||
lemmy-ui:
|
||||
image: dessalines/lemmy-ui:0.13.3
|
||||
restart: always
|
||||
environment:
|
||||
- LEMMY_INTERNAL_HOST=lemmy:8541
|
||||
- LEMMY_EXTERNAL_HOST=localhost:8541
|
||||
- LEMMY_HTTPS=false
|
||||
depends_on:
|
||||
- lemmy
|
||||
lemmy:
|
||||
image: lemmy-federation:latest
|
||||
restart: always
|
||||
volumes:
|
||||
- ./lemmy.hjson:/config/config.hjson
|
||||
environment:
|
||||
- APUB_TESTING_SEND_SYNC
|
||||
- RUST_BACKTRACE=1
|
||||
- RUST_LOG="warn,lemmy_server=debug,lemmy_api=debug,lemmy_api_common=debug,lemmy_api_crud=debug,lemmy_apub=debug,lemmy_db_schema=debug,lemmy_db_views=debug,lemmy_db_views_actor=debug,lemmy_db_views_moderator=debug,lemmy_routes=debug,lemmy_utils=debug,lemmy_websocket=debug"
|
||||
depends_on:
|
||||
- postgres_lemmy
|
||||
ports:
|
||||
- "8541:8541"
|
||||
postgres_lemmy:
|
||||
image: postgres:12-alpine
|
||||
restart: always
|
||||
environment:
|
||||
- POSTGRES_USER=lemmy
|
||||
- POSTGRES_PASSWORD=password
|
||||
- POSTGRES_DB=lemmy
|
||||
volumes:
|
||||
- ./volumes/postgres_lemmy:/var/lib/postgresql/data
|
||||
|
||||
pleroma:
|
||||
image: jordemort/pleroma
|
||||
restart: always
|
||||
ports:
|
||||
- 127.0.0.1:4000:4000
|
||||
volumes:
|
||||
- ./pleroma_config.exs:/etc/pleroma/config.exs
|
||||
- uploads:/var/lib/pleroma/uploads
|
||||
- static:/var/lib/pleroma/static
|
||||
environment:
|
||||
DOMAIN: pleroma:4000
|
||||
ADMIN_EMAIL: chicken@example.com
|
||||
USE_RUM: "y"
|
||||
USE_SOAPBOX: "n"
|
||||
POSTGRES_PASSWORD: hunter2
|
||||
|
||||
postgres:
|
||||
image: jordemort/postgres-rum
|
||||
restart: always
|
||||
volumes:
|
||||
- data:/var/lib/postgresql/data
|
||||
environment:
|
||||
POSTGRES_DB: pleroma
|
||||
POSTGRES_USER: pleroma
|
||||
POSTGRES_PASSWORD: hunter2
|
||||
|
||||
volumes:
|
||||
uploads:
|
||||
static:
|
||||
data:
|
|
@ -1,23 +0,0 @@
|
|||
{
|
||||
hostname: lemmy:8541
|
||||
port: 8541
|
||||
tls_enabled: false
|
||||
setup: {
|
||||
admin_username: lemmy
|
||||
admin_password: lemmylemmy
|
||||
site_name: lemmy
|
||||
sidebar: lemmy sidebar
|
||||
}
|
||||
database: {
|
||||
database: lemmy
|
||||
user: lemmy
|
||||
password: password
|
||||
host: postgres_lemmy
|
||||
}
|
||||
federation: {
|
||||
enabled: true
|
||||
}
|
||||
captcha: {
|
||||
enabled: false
|
||||
}
|
||||
}
|
|
@ -1,44 +0,0 @@
|
|||
events {
|
||||
worker_connections 1024;
|
||||
}
|
||||
|
||||
http {
|
||||
upstream lemmy {
|
||||
server "lemmy:8541";
|
||||
}
|
||||
upstream lemmy-ui {
|
||||
server "lemmy-ui:1234";
|
||||
}
|
||||
server {
|
||||
listen 8540;
|
||||
server_name 127.0.0.1;
|
||||
access_log off;
|
||||
|
||||
# Upload limit for pictshare
|
||||
client_max_body_size 50M;
|
||||
|
||||
location ~ ^/(api|pictrs|feeds|nodeinfo|.well-known) {
|
||||
proxy_pass http://lemmy;
|
||||
proxy_http_version 1.1;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection "upgrade";
|
||||
}
|
||||
location / {
|
||||
set $proxpass http://lemmy-ui;
|
||||
if ($http_accept = "application/activity+json") {
|
||||
set $proxpass http://lemmy;
|
||||
}
|
||||
if ($http_accept = "application/ld+json; profile=\"https://www.w3.org/ns/activitystreams\"") {
|
||||
set $proxpass http://lemmy;
|
||||
}
|
||||
proxy_pass $proxpass;
|
||||
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
|
||||
# Cuts off the trailing slash on URLs to make them valid
|
||||
rewrite ^(.+)/+$ $1 permanent;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -1,47 +0,0 @@
|
|||
# Pleroma instance configuration
|
||||
|
||||
import Config
|
||||
|
||||
config :pleroma, Pleroma.Web.Endpoint,
|
||||
url: [host: "pleroma", scheme: "http", port: 4000],
|
||||
http: [ip: {0, 0, 0, 0}, port: 4000],
|
||||
secret_key_base: "0dqEgJ+GcXLVgcmMsya1nSf5DyiDy7lRkGqYKB/TyAxrrbzgcuxPKM+gloTrNJPL",
|
||||
signing_salt: "GmRjWVZ9"
|
||||
|
||||
config :pleroma, :instance,
|
||||
name: "pleroma:4000",
|
||||
email: "chicken@example.com",
|
||||
notify_email: "chicken@example.com",
|
||||
limit: 5000,
|
||||
registrations_open: true
|
||||
|
||||
config :pleroma, :media_proxy,
|
||||
enabled: false,
|
||||
redirect_on_failure: true
|
||||
#base_url: "https://cache.pleroma.social"
|
||||
|
||||
config :pleroma, Pleroma.Repo,
|
||||
adapter: Ecto.Adapters.Postgres,
|
||||
username: "pleroma",
|
||||
password: "hunter2",
|
||||
database: "pleroma",
|
||||
hostname: "postgres"
|
||||
|
||||
# Configure web push notifications
|
||||
config :web_push_encryption, :vapid_details,
|
||||
subject: "mailto:chicken@example.com",
|
||||
public_key: "BDy9svG0DfHPzJwZBt4VBYS8ub_pId4-FUZQLXBcqmkYvZtYVnhbErJgViLYZROSIVVWY4U-sZgeMSNPJRVlt_g",
|
||||
private_key: "BuPx7F7nd42VKejnW9U3yPPUPrlRbcgGCLfZcGETdgo"
|
||||
|
||||
config :pleroma, :database, rum_enabled: true
|
||||
config :pleroma, :instance, static_dir: "/var/lib/pleroma/static"
|
||||
config :pleroma, Pleroma.Uploaders.Local, uploads: "/var/lib/pleroma/uploads"
|
||||
|
||||
config :joken, default_signer: "UnyjyX3et+ImHWSVYJ3hCM5vexmB7wq6Zcx1qrv/GAGOZdBmq5/SKmX8jSWKB6xi"
|
||||
|
||||
config :pleroma, configurable_from_database: true
|
||||
|
||||
config :pleroma, Pleroma.Upload, filters: [Pleroma.Upload.Filter.Exiftool, Pleroma.Upload.Filter.AnonymizeFilename, Pleroma.Upload.Filter.Dedupe]
|
||||
|
||||
config :logger, :ex_syslogger,
|
||||
level: :debug
|
|
@ -1,25 +0,0 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
if [ ! -e "$PLEROMA_CONFIG_PATH" ] ; then
|
||||
generate-pleroma-config.sh
|
||||
fi
|
||||
|
||||
while ! pg_isready -U "${POSTGRES_USER:-pleroma}" -d "postgres://${POSTGRES_HOST:-postgres}:5432/${POSTGRES_DB:-pleroma}" -t 1; do
|
||||
echo "Waiting for ${POSTGRES_HOST-postgres} to come up..." >&2
|
||||
sleep 1s
|
||||
done
|
||||
|
||||
pleroma_ctl migrate
|
||||
|
||||
if [ "${USE_RUM:-n}" = "y" ] ; then
|
||||
pleroma_ctl migrate --migrations-path priv/repo/optional_migrations/rum_indexing/
|
||||
fi
|
||||
|
||||
if [ "${USE_SOAPBOX:-n}" = "y" ]; then
|
||||
unzip -o /tmp/soapbox-fe.zip -d /var/lib/pleroma
|
||||
rm /tmp/soapbox-fe.zip
|
||||
fi
|
||||
|
||||
exec pleroma start
|
|
@ -1,10 +0,0 @@
|
|||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
sudo docker build ../../ --file ../dev/volume_mount.dockerfile -t lemmy-federation:latest
|
||||
|
||||
sudo mkdir -p volumes/pictrs
|
||||
sudo chown -R 991:991 volumes/pictrs
|
||||
|
||||
#sudo docker-compose pull --ignore-pull-failures || true
|
||||
sudo docker-compose up
|
|
@ -109,7 +109,7 @@ fn community_updates_2020_04_02(
|
|||
let form = CommunityForm {
|
||||
name: ccommunity.name.to_owned(),
|
||||
title: ccommunity.title.to_owned(),
|
||||
description: ccommunity.description.to_owned(),
|
||||
description: Some(ccommunity.description.to_owned()),
|
||||
hidden: Some(false),
|
||||
actor_id: Some(community_actor_id.to_owned()),
|
||||
local: Some(ccommunity.local),
|
||||
|
|
Loading…
Reference in a new issue