6bd10ae845f541774860458ce5f5b8e9d44702ad
[gssweb.git] / xpi / lib / main.js
1 var widgets = require("sdk/widget");
2 var tabs = require("sdk/tabs");
3
4 const {Cu} = require("chrome");
5
6 function myDump(message) {
7   dump("\n");
8   dump("**********************************************************************\n");
9   dump("**********************************************************************\n");
10   dump("** " + message + " **\n");
11   dump("**********************************************************************\n");
12   dump("**********************************************************************\n");
13 }
14
15 myDump("About to load ctypes");
16 Cu.import("resource://gre/modules/ctypes.jsm");
17
18 /************************
19  ** Declaring types    **
20  ************************/
21 const gss_buffer_t_struct = ctypes.StructType(
22     "gss_buffer_t",
23     [
24         {"length": ctypes.size_t},
25         {"value":  ctypes.void_t.ptr}
26     ]
27 );
28 const gss_buffer_t = ctypes.PointerType(gss_buffer_t_struct);
29 const gss_OID_struct = ctypes.StructType(
30     "gss_OID", 
31     [
32         {"length" :   ctypes.uint32_t},
33         {"elements" : ctypes.voidptr_t}
34     ]
35 );
36 const gss_OID = ctypes.PointerType(gss_OID_struct);
37 const gss_name_t = ctypes.StructType("gss_name_t");
38
39 const gss_cred_id_struct = ctypes.StructType("gss_cred_id_struct");
40 const gss_cred_id_t = ctypes.PointerType(gss_cred_id_struct);
41
42 const gss_ctx_id_struct = ctypes.StructType("gss_ctx_id_struct");
43 const gss_ctx_id_t = ctypes.PointerType(gss_ctx_id_struct);
44
45 const gss_channel_bindings_struct = ctypes.StructType(
46     "gss_channel_bindings_struct",
47     [
48         {"initiator_addrtype": ctypes.uint32_t},
49         {"initiator_address":  gss_buffer_t_struct},
50         {"acceptor_addrtype":  ctypes.uint32_t},
51         {"acceptor_address":   gss_buffer_t_struct},
52         {"application_data":   gss_buffer_t_struct}
53     ]
54 );
55 const gss_channel_bindings_t = ctypes.PointerType(gss_channel_bindings_struct);
56
57 const gss_status_struct = ctypes.StructType(
58     "gss_status_struct",
59     [
60         {"major": ctypes.uint32_t},
61         {"minor": ctypes.uint32_t}
62     ]
63 );
64 const gss_status_t = ctypes.PointerType(gss_status_struct);
65
66
67 /**********************
68  * Utility functions  *
69  **********************/
70 function generate_gss_buffer(buff) {
71   myDump("Generate a gss_buffer_t for (" + buff + ")");
72
73   var buffString = ctypes.char.array()(buff);
74
75   var gss_buffer = new gss_buffer_t_struct();
76   gss_buffer.length = new ctypes.size_t(buff.length);
77   gss_buffer.value = buffString.address();
78
79   myDump("Returning the buffer_t");
80   return gss_buffer; 
81 }
82
83 //"1.3.6.1.5.5.2" - spnego
84 //"1.2.840.113554.1.2.1.4" - nt hostservice
85
86 function str_to_oid(oid_str)
87 {
88     var buffer = generate_gss_buffer(oid_str);
89     var oid = new gss_OID_struct();
90     var oid_ptr = oid.address();
91     minStatus = new ctypes.uint32_t(0);
92     var majStatus;
93     
94     myDump("Abotut to str_to_oid: " + oid_str);
95     majStatus = gss_str_to_oid(
96         minStatus.address(), 
97         buffer.address(), 
98         oid_ptr.address() );
99     myDump("Finished the str_to_oid: " + majStatus + "/" + minStatus);
100     
101     myDump("   returned oid: [ length: " + oid_ptr.contents.length + " ]");
102     
103     return(oid_ptr.contents);
104 }
105
106 function import_name(name)
107 {
108     myDump("Entering import_name(" + name + ")");
109     var name_buffer     = generate_gss_buffer(name);
110     var input_name_type = new gss_OID();
111     var oid             = str_to_oid("1.2.840.113554.1.2.1.4");
112                           /* GSS_C_NT_HOSTBASED_SERVICE */
113     var output_name_ptr = gss_name_t.ptr(ctypes.UInt64("0x0"));
114     var minor           = new ctypes.uint32_t(0);
115     var major;
116     
117     var printable = new gss_buffer_t_struct();
118     var printtype = new gss_OID();
119     
120     major = gss_import_name(
121         minor.address(),
122         name_buffer.address(),
123         oid.address(),
124         output_name_ptr.address()
125     );
126     myDump("Finished the gss_import_name: " + major + "/" + minor);
127     
128     major = gss_display_name(
129         minor.address(),
130         output_name_ptr,
131         printable.address(),
132         printtype.address()
133     );
134     myDump("Display name: [ length: " + printable.length + 
135            " value: " + printable.value + " ]");
136     myDump("Display name type: [ length: " + printtype.length + " ]");
137     
138     return(output_name_ptr);
139 }
140
141
142 try{
143     var libkrb5;
144     var libgss_utils;
145     try{
146         libkrb5 = ctypes.open("libgssapi_krb5.so");
147         libgss_utils = ctypes.open("libgssapi_utils.so");
148     }
149     catch (e) {
150         myDump("Could not open utils: " + e);
151         libkrb5 = ctypes.open("libgss.dll");
152         libgss_utils = ctypes.open("libgssapi_utils.dll");
153     }
154
155     myDump("libkrb5 return value: " + libkrb5);
156     myDump("libgss_utils return value: " + libgss_utils);
157     
158     myDump("ctypes.open");
159
160     /**************************************************************
161      ** Function definitions
162      **************************************************************/
163     const gss_str_to_oid = libkrb5.declare("gss_str_to_oid",
164         ctypes.default_abi, 
165         ctypes.uint32_t,     /* Return value           */
166         ctypes.uint32_t.ptr, /* arg: minor_status */
167         gss_buffer_t,        /* arg: oid_str */
168         gss_OID.ptr);        /* arg: oid */
169     myDump("gss_str_to_oid function is " + gss_str_to_oid);
170
171     const gss_display_name = libkrb5.declare("gss_display_name",
172         ctypes.default_abi, 
173         ctypes.uint32_t,     /* Return value           */
174         ctypes.uint32_t.ptr, /* arg: minor_status */
175         gss_name_t.ptr,      /* arg: input_name */
176         gss_buffer_t,        /* arg: output_name_buffer */
177         gss_OID.ptr);        /* arg: ouptut_name_type */
178     myDump("gss_str_to_oid function is " + gss_str_to_oid);
179
180     const gss_import_name = libkrb5.declare("gss_import_name", 
181         ctypes.default_abi, 
182         ctypes.uint32_t,     /* Return value           */
183         ctypes.uint32_t.ptr, /* arg: minor status      */
184         gss_buffer_t,        /* arg: input_name_buffer */
185         gss_OID,             /* arg: input_name_type   */
186         ctypes.PointerType(gss_name_t).ptr );     /* arg: output_name       */
187     myDump("gss_import_name is function is " + gss_import_name);
188
189     const gss_init_sec_context = libkrb5.declare("gss_init_sec_context", 
190         ctypes.default_abi, 
191         ctypes.uint32_t,     /* Return value              */
192         ctypes.uint32_t.ptr, /* arg: minor status         */
193         gss_cred_id_t,       /* arg: claimant_cred_handle */
194         gss_ctx_id_t.ptr,    /* arg: context_handle       */
195         gss_name_t.ptr,      /* arg: target_name          */
196         gss_OID,             /* arg: mech_type            */
197         ctypes.uint32_t,     /* arg: req_flags            */
198         ctypes.uint32_t,     /* arg: time_req             */
199         gss_channel_bindings_t, /* arg: channel_bindings, reserved for future use */
200         gss_buffer_t,        /* arg: input_token          */
201         gss_OID.ptr,         /* arg: actual_mech_type     */
202         gss_buffer_t,        /* arg: output_token         */
203         ctypes.uint32_t.ptr, /* arg: ret_flags            */
204         ctypes.uint32_t.ptr  /* arg: time_rec             */
205     );
206     myDump("gss_init_sec_context function is " + gss_init_sec_context);
207     
208     const gss_construct_sec_context = libgss_utils.declare(
209         "gss_construct_sec_context", 
210         ctypes.default_abi,
211         ctypes.uint32_t,         /* Return value - boolean                             */
212         gss_status_t,            /* arg: Status struct pointer                         */
213         gss_cred_id_t,           /* arg: claimant_cred_handle - reserved for future    */
214         gss_ctx_id_t.ptr,        /* arg: context_handle, the output of the function    */
215         gss_name_t.ptr,          /* arg: target_name - the other endpoint              */
216         gss_OID,                 /* arg: mech_type - the desired mechanism type        */
217         ctypes.uint32_t,         /* arg: req_flags                                     */
218         ctypes.uint32_t,         /* arg: time_req                                      */
219         gss_channel_bindings_t   /* arg: input_chan_bindings - reserved for future use */
220     );
221
222
223
224     var majStatus, minStatus, output_name_ptr;
225     minStatus = new ctypes.uint32_t(0);
226     
227     output_name_ptr = import_name('http@www.project-moonshot.org/PROJECT-MOONSHOT.ORG');
228     
229     var cred_handle = gss_cred_id_struct.ptr(ctypes.UInt64("0x0"));
230     var context_handle = gss_ctx_id_struct.ptr(ctypes.UInt64("0x0"));
231     var GSS_C_NO_OID = gss_OID_struct().address();
232     var null_mechanism = gss_OID_struct.ptr(ctypes.UInt64("0x0"));
233     var channel_bindings = new gss_channel_bindings_struct();
234     var input_token = new gss_buffer_t_struct();
235     var actual_mech_type = gss_OID();
236     var output_token = new gss_buffer_t_struct();
237     var ret_flags = new ctypes.uint32_t(0);
238     var time_rec = new ctypes.uint32_t(0);
239     var status = new gss_status_struct();
240     
241     var success = gss_construct_sec_context(
242         status.address(),
243         cred_handle,
244         context_handle.address(),
245         output_name_ptr,
246         null_mechanism,
247         ctypes.uint32_t(0),          /* req_flags   */
248         ctypes.uint32_t(0),          /* time_req    */
249         channel_bindings.address()
250     );
251     
252     myDump("gss_construct_sec_context call: " + success + 
253            " [0x" + status.major.toString(16) + "/" + status.minor + "]");
254 /*
255     do
256     {
257
258         majStatus = gss_init_sec_context(
259             minStatus.address(),
260             cred_handle,
261             context_handle.address(),
262             output_name_ptr,
263             GSS_C_NO_OID,                /* Default OID * /
264             ctypes.uint32_t(0),          /* req_flags   * /
265             ctypes.uint32_t(0),          /* time_req    * /
266             channel_bindings.address(),
267             input_token.address(),
268             actual_mech_type.address(),
269             output_token.address(),
270             ret_flags.address(),
271             time_rec.address()
272         );
273         myDump("Finished the init_sec_context: " + majStatus + "/" + minStatus);
274         myDump(": " + output_name_ptr);
275
276
277     } while ((majStatus & 1) == 1)
278 */
279
280     myDump("All calls succeeded");
281     
282     libkrb5.close();
283     myDump("close");
284     
285 }
286 catch (e)
287 {
288     myDump("Caught exception: " + e);
289 }
290
291