[pdm-devel] [PATCH yew-comp v2 5/5] utils/login panel: move openid redirection authorization helper to utils

Shannon Sterz s.sterz at proxmox.com
Fri Oct 17 15:58:00 CEST 2025


this allows users of this crate to check whether url parameters for an
openid authorization request are present. allowing for minimal user
interaction for completing the login flow.

Signed-off-by: Shannon Sterz <s.sterz at proxmox.com>
---
 src/login_panel.rs | 34 ++++------------------------------
 src/utils.rs       | 32 ++++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 30 deletions(-)

diff --git a/src/login_panel.rs b/src/login_panel.rs
index 9d1d5d6..75721f5 100644
--- a/src/login_panel.rs
+++ b/src/login_panel.rs
@@ -18,6 +18,7 @@ use pwt::{prelude::*, AsyncPool};
 use proxmox_login::{Authentication, SecondFactorChallenge, Ticket, TicketResult};
 
 use crate::common_api_types::BasicRealmInfo;
+use crate::utils;
 use crate::{tfa::TfaDialog, RealmSelector};
 
 use pwt_macros::builder;
@@ -162,35 +163,6 @@ impl ProxmoxLoginPanel {
         });
     }
 
-    fn openid_redirection_authorization(ctx: &Context<Self>) {
-        let Ok(query_string) = gloo_utils::window().location().search() else {
-            return;
-        };
-
-        let mut auth = HashMap::new();
-        let query_parameters = query_string.split('&');
-
-        for param in query_parameters {
-            let mut key_value = param.split('=');
-
-            match (key_value.next(), key_value.next()) {
-                (Some("?code") | Some("code"), Some(value)) => {
-                    auth.insert("code".to_string(), value.to_string());
-                }
-                (Some("?state") | Some("state"), Some(value)) => {
-                    if let Ok(decoded) = percent_decode(value.as_bytes()).decode_utf8() {
-                        auth.insert("state".to_string(), decoded.to_string());
-                    }
-                }
-                _ => continue,
-            };
-        }
-
-        if auth.contains_key("code") && auth.contains_key("state") {
-            ctx.link().send_message(Msg::OpenIDAuthorization(auth));
-        }
-    }
-
     fn openid_login(&self, ctx: &Context<Self>, mut auth: HashMap<String, String>) {
         let link = ctx.link().clone();
         let save_username = ctx.props().mobile || *self.save_username;
@@ -521,7 +493,9 @@ impl Component for ProxmoxLoginPanel {
         let save_username = PersistentState::<bool>::new("ProxmoxLoginPanelSaveUsername");
         let last_username = PersistentState::<String>::new("ProxmoxLoginPanelUsername");
 
-        Self::openid_redirection_authorization(ctx);
+        if let Some(auth) = utils::openid_redirection_authorization() {
+            ctx.link().send_message(Msg::OpenIDAuthorization(auth));
+        }
 
         Self {
             form_ctx,
diff --git a/src/utils.rs b/src/utils.rs
index 3dfc696..f1ea984 100644
--- a/src/utils.rs
+++ b/src/utils.rs
@@ -2,6 +2,7 @@ use std::collections::HashMap;
 use std::fmt::Display;
 use std::sync::Mutex;
 
+use percent_encoding::percent_decode;
 use serde_json::Value;
 use wasm_bindgen::JsCast;
 use yew::prelude::*;
@@ -462,3 +463,34 @@ pub fn register_pve_tasks() {
     register_task_description("zfscreate", (tr!("ZFS Storage"), tr!("Create")));
     register_task_description("zfsremove", ("ZFS Pool", tr!("Remove")));
 }
+
+pub fn openid_redirection_authorization() -> Option<HashMap<String, String>> {
+    let Ok(query_string) = gloo_utils::window().location().search() else {
+        return None;
+    };
+
+    let mut auth = HashMap::new();
+    let query_parameters = query_string.split('&');
+
+    for param in query_parameters {
+        let mut key_value = param.split('=');
+
+        match (key_value.next(), key_value.next()) {
+            (Some("?code") | Some("code"), Some(value)) => {
+                auth.insert("code".to_string(), value.to_string());
+            }
+            (Some("?state") | Some("state"), Some(value)) => {
+                if let Ok(decoded) = percent_decode(value.as_bytes()).decode_utf8() {
+                    auth.insert("state".to_string(), decoded.to_string());
+                }
+            }
+            _ => continue,
+        };
+    }
+
+    if auth.contains_key("code") && auth.contains_key("state") {
+        return Some(auth);
+    }
+
+    None
+}
-- 
2.47.3





More information about the pdm-devel mailing list