diff --git a/CHANGELOG.md b/CHANGELOG.md index 6959c8577c15323852bfc86dec7701085842a0e6..2780ebb86aa5ac1c3ad898748853e0cabfeed04d 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 e8e9973b6eb7e5d41bffd857f1b92e610dd04433..34d103df778288b8f2980ef228e23fb29d91e7fe 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 37a0525e25dd134813a49d9d07f3c1f6ea06f366..3ae4ac044a82d70ff9153e6c2050919cab63e386 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 4860f42cdc35184f53dbf168f81d57ba11a4f29f..62deefc67d9a18038c651d8286cb6ecb5945cf12 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 = {