summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authoranatawa12 <anatawa12@icloud.com>2023-10-05 17:03:50 +0900
committerGitHub <noreply@github.com>2023-10-05 17:03:50 +0900
commitee483f2deee56ecac38ccc5554594c6ecad1cc96 (patch)
treedbbea339ab6517b9b74d7e97f1566003ad045ece
parent2023.10.0-beta.3 (diff)
downloadsharkey-ee483f2deee56ecac38ccc5554594c6ecad1cc96.tar.gz
sharkey-ee483f2deee56ecac38ccc5554594c6ecad1cc96.tar.bz2
sharkey-ee483f2deee56ecac38ccc5554594c6ecad1cc96.zip
Disallow renote of direct note (#11970)
* chore: renoteに関するチェックをまとめる * fix: ダイレクト投稿をrenoteできる * fix(frontend): 自分のダイレクト投稿をrenoteできる * docs(changelog): ダイレクト投稿をリノートできてしまう * fix lint * chore(backend): visibilityに関するエラーをApi Errorとして返す
-rw-r--r--CHANGELOG.md1
-rw-r--r--packages/backend/src/core/NoteCreateService.ts35
-rw-r--r--packages/backend/src/server/api/endpoints/notes/create.ts14
-rw-r--r--packages/frontend/src/components/MkNote.vue2
4 files changed, 39 insertions, 13 deletions
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 6959c8577c..2780ebb86a 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -27,6 +27,7 @@
- Enhance: ソフトワードミュートとハードワードミュートは統合されました
- Enhance: モデレーションログ機能の強化
- Enhance: ローカリゼーションの更新
+- Fix: ダイレクト投稿をリノートできてしまう
### Client
- Enhance: 二要素認証のバックアップコード一覧をテキストファイルでダウンロード可能に
diff --git a/packages/backend/src/core/NoteCreateService.ts b/packages/backend/src/core/NoteCreateService.ts
index e8e9973b6e..34d103df77 100644
--- a/packages/backend/src/core/NoteCreateService.ts
+++ b/packages/backend/src/core/NoteCreateService.ts
@@ -252,19 +252,30 @@ export class NoteCreateService implements OnApplicationShutdown {
}
}
- // Renote対象が「ホームまたは全体」以外の公開範囲ならreject
- if (data.renote && data.renote.visibility !== 'public' && data.renote.visibility !== 'home' && data.renote.userId !== user.id) {
- throw new Error('Renote target is not public or home');
- }
-
- // Renote対象がpublicではないならhomeにする
- if (data.renote && data.renote.visibility !== 'public' && data.visibility === 'public') {
- data.visibility = 'home';
- }
+ if (data.renote) {
+ switch (data.renote.visibility) {
+ case 'public':
+ // public noteは無条件にrenote可能
+ break;
+ case 'home':
+ // home noteはhome以下にrenote可能
+ if (data.visibility === 'public') {
+ data.visibility = 'home';
+ }
+ break;
+ case 'followers':
+ // 他人のfollowers noteはreject
+ if (data.renote.userId !== user.id) {
+ throw new Error('Renote target is not public or home');
+ }
- // Renote対象がfollowersならfollowersにする
- if (data.renote && data.renote.visibility === 'followers') {
- data.visibility = 'followers';
+ // Renote対象がfollowersならfollowersにする
+ data.visibility = 'followers';
+ break;
+ case 'specified':
+ // specified / direct noteはreject
+ throw new Error('Renote target is not public or home');
+ }
}
// 返信対象がpublicではないならhomeにする
diff --git a/packages/backend/src/server/api/endpoints/notes/create.ts b/packages/backend/src/server/api/endpoints/notes/create.ts
index 37a0525e25..3ae4ac044a 100644
--- a/packages/backend/src/server/api/endpoints/notes/create.ts
+++ b/packages/backend/src/server/api/endpoints/notes/create.ts
@@ -57,6 +57,12 @@ export const meta = {
id: 'fd4cc33e-2a37-48dd-99cc-9b806eb2031a',
},
+ cannotRenoteDueToVisibility: {
+ message: 'You can not Renote due to target visibility.',
+ code: 'CANNOT_RENOTE_DUE_TO_VISIBILITY',
+ id: 'be9529e9-fe72-4de0-ae43-0b363c4938af',
+ },
+
noSuchReplyTarget: {
message: 'No such reply target.',
code: 'NO_SUCH_REPLY_TARGET',
@@ -231,6 +237,14 @@ export default class extends Endpoint<typeof meta, typeof paramDef> { // eslint-
throw new ApiError(meta.errors.youHaveBeenBlocked);
}
}
+
+ if (renote.visibility === 'followers' && renote.userId !== me.id) {
+ // 他人のfollowers noteはreject
+ throw new ApiError(meta.errors.cannotRenoteDueToVisibility);
+ } else if (renote.visibility === 'specified') {
+ // specified / direct noteはreject
+ throw new ApiError(meta.errors.cannotRenoteDueToVisibility);
+ }
}
let reply: MiNote | null = null;
diff --git a/packages/frontend/src/components/MkNote.vue b/packages/frontend/src/components/MkNote.vue
index 4860f42cdc..62deefc67d 100644
--- a/packages/frontend/src/components/MkNote.vue
+++ b/packages/frontend/src/components/MkNote.vue
@@ -215,7 +215,7 @@ const muted = ref($i ? checkWordMute(appearNote, $i, $i.mutedWords) : false);
const translation = ref<any>(null);
const translating = ref(false);
const showTicker = (defaultStore.state.instanceTicker === 'always') || (defaultStore.state.instanceTicker === 'remote' && appearNote.user.instance);
-const canRenote = computed(() => ['public', 'home'].includes(appearNote.visibility) || appearNote.userId === $i.id);
+const canRenote = computed(() => ['public', 'home'].includes(appearNote.visibility) || (appearNote.visibility === 'followers' && appearNote.userId === $i.id));
let renoteCollapsed = $ref(defaultStore.state.collapseRenotes && isRenote && (($i && ($i.id === note.userId || $i.id === appearNote.userId)) || (appearNote.myReaction != null)));
const keymap = {