Minor refactoring of XML import code
authorDan Breslau <dbreslau@painless-security.com>
Thu, 28 Apr 2016 20:21:21 +0000 (16:21 -0400)
committerDan Breslau <dbreslau@painless-security.com>
Thu, 28 Apr 2016 20:21:21 +0000 (16:21 -0400)
src/moonshot-id.vala
src/moonshot-provisioning-common.vala
src/moonshot-server.vala
src/moonshot-webp-parser.vala

index e578257..2dc9ac2 100644 (file)
@@ -92,8 +92,18 @@ public class IdCard : Object
 
     public string issuer { get; set; default = ""; }
   
-    public Rule[] rules {get; set; default = {};}
-    public string[] services { get; set; default = {}; }
+    private Rule[] _rules = {};
+    public Rule[] rules {
+        get {return _rules;}
+        internal set {_rules = value ?? {};}
+    }
+
+    private string[] _services = {};
+    public string[] services {
+        get {return _services;}
+        internal set {_services = value ?? {};}
+    }
+
     public bool temporary {get; set; default = false; }
 
     public TrustAnchor trust_anchor  { get; set; default = new TrustAnchor (); }
@@ -141,7 +151,7 @@ public class IdCard : Object
         if (this.trust_anchor.Compare(other.trust_anchor)!=0)
             diff |= 1 << DiffFlags.TRUST_ANCHOR;
 
-        stdout.printf("Diff Flags: %x\n", diff);
+        // stdout.printf("Diff Flags: %x\n", diff);
         return diff;
     }
 
@@ -155,6 +165,14 @@ public class IdCard : Object
     ~IdCard() {
         password = null;
     }
+
+    internal void add_rule(Rule rule) {
+        _rules += rule;
+    }
+
+    internal void add_service(string service) {
+        _services += service;
+    }
 }
 
 public int CompareRules(Rule[] a, Rule[] b)
index 48a1fa6..a0c39c3 100644 (file)
  * SUCH DAMAGE.
 */
 
+
+
 namespace WebProvisioning
 { 
-    IdCard card;
-    IdCard[] cards;
-
     bool check_stack(SList<string> stack, string[] reference) {
 
         if (stack.length() < reference.length)
@@ -120,112 +119,116 @@ namespace WebProvisioning
         return check_stack(stack, display_name_path);
     }
   
-    public void start_element_func(MarkupParseContext context,
-                                   string element_name,
-                                   string[] attribute_names,
-                                   string[] attribute_values) throws MarkupError
+    public class Parser : Object
     {
-        if (element_name == "identity")
-        {
-            IdCard[] tmp_cards = cards;
+        private static MoonshotLogger logger = new MoonshotLogger("WebProvisioning");
 
-            cards = new IdCard[tmp_cards.length + 1];
-            for (int i = 0; i < tmp_cards.length; i++)
-            {
-                cards[i] = tmp_cards[i];
-            }
-            card = new IdCard();
-            cards[tmp_cards.length] = card;
-        }
-        else if (element_name == "rule")
-        {
-            Rule[] tmp_rules = card.rules;
-            card.rules = new Rule[tmp_rules.length + 1];
-            for (int i = 0; i < tmp_rules.length; i++)
+        private void start_element_func(MarkupParseContext context,
+                                        string element_name,
+                                        string[] attribute_names,
+                                        string[] attribute_values) throws MarkupError 
             {
-                card.rules[i] = tmp_rules[i];
+                if (element_name == "identity")
+                {
+                    logger.trace("start_element_func (%p): Adding an identity".printf(this));
+                    card = new IdCard();
+                    _cards += card;
+                }
+                else if (element_name == "rule")
+                {
+                    card.add_rule(Rule());
+                }
             }
-      
-            card.rules[tmp_rules.length] = Rule();
-        }
-    }
 
-    public void
-    text_element_func(MarkupParseContext context,
-                      string             text,
-                      size_t             text_len) throws MarkupError
-    {
-        unowned SList<string> stack = context.get_element_stack();
+            private void
+            text_element_func(MarkupParseContext context,
+                              string             text,
+                              size_t             text_len) throws MarkupError {
+                unowned SList<string> stack = context.get_element_stack();
     
-        if (text_len < 1)
-            return;
+                if (text_len < 1)
+                    return;
     
-        if (stack.nth_data(0) == "display-name" && display_name_handler(stack))
-        {
-            card.display_name = text;
-        }
-        else if (stack.nth_data(0) == "user" && user_handler(stack))
-        {
-            card.username = text;
-        }
-        else if (stack.nth_data(0) == "password" && password_handler(stack))
-        {
-            card.password = text;
-        }
-        else if (stack.nth_data(0) == "realm" && realm_handler(stack))
-        {
-            card.issuer = text;
-        }
-        else if (stack.nth_data(0) == "service")
-        {
-            string[] services = card.services;
-            card.services = new string[services.length + 1];
-            for (int i = 0; i < services.length; i++)
-            {
-                card.services[i] = services[i];
-            }
-            card.services[services.length] = text;
-        }
-        /* Rules */
-        else if (stack.nth_data(0) == "pattern" && pattern_handler(stack))
-        {
-            /* use temp array to workaround valac 0.10 bug accessing array property length */ 
-            var temp = card.rules;
-            card.rules[temp.length - 1].pattern = text;
-        }
-        else if (stack.nth_data(0) == "always-confirm" && always_confirm_handler(stack))
-        {
-            if (text == "true" || text == "false") {
-                /* use temp array to workaround valac 0.10 bug accessing array property length*/
-                var temp = card.rules;
-                card.rules[temp.length - 1].always_confirm = text;
+                logger.trace("text_element_func (%p): text='%s'".printf(this, stack.nth_data(0)));
+
+                if (stack.nth_data(0) == "display-name" && display_name_handler(stack))
+                {
+                    card.display_name = text;
+                }
+                else if (stack.nth_data(0) == "user" && user_handler(stack))
+                {
+                    card.username = text;
+                }
+                else if (stack.nth_data(0) == "password" && password_handler(stack))
+                {
+                    card.password = text;
+                }
+                else if (stack.nth_data(0) == "realm" && realm_handler(stack))
+                {
+                    card.issuer = text;
+                }
+                else if (stack.nth_data(0) == "service")
+                {
+                    card.add_service(text);
+                }
+
+                /* Rules */
+                else if (stack.nth_data(0) == "pattern" && pattern_handler(stack))
+                {
+                    /* use temp array to workaround valac 0.10 bug accessing array property length */ 
+                    var temp = card.rules;
+                    card.rules[temp.length - 1].pattern = text;
+                }
+                else if (stack.nth_data(0) == "always-confirm" && always_confirm_handler(stack))
+                {
+                    if (text == "true" || text == "false") {
+                        /* use temp array to workaround valac 0.10 bug accessing array property length*/
+                        var temp = card.rules;
+                        card.rules[temp.length - 1].always_confirm = text;
+                    }
+                }
+                /*Trust anchor*/
+                else if (stack.nth_data(0) == "ca-cert" && ca_cert_handler(stack))
+                {
+                    card.trust_anchor.ca_cert = text;
+                }
+                else if (stack.nth_data(0) == "subject" && subject_handler(stack))
+                {
+                    card.trust_anchor.subject = text;
+                }
+                else if (stack.nth_data(0) == "subject-alt" && subject_alt_handler(stack))
+                {
+                    card.trust_anchor.subject_alt = text;
+                }
+                else if (stack.nth_data(0) == "server-cert" && server_cert_handler(stack))
+                {
+                    card.trust_anchor.server_cert = text;
+                }
             }
-        }
-        /*Trust anchor*/
-        else if (stack.nth_data(0) == "ca-cert" && ca_cert_handler(stack))
-        {
-            card.trust_anchor.ca_cert = text;
-        }
-        else if (stack.nth_data(0) == "subject" && subject_handler(stack))
-        {
-            card.trust_anchor.subject = text;
-        }
-        else if (stack.nth_data(0) == "subject-alt" && subject_alt_handler(stack))
-        {
-            card.trust_anchor.subject_alt = text;
-        }
-        else if (stack.nth_data(0) == "server-cert" && server_cert_handler(stack))
-        {
-            card.trust_anchor.server_cert = text;
-        }
-    }
 
-    class Parser
-    {
-        private MarkupParser parser;
+
+
+        private const MarkupParser parser = {
+            start_element_func, null, text_element_func, null, null
+        };
+
+        private MarkupParseContext ctx;
+
         private string       text;
         private string       path;
+
+        private IdCard card;
+        private IdCard[] _cards = {};
+
+        public IdCard[] cards {
+            get {return _cards;}
+            private set {_cards = value ?? {};}
+        }
+
         public Parser(string path) {
+
+            ctx = new MarkupParseContext(parser, 0, this, null);
+
             text = "";
             this.path = path;
 
@@ -243,12 +246,10 @@ namespace WebProvisioning
                 error("Could not retreive file size");
             }
       
-            parser = {start_element_func, null, text_element_func, null, null};
+            logger.trace(@"Parser(): read text to parse; length=$(text.length)");
         }
-    
+
         public void parse() {
-            var ctx = new MarkupParseContext(parser, 0, null, null);
-      
             try
             {
                 ctx.parse(text, text.length);
index bb26dc0..b1cc9ba 100644 (file)
@@ -227,7 +227,7 @@ public class MoonshotServer : Object {
         webp.parse();
         bool result = false;
         int installed_cards = 0;
-        foreach (IdCard card in WebProvisioning.cards)
+        foreach (IdCard card in webp.cards)
         {
             string[] rules_patterns = {};
             string[] rules_always_confirm = {};
index efe53b5..90b5452 100644 (file)
@@ -33,10 +33,12 @@ using Moonshot;
 
 namespace WebProvisioning
 { 
-
+    private MoonshotLogger logger;
 
     public static int main(string[] args)
     {
+        logger = new MoonshotLogger("WebProvisioning");
+
         int arg_index = -1;
         int force_flat_file_store = 0;
         bool bad_switch = false;
@@ -73,9 +75,15 @@ namespace WebProvisioning
     
         var webp = new Parser(webp_file);
         webp.parse();
-    
-        foreach (IdCard card in cards)
+        logger.trace(@"Have $(webp.cards.length) IdCards");
+        foreach (IdCard card in webp.cards)
         {
+
+            if (card == null) {
+                logger.trace(@"Skipping null IdCard");
+                continue;
+            }
+
             Moonshot.Error error;
             string[] rules_patterns = {};
             string[] rules_always_confirm = {};
@@ -96,6 +104,7 @@ namespace WebProvisioning
                 }
             }
 
+            logger.trace(@"Installing IdCard named '$(card.display_name)'");
             Moonshot.install_id_card(card.display_name,
                                      card.username,
                                      card.password,