unoffical wafrn mirror wafrn.net
atproto social-network activitypub
at development 227 lines 8.0 kB view raw
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 };