Change chrome to match the camelCase navigator.gssEap
[gssweb.git] / chrome / app / navigator.gss.js
index 7af3b44..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,13 +42,19 @@ var GSSEap = (function ()
     {
         // Public attributes
         this.version = "0.0.1";
+        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.error = config.error || function (major, minor, error, appTag) {
-            console.warn(error);
-        };
-        window.addEventListener("message", this.dispatch_responses.bind(this));
+        this.default_error = config.error || 
+            function (major, minor, error, appTag) {
+                console.warn(error);
+            };
+        window.addEventListener(
+            "message",
+            this.dispatch_responses.bind(this)
+        );
     }
     GSSEap.prototype.dispatch_responses = function (event) 
     {
@@ -24,20 +62,24 @@ var GSSEap = (function ()
         var nonce;
         var callback;
         var app_tag;
+        var error;
 
         /* 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
-        * - One of my methods matches the nonce in data.cookies.navigator_gss_tag
-        *   and that method matches data.method
+        * - One of my callbacks matches the nonce in
+        *   data.cookies.navigator_gss_tag
+        * - One of my methods matches the nonce in 
+        *   data.cookies.navigator_gss_tag and that method matches
+        *   data.method
         */
         method = event.data.method;
         if (
-             (method != "gss_import_name") ||
-             ("undefined" == typeof (event.data.return_values)) ||
+             ( -1 == this.implemented_methods.indexOf(method) ) ||
+             (  ("undefined" == typeof (event.data.return_values) ) &&
+                ("undefined" == typeof (event.data.error_message) ) ) ||
              ("undefined" == typeof (event.data.cookies)))
         {
             return;
@@ -46,59 +88,186 @@ 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;
         }
 
         // We now know that this message is for us!
         this.callbacks[nonce] = undefined;
         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: " + 
               event.data.return_values.errors.major_status_message + 
               "; Minor status message: " + 
               event.data.return_values.errors.minor_status_message;
-            this.error(
+            error(
               event.data.return_values.major_status,
               event.data.return_values.minor_status, 
               errMsg,
               app_tag);
         } else {
-            if ("gss_import_name" == method) 
-            { callback(event.data.return_values.gss_name, app_tag); }
-            // if( "gss_X" == method ) { callback(event.data.return_values.x, app_tag);}
+            callback(event.data.return_values, app_tag);
         }
     };
 
+
+    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;
-        var error = params.error || this.error; 
+        
+        // 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()
         if ( "undefined" == typeof(name) ||
-             "undefined" == typeof(success) )
+             "undefined" == typeof(callback) )
         {
-          this.error(-1, -1, 
+          error(-1, -1, 
             "import_name called missing either name or success callback"
           );
           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":
@@ -121,8 +290,8 @@ var GSSEap = (function ()
         var routineMask;
         var mask;
 
-        callingMask = 377 << 24;
-        routineMask = 377 << 16;
+        callingMask = 255 << 24;
+        routineMask = 255 << 16;
         mask = callingMask | routineMask;
 
         return (0 != (major & mask));
@@ -130,4 +299,4 @@ var GSSEap = (function ()
     return GSSEap;
 })();
 
-navigator.gss_eap = GSSEap;
+navigator.gssEap = GSSEap;