From 17d69131138577849d9cb170fd3ddb0da3ccb8b3 Mon Sep 17 00:00:00 2001 From: Kevin Wasserman Date: Mon, 4 Nov 2013 08:56:26 -0500 Subject: [PATCH] Modify identity selection logic / fix bugs If the request provides an password, always use it. If the request provides an nai, but no corresponding identity exist, create a temporary identity which is never stored to handle the response. --- src/moonshot-id.vala | 1 + src/moonshot-identities-manager.vala | 8 +++++ src/moonshot-identity-management-view.vala | 37 ++++++++++++--------- src/moonshot-identity-manager-app.vala | 53 ++++++++++-------------------- src/moonshot-server.vala | 5 ++- 5 files changed, 53 insertions(+), 51 deletions(-) diff --git a/src/moonshot-id.vala b/src/moonshot-id.vala index 3198353..8f90e8d 100644 --- a/src/moonshot-id.vala +++ b/src/moonshot-id.vala @@ -44,6 +44,7 @@ public class IdCard : Object public Rule[] rules {get; set; default = {};} public string[] services { get; set; default = {}; } + public bool temporary {get; set; default = false; } public TrustAnchor trust_anchor { get; set; default = new TrustAnchor (); } diff --git a/src/moonshot-identities-manager.vala b/src/moonshot-identities-manager.vala index 0c8dfb4..cc57f43 100644 --- a/src/moonshot-identities-manager.vala +++ b/src/moonshot-identities-manager.vala @@ -109,6 +109,9 @@ public class IdentityManagerModel : Object { } public void add_card(IdCard card, bool force_flat_file_store) { + if (card.temporary) + return; + string candidate; IIdentityCardStore.StoreType saved_store_type = get_store_type(); @@ -129,6 +132,11 @@ public class IdentityManagerModel : Object { public IdCard update_card(IdCard card) { IdCard retval; + if (card.temporary) { + retval = card; + return retval; + } + if (!card.store_password) password_table.CachePassword(card, store); else diff --git a/src/moonshot-identity-management-view.vala b/src/moonshot-identity-management-view.vala index 0b7e283..1ddb1c8 100644 --- a/src/moonshot-identity-management-view.vala +++ b/src/moonshot-identity-management-view.vala @@ -439,23 +439,30 @@ public class IdentityManagerView : Window { public IdCard check_add_password(IdCard identity, IdentityRequest request, IdentityManagerModel model) { IdCard retval = identity; - if ((identity.password == "") && !identity.IsNoIdentity()) - { - var dialog = new AddPasswordDialog (identity, request); - var result = dialog.run (); - - switch (result) { - case ResponseType.OK: - identity.password = dialog.password; - identity.store_password = dialog.remember; + 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 (request_has_pw) { + identity.password = request.password; retval = model.update_card(identity); - break; - default: - identity = null; - break; + } else { + var dialog = new AddPasswordDialog (identity, request); + var result = dialog.run (); + + switch (result) { + case ResponseType.OK: + identity.password = dialog.password; + identity.store_password = dialog.remember; + if (dialog.remember) + identity.temporary = false; + retval = model.update_card(identity); + break; + default: + identity = null; + break; + } + dialog.destroy (); } - - dialog.destroy (); } return retval; } diff --git a/src/moonshot-identity-manager-app.vala b/src/moonshot-identity-manager-app.vala index 03088eb..a9a4c33 100644 --- a/src/moonshot-identity-manager-app.vala +++ b/src/moonshot-identity-manager-app.vala @@ -96,16 +96,14 @@ public class IdentityManagerApp { bool has_nai = request.nai != null && request.nai != ""; bool has_srv = request.service != null && request.service != ""; bool confirm = false; - IdCard nai_provided = null; foreach (IdCard id in model.get_card_list()) { - /* If NAI matches we add id card to the candidate list */ + /* If NAI matches, use this id card */ if (has_nai && request.nai == id.nai) { - nai_provided = id; - request.candidates.append (id); - continue; + identity = id; + break; } /* If any service matches we add id card to the candidate list */ @@ -123,7 +121,7 @@ public class IdentityManagerApp { } /* If more than one candidate we dissasociate service from all ids */ - if (has_srv && request.candidates.length() > 1) + if ((identity == null) && has_srv && request.candidates.length() > 1) { foreach (IdCard id in request.candidates) { @@ -161,10 +159,8 @@ public class IdentityManagerApp { } } -// model.store_id_cards (); - /* If there are no candidates we use the service matching rules */ - if (request.candidates.length () == 0) + if ((identity==null) && (request.candidates.length () == 0)) { foreach (IdCard id in model.get_card_list()) { @@ -181,38 +177,25 @@ public class IdentityManagerApp { } } - if (request.candidates.length () > 1) - { - if (has_nai && nai_provided != null) - { - identity = nai_provided; - confirm = false; - } - else - confirm = true; - } - if (identity == null) - identity = request.candidates.nth_data (0); - if ((identity != null) && - ((identity.password == null) || (identity.password == ""))) + if ((identity == null) && has_nai) { + // create a temp identity + string[] components = request.nai.split("@", 2); + identity = new IdCard(); + identity.display_name = request.nai; + identity.username = components[0]; + if (components.length > 1) + identity.issuer = components[1]; identity.password = request.password; + identity.temporary = true; + } if (identity == null) { - if (has_nai) { - // create a temp identity - string[] components = request.nai.split("@", 2); - identity = new IdCard(); - identity.display_name = request.nai; - identity.username = components[0]; - if (components.length > 1) - identity.issuer = components[1]; - identity.password = request.password; - } else { + if (request.candidates.length () != 1) { confirm = true; + } else { + identity = request.candidates.nth_data (0); } } - /* TODO: If candidate list empty return fail */ - if (confirm && (view != null)) { if (!explicitly_launched) diff --git a/src/moonshot-server.vala b/src/moonshot-server.vala index 81fdccd..6b2f864 100644 --- a/src/moonshot-server.vala +++ b/src/moonshot-server.vala @@ -49,7 +49,10 @@ public class MoonshotServer : Object { if ((id_card != null) && (id_card.display_name != IdCard.NO_IDENTITY)) { nai_out = id_card.nai; - password_out = id_card.password; + if ((request.password!=null) && (request.password != "")) + password_out = request.password; + else + password_out = id_card.password; server_certificate_hash = id_card.trust_anchor.server_cert; ca_certificate = id_card.trust_anchor.ca_cert; -- 2.1.4