diff options
| author | piuvas <mail@piuvas.net> | 2025-05-27 17:12:02 -0300 |
|---|---|---|
| committer | piuvas <mail@piuvas.net> | 2025-05-27 17:12:02 -0300 |
| commit | 56db26f236a5a4fcf937f10019a0ce14c0ffc057 (patch) | |
| tree | 680038fe5217f950d941d26fbce6fbdcaab01c39 | |
| parent | fix lowecasing of muted instances. (diff) | |
| download | sharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.tar.gz sharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.tar.bz2 sharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.zip | |
some requested changes to linkAttribution.
3 files changed, 26 insertions, 29 deletions
diff --git a/packages/backend/src/server/web/UrlPreviewService.ts b/packages/backend/src/server/web/UrlPreviewService.ts index ccf8fa342d..2a300782c6 100644 --- a/packages/backend/src/server/web/UrlPreviewService.ts +++ b/packages/backend/src/server/web/UrlPreviewService.ts @@ -28,15 +28,16 @@ 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, MiUser } from '@/models/User.js'; +import type { MiLocalUser } from '@/models/User.js'; import { getIpHash } from '@/misc/get-ip-hash.js'; import { isRetryableError } from '@/misc/is-retryable-error.js'; +import * as Acct from '@/misc/acct.js'; import type { FastifyRequest, FastifyReply } from 'fastify'; export type LocalSummalyResult = SummalyResult & { haveNoteLocally?: boolean; linkAttribution?: { - user: MiUser, + userId: string, } }; @@ -435,36 +436,25 @@ export class UrlPreviewService { private async validateLinkAttribution(summary: LocalSummalyResult) { if (!summary.fediverseCreator) return; + if (!URL.canParse(summary.url)) 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('@'); - - // 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) { - host = null; + const acct = Acct.parse(summary.fediverseCreator); + if (acct.host?.toLowerCase() === this.config.host) { + acct.host = null; } try { - const user = await this.remoteUserResolveService.resolveUser(username, host); + const user = await this.remoteUserResolveService.resolveUser(acct.username, acct.host); const attributionDomains = user.attributionDomains; - if (attributionDomains.some(x => `.${url.host.toLowerCase()}`.endsWith(`.${x}`))) { + if (attributionDomains.some(x => `.${url?.host.toLowerCase()}`.endsWith(`.${x}`))) { summary.linkAttribution = { - user: user, + userId: user.id, }; } } catch { - this.logger.warn('user not found: ' + fediverseCreator); + this.logger.debug('User not found: ' + summary.fediverseCreator); } } diff --git a/packages/frontend/src/components/MkUrlPreview.vue b/packages/frontend/src/components/MkUrlPreview.vue index 0cba73ef05..4948da2f75 100644 --- a/packages/frontend/src/components/MkUrlPreview.vue +++ b/packages/frontend/src/components/MkUrlPreview.vue @@ -65,14 +65,17 @@ SPDX-License-Identifier: AGPL-3.0-only </footer> </article> </component> - <I18n v-if="linkAttribution" :src="i18n.ts.writtenBy" :class="$style.linkAttribution" tag="p"> + + <I18n v-if="attributionUser" :src="i18n.ts.writtenBy" :class="$style.linkAttribution" tag="p"> <template #user> - <MkA v-user-preview="linkAttribution.user.id" :to="userPage(linkAttribution.user)"> - <MkAvatar :class="$style.linkAttributionIcon" :user="linkAttribution.user"/> - <MkUserName :user="linkAttribution.user" style="color: var(--MI_THEME-accent)"/> + <MkA v-user-preview="attributionUser.id" :to="userPage(attributionUser)"> + <MkAvatar :class="$style.linkAttributionIcon" :user="attributionUser"/> + <MkUserName :user="attributionUser" style="color: var(--MI_THEME-accent)"/> </MkA> </template> </I18n> + <p v-else-if="linkAttribution" :class="$style.linkAttributionIcon"><MkEllipsis/></p> + <template v-if="showActions"> <div v-if="tweetId" :class="$style.action"> <MkButton :small="true" inline @click="tweetExpanded = true"> @@ -107,7 +110,6 @@ import { i18n } from '@/i18n.js'; import * as os from '@/os.js'; import { deviceKind } from '@/utility/device-kind.js'; import MkButton from '@/components/MkButton.vue'; -import MkImgWithBlurhash from '@/components/MkImgWithBlurhash.vue'; import { transformPlayerUrl } from '@/utility/player-url-transform.js'; import { store } from '@/store.js'; import { prefer } from '@/preferences.js'; @@ -157,8 +159,9 @@ const player = ref<SummalyResult['player']>({ allow: [], }); const linkAttribution = ref<{ - user: Misskey.entities.User, + userId: string, } | null>(null); +const attributionUser = ref<Misskey.entities.User | null>(null); const playerEnabled = ref(false); const tweetId = ref<string | null>(null); const tweetExpanded = ref(props.detail); @@ -237,7 +240,7 @@ function refresh(withFetch = false) { .then(async (info: SummalyResult & { haveNoteLocally?: boolean, linkAttribution?: { - user: Misskey.entities.User + userId: string, } } | null) => { unknownUrl.value = info == null; @@ -255,6 +258,10 @@ function refresh(withFetch = false) { sensitive.value = info?.sensitive ?? false; activityPub.value = info?.activityPub ?? null; linkAttribution.value = info?.linkAttribution ?? null; + if (linkAttribution.value) { + misskeyApi('users/show', { userId: linkAttribution.value.userId }) + .then(u => attributionUser.value = u); + } theNote.value = null; if (info?.haveNoteLocally) { diff --git a/packages/frontend/src/pages/settings/attribution-domains-setting.vue b/packages/frontend/src/pages/settings/attribution-domains-setting.vue index 245ab8fe74..59922a4e0f 100644 --- a/packages/frontend/src/pages/settings/attribution-domains-setting.vue +++ b/packages/frontend/src/pages/settings/attribution-domains-setting.vue @@ -38,7 +38,7 @@ const autochange = ref(false); const tutorialTag = '`<meta name="fediverse:creator" content="' + $i.username + '@' + toUnicode(hostRaw) + '" />`'; async function save() { - let domains = attributionDomains.value + const domains = attributionDomains.value .trim().split('\n') .map(el => el.trim().toLowerCase()) .filter(el => el); |