Change chrome to match the camelCase navigator.gssEap
[gssweb.git] / chrome / app / navigator.gss.js
index 268fa99..432adae 100644 (file)
@@ -1,8 +1,40 @@
-console.log('Loading navigator.gss.js - #7');
-
-/* This file gets injected into the web page verbatim */
+/*
+ * Copyright (c) 2014, JANET(UK)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ *
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ *
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * 3. Neither the name of JANET(UK) nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
+ * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
+ * COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
+ * OF THE POSSIBILITY OF SUCH DAMAGE.
+ *
+ */
 
+console.log('Loading navigator.gss.js - #9');
 
+/* This file gets injected into the web page verbatim */
 
 var GSSEap = (function () 
   {
@@ -10,9 +42,9 @@ var GSSEap = (function ()
     {
         // Public attributes
         this.version = "0.0.1";
-        this.implemented_methods = ["gss_import_name"];
+        this.implemented_methods = ["gss_import_name", "gss_display_name", "gss_init_sec_context", "gss_acquire_cred"];
+       // MRW -- combine success/error callback hashes?
         this.callbacks = {};
-        this.methods = {};
         this.errors = {};
         this.appTag = config.appTag || "";
         this.default_error = config.error || 
@@ -35,7 +67,7 @@ var GSSEap = (function ()
         /* This message is destined for us only if all the following apply:
         * - The data.method_name is one of the methods implemented by this
         *   object
-        * - data.return_values exists
+        * - data.return_values exists or data.error_mssage exists
         * - data.cookies exists
         * - One of my callbacks matches the nonce in
         *   data.cookies.navigator_gss_tag
@@ -46,7 +78,8 @@ var GSSEap = (function ()
         method = event.data.method;
         if (
              ( -1 == this.implemented_methods.indexOf(method) ) ||
-             ("undefined" == typeof (event.data.return_values)) ||
+             (  ("undefined" == typeof (event.data.return_values) ) &&
+                ("undefined" == typeof (event.data.error_message) ) ) ||
              ("undefined" == typeof (event.data.cookies)))
         {
             return;
@@ -55,8 +88,7 @@ var GSSEap = (function ()
         nonce = event.data.cookies.navigator_gss_tag;
         event.data.cookies.navigator_gss_tag = undefined;
         callback = this.callbacks[nonce];
-        if ("undefined" == typeof (callback) || 
-            this.methods[nonce] != method) {
+        if ("undefined" == typeof (callback)) {
             return;
         }
 
@@ -65,7 +97,11 @@ var GSSEap = (function ()
         app_tag = event.data.cookies.app_tag;
         error = this.errors[nonce] || this.default_error;
 
-        if (this.gss_error(event.data.return_values.major_status))
+        if ("undefined" != typeof(event.data.error_message) )
+        {
+            error(-1, -1, "Error parsing message: " + event.data.error_message, app_tag);
+        }
+        else if (this.gss_error(event.data.return_values.major_status))
         {
             var errMsg = "Error during " + method + ": " + 
               "Major status message: " + 
@@ -82,17 +118,133 @@ var GSSEap = (function ()
         }
     };
 
+
+    GSSEap.prototype.init_sec_context = function (params) 
+    {
+        /* variables */
+        // internal variables
+        var nonce;
+        
+        // Required parameters
+        var target_name = params.target_name;
+        var callback = params.success || this.success;
+
+        // Optional & defaulted parameters (some are defaulted at lower layer)
+        var context_handle = params.context_handle;
+        var cred_handle = params.cred_handle; 
+       var mech_type = params.mech_type; 
+       var req_flags = params.req_flags;
+       var time_req = params.time_req;
+       var input_token = params.input_token;
+
+        var error = params.error || this.default_error; 
+        var app_tag = params.app_tag || this.appTag;
+
+        /* Error checking */
+        // Call an error if we don't have the required parameters.
+        // - name
+        // - success()
+        if ( "undefined" == typeof(target_name) ||
+             "undefined" == typeof(callback) )
+        {
+          error(-1, -1, 
+            "init_sec_context called missing either target_name or success callback"
+          );
+          return;
+        }
+        
+        /* Setup */
+        nonce = navigator.generateNonce();
+
+        /* Main processing */
+        // Save our callback, method name, and error function
+        this.callbacks[nonce] = callback;
+        this.errors[nonce] = error;
+        
+        // Now pass the request on to the C code
+        window.postMessage({
+            "method":"gss_init_sec_context",
+            "arguments":
+            {
+                "target_name": target_name,
+               "context_handle": context_handle,
+               "cred_handle": cred_handle,
+               "mech_type": mech_type,
+               "req_flags": req_flags,
+               "time_req": time_req,
+               "input_token": input_token
+               
+            },
+            "cookies":
+            {
+                "navigator_gss_tag": nonce,
+                "app_tag": app_tag
+            }
+        }, "*");
+        
+    };
+
+    GSSEap.prototype.display_name = function(params)
+    {
+        /* Variables */
+        // required parameters
+        var input_name = params.input_name;
+        var callback = params.success;
+
+        if ( "undefined" == typeof(name) ||
+             "undefined" == typeof(callback) )
+        {
+          error(-1, -1, 
+            "import_name called missing either name or success callback"
+          );
+          return;
+        }
+
+        var error = params.error || this.default_error; 
+        var app_tag = params.app_tag || this.appTag;
+        
+        /* Setup */
+        nonce = navigator.generateNonce();
+
+
+        /* Main processing */
+        // Save our callback, method name, and error function
+        this.callbacks[nonce] = callback;
+        this.errors[nonce] = error;
+        
+        // Now pass the request on to the C code
+        window.postMessage({
+            "method":"gss_display_name",
+            "arguments":
+            {
+                "input_name": input_name,
+            },
+            "cookies":
+            {
+                "navigator_gss_tag": nonce,
+                "app_tag": app_tag
+            }
+        }, "*");
+        
+    }
+
     GSSEap.prototype.import_name = function (params) 
     {
         /* variables */
+        // internal variables
         var nonce;
+        
+        // Required parameters
         var name = params.name;
-        var name_type = params.name_type || "{1 2 840 113554 1 2 1 4 }";
         var callback = params.success;
+        
+        // Optional & defaulted parameters
+        var name_type = params.name_type || "{1 2 840 113554 1 2 1 4 }";
         var error = params.error || this.default_error; 
         var app_tag = params.app_tag || this.appTag;
 
-        /* Erorr checking */
+
+        /* Error checking */
         // Call an error if we don't have the required parameters.
         // - name
         // - success()
@@ -104,11 +256,18 @@ var GSSEap = (function ()
           );
           return;
         }
+
         
+        /* Setup */
         nonce = navigator.generateNonce();
+
+
+        /* Main processing */
+        // Save our callback, method name, and error function
         this.callbacks[nonce] = callback;
-        this.methods[nonce] = "gss_import_name";
         this.errors[nonce] = error;
+        
+        // Now pass the request on to the C code
         window.postMessage({
             "method":"gss_import_name",
             "arguments":
@@ -140,4 +299,4 @@ var GSSEap = (function ()
     return GSSEap;
 })();
 
-navigator.gss_eap = GSSEap;
+navigator.gssEap = GSSEap;