From 3fe29adff89033f2fd9443a9a30616b95c0fd902 Mon Sep 17 00:00:00 2001 From: Marie Date: Sun, 13 Aug 2023 12:46:42 +0000 Subject: [PATCH 1/7] chore: Translated using Weblate (German) Currently translated at 100.0% (1850 of 1850 strings) Translation: Firefish/locales Translate-URL: https://hosted.weblate.org/projects/firefish/locales/de/ --- locales/de-DE.yml | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/locales/de-DE.yml b/locales/de-DE.yml index fbfa23db56..d58896da84 100644 --- a/locales/de-DE.yml +++ b/locales/de-DE.yml @@ -2099,7 +2099,7 @@ customKaTeXMacro: Individuelle KaTeX Makros enableCustomKaTeXMacro: Individuelle KaTeX-Makros aktivieren replayTutorial: Wiederhole die Benutzeranleitung apps: Apps -caption: Automatische Untertitelung +caption: Automatische Beschreibung pwa: PWA installieren cw: Inhaltswarnung older: älter @@ -2204,3 +2204,7 @@ deletePasskeysConfirm: Alle Passkeys und Security-Keys werden unwiderruflich von inputNotMatch: Eingabe stimmt nicht überein addRe: Ein "re:" am Anfang des Kommentars hinzufügen, um einem Beitrag mit einer Inhaltswarnung zu antworten +confirm: Bestätigen +importZip: ZIP Importieren +emojiPackCreator: Emoji-Pack Ersteller +exportZip: ZIP Exportieren From fd4bf7f333871b4ba45bd9e52d5d3c49cf0764f3 Mon Sep 17 00:00:00 2001 From: naskya Date: Mon, 14 Aug 2023 13:47:34 +0000 Subject: [PATCH 2/7] chore: Translated using Weblate (Japanese) Currently translated at 100.0% (1850 of 1850 strings) Translation: Firefish/locales Translate-URL: https://hosted.weblate.org/projects/firefish/locales/ja/ --- locales/ja-JP.yml | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/locales/ja-JP.yml b/locales/ja-JP.yml index f266b1f820..43436b996d 100644 --- a/locales/ja-JP.yml +++ b/locales/ja-JP.yml @@ -303,7 +303,7 @@ emptyDrive: "ドライブは空です" emptyFolder: "フォルダーは空です" unableToDelete: "削除できません" inputNewFileName: "新しいファイル名を入力してください" -inputNewDescription: "新しいキャプションを入力" +inputNewDescription: "新しい説明を入力" inputNewFolderName: "新しいフォルダ名を入力してください" circularReferenceFolder: "移動先のフォルダーは、移動するフォルダーのサブフォルダーです。" hasChildFilesOrFolders: "このフォルダは空でないため、削除できません。" @@ -577,8 +577,8 @@ disablePlayer: "プレイヤーを閉じる" expandTweet: "ツイートを展開する" themeEditor: "テーマエディター" description: "説明" -describeFile: "キャプションを追加" -enterFileDescription: "キャプションを入力" +describeFile: "説明を追加" +enterFileDescription: "説明を入力" author: "作者" leaveConfirm: "未保存の変更があります。破棄しますか?" manage: "管理" @@ -949,7 +949,7 @@ customSplashIconsDescription: "ユーザがページをロード/リロードす showUpdates: "Firefishの更新時にポップアップを表示する" recommendedInstances: "おすすめサーバー" recommendedInstancesDescription: "おすすめタイムラインに表示するサーバーを改行区切りで入力してください。" -caption: "自動でキャプションをつける" +caption: "自動で説明をつける" splash: "スプラッシュスクリーン" updateAvailable: "アップデートがありますよ!" swipeOnDesktop: "デスクトップでモバイルスタイルのスワイプを可能にする" From 6773ef711a02e87fe4d6656d9008a5106ea3270e Mon Sep 17 00:00:00 2001 From: Vyr Cossont Date: Mon, 14 Aug 2023 12:18:57 -0700 Subject: [PATCH 3/7] Mastodon API: convert IDs in conversations --- .../backend/src/server/api/mastodon/converters.ts | 10 ++++++++++ .../src/server/api/mastodon/endpoints/timeline.ts | 11 +++++++++-- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/packages/backend/src/server/api/mastodon/converters.ts b/packages/backend/src/server/api/mastodon/converters.ts index 9084643795..6469d9c97b 100644 --- a/packages/backend/src/server/api/mastodon/converters.ts +++ b/packages/backend/src/server/api/mastodon/converters.ts @@ -74,3 +74,13 @@ export function convertStatus(status: Entity.Status) { return status; } + +export function convertConversation(conversation: Entity.Conversation) { + conversation.id = convertId(conversation.id, IdType.MastodonId); + conversation.accounts = conversation.accounts.map(convertAccount); + if (conversation.last_status) { + conversation.last_status = convertStatus(conversation.last_status); + } + + return conversation; +} diff --git a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts index d54594327a..0a4da322d7 100644 --- a/packages/backend/src/server/api/mastodon/endpoints/timeline.ts +++ b/packages/backend/src/server/api/mastodon/endpoints/timeline.ts @@ -1,7 +1,12 @@ import Router from "@koa/router"; import { getClient } from "../ApiMastodonCompatibleService.js"; import { ParsedUrlQuery } from "querystring"; -import { convertAccount, convertList, convertStatus } from "../converters.js"; +import { + convertAccount, + convertConversation, + convertList, + convertStatus, +} from "../converters.js"; import { convertId, IdType } from "../../index.js"; export function limitToInt(q: ParsedUrlQuery) { @@ -136,7 +141,9 @@ export function apiTimelineMastodon(router: Router): void { const data = await client.getConversationTimeline( convertTimelinesArgsId(limitToInt(ctx.query)), ); - ctx.body = data.data; + ctx.body = data.data.map((conversation) => + convertConversation(conversation), + ); } catch (e: any) { console.error(e); console.error(e.response.data); From 7d49af822a7c38e0e4f5098014ba224695342aeb Mon Sep 17 00:00:00 2001 From: Essem Date: Tue, 15 Aug 2023 03:44:06 +0000 Subject: [PATCH 4/7] Add address bind config option --- .config/example.yml | 3 +++ packages/backend/src/config/types.ts | 1 + packages/backend/src/misc/fetch.ts | 4 ++++ 3 files changed, 8 insertions(+) diff --git a/.config/example.yml b/.config/example.yml index e28a20a3c7..c4c6340076 100644 --- a/.config/example.yml +++ b/.config/example.yml @@ -161,6 +161,9 @@ reservedUsernames: [ # deliverJobMaxAttempts: 12 # inboxJobMaxAttempts: 8 +# Local address used for outgoing requests +#outgoingAddress: 127.0.0.1 + # IP address family used for outgoing request (ipv4, ipv6 or dual) #outgoingAddressFamily: ipv4 diff --git a/packages/backend/src/config/types.ts b/packages/backend/src/config/types.ts index 7ead804a6f..52854db5a5 100644 --- a/packages/backend/src/config/types.ts +++ b/packages/backend/src/config/types.ts @@ -78,6 +78,7 @@ export type Source = { fingerprint?: string; }; + outgoingAddress?: string; outgoingAddressFamily?: "ipv4" | "ipv6" | "dual"; deliverJobConcurrency?: number; diff --git a/packages/backend/src/misc/fetch.ts b/packages/backend/src/misc/fetch.ts index 0e673ba3a8..e47ef0d47a 100644 --- a/packages/backend/src/misc/fetch.ts +++ b/packages/backend/src/misc/fetch.ts @@ -99,6 +99,7 @@ const _http = new http.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as http.AgentOptions); /** @@ -108,6 +109,7 @@ const _https = new https.Agent({ keepAlive: true, keepAliveMsecs: 30 * 1000, lookup: cache.lookup, + localAddress: config.outgoingAddress, } as https.AgentOptions); const maxSockets = Math.max(256, config.deliverJobConcurrency || 128); @@ -123,6 +125,7 @@ export const httpAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _http; @@ -137,6 +140,7 @@ export const httpsAgent = config.proxy maxFreeSockets: 256, scheduling: "lifo", proxy: config.proxy, + localAddress: config.outgoingAddress, }) : _https; From 4174e3d0705343839cc0f3c194205559a1c55088 Mon Sep 17 00:00:00 2001 From: Essem Date: Wed, 19 Jul 2023 19:53:07 -0500 Subject: [PATCH 5/7] Fix report emails and modmail sanitization --- .../api/endpoints/admin/send-mod-mail.ts | 2 +- .../api/endpoints/users/report-abuse.ts | 25 +++++++++++-------- 2 files changed, 15 insertions(+), 12 deletions(-) diff --git a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts index f7a9ad7782..db12ab6c23 100644 --- a/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts +++ b/packages/backend/src/server/api/endpoints/admin/send-mod-mail.ts @@ -1,4 +1,4 @@ -import * as sanitizeHtml from "sanitize-html"; +import sanitizeHtml from "sanitize-html"; import define from "../../define.js"; import { Users, UserProfiles } from "@/models/index.js"; import { ApiError } from "../../error.js"; diff --git a/packages/backend/src/server/api/endpoints/users/report-abuse.ts b/packages/backend/src/server/api/endpoints/users/report-abuse.ts index 44d3f9b500..1368f9e2b9 100644 --- a/packages/backend/src/server/api/endpoints/users/report-abuse.ts +++ b/packages/backend/src/server/api/endpoints/users/report-abuse.ts @@ -1,12 +1,14 @@ -import * as sanitizeHtml from "sanitize-html"; +import * as mfm from "mfm-js"; +import sanitizeHtml from "sanitize-html"; import { publishAdminStream } from "@/services/stream.js"; -import { AbuseUserReports, Users } from "@/models/index.js"; +import { AbuseUserReports, UserProfiles, Users } from "@/models/index.js"; import { genId } from "@/misc/gen-id.js"; import { sendEmail } from "@/services/send-email.js"; import { fetchMeta } from "@/misc/fetch-meta.js"; import { getUser } from "../../common/getters.js"; import { ApiError } from "../../error.js"; import define from "../../define.js"; +import { toHtml } from "@/mfm/to-html.js"; export const meta = { tags: ["users"], @@ -84,6 +86,7 @@ export default define(meta, paramDef, async (ps, me) => { ], }); + const meta = await fetchMeta(); for (const moderator of moderators) { publishAdminStream(moderator.id, "newAbuseUserReport", { id: report.id, @@ -91,16 +94,16 @@ export default define(meta, paramDef, async (ps, me) => { reporterId: report.reporterId, comment: report.comment, }); - } - const meta = await fetchMeta(); - if (meta.email) { - sendEmail( - meta.email, - "New abuse report", - sanitizeHtml(ps.comment), - sanitizeHtml(ps.comment), - ); + const profile = await UserProfiles.findOneBy({ userId: moderator.id }); + if (profile?.email) { + sendEmail( + profile.email, + "New abuse report", + sanitizeHtml(toHtml(mfm.parse(ps.comment))!), + sanitizeHtml(toHtml(mfm.parse(ps.comment))!), + ); + } } }); }); From a07a585cdb36f2b6fcdd37a09991d66eb584a041 Mon Sep 17 00:00:00 2001 From: Jegler Date: Wed, 16 Aug 2023 03:45:10 +0000 Subject: [PATCH 6/7] Fix tini path in Dockerfile --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index eeb5db886e..c7d9a95d86 100644 --- a/Dockerfile +++ b/Dockerfile @@ -74,5 +74,5 @@ COPY --from=build /firefish/packages/backend/native-utils/built /firefish/packag RUN corepack enable && corepack prepare pnpm@latest --activate ENV NODE_ENV=production VOLUME "/firefish/files" -ENTRYPOINT [ "/sbin/tini", "--" ] +ENTRYPOINT [ "/usr/bin/tini", "--" ] CMD [ "pnpm", "run", "migrateandstart" ] From 59e989c0bbf59adfe71e9317e4d69cab4999d0f5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Daniel=20Hern=C3=A1ndez?= Date: Thu, 17 Aug 2023 04:41:27 +0000 Subject: [PATCH 7/7] Validate before delivering to keep federation working on valid inboxes --- .../src/remote/activitypub/deliver-manager.ts | 24 ++++++++++++++----- 1 file changed, 18 insertions(+), 6 deletions(-) diff --git a/packages/backend/src/remote/activitypub/deliver-manager.ts b/packages/backend/src/remote/activitypub/deliver-manager.ts index 400e047774..c97d1c99ae 100644 --- a/packages/backend/src/remote/activitypub/deliver-manager.ts +++ b/packages/backend/src/remote/activitypub/deliver-manager.ts @@ -122,19 +122,31 @@ export default class DeliverManager { ) .forEach((recipe) => inboxes.add(recipe.to.inbox!)); + // Validate Inboxes first + const validInboxes = []; + for (const inbox of inboxes) { + try { + validInboxes.push({ + inbox, + host: new URL(inbox).host, + }); + } catch (error) { + console.error(error); + console.error(`Invalid Inbox ${inbox}`); + } + } + const instancesToSkip = await skippedInstances( // get (unique) list of hosts - Array.from( - new Set(Array.from(inboxes).map((inbox) => new URL(inbox).host)), - ), + Array.from(new Set(validInboxes.map((valid) => valid.host))), ); // deliver - for (const inbox of inboxes) { + for (const valid of validInboxes) { // skip instances as indicated - if (instancesToSkip.includes(new URL(inbox).host)) continue; + if (instancesToSkip.includes(valid.host)) continue; - deliver(this.actor, this.activity, inbox); + deliver(this.actor, this.activity, valid.inbox); } } }