[pdm-devel] [PATCH yew-comp 5/5] utils/login panel: move openid redirection authorization helper to utils
Shannon Sterz
s.sterz at proxmox.com
Tue Oct 14 15:30:41 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>
---
note: this is mostly important for users of this crate that don't show
the login component right away (for example, because they want to render
a consent screen first).
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 8926a32..f2ce93f 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 79b7ad7..1796a0b 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