From ca32c231d0aaab9dacaa88a0b0564d626827e797 Mon Sep 17 00:00:00 2001 From: piuvas Date: Mon, 26 May 2025 22:44:29 -0300 Subject: initial link attributions work. --- .../backend/src/server/web/UrlPreviewService.ts | 50 +++++++++++++++++++++- 1 file changed, 49 insertions(+), 1 deletion(-) (limited to 'packages/backend/src/server/web') diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index 203bc908a8..d5d62c67c0 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -19,7 +19,8 @@ import { MiMeta } from '@/models/Meta.js'; import { RedisKVCache } from '@/misc/cache.js'; import { UtilityService } from '@/core/UtilityService.js'; import { ApDbResolverService } from '@/core/activitypub/ApDbResolverService.js'; -import type { MiAccessToken, NotesRepository } from '@/models/_.js'; +import type { MiAccessToken, NotesRepository, UsersRepository } from '@/models/_.js'; +import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { ApUtilityService } from '@/core/activitypub/ApUtilityService.js'; import { ApRequestService } from '@/core/activitypub/ApRequestService.js'; import { SystemAccountService } from '@/core/SystemAccountService.js'; @@ -34,6 +35,12 @@ import type { FastifyRequest, FastifyReply } from 'fastify'; export type LocalSummalyResult = SummalyResult & { haveNoteLocally?: boolean; + linkAttribution?: { + name: string, + username: string, + avatarUrl: string, + avatarBlurhash: string, + } }; // Increment this to invalidate cached previews after a major change. @@ -77,11 +84,15 @@ export class UrlPreviewService { @Inject(DI.notesRepository) private readonly notesRepository: NotesRepository, + @Inject(DI.usersRepository) + private readonly usersRepository: UsersRepository, + private httpRequestService: HttpRequestService, private loggerService: LoggerService, private readonly utilityService: UtilityService, private readonly apUtilityService: ApUtilityService, private readonly apDbResolverService: ApDbResolverService, + private readonly remoteUserResolveService: RemoteUserResolveService, private readonly apRequestService: ApRequestService, private readonly systemAccountService: SystemAccountService, private readonly apNoteService: ApNoteService, @@ -206,6 +217,8 @@ export class UrlPreviewService { } } + await this.validateLinkAttribution(summary); + // Await this to avoid hammering redis when a bunch of URLs are fetched at once await this.previewCache.set(cacheKey, summary); @@ -426,6 +439,41 @@ export class UrlPreviewService { } } + private async validateLinkAttribution(summary: LocalSummalyResult) { + if (!summary.fediverseCreator) return; + + const url = URL.parse(summary.url); + if (!url) return; + let fediverseCreator = summary.fediverseCreator; + // expecting either '@username@host' or 'username@host' + if (fediverseCreator.startsWith('@')) { + fediverseCreator = fediverseCreator.substring(1); + } + + // + const array = fediverseCreator.split('@'); + const username = array[0].toLowerCase(); + let host: string | null = array[1]; + if (host.toLowerCase() === this.config.host) { + host = null; + } + try { + const user = await this.remoteUserResolveService.resolveUser(username, host) + + const attributionDomains = user.attributionDomains; + if (attributionDomains.some(x => `.${url.host.toLowerCase()}`.endsWith(`.${x}`))) { + summary.linkAttribution = { + name: user.name ?? user.username, + username: fediverseCreator, + avatarUrl: user.avatarUrl ?? '', + avatarBlurhash: user.avatarBlurhash ?? '', + } + } + } catch { + console.warn('user not found: ' + fediverseCreator) + } + } + // Adapted from ApiCallService private async checkFetchPermissions(auth: AuthArray, reply: FastifyReply): Promise { const [user, app] = auth; -- cgit v1.2.3-freya From 6874a318ea19bc1da8f990db1fa226d63e3c5397 Mon Sep 17 00:00:00 2001 From: piuvas Date: Mon, 26 May 2025 23:34:31 -0300 Subject: small fixes. --- packages/backend/src/server/web/UrlPreviewService.ts | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) (limited to 'packages/backend/src/server/web') diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index d5d62c67c0..854f6b9847 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -19,7 +19,7 @@ import { MiMeta } from '@/models/Meta.js'; import { RedisKVCache } from '@/misc/cache.js'; import { UtilityService } from '@/core/UtilityService.js'; import { ApDbResolverService } from '@/core/activitypub/ApDbResolverService.js'; -import type { MiAccessToken, NotesRepository, UsersRepository } from '@/models/_.js'; +import type { MiAccessToken, NotesRepository } from '@/models/_.js'; import { RemoteUserResolveService } from '@/core/RemoteUserResolveService.js'; import { ApUtilityService } from '@/core/activitypub/ApUtilityService.js'; import { ApRequestService } from '@/core/activitypub/ApRequestService.js'; @@ -84,9 +84,6 @@ export class UrlPreviewService { @Inject(DI.notesRepository) private readonly notesRepository: NotesRepository, - @Inject(DI.usersRepository) - private readonly usersRepository: UsersRepository, - private httpRequestService: HttpRequestService, private loggerService: LoggerService, private readonly utilityService: UtilityService, @@ -450,7 +447,6 @@ export class UrlPreviewService { fediverseCreator = fediverseCreator.substring(1); } - // const array = fediverseCreator.split('@'); const username = array[0].toLowerCase(); let host: string | null = array[1]; -- cgit v1.2.3-freya From 604c6dbc669bc4a2a3238a8c3f0f500d78dfa33e Mon Sep 17 00:00:00 2001 From: piuvas Date: Tue, 27 May 2025 00:14:41 -0300 Subject: add missing semicolons. --- packages/backend/src/server/web/UrlPreviewService.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'packages/backend/src/server/web') diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index 854f6b9847..b50e5d49fd 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -454,7 +454,7 @@ export class UrlPreviewService { host = null; } try { - const user = await this.remoteUserResolveService.resolveUser(username, host) + const user = await this.remoteUserResolveService.resolveUser(username, host); const attributionDomains = user.attributionDomains; if (attributionDomains.some(x => `.${url.host.toLowerCase()}`.endsWith(`.${x}`))) { @@ -463,10 +463,10 @@ export class UrlPreviewService { username: fediverseCreator, avatarUrl: user.avatarUrl ?? '', avatarBlurhash: user.avatarBlurhash ?? '', - } + }; } } catch { - console.warn('user not found: ' + fediverseCreator) + console.warn('user not found: ' + fediverseCreator); } } -- cgit v1.2.3-freya From 5545ddf9ddefa5620c58ea34b2e6fdf18fdac30a Mon Sep 17 00:00:00 2001 From: piuvas Date: Tue, 27 May 2025 13:25:06 -0300 Subject: requested changes. --- locales/index.d.ts | 4 +-- packages/backend/src/models/json-schema/user.ts | 2 +- .../backend/src/server/web/UrlPreviewService.ts | 18 +++++----- packages/frontend/src/components/MkUrlPreview.vue | 41 ++++++++++------------ packages/frontend/src/pages/settings/profile.vue | 2 -- sharkey-locales/en-US.yml | 2 +- sharkey-locales/pt-PT.yml | 2 +- 7 files changed, 32 insertions(+), 39 deletions(-) (limited to 'packages/backend/src/server/web') diff --git a/locales/index.d.ts b/locales/index.d.ts index 1070318fa2..f809613e7a 100644 --- a/locales/index.d.ts +++ b/locales/index.d.ts @@ -13138,9 +13138,9 @@ export interface Locale extends ILocale { */ "attributionDomainsDescription": string; /** - * Written by + * Written by {user} */ - "writtenBy": string; + "writtenBy": ParameterizedString<"user">; } declare const locales: { [lang: string]: Locale; diff --git a/packages/backend/src/models/json-schema/user.ts b/packages/backend/src/models/json-schema/user.ts index 9bfb57fc66..82d354cfd0 100644 --- a/packages/backend/src/models/json-schema/user.ts +++ b/packages/backend/src/models/json-schema/user.ts @@ -237,7 +237,7 @@ export const packedUserLiteSchema = { }, }, attributionDomains: { - type: 'object', + type: 'array', nullable: false, optional: false, additionalProperties: { type: 'string', diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index b50e5d49fd..ccf8fa342d 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -28,7 +28,7 @@ import { ApNoteService } from '@/core/activitypub/models/ApNoteService.js'; import { AuthenticateService, AuthenticationError } from '@/server/api/AuthenticateService.js'; import { SkRateLimiterService } from '@/server/SkRateLimiterService.js'; import { BucketRateLimit, Keyed, sendRateLimitHeaders } from '@/misc/rate-limit-utils.js'; -import type { MiLocalUser } from '@/models/User.js'; +import type { MiLocalUser, MiUser } from '@/models/User.js'; import { getIpHash } from '@/misc/get-ip-hash.js'; import { isRetryableError } from '@/misc/is-retryable-error.js'; import type { FastifyRequest, FastifyReply } from 'fastify'; @@ -36,10 +36,7 @@ import type { FastifyRequest, FastifyReply } from 'fastify'; export type LocalSummalyResult = SummalyResult & { haveNoteLocally?: boolean; linkAttribution?: { - name: string, - username: string, - avatarUrl: string, - avatarBlurhash: string, + user: MiUser, } }; @@ -448,6 +445,10 @@ export class UrlPreviewService { } const array = fediverseCreator.split('@'); + + // make sure we only have username@host. + if (array.length !== 2) return; + const username = array[0].toLowerCase(); let host: string | null = array[1]; if (host.toLowerCase() === this.config.host) { @@ -459,14 +460,11 @@ export class UrlPreviewService { const attributionDomains = user.attributionDomains; if (attributionDomains.some(x => `.${url.host.toLowerCase()}`.endsWith(`.${x}`))) { summary.linkAttribution = { - name: user.name ?? user.username, - username: fediverseCreator, - avatarUrl: user.avatarUrl ?? '', - avatarBlurhash: user.avatarBlurhash ?? '', + user: user, }; } } catch { - console.warn('user not found: ' + fediverseCreator); + this.logger.warn('user not found: ' + fediverseCreator); } } diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue index ca8f6848e5..0cba73ef05 100644 --- a/packages/frontend/src/components/MkUrlPreview.vue +++ b/packages/frontend/src/components/MkUrlPreview.vue @@ -65,13 +65,14 @@ SPDX-License-Identifier: AGPL-3.0-only - + + +