summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorpiuvas <mail@piuvas.net>2025-05-27 17:12:02 -0300
committerpiuvas <mail@piuvas.net>2025-05-27 17:12:02 -0300
commit56db26f236a5a4fcf937f10019a0ce14c0ffc057 (patch)
tree680038fe5217f950d941d26fbce6fbdcaab01c39
parentfix lowecasing of muted instances. (diff)
downloadsharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.tar.gz
sharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.tar.bz2
sharkey-56db26f236a5a4fcf937f10019a0ce14c0ffc057.zip
some requested changes to linkAttribution.
-rw-r--r--packages/backend/src/server/web/UrlPreviewService.ts32
-rw-r--r--packages/frontend/src/components/MkUrlPreview.vue21
-rw-r--r--packages/frontend/src/pages/settings/attribution-domains-setting.vue2
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);