unoffical wafrn mirror
wafrn.net
atproto
social-network
activitypub
1import { Job } from "bullmq";
2import { logger } from "../logger.js";
3import {
4 Blocks,
5 Emoji,
6 EmojiReaction,
7 FederatedHost,
8 Follows,
9 Post,
10 User,
11 UserLikesPostRelations,
12} from "../../models/index.js";
13import { getRemoteActor } from "../activitypub/getRemoteActor.js";
14import { signAndAccept } from "../activitypub/signAndAccept.js";
15import { removeUser } from "../activitypub/removeUser.js";
16import getBlockedIds from "../cacheGetters/getBlockedIds.js";
17import getUserBlockedServers from "../cacheGetters/getUserBlockedServers.js";
18import { deletePostCommon } from "../deletePost.js";
19import { AcceptActivity } from "../activitypub/processors/accept.js";
20import { AnnounceActivity } from "../activitypub/processors/announce.js";
21import { CreateActivity } from "../activitypub/processors/create.js";
22import { FollowActivity } from "../activitypub/processors/follow.js";
23import { UpdateActivity } from "../activitypub/processors/update.js";
24import { UndoActivity } from "../activitypub/processors/undo.js";
25import { LikeActivity } from "../activitypub/processors/like.js";
26import { DeleteActivity } from "../activitypub/processors/delete.js";
27import { EmojiReactActivity } from "../activitypub/processors/emojiReact.js";
28import { RemoveActivity } from "../activitypub/processors/remove.js";
29import { AddActivity } from "../activitypub/processors/add.js";
30import { BlockActivity } from "../activitypub/processors/block.js";
31import { MoveActivity } from "../activitypub/processors/move.js";
32import { RejectActivity } from "../activitypub/processors/reject.js";
33import { wait } from "../wait.js";
34import { flagActivity } from "../activitypub/processors/flag.js";
35import { getPetitionSigned } from "../activitypub/getPetitionSigned.js";
36import { completeEnvironment } from "../backendOptions.js";
37import { activityPubObject } from "../../interfaces/fediverse/activityPubObject.js";
38import { getPostThreadRecursive } from "../activitypub/getPostThreadRecursive.js";
39import { getAdminUser } from "../getAdminAndDeletedUser.js";
40import { postPetitionSigned } from "../activitypub/postPetitionSigned.js";
41import { biteActivity } from "../activitypub/processors/bite.js";
42
43async function inboxWorker(job: Job) {
44 try {
45 const user = await User.findByPk(job.data.petitionBy);
46 if (!user) {
47 return;
48 }
49
50 const body = job.data.petition;
51 const req = { body: body };
52 // little hack that should be fixed later
53 if (req.body.type === "Delete" && req.body.id.endsWith("#delete")) {
54 const userToRemove = await User.findOne({
55 where: {
56 remoteId: req.body.id.split("#")[0].toLowerCase(),
57 },
58 });
59 if (userToRemove) {
60 await removeUser(userToRemove.id);
61 return;
62 }
63 }
64 const remoteUser = await getRemoteActor(req.body.actor, user);
65 const host = await FederatedHost.findOne({
66 where: {
67 displayName: new URL(req.body.actor).host,
68 },
69 });
70 if (remoteUser) {
71 // we check if the user has blocked the user or the server. This will mostly work for follows and dms. Will investigate further down the line
72 const userBlocks: string[] = await getBlockedIds(user.id, false, true);
73 const blocksExisting = userBlocks.includes(remoteUser.id) ? 1 : 0;
74 const blockedServersData = await getUserBlockedServers(user.id);
75 const blocksServers = blockedServersData.find(
76 (elem: any) => elem.id === host?.id
77 )
78 ? 1
79 : 0;
80 if (
81 (!remoteUser?.banned &&
82 !host?.blocked &&
83 blocksExisting + blocksServers === 0) ||
84 req.body.type === "Undo" ||
85 req.body.type === "Delete"
86 ) {
87 switch (req.body.type) {
88 case "Accept": {
89 await AcceptActivity(body, remoteUser, user);
90 break;
91 }
92 case "Reject": {
93 await RejectActivity(body, remoteUser, user);
94 break;
95 }
96 case "Announce": {
97 await AnnounceActivity(body, remoteUser, user);
98 break;
99 }
100 case "Page":
101 case "Create": {
102 await CreateActivity(body, remoteUser, user);
103 break;
104 }
105 case "Follow": {
106 await FollowActivity(body, remoteUser, user);
107 break;
108 }
109 case "Update": {
110 await wait(5000);
111 await UpdateActivity(body, remoteUser, user);
112 break;
113 }
114 case "Undo": {
115 await UndoActivity(body, remoteUser, user);
116 break;
117 }
118 case "Like": {
119 await LikeActivity(body, remoteUser, user);
120 break;
121 }
122 case "Delete": {
123 await DeleteActivity(body, remoteUser, user);
124 break;
125 }
126 case "EmojiReact": {
127 await EmojiReactActivity(body, remoteUser, user);
128 break;
129 }
130 case "Remove": {
131 await RemoveActivity(body, remoteUser, user);
132 break;
133 }
134 case "Add": {
135 await AddActivity(body, remoteUser, user);
136 break;
137 }
138 case "Block": {
139 await BlockActivity(body, remoteUser, user);
140 break;
141 }
142
143 case "Move": {
144 await MoveActivity(body, remoteUser, user);
145 break;
146 }
147
148 case "Flag": {
149 await flagActivity(body, remoteUser, user);
150 break;
151 }
152
153 case "Bite": {
154 await biteActivity(body, remoteUser, user);
155 break;
156 }
157
158 // activities that we ignore:
159 case "CacheFile":
160 case "Playlist":
161 case "Listen":
162 case "View": {
163 // await signAndAccept(req, remoteUser, user)
164 break;
165 }
166
167 case "QuoteRequest":
168 {
169 // TODO in case of rejecting quotes on fedi we do here
170 if (
171 req.body.object &&
172 req.body.object.startsWith(
173 `${completeEnvironment.frontendUrl}/fediverse/post/`
174 )
175 ) {
176 const postId = req.body.object.split(
177 `${completeEnvironment.frontendUrl}/fediverse/post/`
178 )[1];
179 const post: any = await Post.findByPk(postId, {
180 include: [
181 {
182 model: User,
183 as: "user",
184 },
185 ],
186 });
187 const quoterPost = await getPostThreadRecursive(
188 await getAdminUser(),
189 req.body.instrument.id
190 );
191 if (post && quoterPost) {
192 const acceptToSend: activityPubObject = {
193 "@context": [
194 "https://www.w3.org/ns/activitystreams",
195 `${completeEnvironment.frontendUrl}/contexts/litepub-0.1.jsonld`,
196 ],
197 actor: `${completeEnvironment.frontendUrl
198 }/fediverse/blog/${post?.dataValues.user.url.toLowerCase()}`,
199 id: `${completeEnvironment.frontendUrl}/fediverse/quote_request/${quoterPost.id}`,
200 type: "Accept",
201 object: req.body.object,
202 instrument: req.body.instrument,
203 };
204
205 await postPetitionSigned(
206 acceptToSend,
207 (await User.scope("full").findByPk(post.userId)) as User,
208 remoteUser.remoteInbox ?? ''
209 );
210 }
211 }
212 }
213 break;
214 default: {
215 logger.info(`NOT IMPLEMENTED: ${req.body.type}`);
216 logger.info(req.body);
217 }
218 }
219 }
220 }
221 } catch (err) {
222 logger.debug(err);
223 const error = new Error("error");
224 }
225}
226
227export { inboxWorker };