|
|
|
@ -1,77 +1,8 @@
|
|
|
|
|
use actix_web::{web, web::Data};
|
|
|
|
|
use actix_web::web::Data;
|
|
|
|
|
use captcha::Captcha;
|
|
|
|
|
use lemmy_api_common::{
|
|
|
|
|
comment::{
|
|
|
|
|
CreateCommentLike,
|
|
|
|
|
CreateCommentReport,
|
|
|
|
|
ListCommentReports,
|
|
|
|
|
ResolveCommentReport,
|
|
|
|
|
SaveComment,
|
|
|
|
|
},
|
|
|
|
|
community::{
|
|
|
|
|
AddModToCommunity,
|
|
|
|
|
BanFromCommunity,
|
|
|
|
|
BlockCommunity,
|
|
|
|
|
FollowCommunity,
|
|
|
|
|
TransferCommunity,
|
|
|
|
|
},
|
|
|
|
|
person::{
|
|
|
|
|
AddAdmin,
|
|
|
|
|
BanPerson,
|
|
|
|
|
BlockPerson,
|
|
|
|
|
ChangePassword,
|
|
|
|
|
GetBannedPersons,
|
|
|
|
|
GetCaptcha,
|
|
|
|
|
GetPersonMentions,
|
|
|
|
|
GetReplies,
|
|
|
|
|
GetReportCount,
|
|
|
|
|
GetUnreadCount,
|
|
|
|
|
Login,
|
|
|
|
|
MarkAllAsRead,
|
|
|
|
|
MarkCommentReplyAsRead,
|
|
|
|
|
MarkPersonMentionAsRead,
|
|
|
|
|
PasswordChangeAfterReset,
|
|
|
|
|
PasswordReset,
|
|
|
|
|
SaveUserSettings,
|
|
|
|
|
VerifyEmail,
|
|
|
|
|
},
|
|
|
|
|
post::{
|
|
|
|
|
CreatePostLike,
|
|
|
|
|
CreatePostReport,
|
|
|
|
|
GetSiteMetadata,
|
|
|
|
|
ListPostReports,
|
|
|
|
|
LockPost,
|
|
|
|
|
MarkPostAsRead,
|
|
|
|
|
ResolvePostReport,
|
|
|
|
|
SavePost,
|
|
|
|
|
StickyPost,
|
|
|
|
|
},
|
|
|
|
|
private_message::{
|
|
|
|
|
CreatePrivateMessageReport,
|
|
|
|
|
ListPrivateMessageReports,
|
|
|
|
|
MarkPrivateMessageAsRead,
|
|
|
|
|
ResolvePrivateMessageReport,
|
|
|
|
|
},
|
|
|
|
|
site::{
|
|
|
|
|
ApproveRegistrationApplication,
|
|
|
|
|
GetModlog,
|
|
|
|
|
GetUnreadRegistrationApplicationCount,
|
|
|
|
|
LeaveAdmin,
|
|
|
|
|
ListRegistrationApplications,
|
|
|
|
|
PurgeComment,
|
|
|
|
|
PurgeCommunity,
|
|
|
|
|
PurgePerson,
|
|
|
|
|
PurgePost,
|
|
|
|
|
ResolveObject,
|
|
|
|
|
Search,
|
|
|
|
|
},
|
|
|
|
|
utils::local_site_to_slur_regex,
|
|
|
|
|
websocket::{CommunityJoin, ModJoin, PostJoin, UserJoin},
|
|
|
|
|
};
|
|
|
|
|
use lemmy_api_common::{context::LemmyContext, utils::local_site_to_slur_regex};
|
|
|
|
|
use lemmy_db_schema::source::local_site::LocalSite;
|
|
|
|
|
use lemmy_utils::{error::LemmyError, utils::check_slurs, ConnectionId};
|
|
|
|
|
use lemmy_websocket::{serialize_websocket_message, LemmyContext, UserOperation};
|
|
|
|
|
use serde::Deserialize;
|
|
|
|
|
|
|
|
|
|
mod comment;
|
|
|
|
|
mod comment_report;
|
|
|
|
@ -95,182 +26,6 @@ pub trait Perform {
|
|
|
|
|
) -> Result<Self::Response, LemmyError>;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
pub async fn match_websocket_operation(
|
|
|
|
|
context: LemmyContext,
|
|
|
|
|
id: ConnectionId,
|
|
|
|
|
op: UserOperation,
|
|
|
|
|
data: &str,
|
|
|
|
|
) -> Result<String, LemmyError> {
|
|
|
|
|
match op {
|
|
|
|
|
// User ops
|
|
|
|
|
UserOperation::Login => do_websocket_operation::<Login>(context, id, op, data).await,
|
|
|
|
|
UserOperation::GetCaptcha => do_websocket_operation::<GetCaptcha>(context, id, op, data).await,
|
|
|
|
|
UserOperation::GetReplies => do_websocket_operation::<GetReplies>(context, id, op, data).await,
|
|
|
|
|
UserOperation::AddAdmin => do_websocket_operation::<AddAdmin>(context, id, op, data).await,
|
|
|
|
|
UserOperation::GetUnreadRegistrationApplicationCount => {
|
|
|
|
|
do_websocket_operation::<GetUnreadRegistrationApplicationCount>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ListRegistrationApplications => {
|
|
|
|
|
do_websocket_operation::<ListRegistrationApplications>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ApproveRegistrationApplication => {
|
|
|
|
|
do_websocket_operation::<ApproveRegistrationApplication>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::BanPerson => do_websocket_operation::<BanPerson>(context, id, op, data).await,
|
|
|
|
|
UserOperation::GetBannedPersons => {
|
|
|
|
|
do_websocket_operation::<GetBannedPersons>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::BlockPerson => {
|
|
|
|
|
do_websocket_operation::<BlockPerson>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::GetPersonMentions => {
|
|
|
|
|
do_websocket_operation::<GetPersonMentions>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::MarkPersonMentionAsRead => {
|
|
|
|
|
do_websocket_operation::<MarkPersonMentionAsRead>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::MarkCommentReplyAsRead => {
|
|
|
|
|
do_websocket_operation::<MarkCommentReplyAsRead>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::MarkAllAsRead => {
|
|
|
|
|
do_websocket_operation::<MarkAllAsRead>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::PasswordReset => {
|
|
|
|
|
do_websocket_operation::<PasswordReset>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::PasswordChange => {
|
|
|
|
|
do_websocket_operation::<PasswordChangeAfterReset>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::UserJoin => do_websocket_operation::<UserJoin>(context, id, op, data).await,
|
|
|
|
|
UserOperation::PostJoin => do_websocket_operation::<PostJoin>(context, id, op, data).await,
|
|
|
|
|
UserOperation::CommunityJoin => {
|
|
|
|
|
do_websocket_operation::<CommunityJoin>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ModJoin => do_websocket_operation::<ModJoin>(context, id, op, data).await,
|
|
|
|
|
UserOperation::SaveUserSettings => {
|
|
|
|
|
do_websocket_operation::<SaveUserSettings>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ChangePassword => {
|
|
|
|
|
do_websocket_operation::<ChangePassword>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::GetReportCount => {
|
|
|
|
|
do_websocket_operation::<GetReportCount>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::GetUnreadCount => {
|
|
|
|
|
do_websocket_operation::<GetUnreadCount>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::VerifyEmail => {
|
|
|
|
|
do_websocket_operation::<VerifyEmail>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Private Message ops
|
|
|
|
|
UserOperation::MarkPrivateMessageAsRead => {
|
|
|
|
|
do_websocket_operation::<MarkPrivateMessageAsRead>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::CreatePrivateMessageReport => {
|
|
|
|
|
do_websocket_operation::<CreatePrivateMessageReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ResolvePrivateMessageReport => {
|
|
|
|
|
do_websocket_operation::<ResolvePrivateMessageReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ListPrivateMessageReports => {
|
|
|
|
|
do_websocket_operation::<ListPrivateMessageReports>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Site ops
|
|
|
|
|
UserOperation::GetModlog => do_websocket_operation::<GetModlog>(context, id, op, data).await,
|
|
|
|
|
UserOperation::PurgePerson => {
|
|
|
|
|
do_websocket_operation::<PurgePerson>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::PurgeCommunity => {
|
|
|
|
|
do_websocket_operation::<PurgeCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::PurgePost => do_websocket_operation::<PurgePost>(context, id, op, data).await,
|
|
|
|
|
UserOperation::PurgeComment => {
|
|
|
|
|
do_websocket_operation::<PurgeComment>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::Search => do_websocket_operation::<Search>(context, id, op, data).await,
|
|
|
|
|
UserOperation::ResolveObject => {
|
|
|
|
|
do_websocket_operation::<ResolveObject>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::TransferCommunity => {
|
|
|
|
|
do_websocket_operation::<TransferCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::LeaveAdmin => do_websocket_operation::<LeaveAdmin>(context, id, op, data).await,
|
|
|
|
|
|
|
|
|
|
// Community ops
|
|
|
|
|
UserOperation::FollowCommunity => {
|
|
|
|
|
do_websocket_operation::<FollowCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::BlockCommunity => {
|
|
|
|
|
do_websocket_operation::<BlockCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::BanFromCommunity => {
|
|
|
|
|
do_websocket_operation::<BanFromCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::AddModToCommunity => {
|
|
|
|
|
do_websocket_operation::<AddModToCommunity>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Post ops
|
|
|
|
|
UserOperation::LockPost => do_websocket_operation::<LockPost>(context, id, op, data).await,
|
|
|
|
|
UserOperation::StickyPost => do_websocket_operation::<StickyPost>(context, id, op, data).await,
|
|
|
|
|
UserOperation::CreatePostLike => {
|
|
|
|
|
do_websocket_operation::<CreatePostLike>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::MarkPostAsRead => {
|
|
|
|
|
do_websocket_operation::<MarkPostAsRead>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::SavePost => do_websocket_operation::<SavePost>(context, id, op, data).await,
|
|
|
|
|
UserOperation::CreatePostReport => {
|
|
|
|
|
do_websocket_operation::<CreatePostReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ListPostReports => {
|
|
|
|
|
do_websocket_operation::<ListPostReports>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ResolvePostReport => {
|
|
|
|
|
do_websocket_operation::<ResolvePostReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::GetSiteMetadata => {
|
|
|
|
|
do_websocket_operation::<GetSiteMetadata>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Comment ops
|
|
|
|
|
UserOperation::SaveComment => {
|
|
|
|
|
do_websocket_operation::<SaveComment>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::CreateCommentLike => {
|
|
|
|
|
do_websocket_operation::<CreateCommentLike>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::CreateCommentReport => {
|
|
|
|
|
do_websocket_operation::<CreateCommentReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ListCommentReports => {
|
|
|
|
|
do_websocket_operation::<ListCommentReports>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
UserOperation::ResolveCommentReport => {
|
|
|
|
|
do_websocket_operation::<ResolveCommentReport>(context, id, op, data).await
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
async fn do_websocket_operation<'a, 'b, Data>(
|
|
|
|
|
context: LemmyContext,
|
|
|
|
|
id: ConnectionId,
|
|
|
|
|
op: UserOperation,
|
|
|
|
|
data: &str,
|
|
|
|
|
) -> Result<String, LemmyError>
|
|
|
|
|
where
|
|
|
|
|
for<'de> Data: Deserialize<'de> + 'a,
|
|
|
|
|
Data: Perform,
|
|
|
|
|
{
|
|
|
|
|
let parsed_data: Data = serde_json::from_str(data)?;
|
|
|
|
|
let res = parsed_data
|
|
|
|
|
.perform(&web::Data::new(context), Some(id))
|
|
|
|
|
.await?;
|
|
|
|
|
serialize_websocket_message(&op, &res)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/// Converts the captcha to a base64 encoded wav audio file
|
|
|
|
|
pub(crate) fn captcha_as_wav_base64(captcha: &Captcha) -> String {
|
|
|
|
|
let letters = captcha.as_wav();
|
|
|
|
|