e8e79caa0956205dc9b5dc50611314c304ccb38a
[gssweb.git] / chrome / app / navigator.gss.js
1 console.log('Loading navigator.gss.js - #7');
2
3 /* This file gets injected into the web page verbatim */
4
5
6
7 var GSSEap = (function () 
8   {
9     function GSSEap(config)
10     {
11         // Public attributes
12         this.version = "0.0.1";
13         this.callbacks = {};
14         this.methods = {};
15         this.appTag = config.appTag || "";
16         this.error = config.error || function (major, minor, error, appTag) {
17             console.warn(error);
18         };
19         window.addEventListener("message", this.dispatch_responses.bind(this));
20     }
21     GSSEap.prototype.dispatch_responses = function (event) 
22     {
23         var method;
24         var nonce;
25         var callback;
26         var app_tag;
27
28         /* This message is destined for us only if all the following apply:
29         * - The data.method_name is one of the methods implemented by this
30         *   object
31         * - data.return_values exists
32         * - data.cookies exists
33         * - One of my callbacks matches the nonce in data.cookies.navigator_gss_tag
34         * - One of my methods matches the nonce in data.cookies.navigator_gss_tag
35         *   and that method matches data.method
36         */
37         method = event.data.method;
38         if (
39              (method != "gss_import_name") ||
40              ("undefined" == typeof (event.data.return_values)) ||
41              ("undefined" == typeof (event.data.cookies)))
42         {
43             return;
44         }
45
46         nonce = event.data.cookies.navigator_gss_tag;
47         event.data.cookies.navigator_gss_tag = undefined;
48         callback = this.callbacks[nonce];
49         if ("undefined" == typeof (callback) || this.methods[nonce] != method) {
50             return;
51         }
52
53         // We now know that this message is for us!
54         this.callbacks[nonce] = undefined;
55         app_tag = event.data.cookies.app_tag;
56
57         if (this.gss_error(event.data.return_values.major_status))
58         {
59             var errMsg = "Error during " + method + ": " + 
60               "Major status message: " + 
61               event.data.return_values.errors.major_status_message + 
62               "; Minor status message: " + 
63               event.data.return_values.errors.minor_status_message;
64             this.error(
65               event.data.return_values.major_status,
66               event.data.return_values.minor_status, 
67               errMsg,
68               app_tag);
69         } else {
70             if ("gss_import_name" == method) 
71             { callback(event.data.return_values, app_tag); }
72             // if( "gss_X" == method ) { callback(event.data.return_values.x, app_tag);}
73         }
74     };
75
76     GSSEap.prototype.import_name = function (params) 
77     {
78         /* variables */
79         var nonce;
80         var name = params.name;
81         var name_type = params.name_type || "{1 2 840 113554 1 2 1 4 }";
82         var callback = params.success;
83         var error = params.error || this.error; 
84         var app_tag = params.app_tag || this.appTag;
85
86         /* Erorr checking */
87         // Call an error if we don't have the required parameters.
88         // - name
89         // - success()
90         if ( "undefined" == typeof(name) ||
91              "undefined" == typeof(callback) )
92         {
93           this.error(-1, -1, 
94             "import_name called missing either name or success callback"
95           );
96           return;
97         }
98         
99         nonce = navigator.generateNonce();
100         this.callbacks[nonce] = callback;
101         this.methods[nonce] = "gss_import_name";
102         window.postMessage({
103             "method":"gss_import_name",
104             "arguments":
105             {
106                 "input_name": name,
107                 "input_name_type": name_type
108             },
109             "cookies":
110             {
111                 "navigator_gss_tag": nonce,
112                 "app_tag": app_tag
113             }
114         }, "*");
115         
116     };
117
118     GSSEap.prototype.gss_error = function (major) 
119     {
120         var callingMask;
121         var routineMask;
122         var mask;
123
124         callingMask = 377 << 24;
125         routineMask = 377 << 16;
126         mask = callingMask | routineMask;
127
128         return (0 != (major & mask));
129     };
130     return GSSEap;
131 })();
132
133 navigator.gss_eap = GSSEap;