Modify identity selection logic / fix bugs
[moonshot-ui.git] / src / moonshot-server.vala
index 145d6bf..6b2f864 100644 (file)
@@ -3,11 +3,21 @@
 [DBus (name = "org.janet.Moonshot")]
 public class MoonshotServer : Object {
 
-    private MainWindow main_window;
+    private IdentityManagerApp parent_app;
 
-    public MoonshotServer (Gtk.Window window)
+    public MoonshotServer (IdentityManagerApp app)
     {
-        this.main_window = (MainWindow) window;
+        this.parent_app = app;
+    }
+
+    public bool show_ui()
+    {
+        if (parent_app.view == null) {
+            return false;
+        }
+        parent_app.show();
+        parent_app.explicitly_launched = true;
+        return true;
     }
 
     public async bool get_identity (string nai,
@@ -20,7 +30,7 @@ public class MoonshotServer : Object {
                                     out string subject_name_constraint,
                                     out string subject_alt_name_constraint)
     {
-        var request = new IdentityRequest (main_window,
+        var request = new IdentityRequest (parent_app,
                                            nai,
                                            password,
                                            service);
@@ -37,15 +47,30 @@ public class MoonshotServer : Object {
 
         var id_card = request.id_card;
 
-        if (id_card != null) {
+        if ((id_card != null) && (id_card.display_name != IdCard.NO_IDENTITY)) {
             nai_out = id_card.nai;
-            password_out = id_card.password;
-
-            server_certificate_hash = "certificate";
-
-            // User should have been prompted if there was no p/w.
-            return_if_fail (nai_out != null);
-            return_if_fail (password_out != null);
+            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;
+            subject_name_constraint = id_card.trust_anchor.subject;
+            subject_alt_name_constraint = id_card.trust_anchor.subject_alt;
+
+            if (nai_out == null)
+                nai_out = "";
+            if (password_out == null)
+                password_out = "";
+            if (server_certificate_hash == null)
+                server_certificate_hash = "";
+            if (ca_certificate == null)
+                ca_certificate = "";
+            if (subject_name_constraint == null)
+                subject_name_constraint = "";
+            if (subject_alt_name_constraint == null)
+                subject_alt_name_constraint = "";
 
             return true;
         }
@@ -60,7 +85,7 @@ public class MoonshotServer : Object {
                                             out string subject_name_constraint,
                                             out string subject_alt_name_constraint)
     {
-        var request = new IdentityRequest.default (main_window);
+        var request = new IdentityRequest.default (parent_app);
         request.set_callback ((IdentityRequest) => get_default_identity.callback());
         request.execute ();
         yield;
@@ -77,19 +102,118 @@ public class MoonshotServer : Object {
             nai_out = request.id_card.nai;
             password_out = request.id_card.password;
 
-            server_certificate_hash = "certificate";
-
-            // User should have been prompted if there was no p/w.
-            return_val_if_fail (nai_out != null, false);
-            return_val_if_fail (password_out != null, false);
+            server_certificate_hash = request.id_card.trust_anchor.server_cert;
+            ca_certificate = request.id_card.trust_anchor.ca_cert;
+            subject_name_constraint = request.id_card.trust_anchor.subject;
+            subject_alt_name_constraint = request.id_card.trust_anchor.subject_alt;
+
+            if (nai_out == null)
+                nai_out = "";
+            if (password_out == null)
+                password_out = "";
+            if (server_certificate_hash == null)
+                server_certificate_hash = "";
+            if (ca_certificate == null)
+                ca_certificate = "";
+            if (subject_name_constraint == null)
+                subject_name_constraint = "";
+            if (subject_alt_name_constraint == null)
+                subject_alt_name_constraint = "";
 
             return true;
         }
 
         return false;
     }
+
+    public bool install_id_card (string   display_name,
+                                 string   user_name,
+                                 string   ?password,
+                                 string   ?realm,
+                                 string[] ?rules_patterns,
+                                 string[] ?rules_always_confirm,
+                                 string[] ?services,
+                                 string   ?ca_cert,
+                                 string   ?subject,
+                                 string   ?subject_alt,
+                                 string   ?server_cert,
+                                 int      force_flat_file_store)
+    {
+      IdCard idcard = new IdCard ();
+
+      idcard.display_name = display_name;
+      idcard.username = user_name;
+      idcard.password = password;
+      if ((password != null) && (password != ""))
+        idcard.store_password = true;
+      idcard.issuer = realm;
+      idcard.services = services;
+      idcard.trust_anchor.ca_cert = ca_cert;
+      idcard.trust_anchor.subject = subject;
+      idcard.trust_anchor.subject_alt = subject_alt;
+      idcard.trust_anchor.server_cert = server_cert;
+
+      if (rules_patterns.length == rules_always_confirm.length)
+      {
+        idcard.rules = new Rule[rules_patterns.length];
+         
+        for (int i=0; i<idcard.rules.length; i++)
+        { 
+          idcard.rules[i].pattern = rules_patterns[i];
+          idcard.rules[i].always_confirm = rules_always_confirm[i];
+        }
+      }
+
+      return parent_app.add_identity (idcard, force_flat_file_store!=0);
+    }
+
+
+    public int install_from_file (string file_name)
+    {
+    var webp = new WebProvisioning.Parser (file_name);
+
+    webp.parse();
+    bool result = false;
+    int installed_cards = 0;
+    foreach (IdCard card in WebProvisioning.cards)
+    {
+      string[] rules_patterns = {};
+      string[] rules_always_confirm = {};
+        
+      if (card.rules.length > 0)
+      {
+        int i = 0;
+        rules_patterns = new string[card.rules.length];
+        rules_always_confirm = new string[card.rules.length];
+        foreach (Rule r in card.rules)
+        {
+          rules_patterns[i] = r.pattern;
+          rules_always_confirm[i] = r.always_confirm;
+          i++;
+        }
+      } 
+
+      result = install_id_card (card.display_name,
+                                card.username,
+                                card.password,
+                                card.issuer,
+                                rules_patterns,
+                                rules_always_confirm,
+                                card.services,
+                                card.trust_anchor.ca_cert,
+                                card.trust_anchor.subject,
+                                card.trust_anchor.subject_alt,
+                                card.trust_anchor.server_cert,
+                                0);
+      if (result) {
+        installed_cards++;
+      }
+    }
+    return installed_cards;
+  }
 }
 
+
 #elif IPC_MSRPC
 
 using Rpc;
@@ -104,13 +228,13 @@ using MoonshotRpcInterface;
  * process ends
  */
 public class MoonshotServer : Object {
-    private static MainWindow main_window;
+    private static IdentityManagerApp parent_app;
 
     private static MoonshotServer instance = null;
 
-    public static void start (Gtk.Window window)
+    public static void start (IdentityManagerApp app)
     {
-        main_window = (MainWindow) window;
+        parent_app = app;
         Rpc.server_start (MoonshotRpcInterface.spec, "/org/janet/Moonshot", Rpc.Flags.PER_USER);
     }
 
@@ -135,7 +259,7 @@ public class MoonshotServer : Object {
     {
         bool result = false;
 
-        var request = new IdentityRequest (main_window,
+        var request = new IdentityRequest (parent_app,
                                            nai,
                                            password,
                                            service);
@@ -160,7 +284,7 @@ public class MoonshotServer : Object {
 
         var id_card = request.id_card;
 
-        if (id_card == null) {
+        if (id_card != null) {
             // The strings are freed by the RPC runtime
             nai_out = id_card.nai;
             password_out = id_card.password;
@@ -168,6 +292,10 @@ public class MoonshotServer : Object {
 
             return_if_fail (nai_out != null);
             return_if_fail (password_out != null);
+            return_if_fail (server_certificate_hash != null);
+            return_if_fail (ca_certificate != null);
+            return_if_fail (subject_name_constraint != null);
+            return_if_fail (subject_alt_name_constraint != null);
 
             result = true;
         }
@@ -185,11 +313,15 @@ public class MoonshotServer : Object {
     [CCode (cname = "moonshot_get_default_identity_rpc")]
     public static void get_default_identity (Rpc.AsyncCall call,
                                              ref string nai_out,
-                                             ref string password_out)
+                                             ref string password_out,
+                                             ref string server_certificate_hash,
+                                             ref string ca_certificate,
+                                             ref string subject_name_constraint,
+                                             ref string subject_alt_name_constraint)
     {
         bool result;
 
-        var request = new IdentityRequest.default (main_window);
+        var request = new IdentityRequest.default (parent_app);
         request.mutex = new Mutex ();
         request.cond = new Cond ();
         request.set_callback (return_identity_cb);
@@ -202,14 +334,23 @@ public class MoonshotServer : Object {
 
         nai_out = "";
         password_out = "";
+        server_certificate_hash = "";
+        ca_certificate = "";
+        subject_name_constraint = "";
+        subject_alt_name_constraint = "";
 
         if (request.id_card != null)
         {
             nai_out = request.id_card.nai;
             password_out = request.id_card.password;
+            server_certificate_hash = "certificate";
 
             return_if_fail (nai_out != null);
             return_if_fail (password_out != null);
+            return_if_fail (server_certificate_hash != null);
+            return_if_fail (ca_certificate != null);
+            return_if_fail (subject_name_constraint != null);
+            return_if_fail (subject_alt_name_constraint != null);
 
             result = true;
         }
@@ -236,6 +377,65 @@ public class MoonshotServer : Object {
         request.cond.wait (request.mutex);
         request.mutex.unlock ();
     }
+
+    [CCode (cname = "moonshot_install_id_card_rpc")]
+    public static bool install_id_card (string     display_name,
+                                        string     user_name,
+                                        string     password,
+                                        string     realm,
+                                        string[]   rules_patterns,
+                                        string[]   rules_always_confirm,
+                                        string[]   services,
+                                        string     ca_cert,
+                                        string     subject,
+                                        string     subject_alt,
+                                        string     server_cert,
+                                        bool       force_flat_file_store)
+    {
+        IdCard idcard = new IdCard ();
+        bool success = false;
+        Mutex mutex = new Mutex();
+        Cond cond = new Cond();
+
+        idcard.display_name = display_name;
+        idcard.username = user_name;
+        idcard.password = password;
+        idcard.issuer = realm;
+        idcard.services = services;
+        idcard.trust_anchor.ca_cert = ca_cert;
+        idcard.trust_anchor.subject = subject;
+        idcard.trust_anchor.subject_alt = subject_alt;
+        idcard.trust_anchor.server_cert = server_cert;
+
+        if (rules_patterns.length == rules_always_confirm.length)
+        {
+            idcard.rules = new Rule[rules_patterns.length];
+         
+            for (int i=0; i<idcard.rules.length; i++)
+            { 
+                idcard.rules[i].pattern = rules_patterns[i];
+                idcard.rules[i].always_confirm = rules_always_confirm[i];
+            }
+        }
+
+        mutex.lock ();
+
+        // Defer addition to the main loop thread.
+        Idle.add (() => {
+            mutex.lock ();
+            success = parent_app.add_identity (idcard, force_flat_file_store);
+            cond.signal ();
+            mutex.unlock ();
+            return false;
+        });
+
+        cond.wait (mutex);
+        mutex.unlock ();
+
+        return success;
+    }
+
 }
 
+
 #endif