From 787d00bec0cbafd0de82decf9e7f7cf843f03053 Mon Sep 17 00:00:00 2001 From: nenohi Date: Wed, 7 Aug 2024 05:26:15 +0900 Subject: [PATCH] =?UTF-8?q?enhance(moderation):=20=E5=87=8D=E7=B5=90?= =?UTF-8?q?=E3=81=95=E3=82=8C=E3=81=9F=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=83=BB=E5=89=8A=E9=99=A4=E3=81=95=E3=82=8C=E3=81=9F=E3=83=A6?= =?UTF-8?q?=E3=83=BC=E3=82=B6=E3=83=BC=E3=82=92=E5=8F=AF=E8=A6=96=E5=8C=96?= =?UTF-8?q?=E3=81=A7=E3=81=8D=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB=20(Missk?= =?UTF-8?q?eyIO#676)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../src/server/api/endpoints/users/show.ts | 18 +++++++- packages/backend/test/e2e/users.ts | 18 +++++++- .../src/components/MkUserNotFound.vue | 44 +++++++++++++++++++ .../src/components/MkUserSuspended.vue | 44 +++++++++++++++++++ packages/frontend/src/pages/user/index.vue | 21 +++++++-- 5 files changed, 140 insertions(+), 5 deletions(-) create mode 100644 packages/frontend/src/components/MkUserNotFound.vue create mode 100644 packages/frontend/src/components/MkUserSuspended.vue diff --git a/packages/backend/src/server/api/endpoints/users/show.ts b/packages/backend/src/server/api/endpoints/users/show.ts index 7ef2c358d..2bb939518 100644 --- a/packages/backend/src/server/api/endpoints/users/show.ts +++ b/packages/backend/src/server/api/endpoints/users/show.ts @@ -66,6 +66,13 @@ export const meta = { id: '4362f8dc-731f-4ad8-a694-be5a88922a24', httpStatusCode: 404, }, + + userSuspended: { + message: 'User is suspended.', + code: 'USER_SUSPENDED', + id: 'c1e1b0d6-2b7c-4c1d-9f1d-2d3d6e8d7e7f', + httpStatusCode: 403, + }, }, } as const; @@ -147,10 +154,19 @@ export default class extends Endpoint { // eslint- user = await this.usersRepository.findOneBy(q); } - if (user == null || (!isModerator && user.isSuspended)) { + if (user == null) { throw new ApiError(meta.errors.noSuchUser); } + if (!isModerator) { + if (user.isDeleted && user.isSuspended) { + throw new ApiError(meta.errors.noSuchUser); + } + if (user.isSuspended) { + throw new ApiError(meta.errors.userSuspended); + } + } + if (user.host == null) { if (me == null && ip != null) { this.perUserPvChart.commitByVisitor(user, ip); diff --git a/packages/backend/test/e2e/users.ts b/packages/backend/test/e2e/users.ts index 4c62a2f5f..c3c2add71 100644 --- a/packages/backend/test/e2e/users.ts +++ b/packages/backend/test/e2e/users.ts @@ -8,7 +8,7 @@ process.env.NODE_ENV = 'test'; import * as assert from 'assert'; import { inspect } from 'node:util'; import { DEFAULT_POLICIES } from '@/core/RoleService.js'; -import { api, post, role, signup, successfulApiCall, uploadFile } from '../utils.js'; +import { api, post, role, signup, successfulApiCall, uploadFile, failedApiCall } from '../utils.js'; import type * as misskey from 'misskey-js'; describe('ユーザー', () => { @@ -883,6 +883,22 @@ describe('ユーザー', () => { //#endregion + //#region 凍結/削除ユーザー + test('が凍結済みのユーザー情報を取得できない', async () => { + const parameters = { userId: userSuspended.id }; + await failedApiCall({ endpoint: 'users/show', parameters, user: alice }, + { status: 403, code: 'USER_SUSPENDED', id: 'c1e1b0d6-2b7c-4c1d-9f1d-2d3d6e8d7e7f' }); + }); + + test('(Admin)が凍結済みユーザー情報を取得できる', async () => { + const parameters = { userId: userSuspended.id }; + await successfulApiCall({ endpoint: 'users/show', parameters, user: root }); + // Adminとユーザー情報は持っている情報が違うので、比較はできない + // const expected = userSuspended; + // assert.deepStrictEqual(response, expected); + }); + //#endregion + test.todo('を管理人として確認することができる(admin/show-user)'); test.todo('を管理人として確認することができる(admin/show-users)'); test.todo('をサーバー向けに取得することができる(federation/users)'); diff --git a/packages/frontend/src/components/MkUserNotFound.vue b/packages/frontend/src/components/MkUserNotFound.vue new file mode 100644 index 000000000..42223d1f6 --- /dev/null +++ b/packages/frontend/src/components/MkUserNotFound.vue @@ -0,0 +1,44 @@ + + + + + + + diff --git a/packages/frontend/src/components/MkUserSuspended.vue b/packages/frontend/src/components/MkUserSuspended.vue new file mode 100644 index 000000000..1264e64fa --- /dev/null +++ b/packages/frontend/src/components/MkUserSuspended.vue @@ -0,0 +1,44 @@ + + + + + + + diff --git a/packages/frontend/src/pages/user/index.vue b/packages/frontend/src/pages/user/index.vue index a6244e2a9..1c0737f09 100644 --- a/packages/frontend/src/pages/user/index.vue +++ b/packages/frontend/src/pages/user/index.vue @@ -24,7 +24,13 @@ SPDX-License-Identifier: AGPL-3.0-only - +
+ +
+
+ + +
@@ -38,6 +44,8 @@ import { misskeyApi } from '@/scripts/misskey-api.js'; import { definePageMetadata } from '@/scripts/page-metadata.js'; import { i18n } from '@/i18n.js'; import { $i } from '@/account.js'; +import MkUserNotFound from '@/components/MkUserNotFound.vue'; +import MkUserSuspended from '@/components/MkUserSuspended.vue'; import MkHorizontalSwipe from '@/components/MkHorizontalSwipe.vue'; const XHome = defineAsyncComponent(() => import('./home.vue')); @@ -62,7 +70,8 @@ const props = withDefaults(defineProps<{ const tab = ref(props.page); const user = ref(null); -const error = ref(null); +const error = ref(null); +const userstatus = ref(null); function fetchUser(): void { if (props.acct == null) return; @@ -70,7 +79,13 @@ function fetchUser(): void { misskeyApi('users/show', Misskey.acct.parse(props.acct)).then(u => { user.value = u; }).catch(err => { - error.value = err; + if (err.id && err.id === '4362f8dc-731f-4ad8-a694-be5a88922a24') { // User not found + userstatus.value = 'notfound'; + } else if (err.id && err.id === 'c1e1b0d6-2b7c-4c1d-9f1d-2d3d6e8d7e7f') { // User suspended + userstatus.value = 'suspended'; + } else { + error.value = err; + } }); }