diff --git a/gui/src/policy_page.rs b/gui/src/policy_page.rs index c16c545..968a6e5 100644 --- a/gui/src/policy_page.rs +++ b/gui/src/policy_page.rs @@ -141,6 +141,53 @@ impl PolicyPage { } pref_page.add(&group); + // Advanced expander — non-master stacks the daemon discovered. Toggling + // any of these triggers polkit at SetPolicy time; no special GUI plumbing. + let advanced_group = adw::PreferencesGroup::new(); + let expander = adw::ExpanderRow::builder() + .title("Advanced") + .subtitle("Per-stack overrides for any PAM stack the daemon knows about.") + .build(); + + let mut others: Vec<&String> = current + .stacks + .keys() + .filter(|k| !MASTER_STACKS.contains(&k.as_str())) + .collect(); + others.sort(); + for stack_name in others { + let mode = current + .stacks + .get(stack_name) + .map(|s| s.mode) + .unwrap_or(Mode::Disabled); + let labels: Vec<&str> = MODE_LABELS.iter().map(|(l, _)| *l).collect(); + let model = gtk::StringList::new(&labels); + let combo = adw::ComboRow::builder() + .title(stack_name.as_str()) + .model(&model) + .selected(mode_to_combo_index(mode)) + .build(); + let me = self.clone(); + let s = stack_name.clone(); + combo.connect_selected_notify(move |c| { + let new_mode = combo_index_to_mode(c.selected()); + me.working + .borrow_mut() + .stacks + .entry(s.clone()) + .or_insert(StackPolicy { + mode: Mode::Disabled, + methods: vec![Method::Fido2], + }) + .mode = new_mode; + }); + expander.add_row(&combo); + } + + advanced_group.add(&expander); + pref_page.add(&advanced_group); + // Apply button row at the bottom. let apply_group = adw::PreferencesGroup::new(); let apply = adw::ActionRow::builder()