summaryrefslogtreecommitdiff
path: root/packages/frontend/src/scripts
diff options
context:
space:
mode:
authorPrivateGER <privateger@privateger.me>2024-10-06 23:13:10 +0200
committerPrivateGER <privateger@privateger.me>2024-10-06 23:13:10 +0200
commitfadae347ffd52a3610ef2e6ce160ade32d3dac31 (patch)
tree2731c25215245ba6c9cf4b8738f6868cf33afb78 /packages/frontend/src/scripts
parentMove text into translation files (diff)
parentmerge: Add option to reject reports from an instance (Resolves #579, #715, #7... (diff)
downloadsharkey-fadae347ffd52a3610ef2e6ce160ade32d3dac31.tar.gz
sharkey-fadae347ffd52a3610ef2e6ce160ade32d3dac31.tar.bz2
sharkey-fadae347ffd52a3610ef2e6ce160ade32d3dac31.zip
Merge branch 'develop' of https://activitypub.software/TransFem-org/Sharkey into feat/instance-admin-ui
Diffstat (limited to 'packages/frontend/src/scripts')
-rw-r--r--packages/frontend/src/scripts/warning-external-website.ts51
1 files changed, 51 insertions, 0 deletions
diff --git a/packages/frontend/src/scripts/warning-external-website.ts b/packages/frontend/src/scripts/warning-external-website.ts
new file mode 100644
index 0000000000..5ef003cb01
--- /dev/null
+++ b/packages/frontend/src/scripts/warning-external-website.ts
@@ -0,0 +1,51 @@
+/*
+ * SPDX-FileCopyrightText: syuilo and misskey-project
+ * SPDX-License-Identifier: AGPL-3.0-only
+ */
+
+import { instance } from '@/instance.js';
+import { defaultStore } from '@/store.js';
+import * as os from '@/os.js';
+import MkUrlWarningDialog from '@/components/MkUrlWarningDialog.vue';
+
+const extractDomain = /^(https?:\/\/|\/\/)?([^@/\s]+@)?(www\.)?([^:/\s]+)/i;
+const isRegExp = /^\/(.+)\/(.*)$/;
+
+export async function warningExternalWebsite(url: string) {
+ const domain = extractDomain.exec(url)?.[4];
+
+ if (!domain) return false;
+
+ const isTrustedByInstance = instance.trustedLinkUrlPatterns.some(expression => {
+ const r = isRegExp.exec(expression);
+
+ if (r) {
+ return new RegExp(r[1], r[2]).test(url);
+ } else if (expression.includes(' ')) {
+ return expression.split(' ').every(keyword => url.includes(keyword));
+ } else {
+ return domain.endsWith(expression);
+ }
+ });
+
+ const isTrustedByUser = defaultStore.reactiveState.trustedDomains.value.includes(domain);
+
+ if (!isTrustedByInstance && !isTrustedByUser) {
+ const confirm = await new Promise<{ canceled: boolean }>(resolve => {
+ const { dispose } = os.popup(MkUrlWarningDialog, {
+ url,
+ }, {
+ done: result => {
+ resolve(result ?? { canceled: true });
+ },
+ closed: () => dispose(),
+ });
+ });
+
+ if (confirm.canceled) return false;
+
+ return window.open(url, '_blank', 'nofollow noopener popup=false');
+ }
+
+ return window.open(url, '_blank', 'nofollow noopener popup=false');
+}