X-Git-Url: http://www.project-moonshot.org/gitweb/?a=blobdiff_plain;f=chrome%2Fapp%2Fnavigator.gss.js;h=a2ed28c13547416436ecd284b6b2a6d1dd96f2fa;hb=3f9648750b03ba5f10297ff02c13bf9cef37f9c6;hp=fd642d57c1d6537145f1ab95f1001cad4d706776;hpb=a28e9219704108163c9f54d9442839f993686343;p=gssweb.git diff --git a/chrome/app/navigator.gss.js b/chrome/app/navigator.gss.js index fd642d5..a2ed28c 100644 --- a/chrome/app/navigator.gss.js +++ b/chrome/app/navigator.gss.js @@ -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, 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(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":