X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=src%2Fmoonshot-identity-management-view.vala;h=6620ac041abc7d5e0588de21fd386b29dd07c639;hb=e32b9690270bbb4c4152ce9672db5d11a81f98e1;hp=b7cb97280b50d4e1ca00e1ea1208b936191ccc90;hpb=08086626e9cacb32a9f1bf4ed3b16af198e368e0;p=moonshot-ui.git diff --git a/src/moonshot-identity-management-view.vala b/src/moonshot-identity-management-view.vala index b7cb972..6620ac0 100644 --- a/src/moonshot-identity-management-view.vala +++ b/src/moonshot-identity-management-view.vala @@ -60,6 +60,8 @@ public class IdentityManagerView : Window { public GLib.Queue request_queue; + internal CheckButton remember_identity_binding = null; + private enum Columns { IDCARD_COL, @@ -149,7 +151,7 @@ public class IdentityManagerView : Window { return true; } - if (id_card.services.length > 0) + if (id_card.services.size > 0) { foreach (string service in id_card.services) { @@ -215,7 +217,6 @@ public class IdentityManagerView : Window { current_idcard_nai = custom_vbox.current_idcard.id_card.nai; custom_vbox.current_idcard = null; } - var children = this.custom_vbox.get_children(); custom_vbox.clear(); this.listmodel->clear(); @@ -225,6 +226,7 @@ public class IdentityManagerView : Window { } foreach (IdCard id_card in card_list) { + logger.trace(@"load_id_cards: Adding card with display name '$(id_card.display_name)'"); add_id_card_data(id_card); IdCardWidget id_card_widget = add_id_card_widget(id_card); if (id_card_widget.id_card.nai == current_idcard_nai) { @@ -241,7 +243,8 @@ public class IdentityManagerView : Window { id_card.username = dialog.username; id_card.password = dialog.password; id_card.store_password = dialog.store_password; - id_card.services = dialog.get_services(); + + id_card.update_services_from_list(dialog.get_services()); return id_card; } @@ -287,6 +290,7 @@ public class IdentityManagerView : Window { var id_card_widget = new IdCardWidget(id_card); this.custom_vbox.add_id_card_widget(id_card_widget); id_card_widget.expanded.connect(this.widget_selected_cb); + id_card_widget.collapsed.connect(this.widget_unselected_cb); return id_card_widget; } @@ -300,6 +304,15 @@ public class IdentityManagerView : Window { this.send_button.set_sensitive(true); } + private void widget_unselected_cb(IdCardWidget id_card_widget) + { + this.remove_button.set_sensitive(false); + this.edit_button.set_sensitive(false); + this.custom_vbox.receive_collapsed_event(id_card_widget); + + this.send_button.set_sensitive(false); + } + public bool add_identity(IdCard id_card, bool force_flat_file_store) { #if OS_MACOS @@ -311,8 +324,11 @@ public class IdentityManagerView : Window { #else Gtk.MessageDialog dialog; IdCard? prev_id = identities_manager.find_id_card(id_card.nai, force_flat_file_store); + logger.trace("add_identity(flat=%s, card='%s'): find_id_card returned %s" + .printf(force_flat_file_store.to_string(), id_card.display_name, (prev_id != null ? "non-null" : "null"))); if (prev_id!=null) { int flags = prev_id.Compare(id_card); + logger.trace("add_identity: compare returned " + flags.to_string()); if (flags == 0) { return false; // no changes, no need to update } else if ((flags & (1 << IdCard.DiffFlags.DISPLAY_NAME)) != 0) { @@ -406,7 +422,6 @@ public class IdentityManagerView : Window { TreeIter iter; IdCard id_card; - var children = this.custom_vbox.get_children(); this.custom_vbox.clear(); if (filter.get_iter_first(out iter)) @@ -426,28 +441,21 @@ public class IdentityManagerView : Window { { var id_card = id_card_widget.id_card; - var dialog = new MessageDialog(this, - DialogFlags.DESTROY_WITH_PARENT, - MessageType.QUESTION, - Gtk.ButtonsType.YES_NO, - _("Are you sure you want to delete %s ID Card?"), id_card.issuer); - var result = dialog.run(); - switch (result) { - case ResponseType.YES: + bool remove = WarningDialog.confirm(this, + Markup.printf_escaped( + "You are about to remove the identity '%s'.", + id_card.display_name) + + "\n\nAre you sure you want to do this?", + "delete_idcard"); + if (remove) remove_identity(id_card_widget); - break; - default: - break; - } - dialog.destroy(); } private void set_prompting_service(string service) { clear_selection_prompts(); - var prompting_service = new Label(_("")); - prompting_service.set_label( _("Identity requested for service:\n%s").printf(service)); + var prompting_service = new Label(_("Identity requested for service:\n%s").printf(service)); prompting_service.set_line_wrap(true); // left-align @@ -458,6 +466,7 @@ public class IdentityManagerView : Window { this.service_prompt_vbox.pack_start(prompting_service, false, false, 12); this.service_prompt_vbox.pack_start(selection_prompt, false, false, 2); + this.service_prompt_vbox.show_all(); } private void clear_selection_prompts() @@ -478,6 +487,7 @@ public class IdentityManagerView : Window { filter.refilter(); redraw_id_card_widgets(); set_prompting_service(request.service); + remember_identity_binding.show(); make_visible(); } this.request_queue.push_tail(request); @@ -500,10 +510,11 @@ public class IdentityManagerView : Window { public IdCard check_add_password(IdCard identity, IdentityRequest request, IdentityManagerModel model) { + logger.trace(@"check_add_password"); IdCard retval = identity; bool idcard_has_pw = (identity.password != null) && (identity.password != ""); bool request_has_pw = (request.password != null) && (request.password != ""); - if ((!idcard_has_pw) && (!identity.IsNoIdentity())) { + if ((!idcard_has_pw) && (!identity.is_no_identity())) { if (request_has_pw) { identity.password = request.password; retval = model.update_card(identity); @@ -531,12 +542,19 @@ public class IdentityManagerView : Window { private void send_identity_cb(IdCard id) { - IdCard identity = id; return_if_fail(request_queue.length > 0); - candidates = null; + if (!check_and_confirm_trust_anchor(id)) { + // Allow user to pick again + return; + } + var request = this.request_queue.pop_head(); - identity = check_add_password(identity, request, identities_manager); + var identity = check_add_password(id, request, identities_manager); + send_button.set_sensitive(false); + + candidates = null; + if (this.request_queue.is_empty()) { candidates = null; @@ -556,12 +574,43 @@ public class IdentityManagerView : Window { filter.refilter(); redraw_id_card_widgets(); - if ((identity != null) && (!identity.IsNoIdentity())) + if ((identity != null) && (!identity.is_no_identity())) parent_app.default_id_card = identity; - request.return_identity(identity); + request.return_identity(identity, remember_identity_binding.active); + + remember_identity_binding.active = false; + remember_identity_binding.hide(); + } + + private bool check_and_confirm_trust_anchor(IdCard id) + { + if (!id.trust_anchor.is_empty() && id.trust_anchor.get_anchor_type() == TrustAnchor.TYPE_ENTERPRISE) { + if (get_string_setting("TrustAnchors", id.nai) != id.trust_anchor.server_cert) { + + bool ret = false; + int result = ResponseType.CANCEL; + var dialog = new TrustAnchorDialog(id, this); + while (!dialog.complete) + result = dialog.run(); + + switch (result) { + case ResponseType.OK: + set_string_setting("TrustAnchors", id.nai, id.trust_anchor.server_cert); + ret = true; + break; + default: + break; + } + + dialog.destroy(); + return ret; + } + } + return true; } + // private void label_make_bold(Label label) // { // var font_desc = new Pango.FontDescription(); @@ -755,7 +804,7 @@ SUCH DAMAGE. remove_button.clicked.connect((w) => {remove_identity_cb(custom_vbox.current_idcard);}); remove_button.set_sensitive(false); - send_button = new Button.with_label(_("Send")); + this.send_button = new Button.with_label(_("Send")); send_button.clicked.connect((w) => {send_identity_cb(custom_vbox.current_idcard.id_card);}); // send_button.set_visible(false); send_button.set_sensitive(false); @@ -769,15 +818,20 @@ SUCH DAMAGE. vbox_right.pack_start(send_button, false, false, 24); id_and_button_box.pack_start(vbox_right, false, false, 0); + var main_vbox = new VBox(false, 0); + + // Note: This places a border above the menubar. Is that what we want? main_vbox.set_border_width(12); #if OS_MACOS // hide the File | Quit menu item which is now on the Mac Menu - Gtk.Widget quit_item = this.ui_manager.get_widget("/MenuBar/FileMenu/Quit"); - quit_item.hide(); +// Gtk.Widget quit_item = this.ui_manager.get_widget("/MenuBar/FileMenu/Quit"); +// quit_item.hide(); Gtk.MenuShell menushell = this.ui_manager.get_widget("/MenuBar") as Gtk.MenuShell; + menushell.modify_bg(StateType.NORMAL, white); + osxApp.set_menu_bar(menushell); osxApp.set_use_quartz_accelerators(true); osxApp.sync_menu_bar(); @@ -785,10 +839,19 @@ SUCH DAMAGE. #else var menubar = this.ui_manager.get_widget("/MenuBar"); main_vbox.pack_start(menubar, false, false, 0); + menubar.modify_bg(StateType.NORMAL, white); #endif main_vbox.pack_start(vbox_left, true, true, 0); + + remember_identity_binding = new CheckButton.with_label(_("Remember my identity choice for this service")); + remember_identity_binding.active = false; + main_vbox.pack_start(remember_identity_binding, false, false, 6); + add(main_vbox); main_vbox.show_all(); + + if (this.request_queue.length == 0) + remember_identity_binding.hide(); } private void set_atk_name_description(Widget widget, string name, string description) @@ -804,12 +867,4 @@ SUCH DAMAGE. this.destroy.connect(Gtk.main_quit); this.identities_manager.card_list_changed.connect(this.on_card_list_changed); } - - private static void set_atk_relation(Widget widget, Widget target_widget, Atk.RelationType relationship) - { - var atk_widget = widget.get_accessible(); - var atk_target_widget = target_widget.get_accessible(); - - atk_widget.add_relationship(relationship, atk_target_widget); - } }