1
1
mirror of https://github.com/kokonect-link/cherrypick synced 2025-01-21 17:23:56 +09:00

enhance(frontend): 外部サイトへのリンクは移動の警告の条件の調整 (MisskeyIO#564)

(cherry picked from commit 65978cbe61b7e86e25795948ee2ef34bdf6f846c)
This commit is contained in:
まっちゃとーにゅ 2024-03-22 19:05:05 +09:00 committed by kakkokari-gtyih
parent a4cc88897b
commit e010342c0e
2 changed files with 7 additions and 6 deletions

View File

@ -1200,7 +1200,7 @@ signupPendingError: "メールアドレスの確認中に問題が発生しま
cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。" cwNotationRequired: "「内容を隠す」がオンの場合は注釈の記述が必要です。"
doReaction: "リアクションする" doReaction: "リアクションする"
wellKnownWebsites: "よく知られたウェブサイト" wellKnownWebsites: "よく知られたウェブサイト"
wellKnownWebsitesDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。スラッシュで囲むと正規表現になります。一致した場合、外部サイトへのリダイレクトの警告を省略させることができます。" wellKnownWebsitesDescription: "スペースで区切るとAND指定になり、改行で区切るとOR指定になります。スラッシュで囲むと正規表現になります。ドメイン名だけ書くと後方一致になります。一致した場合、外部サイトへのリダイレクトの警告を省略させることができます。"
code: "コード" code: "コード"
reloadRequiredToApplySettings: "設定の反映にはリロードが必要です。" reloadRequiredToApplySettings: "設定の反映にはリロードが必要です。"
remainingN: "残り: {n}" remainingN: "残り: {n}"

View File

@ -9,19 +9,20 @@ import { defaultStore } from '@/store.js';
import * as os from '@/os.js'; import * as os from '@/os.js';
import MkUrlWarningDialog from '@/components/MkUrlWarningDialog.vue'; import MkUrlWarningDialog from '@/components/MkUrlWarningDialog.vue';
const extractDomain = /^(https?:\/\/|\/\/)?([^@/\s]+@)?(www\.)?([^:/\s]+)/i;
const isRegExp = /^\/(.+)\/(.*)$/; const isRegExp = /^\/(.+)\/(.*)$/;
export async function warningExternalWebsite(ev: MouseEvent, url: string) { export async function warningExternalWebsite(ev: MouseEvent, url: string) {
const _url = new URL(url); const domain = extractDomain.exec(url)?.[4];
const self = !domain || url.startsWith(local);
const self = url.startsWith(local);
const isWellKnownWebsite = self || instance.wellKnownWebsites.some(expression => { const isWellKnownWebsite = self || instance.wellKnownWebsites.some(expression => {
const r = isRegExp.exec(expression); const r = isRegExp.exec(expression);
if (r) { if (r) {
return new RegExp(r[1], r[2]).test(url); return new RegExp(r[1], r[2]).test(url);
} else return expression.split(' ').every(keyword => url.includes(keyword)); } else if (expression.includes(' ')) return expression.split(' ').every(keyword => url.includes(keyword));
else return domain.endsWith(expression);
}); });
const isTrustedByUser = defaultStore.reactiveState.trustedDomains.value.includes(_url.hostname); const isTrustedByUser = defaultStore.reactiveState.trustedDomains.value.includes(domain);
if (!self && !isWellKnownWebsite && !isTrustedByUser) { if (!self && !isWellKnownWebsite && !isTrustedByUser) {
ev.preventDefault(); ev.preventDefault();