diff --git a/Cargo.lock b/Cargo.lock index b917b46..616c52b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -81,31 +81,6 @@ dependencies = [ "syn 1.0.109", ] -[[package]] -name = "ashpd" -version = "0.12.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "618a409b91d5265798a99e3d1d0b226911605e581c4e7255e83c1e397b172bce" -dependencies = [ - "async-fs", - "async-net", - "async-trait", - "enumflags2", - "futures-channel", - "futures-util", - "gdk4-wayland", - "glib", - "gtk4", - "rand 0.9.2", - "serde", - "serde_repr", - "url", - "wayland-backend", - "wayland-client", - "wayland-protocols", - "zbus", -] - [[package]] name = "asn1-rs" version = "0.7.1" @@ -194,17 +169,6 @@ dependencies = [ "slab", ] -[[package]] -name = "async-fs" -version = "2.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8034a681df4aed8b8edbd7fbe472401ecf009251c8b40556b304567052e294c5" -dependencies = [ - "async-lock", - "blocking", - "futures-lite", -] - [[package]] name = "async-global-executor" version = "2.4.1" @@ -249,17 +213,6 @@ dependencies = [ "pin-project-lite", ] -[[package]] -name = "async-net" -version = "2.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b948000fad4873c1c9339d60f2623323a0cfd3816e5181033c6a5cb68b2accf7" -dependencies = [ - "async-io", - "blocking", - "futures-lite", -] - [[package]] name = "async-process" version = "2.5.0" @@ -856,10 +809,10 @@ dependencies = [ name = "credentialsd-ui" version = "0.1.0" dependencies = [ - "ashpd", "async-std", "credentialsd-common", "futures-lite", + "gdk4-wayland", "gettext-rs", "gtk4", "qrcode", @@ -1086,27 +1039,12 @@ dependencies = [ "syn 2.0.114", ] -[[package]] -name = "dlib" -version = "0.5.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "330c60081dcc4c72131f8eb70510f1ac07223e5d4163db481a04a0befcffa412" -dependencies = [ - "libloading", -] - [[package]] name = "downcast" version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1435fa1053d8b2fbbe9be7e97eca7f33d37b28409959813daefc1446a14247f1" -[[package]] -name = "downcast-rs" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "75b325c5dbd37f80359721ad39aca5a29fb04c89279657cffdda8736d0c0b9d2" - [[package]] name = "dunce" version = "1.0.5" @@ -1275,15 +1213,6 @@ dependencies = [ "winreg", ] -[[package]] -name = "form_urlencoded" -version = "1.2.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "cb4cb245038516f5f85277875cdaa4f7d2c9a0fa0468de06ed190163b1581fcf" -dependencies = [ - "percent-encoding", -] - [[package]] name = "fragile" version = "2.0.1" @@ -1885,108 +1814,6 @@ version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" -[[package]] -name = "icu_collections" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "4c6b649701667bbe825c3b7e6388cb521c23d88644678e83c0c4d0a621a34b43" -dependencies = [ - "displaydoc", - "potential_utf", - "yoke", - "zerofrom", - "zerovec", -] - -[[package]] -name = "icu_locale_core" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "edba7861004dd3714265b4db54a3c390e880ab658fec5f7db895fae2046b5bb6" -dependencies = [ - "displaydoc", - "litemap", - "tinystr", - "writeable", - "zerovec", -] - -[[package]] -name = "icu_normalizer" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5f6c8828b67bf8908d82127b2054ea1b4427ff0230ee9141c54251934ab1b599" -dependencies = [ - "icu_collections", - "icu_normalizer_data", - "icu_properties", - "icu_provider", - "smallvec", - "zerovec", -] - -[[package]] -name = "icu_normalizer_data" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7aedcccd01fc5fe81e6b489c15b247b8b0690feb23304303a9e560f37efc560a" - -[[package]] -name = "icu_properties" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "020bfc02fe870ec3a66d93e677ccca0562506e5872c650f893269e08615d74ec" -dependencies = [ - "icu_collections", - "icu_locale_core", - "icu_properties_data", - "icu_provider", - "zerotrie", - "zerovec", -] - -[[package]] -name = "icu_properties_data" -version = "2.1.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "616c294cf8d725c6afcd8f55abc17c56464ef6211f9ed59cccffe534129c77af" - -[[package]] -name = "icu_provider" -version = "2.1.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85962cf0ce02e1e0a629cc34e7ca3e373ce20dda4c4d7294bbd0bf1fdb59e614" -dependencies = [ - "displaydoc", - "icu_locale_core", - "writeable", - "yoke", - "zerofrom", - "zerotrie", - "zerovec", -] - -[[package]] -name = "idna" -version = "1.1.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3b0875f23caa03898994f6ddc501886a45c7d3d62d04d2d90788d47be1b1e4de" -dependencies = [ - "idna_adapter", - "smallvec", - "utf8_iter", -] - -[[package]] -name = "idna_adapter" -version = "1.2.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3acae9609540aa318d1bc588455225fb2085b9ed0c4f6bd0d9d5bcd86f1a0344" -dependencies = [ - "icu_normalizer", - "icu_properties", -] - [[package]] name = "image" version = "0.25.9" @@ -2208,12 +2035,6 @@ version = "0.11.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "df1d3c3b53da64cf5760482273a98e575c651a67eec7f77df96b5b642de8f039" -[[package]] -name = "litemap" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6373607a59f0be73a39b6fe456b8192fcc3585f602af20751600e974dd455e77" - [[package]] name = "locale_config" version = "0.3.0" @@ -2641,12 +2462,6 @@ dependencies = [ "base64ct", ] -[[package]] -name = "percent-encoding" -version = "2.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9b4f627cb1b25917193a259e49bdad08f671f8d9708acfd5fe0a8c1455d87220" - [[package]] name = "pin-project-lite" version = "0.2.16" @@ -2723,15 +2538,6 @@ dependencies = [ "universal-hash", ] -[[package]] -name = "potential_utf" -version = "0.1.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b73949432f5e2a09657003c25bca5e19a0e9c84f8058ca374f49e0ebe605af77" -dependencies = [ - "zerovec", -] - [[package]] name = "powerfmt" version = "0.2.0" @@ -2829,15 +2635,6 @@ dependencies = [ "image", ] -[[package]] -name = "quick-xml" -version = "0.38.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b66c2058c55a409d601666cffe35f04333cf1013010882cec174a7467cd4e21c" -dependencies = [ - "memchr", -] - [[package]] name = "quote" version = "1.0.43" @@ -3084,12 +2881,6 @@ dependencies = [ "windows-sys 0.61.2", ] -[[package]] -name = "scoped-tls" -version = "1.0.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294" - [[package]] name = "scopeguard" version = "1.2.0" @@ -3564,16 +3355,6 @@ dependencies = [ "time-core", ] -[[package]] -name = "tinystr" -version = "0.8.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42d3e9c45c09de15d06dd8acf5f4e0e399e85927b7f00711024eb7ae10fa4869" -dependencies = [ - "displaydoc", - "zerovec", -] - [[package]] name = "tokio" version = "1.49.0" @@ -3820,31 +3601,12 @@ version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "8ecb6da28b8a351d773b68d5825ac39017e680750f980f3a1a85cd8dd28a47c1" -[[package]] -name = "url" -version = "2.5.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff67a8a4397373c3ef660812acab3268222035010ab8680ec4215f38ba3d0eed" -dependencies = [ - "form_urlencoded", - "idna", - "percent-encoding", - "serde", - "serde_derive", -] - [[package]] name = "utf-8" version = "0.7.6" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9" -[[package]] -name = "utf8_iter" -version = "1.0.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b6c140620e7ffbb22c2dee59cafe6084a59b5ffc27a8859a5f0d494b5d52b6be" - [[package]] name = "uuid" version = "1.19.0" @@ -3971,66 +3733,6 @@ dependencies = [ "unicode-ident", ] -[[package]] -name = "wayland-backend" -version = "0.3.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fee64194ccd96bf648f42a65a7e589547096dfa702f7cadef84347b66ad164f9" -dependencies = [ - "cc", - "downcast-rs", - "rustix", - "scoped-tls", - "smallvec", - "wayland-sys", -] - -[[package]] -name = "wayland-client" -version = "0.31.12" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b8e6faa537fbb6c186cb9f1d41f2f811a4120d1b57ec61f50da451a0c5122bec" -dependencies = [ - "bitflags 2.10.0", - "rustix", - "wayland-backend", - "wayland-scanner", -] - -[[package]] -name = "wayland-protocols" -version = "0.32.10" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baeda9ffbcfc8cd6ddaade385eaf2393bd2115a69523c735f12242353c3df4f3" -dependencies = [ - "bitflags 2.10.0", - "wayland-backend", - "wayland-client", - "wayland-scanner", -] - -[[package]] -name = "wayland-scanner" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5423e94b6a63e68e439803a3e153a9252d5ead12fd853334e2ad33997e3889e3" -dependencies = [ - "proc-macro2", - "quick-xml", - "quote", -] - -[[package]] -name = "wayland-sys" -version = "0.31.8" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1e6dbfc3ac5ef974c92a2235805cc0114033018ae1290a72e474aa8b28cbbdfd" -dependencies = [ - "dlib", - "log", - "pkg-config", -] - [[package]] name = "web-sys" version = "0.3.85" @@ -4445,12 +4147,6 @@ version = "0.51.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "d7249219f66ced02969388cf2bb044a09756a083d0fab1e566056b04d9fbcaa5" -[[package]] -name = "writeable" -version = "0.6.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9edde0db4769d2dc68579893f2306b26c6ecfbe0ef499b013d731b7b9247e0b9" - [[package]] name = "x509-parser" version = "0.17.0" @@ -4474,29 +4170,6 @@ version = "1.2.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b8aa498d22c9bbaf482329839bc5620c46be275a19a812e9a22a2b07529a642a" -[[package]] -name = "yoke" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "72d6e5c6afb84d73944e5cedb052c4680d5657337201555f9f2a16b7406d4954" -dependencies = [ - "stable_deref_trait", - "yoke-derive", - "zerofrom", -] - -[[package]] -name = "yoke-derive" -version = "0.8.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b659052874eb698efe5b9e8cf382204678a0086ebf46982b79d6ca3182927e5d" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", - "synstructure", -] - [[package]] name = "zbus" version = "5.13.1" @@ -4579,66 +4252,12 @@ dependencies = [ "syn 2.0.114", ] -[[package]] -name = "zerofrom" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "50cc42e0333e05660c3587f3bf9d0478688e15d870fab3346451ce7f8c9fbea5" -dependencies = [ - "zerofrom-derive", -] - -[[package]] -name = "zerofrom-derive" -version = "0.1.6" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d71e5d6e06ab090c67b5e44993ec16b72dcbaabc526db883a360057678b48502" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", - "synstructure", -] - [[package]] name = "zeroize" version = "1.8.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "b97154e67e32c85465826e8bcc1c59429aaaf107c1e4a9e53c8d8ccd5eff88d0" -[[package]] -name = "zerotrie" -version = "0.2.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "2a59c17a5562d507e4b54960e8569ebee33bee890c70aa3fe7b97e85a9fd7851" -dependencies = [ - "displaydoc", - "yoke", - "zerofrom", -] - -[[package]] -name = "zerovec" -version = "0.11.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6c28719294829477f525be0186d13efa9a3c602f7ec202ca9e353d310fb9a002" -dependencies = [ - "yoke", - "zerofrom", - "zerovec-derive", -] - -[[package]] -name = "zerovec-derive" -version = "0.11.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "eadce39539ca5cb3985590102671f2567e659fca9666581ad3411d59207951f3" -dependencies = [ - "proc-macro2", - "quote", - "syn 2.0.114", -] - [[package]] name = "zmij" version = "1.0.15" @@ -4654,7 +4273,6 @@ dependencies = [ "endi", "enumflags2", "serde", - "url", "winnow", "zvariant_derive", "zvariant_utils", diff --git a/credentialsd-ui/Cargo.toml b/credentialsd-ui/Cargo.toml index 9de9535..36d10c7 100644 --- a/credentialsd-ui/Cargo.toml +++ b/credentialsd-ui/Cargo.toml @@ -7,15 +7,15 @@ license = "LGPL-3.0-only" [features] default = ["wayland"] -wayland = ["ashpd/gtk4_wayland", "ashpd/wayland"] +wayland = ["gdk-wayland"] [dependencies] -ashpd = { version = "0.12.0", features = ["async-std", "backend"], default-features = false } async-std = { version = "1.13.1", features = ["unstable"] } credentialsd-common = { path = "../credentialsd-common" } futures-lite = "2.6.0" gettext-rs = { version = "0.7", features = ["gettext-system"] } gtk = { version = "0.10.3", package = "gtk4", features = ["v4_6"] } +gdk-wayland = { version = "0.10.3", package = "gdk4-wayland", optional = true } qrcode = "0.14.1" serde.workspace = true tracing.workspace = true diff --git a/credentialsd-ui/src/gui/mod.rs b/credentialsd-ui/src/gui/mod.rs index 8a17bbb..bd65aed 100644 --- a/credentialsd-ui/src/gui/mod.rs +++ b/credentialsd-ui/src/gui/mod.rs @@ -3,10 +3,9 @@ pub mod view_model; use std::thread; use std::{sync::Arc, thread::JoinHandle}; -use ashpd::WindowIdentifierType; use async_std::{channel::Receiver, sync::Mutex as AsyncMutex}; -use credentialsd_common::server::ViewRequest; +use credentialsd_common::server::{ViewRequest, WindowHandle}; use credentialsd_common::{client::FlowController, model::ViewUpdate}; use view_model::ViewEvent; @@ -28,13 +27,12 @@ fn run_gui( flow_controller: Arc>, request: ViewRequest, ) { - let parent_window: Option = - request.window_handle.as_ref().and_then(|h| { - h.to_string() - .parse() - .inspect_err(|err| tracing::warn!("Failed to parse parent window handle: {err}")) - .ok() - }); + let parent_window: Option = request.window_handle.as_ref().and_then(|h| { + h.to_string() + .try_into() + .inspect_err(|err| tracing::warn!("Failed to parse parent window handle: {err}")) + .ok() + }); let (tx_update, rx_update) = async_std::channel::unbounded::(); let (tx_event, rx_event) = async_std::channel::unbounded::(); diff --git a/credentialsd-ui/src/gui/view_model/gtk/application.rs b/credentialsd-ui/src/gui/view_model/gtk/application.rs index 9170315..b86cd82 100644 --- a/credentialsd-ui/src/gui/view_model/gtk/application.rs +++ b/credentialsd-ui/src/gui/view_model/gtk/application.rs @@ -1,5 +1,5 @@ -use ashpd::WindowIdentifierType; use async_std::channel::{Receiver, Sender}; +use credentialsd_common::server::WindowHandle; use tracing::{debug, info}; use gtk::prelude::*; @@ -14,7 +14,7 @@ mod imp { use crate::gui::view_model::gtk::ModelState; use super::*; - use ashpd::WindowIdentifierType; + use credentialsd_common::server::WindowHandle; use glib::{WeakRef, clone}; use std::{ cell::{OnceCell, RefCell}, @@ -25,7 +25,7 @@ mod imp { pub struct CredentialsUi { pub window: OnceCell>, - pub(super) parent_window: RefCell>, + pub(super) parent_window: RefCell>, pub(super) tx: RefCell>>, pub(super) rx: RefCell>>, } @@ -58,7 +58,7 @@ mod imp { let window = CredentialsUiWindow::new(&app, view_model); if let Some(parent_window) = self.parent_window.borrow().as_ref() { - parent_window.set_parent_of(&window); + _ = self.set_dialog_window(&window, parent_window); } let window2 = window.clone(); @@ -112,6 +112,53 @@ mod imp { } impl GtkApplicationImpl for CredentialsUi {} + impl CredentialsUi { + #[cfg(not(feature = "wayland"))] + fn set_dialog_window( + &self, + dialog_window: &CredentialsUiWindow, + parent_window: &WindowHandle, + ) -> Result<(), ()> { + tracing::warn!("Windowing system not supported"); + Err(()) + } + + #[cfg(feature = "wayland")] + fn set_dialog_window( + &self, + dialog_window: &CredentialsUiWindow, + parent_window: &WindowHandle, + ) -> Result<(), ()> { + let surface = match dialog_window.surface() { + Some(surface) => surface, + None => { + WidgetExt::realize(dialog_window); + dialog_window.surface().expect("surface to exist on window") + } + }; + dialog_window.set_modal(true); + + match parent_window { + WindowHandle::Wayland(handle) => { + use gdk_wayland::WaylandToplevel; + + let toplevel = surface.dynamic_cast::().map_err(|_| { + tracing::warn!( + "Failed to get toplevel from surface, not setting parent window" + ) + })?; + if !toplevel.set_transient_for_exported(handle) { + tracing::warn!(?parent_window, "Failed to set window handle as parent."); + } + Ok(()) + } + _ => { + tracing::warn!(?parent_window, "Unsupported window handle passed"); + Err(()) + } + } + } + } } glib::wrapper! { @@ -166,7 +213,7 @@ impl CredentialsUi { } pub(crate) fn new( - parent_window: Option, + parent_window: Option, tx: Sender, rx: Receiver, ) -> Self { diff --git a/credentialsd-ui/src/gui/view_model/gtk/mod.rs b/credentialsd-ui/src/gui/view_model/gtk/mod.rs index 0b64265..f82afcb 100644 --- a/credentialsd-ui/src/gui/view_model/gtk/mod.rs +++ b/credentialsd-ui/src/gui/view_model/gtk/mod.rs @@ -3,8 +3,8 @@ pub mod credential; pub mod device; mod window; -use ashpd::WindowIdentifierType; use async_std::channel::{Receiver, Sender}; +use credentialsd_common::server::WindowHandle; use gettextrs::{LocaleCategory, gettext, ngettext}; use glib::clone; use gtk::gdk::Texture; @@ -370,7 +370,7 @@ impl ViewModel { } pub fn start_gtk_app( - parent_window: Option, + parent_window: Option, tx_event: async_std::channel::Sender, rx_update: async_std::channel::Receiver, ) { diff --git a/demo_client/gui.py b/demo_client/gui.py index 2fdb3f4..f9e01a7 100755 --- a/demo_client/gui.py +++ b/demo_client/gui.py @@ -21,7 +21,7 @@ gi.require_version("Gtk", "4.0") gi.require_version("GdkWayland", "4.0") gi.require_version("Adw", "1") -from gi.repository import GdkWayland, Gio, GObject, Gtk, Adw # noqa: E402 +from gi.repository import GdkWayland, Gio, GObject, Gtk, Adw # noqa: E402,F401 import webauthn # noqa: E402 import util # noqa: E402 @@ -92,10 +92,14 @@ def on_register(self, *args): ) options = self._get_registration_options(user_handle, username) print(f"registration options: {options}") + def cb(user_id, toplevel, handle): cur = DB.cursor() - window_handle = "wayland:{handle}" - auth_data = create_passkey(INTERFACE, window_handle, self.origin, self.origin, options) + window_handle = f"wayland:{handle}" + print(window_handle) + auth_data = create_passkey( + INTERFACE, window_handle, self.origin, self.origin, options + ) if not user_id: cur.execute( "insert into users (username, user_handle, created_time) values (?, ?, ?)", @@ -106,7 +110,9 @@ def cb(user_id, toplevel, handle): "user_handle": user_handle, "cred_id": auth_data.cred_id, "aaguid": str(uuid.UUID(bytes=bytes(auth_data.aaguid))), - "sign_count": None if auth_data.sign_count == 0 else auth_data.sign_count, + "sign_count": None + if auth_data.sign_count == 0 + else auth_data.sign_count, "backup_eligible": 1 if "BE" in auth_data.flags else 0, "backup_state": 1 if "BS" in auth_data.flags else 0, "uv_initialized": 1 if "UV" in auth_data.flags else 0, @@ -124,6 +130,7 @@ def cb(user_id, toplevel, handle): print("Added passkey") DB.commit() cur.close() + toplevel = self.get_surface() toplevel.export_handle(functools.partial(cb, user_id)) cur.close() @@ -213,6 +220,7 @@ def retrieve_user_cred( return user_cred else: return None + def cb(toplevel, window_handle): print(f"received window handle: {window_handle}") window_handle = f"wayland:{window_handle}" @@ -302,7 +310,11 @@ def on_activate(self, app): def create_passkey( - interface: ProxyInterface, window_handle: str, origin: str, top_origin: str, options: dict + interface: ProxyInterface, + window_handle: str, + origin: str, + top_origin: str, + options: dict, ) -> webauthn.AuthenticatorData: is_same_origin = origin == top_origin print( @@ -334,7 +346,9 @@ def create_passkey( return webauthn.verify_create_response(response_json, options, origin) -def get_passkey(interface, window_handle, origin, top_origin, rp_id, cred_ids, cred_lookup_fn): +def get_passkey( + interface, window_handle, origin, top_origin, rp_id, cred_ids, cred_lookup_fn +): is_same_origin = origin == top_origin options = { "challenge": util.b64_encode(secrets.token_bytes(16)),