From bb486324427ba0810b7ebc272d87e0a89223d84d Mon Sep 17 00:00:00 2001 From: mei23 Date: Sun, 18 Feb 2024 06:47:25 +0900 Subject: [PATCH 1/5] =?UTF-8?q?Tune=20=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E7=89=A9=E7=90=86=E5=89=8A=E9=99=A4=E3=83=84=E3=83=BC=E3=83=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/tools/_delete-deleted-user-by-hosts.ts | 7 ++++++- src/tools/_delete-deleted-user-by-id.ts | 7 ++++++- 2 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/tools/_delete-deleted-user-by-hosts.ts b/src/tools/_delete-deleted-user-by-hosts.ts index 6cf366efaf1b..3dd25977a7a5 100644 --- a/src/tools/_delete-deleted-user-by-hosts.ts +++ b/src/tools/_delete-deleted-user-by-hosts.ts @@ -1,4 +1,5 @@ -// 消したリモートユーザーを物理削除する、削除フラグリセット、clean-deleted-user-objsをやった後にやる、使うな +// 消したリモートユーザーを物理削除する by host +import Note from '../models/note'; import User, { IUser } from '../models/user'; async function main(host: string) { @@ -23,6 +24,10 @@ async function main(host: string) { console.log(`user(${prs}/${users.length}): ${user.username}@${user.host}`); + await Note.remove({ + userId: user._id + }); + await User.remove({ _id: u._id }); diff --git a/src/tools/_delete-deleted-user-by-id.ts b/src/tools/_delete-deleted-user-by-id.ts index 4369eafdf484..051ce262cf65 100644 --- a/src/tools/_delete-deleted-user-by-id.ts +++ b/src/tools/_delete-deleted-user-by-id.ts @@ -1,6 +1,7 @@ -// 消したリモートユーザーを物理削除する、削除フラグリセット、clean-deleted-user-objsをやった後にやる、使うな +// 消したリモートユーザーを物理削除する by UserId import * as mongo from 'mongodb'; import User from '../models/user'; +import Note from '../models/note'; async function main(userId: string) { if (!userId) throw 'userId required'; @@ -16,6 +17,10 @@ async function main(userId: string) { console.log('user', user); + await Note.remove({ + userId: user._id + }); + await User.remove({ _id: user._id }); From 1a6a5f0676f7524113de874ef67a56ef67ad7e12 Mon Sep 17 00:00:00 2001 From: mei23 Date: Sun, 18 Feb 2024 07:13:58 +0900 Subject: [PATCH 2/5] =?UTF-8?q?=E3=83=A6=E3=83=BC=E3=82=B6=E3=83=BC?= =?UTF-8?q?=E3=83=9A=E3=83=BC=E3=82=B8=E3=81=AE=E3=82=A8=E3=83=A9=E3=83=BC?= =?UTF-8?q?=E3=81=A7=E3=83=80=E3=82=A4=E3=82=A2=E3=83=AD=E3=82=B0=E3=82=92?= =?UTF-8?q?=E8=A1=A8=E7=A4=BA=E3=81=99=E3=82=8B=E3=82=88=E3=81=86=E3=81=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/client/app/common/views/deck/deck.user-column.vue | 5 ++++- src/client/app/desktop/views/home/user/index.vue | 3 ++- src/client/app/mobile/views/pages/user/index.vue | 4 ++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/src/client/app/common/views/deck/deck.user-column.vue b/src/client/app/common/views/deck/deck.user-column.vue index f1e6042f9049..7043cfaae5c9 100644 --- a/src/client/app/common/views/deck/deck.user-column.vue +++ b/src/client/app/common/views/deck/deck.user-column.vue @@ -141,7 +141,10 @@ export default Vue.extend({ this.$root.api('users/show', parseAcct(this.$route.params.user)).then(user => { this.user = user; this.fetching = false; - }); + }).catch((e: any) => { + this.$root.dialog({ type: 'error', text: e.message || 'Error' }); + this.fetching = false; + });; }, onAvatarClick() { diff --git a/src/client/app/desktop/views/home/user/index.vue b/src/client/app/desktop/views/home/user/index.vue index 88fe99024e47..b10f45b555bf 100644 --- a/src/client/app/desktop/views/home/user/index.vue +++ b/src/client/app/desktop/views/home/user/index.vue @@ -50,7 +50,8 @@ export default Vue.extend({ if (this.$store.state.i || !user.host) this.user = user; this.fetching = false; Progress.done(); - }).catch(() => { + }).catch((e: any) => { + this.$root.dialog({ type: 'error', text: e.message || 'Error' }); this.fetching = false; Progress.done(); }); diff --git a/src/client/app/mobile/views/pages/user/index.vue b/src/client/app/mobile/views/pages/user/index.vue index ca0d65d3f9c2..5d07e67afa16 100644 --- a/src/client/app/mobile/views/pages/user/index.vue +++ b/src/client/app/mobile/views/pages/user/index.vue @@ -149,6 +149,10 @@ export default Vue.extend({ Progress.done(); document.title = `${Vue.filter('userName')(this.user)} | ${this.$root.instanceName}`; + }).catch((e: any) => { + this.$root.dialog({ type: 'error', text: e.message || 'Error' }); + this.fetching = false; + Progress.done(); }); }, From c17f2ea4a94d7fc793f47d6c056d1b7e1a7393cf Mon Sep 17 00:00:00 2001 From: mei23 Date: Sun, 18 Feb 2024 07:29:20 +0900 Subject: [PATCH 3/5] =?UTF-8?q?=E7=AE=A1=E7=90=86=E8=80=85=E3=81=AE?= =?UTF-8?q?=E9=80=A3=E7=B5=A1=E5=85=88=E3=81=AF=E3=83=A1=E3=83=BC=E3=83=AB?= =?UTF-8?q?=E3=82=A2=E3=83=89=E3=83=AC=E3=82=B9=E3=81=A7=E3=81=AA=E3=81=8F?= =?UTF-8?q?=E3=81=A6=E3=82=82=E3=82=88=E3=81=84?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- locales/en-US.yml | 2 +- locales/ja-JP.yml | 2 +- src/client/app/admin/views/cards/email.vue | 14 +++++++++----- src/client/app/admin/views/cards/general.vue | 8 ++++---- src/server/api/endpoints/admin/update-meta.ts | 2 +- 5 files changed, 16 insertions(+), 12 deletions(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index 5b25ee1fd62b..f8ffde00ff75 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1497,7 +1497,7 @@ admin/views/instance.vue: smtp-auth: "Perform SMTP authentication" smtp-user: "SMTP User" smtp-pass: "SMTP Password" - test-mail: "Test mail to administrator contact" + test-mail: "Test mail" serviceworker-config: "ServiceWorker" enable-serviceworker: "Enable ServiceWorker" serviceworker-info: "Must be enabled for push notifications." diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index cb069efe1ea5..8b525af1c85b 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1647,7 +1647,7 @@ admin/views/instance.vue: smtp-auth: "SMTP認証を行う" smtp-user: "SMTPユーザー" smtp-pass: "SMTPパスワード" - test-mail: "管理者の連絡先にテスト送信" + test-mail: "テスト送信" serviceworker-config: "ServiceWorker" enable-serviceworker: "ServiceWorkerを有効にする" serviceworker-info: "プッシュ通知を行うには有効する必要があります。" diff --git a/src/client/app/admin/views/cards/email.vue b/src/client/app/admin/views/cards/email.vue index ba15e1d451e7..f524e174136b 100644 --- a/src/client/app/admin/views/cards/email.vue +++ b/src/client/app/admin/views/cards/email.vue @@ -57,8 +57,6 @@ export default defineComponent({ smtpPass: null, smtpAuth: false, - maintainerEmail: null, - // icons アイコンを追加したらここをいじる 2/2 farEnvelope, }; @@ -82,8 +80,6 @@ export default defineComponent({ this.smtpUser = meta.smtpUser; this.smtpPass = meta.smtpPass; this.smtpAuth = meta.smtpUser != null && meta.smtpUser !== ''; - - this.maintainerEmail = meta.maintainer.email; }); }, @@ -120,8 +116,16 @@ export default defineComponent({ }, async testEmail() { + const { canceled, result } = await this.$root.dialog({ + title: 'To', + input: { + type: 'text' + } + }); + if (canceled) return; + this.$root.api('admin/send-email', { - to: this.maintainerEmail, + to: result, subject: 'Test email', text: 'Na' }).then((e: Error) => { diff --git a/src/client/app/admin/views/cards/general.vue b/src/client/app/admin/views/cards/general.vue index 68c34d8e63b4..9f1ec3462295 100644 --- a/src/client/app/admin/views/cards/general.vue +++ b/src/client/app/admin/views/cards/general.vue @@ -13,10 +13,10 @@
-
{{ $t('maintainer-config') }}
+
{{ $t('maintainer-config') }}
{{ $t('maintainer-name') }} - {{ $t('maintainer-email') }} + {{ $t('maintainer-email') }}
@@ -39,7 +39,7 @@ import { defineComponent, getCurrentInstance } from 'vue'; import i18n from '../../../i18n'; // アイコンを追加したらここをいじる 1/2 -import { faHeadset } from '@fortawesome/free-solid-svg-icons'; +import { faCrown } from '@fortawesome/free-solid-svg-icons'; import { faEnvelope as farEnvelope } from '@fortawesome/free-regular-svg-icons'; export default defineComponent({ @@ -63,7 +63,7 @@ export default defineComponent({ disableRegistration: false, // icons アイコンを追加したらここをいじる 2/2 - faHeadset, farEnvelope, + faCrown, farEnvelope, }; }, diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index 737dbf78bd89..edc796c7755f 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -195,7 +195,7 @@ export const meta = { maintainerEmail: { validator: $.optional.nullable.str, desc: { - 'ja-JP': 'インスタンス管理者の連絡先メールアドレス' + 'ja-JP': 'インスタンス管理者の連絡先' } }, From 8815aaf574f61654aa87be01060a1c030b310ff0 Mon Sep 17 00:00:00 2001 From: MeiMei <30769358+mei23@users.noreply.github.com> Date: Sun, 18 Feb 2024 15:48:04 +0900 Subject: [PATCH 4/5] =?UTF-8?q?=E3=83=95=E3=82=A1=E3=82=A4=E3=83=AB?= =?UTF-8?q?=E3=83=9F=E3=83=A5=E3=83=BC=E3=83=88=20(#4827)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * ファイルミュート * a * b --- locales/en-US.yml | 2 ++ locales/ja-JP.yml | 2 ++ src/client/app/admin/views/instanceblocks.vue | 9 +++++++++ src/misc/fetch-meta.ts | 1 + src/models/meta.ts | 1 + src/server/api/endpoints/admin/meta.ts | 1 + src/server/api/endpoints/admin/update-meta.ts | 13 ++++++++++++- src/services/instance-moderation.ts | 18 ++++++++++++++++++ src/services/note/create.ts | 13 +++++++++++++ 9 files changed, 59 insertions(+), 1 deletion(-) diff --git a/locales/en-US.yml b/locales/en-US.yml index f8ffde00ff75..fea2315588a0 100644 --- a/locales/en-US.yml +++ b/locales/en-US.yml @@ -1747,6 +1747,8 @@ admin/views/instanceblocks.vue: ignoredInstances-info: "Instances that don't send/receive and fetch. One host per line. You can use /RegExp/." selfSilencedInstances: "Self-silenced instances" selfSilencedInstances-info: "Instances to deliver with maximum visibility home. One host per line. You can use /RegExp/." + mutedFiles: "Attachments to mute" + mutedFiles-info: "Mute the specified file if it is attached. MD5 lower case." exposeHome: "If fetched from remote, max visibility to home." exposeHome-info: "If posts are retrieved from instances with no followers, etc., set the maximum visibility to Home." diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index 8b525af1c85b..a9e04d82883d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -1910,6 +1910,8 @@ admin/views/instanceblocks.vue: ignoredInstances-info: "送受信と取得を行わないインスタンス。1行に1ホスト記述します。/正規表現/ が使えます。" selfSilencedInstances: "セルフサイレンスするインスタンス" selfSilencedInstances-info: "最大公開範囲ホームで配信するインスタンス。1行に1ホスト記述します。/正規表現/ が使えます。" + mutedFiles: "ミュートする添付ファイル" + mutedFiles-info: "指定のファイルが投稿に添付されている場合にミュートします。MD5小文字。" exposeHome: 取得されるときの最大公開範囲はホームにする exposeHome-info: "フォロワーのいないインスタンスなどから投稿を取得されるときの最大公開範囲をホームにします。" diff --git a/src/client/app/admin/views/instanceblocks.vue b/src/client/app/admin/views/instanceblocks.vue index 8561da49002e..ac9137f21052 100644 --- a/src/client/app/admin/views/instanceblocks.vue +++ b/src/client/app/admin/views/instanceblocks.vue @@ -15,6 +15,12 @@ {{ $t('selfSilencedInstances-info') }} +
+
{{ $t('mutedFiles') }}
+ + {{ $t('mutedFiles-info') }} +
+
{{ $t('exposeHome') }} {{ $t('exposeHome-info') }} @@ -38,6 +44,7 @@ export default defineComponent({ $root: getCurrentInstance() as any, blockedInstances: '', selfSilencedInstances: '', + mutedFiles: '', exposeHome: false, }; }, @@ -49,6 +56,7 @@ export default defineComponent({ this.$root.api('admin/meta').then((meta: any) => { this.blockedInstances = meta.blockedInstances.join('\n'); this.selfSilencedInstances = meta.selfSilencedInstances.join('\n'); + this.mutedFiles = meta.mutedFiles.join('\n'); this.exposeHome = meta.exposeHome; }); }, @@ -56,6 +64,7 @@ export default defineComponent({ this.$root.api('admin/update-meta', { blockedInstances: this.blockedInstances ? this.blockedInstances.split('\n') : [], selfSilencedInstances: this.selfSilencedInstances ? this.selfSilencedInstances.split('\n') : [], + mutedFiles: this.mutedFiles ? this.mutedFiles.split('\n') : [], exposeHome: !!this.exposeHome, }).then(() => { this.$root.dialog({ diff --git a/src/misc/fetch-meta.ts b/src/misc/fetch-meta.ts index ba0dcdb2ba90..5929b2b9bc13 100644 --- a/src/misc/fetch-meta.ts +++ b/src/misc/fetch-meta.ts @@ -10,6 +10,7 @@ const defaultMeta: any = { hidedTags: [], blockedInstances: [], selfSilencedInstances: [], + mutedFiles: [], exposeHome: false, stats: { // Object.assignじゃマージされない diff --git a/src/models/meta.ts b/src/models/meta.ts index 61ddcb46dfde..1fd582fa0352 100644 --- a/src/models/meta.ts +++ b/src/models/meta.ts @@ -191,6 +191,7 @@ export type IMeta = { hidedTags?: string[]; blockedInstances?: string[]; selfSilencedInstances?: string[]; + mutedFiles?: string[]; exposeHome?: boolean; mascotImageUrl?: string; bannerUrl?: string; diff --git a/src/server/api/endpoints/admin/meta.ts b/src/server/api/endpoints/admin/meta.ts index 74953aa83391..ae53135f237f 100644 --- a/src/server/api/endpoints/admin/meta.ts +++ b/src/server/api/endpoints/admin/meta.ts @@ -144,6 +144,7 @@ export default define(meta, async (ps, me) => { response.hidedTags = instance.hidedTags; response.blockedInstances = instance.blockedInstances; response.selfSilencedInstances = instance.selfSilencedInstances; + response.mutedFiles = instance.mutedFiles; response.exposeHome = instance.exposeHome; response.recaptchaSecretKey = instance.recaptchaSecretKey; response.proxyAccount = instance.proxyAccount; diff --git a/src/server/api/endpoints/admin/update-meta.ts b/src/server/api/endpoints/admin/update-meta.ts index edc796c7755f..3b2c80388383 100644 --- a/src/server/api/endpoints/admin/update-meta.ts +++ b/src/server/api/endpoints/admin/update-meta.ts @@ -85,6 +85,13 @@ export const meta = { } }, + mutedFiles: { + validator: $.optional.nullable.arr($.str), + desc: { + 'ja-JP': 'ミュートする添付ファイル' + } + }, + exposeHome: { validator: $.optional.boolean, desc: { @@ -391,6 +398,10 @@ export default define(meta, async (ps) => { set.selfSilencedInstances = ps.selfSilencedInstances.map(x => x.trim()).filter(x => x !== '').map(x => toApHost(x)); } + if (Array.isArray(ps.mutedFiles)) { + set.mutedFiles = ps.mutedFiles.map(x => x.trim()).filter(x => x !== ''); + } + if (typeof ps.exposeHome === 'boolean') { set.exposeHome = ps.exposeHome; } @@ -543,7 +554,7 @@ export default define(meta, async (ps) => { $set: set }, { upsert: true }); - if (set.blockedInstances || set.selfSilencedInstances) { + if (set.blockedInstances || set.selfSilencedInstances || set.mutedFiles) { publishInstanceModUpdated(); } diff --git a/src/services/instance-moderation.ts b/src/services/instance-moderation.ts index 4ed8b74838a5..5635ffb559b6 100644 --- a/src/services/instance-moderation.ts +++ b/src/services/instance-moderation.ts @@ -8,6 +8,7 @@ let blockedHostsRegExp: Set; let selfSilencedHosts: Set; let selfSilencedHostsRegExp: Set; let closedHosts: Set; +let mutedFiles: Set; export async function isBlockedHost(host: string | null) { if (host == null) return false; @@ -31,6 +32,12 @@ export async function isSelfSilencedHost(host: string | null) { return false; } +export async function isMutedFile(md5: string | null | undefined) { + if (md5 == null) return false; + if (!mutedFiles) await Update(); + return mutedFiles?.has(md5); +} + export async function isClosedHost(host: string | null) { if (host == null) return false; if (!closedHosts) await Update(); @@ -80,6 +87,17 @@ async function Update() { selfSilencedHostsRegExp = regExps; } + // mutedFiles from meta + { + const literals = new Set(); + + for (const b of (meta.mutedFiles || [])) { + literals.add(b); + } + + mutedFiles = literals; + } + // closed from instance const closed = await Instance.find({ isMarkedAsClosed: true diff --git a/src/services/note/create.ts b/src/services/note/create.ts index bbc88c8ec66d..a9344c4aa8e7 100644 --- a/src/services/note/create.ts +++ b/src/services/note/create.ts @@ -34,6 +34,10 @@ import Following from '../../models/following'; import { IActivity } from '../../remote/activitypub/type'; import { normalizeTag } from '../../misc/normalize-tag'; import * as ms from 'ms'; +import { isMutedFile } from '../instance-moderation'; +import Logger from '../logger'; +export const noteLogger = new Logger('note'); + type NotificationType = 'reply' | 'renote' | 'quote' | 'mention' | 'highlight'; @@ -84,6 +88,15 @@ class NotificationManager { return; } + if (this.queue.length === 0) return; + + for (const atc of this.note._files || []) { + if (await isMutedFile(atc.md5)) { + noteLogger.info(`muted file: note=${this.note._id} md5=${atc.md5}`); + return; + } + } + for (const x of this.queue) { // ミュートされてたらスキップ const mute = await getMute(x.target, this.notifier._id); From a6c53c5e57e844c102d354daf648ef996e29aca5 Mon Sep 17 00:00:00 2001 From: mei23 Date: Sun, 18 Feb 2024 15:48:37 +0900 Subject: [PATCH 5/5] 10.102.690-m544 --- package.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/package.json b/package.json index 4581d6585c57..8b06ee40401c 100644 --- a/package.json +++ b/package.json @@ -1,7 +1,7 @@ { "name": "misskey", "author": "mei23 ", - "version": "10.102.689-m544", + "version": "10.102.690-m544", "codename": "m544", "repository": { "type": "git",