Make URL schemes dialog more ergonomic

This commit is contained in:
soleuniverse 2025-05-14 10:49:19 +02:00
parent 3d623c7e9e
commit df9b7c7df5
3 changed files with 26 additions and 4 deletions

View file

@ -89,6 +89,8 @@ preferences-url-scheme-prompt = Allowed { preferences-url-schemes } (space-separ
preferences-url-scheme-warning = Blocked attempt to open `{ $link }`, which may be a security issue.
If you trust the deck author and wish to proceed, you can add `{ $scheme }` to your allowed { preferences-url-schemes }.
preferences-url-scheme-allow-once = Allow once
preferences-url-scheme-always-allow = Always allow
## NO NEED TO TRANSLATE. This text is no longer used by Anki, and will be removed in the future.

View file

@ -750,3 +750,11 @@ create table if not exists profiles
def set_allowed_url_schemes(self, schemes: list[str]) -> None:
self.profile["allowedUrlSchemes"] = schemes
def always_allow_scheme(self, scheme: str) -> None:
schemes = self.allowed_url_schemes()
if scheme not in schemes:
schemes.append(scheme)
self.set_allowed_url_schemes(schemes)

View file

@ -5,7 +5,7 @@ from __future__ import annotations
from markdown import markdown
from aqt.qt import Qt, QUrl
from aqt.qt import QMessageBox, Qt, QUrl
from aqt.utils import ask_user_dialog, getText, openLink, tr
@ -32,6 +32,13 @@ def is_supported_scheme(url: QUrl) -> bool:
return scheme in allowed_schemes or scheme in ["http", "https"]
def always_allow_scheme(url: QUrl) -> None:
from aqt import mw
scheme = url.scheme().lower()
mw.pm.always_allow_scheme(scheme)
def open_url_if_supported_scheme(url: QUrl) -> None:
from aqt import mw
@ -41,7 +48,10 @@ def open_url_if_supported_scheme(url: QUrl) -> None:
def on_button(idx: int) -> None:
if idx == 0:
show_url_schemes_dialog()
openLink(url)
elif idx == 1:
always_allow_scheme(url)
openLink(url)
msg = markdown(
tr.preferences_url_scheme_warning(link=url.toString(), scheme=url.scheme())
@ -49,10 +59,12 @@ def open_url_if_supported_scheme(url: QUrl) -> None:
ask_user_dialog(
msg,
buttons=[
tr.actions_with_ellipsis(action=tr.preferences_url_schemes()),
tr.actions_close(),
tr.preferences_url_scheme_allow_once(),
tr.preferences_url_scheme_always_allow(),
(tr.actions_cancel(), QMessageBox.ButtonRole.RejectRole),
],
parent=mw,
callback=on_button,
textFormat=Qt.TextFormat.RichText,
default_button=0,
)