Modify identity selection logic / fix bugs
authorKevin Wasserman <kevin.wasserman@painless-security.com>
Mon, 4 Nov 2013 13:56:26 +0000 (08:56 -0500)
committerKevin Wasserman <kevin.wasserman@painless-security.com>
Mon, 4 Nov 2013 14:06:15 +0000 (09:06 -0500)
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
src/moonshot-identities-manager.vala
src/moonshot-identity-management-view.vala
src/moonshot-identity-manager-app.vala
src/moonshot-server.vala

index 3198353..8f90e8d 100644 (file)
@@ -44,6 +44,7 @@ public class IdCard : Object
   
   public Rule[] rules {get; set; default = {};}
   public string[] services { get; set; default = {}; }
   
   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 (); }
   
 
   public TrustAnchor trust_anchor  { get; set; default = new TrustAnchor (); }
   
index 0c8dfb4..cc57f43 100644 (file)
@@ -109,6 +109,9 @@ public class IdentityManagerModel : Object {
     }
 
     public void add_card(IdCard card, bool force_flat_file_store) {
     }
 
     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();
 
         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;
 
      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
         if (!card.store_password)
             password_table.CachePassword(card, store);
         else
index 0b7e283..1ddb1c8 100644 (file)
@@ -439,23 +439,30 @@ public class IdentityManagerView : Window {
     public IdCard check_add_password(IdCard identity, IdentityRequest request, IdentityManagerModel model)
     {
         IdCard retval = identity;
     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);
                 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;
     }
         }
         return retval;
     }
index 03088eb..a9a4c33 100644 (file)
@@ -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;
             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())
             {
 
             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)
                 {
                 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 */
                 }
 
                 /* 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 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)
                 {
             {
                 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 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())
                 {
             {
                 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.password = request.password;
+                identity.temporary = true;
+            }
             if (identity == null) {
             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;
                     confirm = true;
+                } else {
+                    identity = request.candidates.nth_data (0);                    
                 }
             }
 
                 }
             }
 
-            /* TODO: If candidate list empty return fail */
-            
             if (confirm && (view != null))
             {
                 if (!explicitly_launched)
             if (confirm && (view != null))
             {
                 if (!explicitly_launched)
index 81fdccd..6b2f864 100644 (file)
@@ -49,7 +49,10 @@ public class MoonshotServer : Object {
 
         if ((id_card != null) && (id_card.display_name != IdCard.NO_IDENTITY)) {
             nai_out = id_card.nai;
 
         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;
 
             server_certificate_hash = id_card.trust_anchor.server_cert;
             ca_certificate = id_card.trust_anchor.ca_cert;