[webp] Trust anchor information in.
[moonshot-ui.git] / src / moonshot-webp-parser.vala
1 namespace WebProvisioning
2
3   public IdCard card;
4
5   bool
6   check_stack (SList<string> stack, string[] reference)
7   {
8     if (stack.length () < reference.length)
9       return false;
10     
11     for (int i = 0; i<reference.length; i++)
12     {
13       if (stack.nth_data(i) != reference[i])
14         return false;
15     }
16
17     return true;
18   }
19
20   bool
21   server_cert_handler (SList<string> stack)
22   {
23     string[] server_cert_path = {"server-cert", "trust-anchor", "identity", "identities"};
24     
25     return check_stack (stack, server_cert_path);
26   }
27
28   bool
29   subject_alt_handler (SList<string> stack)
30   {
31     string[] subject_alt_path = {"subject-alt", "trust-anchor", "identity", "identities"};
32     
33     return check_stack (stack, subject_alt_path);
34   }
35
36   bool
37   subject_handler (SList<string> stack)
38   {
39     string[] subject_path = {"subject", "trust-anchor", "identity", "identities"};
40     
41     return check_stack (stack, subject_path);
42   }
43   
44   bool
45   ca_cert_handler (SList<string> stack)
46   {
47     string[] ca_path = {"ca-cert", "trust-anchor", "identity", "identities"};
48     
49     return check_stack (stack, ca_path);
50   }
51
52   bool
53   realm_handler (SList<string> stack)
54   {
55     string[] realm_path = {"realm", "identity", "identities"};
56     
57     return check_stack (stack, realm_path);
58   }
59
60   bool
61   password_handler (SList<string> stack)
62   {
63     string[] password_path = {"password", "identity", "identities"};
64     
65     return check_stack (stack, password_path);
66   }
67
68   bool
69   user_handler (SList<string> stack)
70   {
71     string[] user_path = {"user", "identity", "identities"};
72     
73     return check_stack (stack, user_path);
74   }
75
76   bool
77   display_name_handler (SList<string> stack)
78   {
79     string[] display_name_path = {"display-name", "identity", "identities"};
80     
81     return check_stack (stack, display_name_path);
82   }
83
84   public void text_element_func (MarkupParseContext context,
85                                  string text,
86                                  size_t text_len) throws MarkupError
87   {
88     unowned SList<string> stack = context.get_element_stack ();
89     
90     if (text_len < 1)
91       return;
92     
93     if (stack.nth_data(0) == "display-name" && display_name_handler (stack))
94     {
95       card.display_name = text;
96     }
97     else if (stack.nth_data(0) == "user" && user_handler (stack))
98     {
99       card.username = text;
100     }
101     else if (stack.nth_data(0) == "password" && password_handler (stack))
102     {
103       card.password = text;
104     }
105     else if (stack.nth_data(0) == "realm" && realm_handler (stack))
106     {
107       card.issuer = text;
108     }
109     else if (stack.nth_data(0) == "service")
110     {
111       string[] services = card.services;
112       card.services = new string[services.length + 1];
113       for (int i = 0; i<services.length; i++)
114       {
115         card.services[i] = services[i];
116       }
117       card.services[services.length] = text;
118     }
119     /* Rules */
120     else if (stack.nth_data(0) == "pattern")
121     {
122     }
123     else if (stack.nth_data(0) == "always_confirm")
124     {
125     }
126     
127     /*Trust anchor*/
128     else if (stack.nth_data(0) == "ca-cert" && ca_cert_handler (stack))
129     {
130       card.trust_anchor.ca_cert = text;
131     }
132     else if (stack.nth_data(0) == "subject" && subject_handler (stack))
133     {
134       card.trust_anchor.subject = text;
135     }
136     else if (stack.nth_data(0) == "subject-alt" && subject_alt_handler (stack))
137     {
138       card.trust_anchor.subject_alt = text;
139     }
140     else if (stack.nth_data(0) == "server-cert" && server_cert_handler (stack))
141     {
142       card.trust_anchor.server_cert = text;
143     }
144   }
145
146   class WebProvisionParser
147   {
148     public WebProvisionParser (string path)
149     {
150       string text = "";
151       var file = File.new_for_path (path);
152     
153       try
154       {
155         var dis = new DataInputStream (file.read ());
156         string line;
157         while ((line = dis.read_line (null)) != null)
158           text += line;
159       }
160       catch (Error e)
161       {
162         error ("Could not retreive file size");
163       }
164       
165       MarkupParser parser = {null, null, text_element_func, null, null};
166       
167       var ctx = new MarkupParseContext(parser, 0, null, null);
168       
169       try
170       {
171         ctx.parse (text, text.length);
172       }
173       catch (Error e)
174       {
175         error ("Could not parse %s, invalid content", path);
176       } 
177     }
178   }
179
180   public static int main (string[] args)
181   {
182     if (args.length < 2)
183     {
184       error ("Usage %s [-a] WEB_PROVISIONING_FILE", args[0]);
185     }
186     
187     if (!FileUtils.test (args[1], FileTest.EXISTS | FileTest.IS_REGULAR))
188     {
189       error ("%s does not exist", args[1]);
190     }
191     
192     card = new IdCard();
193     
194     var webp = new WebProvisionParser (args[1]);
195     
196     debug ("'%s' '%s' '%s' '%s'", card.display_name, card.username, card.password, card.issuer);
197     
198     foreach (string srv in card.services)
199     {
200       debug ("service: %s", srv);
201     }
202     
203     return 0;
204   }
205 }