From 6e25bd9c5efdcaf8e4c4f7b1f7289b4ad338e0c7 Mon Sep 17 00:00:00 2001 From: Leah Date: Fri, 10 Jan 2025 19:17:30 +0100 Subject: [PATCH] decline users --- .../src/core/CreateSystemUserService.ts | 1 + .../ImportFollowingProcessorService.ts | 3 +++ .../src/server/ActivityPubServerService.ts | 1 + .../backend/src/server/api/EndpointsModule.ts | 2 ++ .../api/endpoints/admin/decline-user.ts | 6 ++++- .../server/api/endpoints/following/create.ts | 22 ++++++++++++++++--- .../frontend/src/components/MkTooltip.vue | 1 + .../frontend/src/pages/admin/approvals.vue | 4 +++- 8 files changed, 35 insertions(+), 5 deletions(-) diff --git a/packages/backend/src/core/CreateSystemUserService.ts b/packages/backend/src/core/CreateSystemUserService.ts index 11212bc12..d6add4119 100644 --- a/packages/backend/src/core/CreateSystemUserService.ts +++ b/packages/backend/src/core/CreateSystemUserService.ts @@ -61,6 +61,7 @@ export class CreateSystemUserService { isLocked: true, isExplorable: false, isBot: true, + approved: true, }).then(x => transactionalEntityManager.findOneByOrFail(MiUser, x.identifiers[0])); await transactionalEntityManager.insert(MiUserKeypair, { diff --git a/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts b/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts index 7129bb40d..8346565f6 100644 --- a/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts +++ b/packages/backend/src/queue/processors/ImportFollowingProcessorService.ts @@ -93,6 +93,9 @@ export class ImportFollowingProcessorService { // skip myself if (target.id === job.data.user.id) return; + // skip follows to not approved accounts + if (!target.approved) return; + this.logger.info(`Follow ${target.id} ${job.data.withReplies ? 'with replies' : 'without replies'} ...`); this.queueService.createFollowJob([{ from: user, to: { id: target.id }, silent: true, withReplies: job.data.withReplies }]); diff --git a/packages/backend/src/server/ActivityPubServerService.ts b/packages/backend/src/server/ActivityPubServerService.ts index 276cfcd64..87d0e07e2 100644 --- a/packages/backend/src/server/ActivityPubServerService.ts +++ b/packages/backend/src/server/ActivityPubServerService.ts @@ -684,6 +684,7 @@ export class ActivityPubServerService { usernameLower: request.params.user.toLowerCase(), host: IsNull(), isSuspended: false, + approved: true, }); return await this.userInfo(request, reply, user); diff --git a/packages/backend/src/server/api/EndpointsModule.ts b/packages/backend/src/server/api/EndpointsModule.ts index 45968ba70..46c4920cc 100644 --- a/packages/backend/src/server/api/EndpointsModule.ts +++ b/packages/backend/src/server/api/EndpointsModule.ts @@ -480,6 +480,7 @@ const $admin_showUser: Provider = { provide: 'ep:admin/show-user', useClass: ep_ const $admin_showUsers: Provider = { provide: 'ep:admin/show-users', useClass: ep___admin_showUsers.default }; const $admin_suspendUser: Provider = { provide: 'ep:admin/suspend-user', useClass: ep___admin_suspendUser.default }; const $admin_approveUser: Provider = { provide: 'ep:admin/approve-user', useClass: ep___admin_approveUser.default }; +const $admin_declineUser: Provider = { provide: 'ep:admin/decline-user', useClass: ep___admin_declineUser.default }; const $admin_unsuspendUser: Provider = { provide: 'ep:admin/unsuspend-user', useClass: ep___admin_unsuspendUser.default }; const $admin_updateMeta: Provider = { provide: 'ep:admin/update-meta', useClass: ep___admin_updateMeta.default }; const $admin_updateUserName: Provider = { provide: 'ep:admin/update-user-name', useClass: ep___admin_updateUserName.default }; @@ -880,6 +881,7 @@ const $reversi_verify: Provider = { provide: 'ep:reversi/verify', useClass: ep__ $admin_showUsers, $admin_suspendUser, $admin_approveUser, + $admin_declineUser, $admin_unsuspendUser, $admin_updateMeta, $admin_updateUserName, diff --git a/packages/backend/src/server/api/endpoints/admin/decline-user.ts b/packages/backend/src/server/api/endpoints/admin/decline-user.ts index 0ec926d0e..4c8ccb98b 100644 --- a/packages/backend/src/server/api/endpoints/admin/decline-user.ts +++ b/packages/backend/src/server/api/endpoints/admin/decline-user.ts @@ -63,7 +63,11 @@ export default class extends Endpoint { // eslint- await this.usedUsernamesRepository.delete({ username: user.username }); - await this.deleteAccountService.deleteAccount(user, false, me); + + //Actually delete it since the last function doesnt actually delete the account + //Note: Before approval these accounts wont federate so this is totally fine. + await this.usersRepository.delete(user.id); + this.moderationLogService.log(me, 'decline', { userId: user.id, diff --git a/packages/backend/src/server/api/endpoints/following/create.ts b/packages/backend/src/server/api/endpoints/following/create.ts index 3c27af604..c9a61037d 100644 --- a/packages/backend/src/server/api/endpoints/following/create.ts +++ b/packages/backend/src/server/api/endpoints/following/create.ts @@ -35,6 +35,12 @@ export const meta = { id: 'fcd2eef9-a9b2-4c4f-8624-038099e90aa5', }, + unapprovedUser: { + message: 'The user has not been approved yet.', + code: 'UNAPPROVED_USER', + id: '8d66f136-b3e1-48fd-92c4-30ecfd7fdb7a', + }, + followeeIsYourself: { message: 'Followee is yourself.', code: 'FOLLOWEE_IS_YOURSELF', @@ -101,15 +107,25 @@ export default class extends Endpoint { // eslint- } // Get followee - const followee = await this.getterService.getUser(ps.userId).catch(err => { - if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') throw new ApiError(meta.errors.noSuchUser); + let followee; + try { + followee = await this.getterService.getUser(ps.userId); + } catch (err) { + if (err.id === '15348ddd-432d-49c2-8a5a-8069753becff') { + throw new ApiError(meta.errors.noSuchUser); + } throw err; - }); + } if ( me.isBot && followee.isBot ) { throw new ApiError(meta.errors.followingAnotherBot); } + const isLocalUser = followee.uri == null; + if (!followee.approved && isLocalUser) { + throw new ApiError(meta.errors.unapprovedUser); + } + try { await this.userFollowingService.follow(follower, followee, { withReplies: ps.withReplies }); } catch (e) { diff --git a/packages/frontend/src/components/MkTooltip.vue b/packages/frontend/src/components/MkTooltip.vue index a3620aab6..2a232cc2a 100644 --- a/packages/frontend/src/components/MkTooltip.vue +++ b/packages/frontend/src/components/MkTooltip.vue @@ -113,5 +113,6 @@ onUnmounted(() => { border: solid 0.5px var(--divider); pointer-events: none; transform-origin: center center; + backdrop-filter: blur(10px); } diff --git a/packages/frontend/src/pages/admin/approvals.vue b/packages/frontend/src/pages/admin/approvals.vue index ed2da5bed..ad76a988c 100644 --- a/packages/frontend/src/pages/admin/approvals.vue +++ b/packages/frontend/src/pages/admin/approvals.vue @@ -45,7 +45,9 @@ const pagination = { function deleted(id: string) { if (paginationComponent.value) { - paginationComponent.value.items.delete(id); + paginationComponent.value.items = paginationComponent.value.items.filter( + (item: any) => item.id !== id + ); } }