Browse Source

数字证书登录

suhanqian 1 year ago
parent
commit
675692ba66

+ 530 - 0
public/json2.js

@@ -0,0 +1,530 @@
+//  json2.js
+//  2017-06-12
+//  Public Domain.
+//  NO WARRANTY EXPRESSED OR IMPLIED. USE AT YOUR OWN RISK.
+
+//  USE YOUR OWN COPY. IT IS EXTREMELY UNWISE TO LOAD CODE FROM SERVERS YOU DO
+//  NOT CONTROL.
+
+//  This file creates a global JSON object containing two methods: stringify
+//  and parse. This file provides the ES5 JSON capability to ES3 systems.
+//  If a project might run on IE8 or earlier, then this file should be included.
+//  This file does nothing on ES5 systems.
+
+//      JSON.stringify(value, replacer, space)
+//          value       any JavaScript value, usually an object or array.
+//          replacer    an optional parameter that determines how object
+//                      values are stringified for objects. It can be a
+//                      function or an array of strings.
+//          space       an optional parameter that specifies the indentation
+//                      of nested structures. If it is omitted, the text will
+//                      be packed without extra whitespace. If it is a number,
+//                      it will specify the number of spaces to indent at each
+//                      level. If it is a string (such as "\t" or " "),
+//                      it contains the characters used to indent at each level.
+//          This method produces a JSON text from a JavaScript value.
+//          When an object value is found, if the object contains a toJSON
+//          method, its toJSON method will be called and the result will be
+//          stringified. A toJSON method does not serialize: it returns the
+//          value represented by the name/value pair that should be serialized,
+//          or undefined if nothing should be serialized. The toJSON method
+//          will be passed the key associated with the value, and this will be
+//          bound to the value.
+
+//          For example, this would serialize Dates as ISO strings.
+
+//              Date.prototype.toJSON = function (key) {
+//                  function f(n) {
+//                      // Format integers to have at least two digits.
+//                      return (n < 10)
+//                          ? "0" + n
+//                          : n;
+//                  }
+//                  return this.getUTCFullYear()   + "-" +
+//                       f(this.getUTCMonth() + 1) + "-" +
+//                       f(this.getUTCDate())      + "T" +
+//                       f(this.getUTCHours())     + ":" +
+//                       f(this.getUTCMinutes())   + ":" +
+//                       f(this.getUTCSeconds())   + "Z";
+//              };
+
+//          You can provide an optional replacer method. It will be passed the
+//          key and value of each member, with this bound to the containing
+//          object. The value that is returned from your method will be
+//          serialized. If your method returns undefined, then the member will
+//          be excluded from the serialization.
+
+//          If the replacer parameter is an array of strings, then it will be
+//          used to select the members to be serialized. It filters the results
+//          such that only members with keys listed in the replacer array are
+//          stringified.
+
+//          Values that do not have JSON representations, such as undefined or
+//          functions, will not be serialized. Such values in objects will be
+//          dropped; in arrays they will be replaced with null. You can use
+//          a replacer function to replace those with JSON values.
+
+//          JSON.stringify(undefined) returns undefined.
+
+//          The optional space parameter produces a stringification of the
+//          value that is filled with line breaks and indentation to make it
+//          easier to read.
+
+//          If the space parameter is a non-empty string, then that string will
+//          be used for indentation. If the space parameter is a number, then
+//          the indentation will be that many spaces.
+
+//          Example:
+
+//          text = JSON.stringify(["e", {pluribus: "unum"}]);
+//          // text is '["e",{"pluribus":"unum"}]'
+
+//          text = JSON.stringify(["e", {pluribus: "unum"}], null, "\t");
+//          // text is '[\n\t"e",\n\t{\n\t\t"pluribus": "unum"\n\t}\n]'
+
+//          text = JSON.stringify([new Date()], function (key, value) {
+//              return this[key] instanceof Date
+//                  ? "Date(" + this[key] + ")"
+//                  : value;
+//          });
+//          // text is '["Date(---current time---)"]'
+
+//      JSON.parse(text, reviver)
+//          This method parses a JSON text to produce an object or array.
+//          It can throw a SyntaxError exception.
+
+//          The optional reviver parameter is a function that can filter and
+//          transform the results. It receives each of the keys and values,
+//          and its return value is used instead of the original value.
+//          If it returns what it received, then the structure is not modified.
+//          If it returns undefined then the member is deleted.
+
+//          Example:
+
+//          // Parse the text. Values that look like ISO date strings will
+//          // be converted to Date objects.
+
+//          myData = JSON.parse(text, function (key, value) {
+//              var a;
+//              if (typeof value === "string") {
+//                  a =
+//   /^(\d{4})-(\d{2})-(\d{2})T(\d{2}):(\d{2}):(\d{2}(?:\.\d*)?)Z$/.exec(value);
+//                  if (a) {
+//                      return new Date(Date.UTC(
+//                         +a[1], +a[2] - 1, +a[3], +a[4], +a[5], +a[6]
+//                      ));
+//                  }
+//                  return value;
+//              }
+//          });
+
+//          myData = JSON.parse(
+//              "[\"Date(09/09/2001)\"]",
+//              function (key, value) {
+//                  var d;
+//                  if (
+//                      typeof value === "string"
+//                      && value.slice(0, 5) === "Date("
+//                      && value.slice(-1) === ")"
+//                  ) {
+//                      d = new Date(value.slice(5, -1));
+//                      if (d) {
+//                          return d;
+//                      }
+//                  }
+//                  return value;
+//              }
+//          );
+
+//  This is a reference implementation. You are free to copy, modify, or
+//  redistribute.
+
+/*jslint
+    eval, for, this
+*/
+
+/*property
+    JSON, apply, call, charCodeAt, getUTCDate, getUTCFullYear, getUTCHours,
+    getUTCMinutes, getUTCMonth, getUTCSeconds, hasOwnProperty, join,
+    lastIndex, length, parse, prototype, push, replace, slice, stringify,
+    test, toJSON, toString, valueOf
+*/
+
+
+// Create a JSON object only if one does not already exist. We create the
+// methods in a closure to avoid creating global variables.
+
+if (typeof JSON !== "object") {
+    JSON = {};
+}
+
+(function () {
+    "use strict";
+
+    var rx_one = /^[\],:{}\s]*$/;
+    var rx_two = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g;
+    var rx_three = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g;
+    var rx_four = /(?:^|:|,)(?:\s*\[)+/g;
+    var rx_escapable = /[\\"\u0000-\u001f\u007f-\u009f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+    var rx_dangerous = /[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g;
+
+    function f(n) {
+        // Format integers to have at least two digits.
+        return (n < 10)
+            ? "0" + n
+            : n;
+    }
+
+    function this_value() {
+        return this.valueOf();
+    }
+
+    if (typeof Date.prototype.toJSON !== "function") {
+
+        Date.prototype.toJSON = function () {
+
+            return isFinite(this.valueOf())
+                ? (
+                    this.getUTCFullYear()
+                    + "-"
+                    + f(this.getUTCMonth() + 1)
+                    + "-"
+                    + f(this.getUTCDate())
+                    + "T"
+                    + f(this.getUTCHours())
+                    + ":"
+                    + f(this.getUTCMinutes())
+                    + ":"
+                    + f(this.getUTCSeconds())
+                    + "Z"
+                )
+                : null;
+        };
+
+        Boolean.prototype.toJSON = this_value;
+        Number.prototype.toJSON = this_value;
+        String.prototype.toJSON = this_value;
+    }
+
+    var gap;
+    var indent;
+    var meta;
+    var rep;
+
+
+    function quote(string) {
+
+// If the string contains no control characters, no quote characters, and no
+// backslash characters, then we can safely slap some quotes around it.
+// Otherwise we must also replace the offending characters with safe escape
+// sequences.
+
+        rx_escapable.lastIndex = 0;
+        return rx_escapable.test(string)
+            ? "\"" + string.replace(rx_escapable, function (a) {
+                var c = meta[a];
+                return typeof c === "string"
+                    ? c
+                    : "\\u" + ("0000" + a.charCodeAt(0).toString(16)).slice(-4);
+            }) + "\""
+            : "\"" + string + "\"";
+    }
+
+
+    function str(key, holder) {
+
+// Produce a string from holder[key].
+
+        var i;          // The loop counter.
+        var k;          // The member key.
+        var v;          // The member value.
+        var length;
+        var mind = gap;
+        var partial;
+        var value = holder[key];
+
+// If the value has a toJSON method, call it to obtain a replacement value.
+
+        if (
+            value
+            && typeof value === "object"
+            && typeof value.toJSON === "function"
+        ) {
+            value = value.toJSON(key);
+        }
+
+// If we were called with a replacer function, then call the replacer to
+// obtain a replacement value.
+
+        if (typeof rep === "function") {
+            value = rep.call(holder, key, value);
+        }
+
+// What happens next depends on the value's type.
+
+        switch (typeof value) {
+        case "string":
+            return quote(value);
+
+        case "number":
+
+// JSON numbers must be finite. Encode non-finite numbers as null.
+
+            return (isFinite(value))
+                ? String(value)
+                : "null";
+
+        case "boolean":
+        case "null":
+
+// If the value is a boolean or null, convert it to a string. Note:
+// typeof null does not produce "null". The case is included here in
+// the remote chance that this gets fixed someday.
+
+            return String(value);
+
+// If the type is "object", we might be dealing with an object or an array or
+// null.
+
+        case "object":
+
+// Due to a specification blunder in ECMAScript, typeof null is "object",
+// so watch out for that case.
+
+            if (!value) {
+                return "null";
+            }
+
+// Make an array to hold the partial results of stringifying this object value.
+
+            gap += indent;
+            partial = [];
+
+// Is the value an array?
+
+            if (Object.prototype.toString.apply(value) === "[object Array]") {
+
+// The value is an array. Stringify every element. Use null as a placeholder
+// for non-JSON values.
+
+                length = value.length;
+                for (i = 0; i < length; i += 1) {
+                    partial[i] = str(i, value) || "null";
+                }
+
+// Join all of the elements together, separated with commas, and wrap them in
+// brackets.
+
+                v = partial.length === 0
+                    ? "[]"
+                    : gap
+                        ? (
+                            "[\n"
+                            + gap
+                            + partial.join(",\n" + gap)
+                            + "\n"
+                            + mind
+                            + "]"
+                        )
+                        : "[" + partial.join(",") + "]";
+                gap = mind;
+                return v;
+            }
+
+// If the replacer is an array, use it to select the members to be stringified.
+
+            if (rep && typeof rep === "object") {
+                length = rep.length;
+                for (i = 0; i < length; i += 1) {
+                    if (typeof rep[i] === "string") {
+                        k = rep[i];
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (
+                                (gap)
+                                    ? ": "
+                                    : ":"
+                            ) + v);
+                        }
+                    }
+                }
+            } else {
+
+// Otherwise, iterate through all of the keys in the object.
+
+                for (k in value) {
+                    if (Object.prototype.hasOwnProperty.call(value, k)) {
+                        v = str(k, value);
+                        if (v) {
+                            partial.push(quote(k) + (
+                                (gap)
+                                    ? ": "
+                                    : ":"
+                            ) + v);
+                        }
+                    }
+                }
+            }
+
+// Join all of the member texts together, separated with commas,
+// and wrap them in braces.
+
+            v = partial.length === 0
+                ? "{}"
+                : gap
+                    ? "{\n" + gap + partial.join(",\n" + gap) + "\n" + mind + "}"
+                    : "{" + partial.join(",") + "}";
+            gap = mind;
+            return v;
+        }
+    }
+
+// If the JSON object does not yet have a stringify method, give it one.
+
+    if (typeof JSON.stringify !== "function") {
+        meta = {    // table of character substitutions
+            "\b": "\\b",
+            "\t": "\\t",
+            "\n": "\\n",
+            "\f": "\\f",
+            "\r": "\\r",
+            "\"": "\\\"",
+            "\\": "\\\\"
+        };
+        JSON.stringify = function (value, replacer, space) {
+
+// The stringify method takes a value and an optional replacer, and an optional
+// space parameter, and returns a JSON text. The replacer can be a function
+// that can replace values, or an array of strings that will select the keys.
+// A default replacer method can be provided. Use of the space parameter can
+// produce text that is more easily readable.
+
+            var i;
+            gap = "";
+            indent = "";
+
+// If the space parameter is a number, make an indent string containing that
+// many spaces.
+
+            if (typeof space === "number") {
+                for (i = 0; i < space; i += 1) {
+                    indent += " ";
+                }
+
+// If the space parameter is a string, it will be used as the indent string.
+
+            } else if (typeof space === "string") {
+                indent = space;
+            }
+
+// If there is a replacer, it must be a function or an array.
+// Otherwise, throw an error.
+
+            rep = replacer;
+            if (replacer && typeof replacer !== "function" && (
+                typeof replacer !== "object"
+                || typeof replacer.length !== "number"
+            )) {
+                throw new Error("JSON.stringify");
+            }
+
+// Make a fake root object containing our value under the key of "".
+// Return the result of stringifying the value.
+
+            return str("", {"": value});
+        };
+    }
+
+
+// If the JSON object does not yet have a parse method, give it one.
+
+    if (typeof JSON.parse !== "function") {
+        JSON.parse = function (text, reviver) {
+
+// The parse method takes a text and an optional reviver function, and returns
+// a JavaScript value if the text is a valid JSON text.
+
+            var j;
+
+            function walk(holder, key) {
+
+// The walk method is used to recursively walk the resulting structure so
+// that modifications can be made.
+
+                var k;
+                var v;
+                var value = holder[key];
+                if (value && typeof value === "object") {
+                    for (k in value) {
+                        if (Object.prototype.hasOwnProperty.call(value, k)) {
+                            v = walk(value, k);
+                            if (v !== undefined) {
+                                value[k] = v;
+                            } else {
+                                delete value[k];
+                            }
+                        }
+                    }
+                }
+                return reviver.call(holder, key, value);
+            }
+
+
+// Parsing happens in four stages. In the first stage, we replace certain
+// Unicode characters with escape sequences. JavaScript handles many characters
+// incorrectly, either silently deleting them, or treating them as line endings.
+
+            text = String(text);
+            rx_dangerous.lastIndex = 0;
+            if (rx_dangerous.test(text)) {
+                text = text.replace(rx_dangerous, function (a) {
+                    return (
+                        "\\u"
+                        + ("0000" + a.charCodeAt(0).toString(16)).slice(-4)
+                    );
+                });
+            }
+
+// In the second stage, we run the text against regular expressions that look
+// for non-JSON patterns. We are especially concerned with "()" and "new"
+// because they can cause invocation, and "=" because it can cause mutation.
+// But just to be safe, we want to reject all unexpected forms.
+
+// We split the second stage into 4 regexp operations in order to work around
+// crippling inefficiencies in IE's and Safari's regexp engines. First we
+// replace the JSON backslash pairs with "@" (a non-JSON character). Second, we
+// replace all simple value tokens with "]" characters. Third, we delete all
+// open brackets that follow a colon or comma or that begin the text. Finally,
+// we look to see that the remaining characters are only whitespace or "]" or
+// "," or ":" or "{" or "}". If that is so, then the text is safe for eval.
+
+            if (
+                rx_one.test(
+                    text
+                        .replace(rx_two, "@")
+                        .replace(rx_three, "]")
+                        .replace(rx_four, "")
+                )
+            ) {
+
+// In the third stage we use the eval function to compile the text into a
+// JavaScript structure. The "{" operator is subject to a syntactic ambiguity
+// in JavaScript: it can begin a block or an object literal. We wrap the text
+// in parens to eliminate the ambiguity.
+
+                j = eval("(" + text + ")");
+
+// In the optional fourth stage, we recursively walk the new structure, passing
+// each name/value pair to a reviver function for possible transformation.
+
+                return (typeof reviver === "function")
+                    ? walk({"": j}, "")
+                    : j;
+            }
+
+// If the text is not JSON parseable, then a SyntaxError is thrown.
+
+            throw new SyntaxError("JSON.parse");
+        };
+    }
+}());

+ 201 - 0
public/onenethelper.ie.js

@@ -0,0 +1,201 @@
+function onenet_guid()
+{
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+        return v.toString(16);
+    });
+    
+}
+
+function InitCmdMsg(action, data)
+{
+	var msg = {};
+	msg['logid'] = onenet_guid();
+	msg['action'] = action; 
+	msg['data'] = data;
+	return msg;
+}
+	
+
+var oneNetHelper_activex=new Object();
+oneNetHelper_activex.isAvailable = false;
+oneNetHelper_activex.IsAddonAvailable = function ()
+	{
+		if(!oneNetHelper_activex.isAvailable)
+		{
+			oneNetHelper_activex.isAvailable = (AuthClientCtrl)? true : false;
+			if(oneNetHelper_activex.isAvailable)
+			{
+				try
+				{			
+					AuthClientCtrl.Test();
+				}
+				catch(e)
+				{
+					oneNetHelper_activex.isAvailable = false;
+					alert("AuthClientCtrl.Test失败!");
+				}	
+			}
+			else
+			{
+				alert("加载AuthClientCtrl 对象失败!");
+			}
+		}
+		
+		
+		return oneNetHelper_activex.isAvailable;
+	}
+	
+oneNetHelper_activex.AddonAvailableNotify = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			resp['addon']=oneNetHelper_activex.isAvailable;
+			notify_web(resp);	
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetUASToken = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			AuthClientCtrl.GetUASToken();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['token'] = AuthClientCtrl.bstrUASToken;
+			resp['expiredate'] = AuthClientCtrl.bstrUASExpireDate;		
+			notify_web(resp);	
+		}, 0);
+	}	
+
+oneNetHelper_activex.GetUserInfo = function (notify_web)
+	{		
+		setTimeout(function (){
+			var resp = {};		
+			AuthClientCtrl.GetUserInfo();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['userid'] = AuthClientCtrl.bstrUserID;
+			resp['username'] = AuthClientCtrl.bstrUserName;
+			resp['certuserid'] = AuthClientCtrl.bstrCertUserID;
+			resp['certusername'] = AuthClientCtrl.bstrCertUserName;
+			resp['authresult'] = AuthClientCtrl.lAuthResult;
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetSignAndToken = function (randomnum, notify_web)
+	{
+		setTimeout(function (){
+			var hostname = location.hostname;
+			var msg = InitCmdMsg("GetSignAndToken", randomnum);
+			msg['appServerAddr'] = hostname;
+			var resp = {};	
+			AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+			var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+			resp = obj.info;
+			/*说明:1.针对老版本客户端底层未处理GetSignAndToken action方式,再次调用原接口获取令牌;
+					2.若提示AuthClientCtrl未定义JsonActionCmdDeal方法,则直接使用GetSignAndToken方法*/
+			if(resp['ret'] == -2003)
+			{
+				AuthClientCtrl.GetSignAndToken(randomnum);
+				resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+				resp['errinfo'] = AuthClientCtrl.bstrError;	
+				resp['signandtoken'] = AuthClientCtrl.bstrSignValAndToken;	
+			}
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetUserCertInfo = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};		
+			AuthClientCtrl.GetUserCertInfo();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['DNStringAll'] = AuthClientCtrl.bstrUserCertInfoValue('DNStringAll');
+			resp['UserName'] = AuthClientCtrl.bstrUserCertInfoValue('UserName');
+			resp['UserID'] = AuthClientCtrl.bstrUserCertInfoValue('UserID');
+			resp['DNCode'] = AuthClientCtrl.bstrUserCertInfoValue('DNCode');
+			resp['DisName'] = AuthClientCtrl.bstrUserCertInfoValue('DisName');
+			resp['UniqueId'] = AuthClientCtrl.bstrUserCertInfoValue('UniqueId');
+			resp['IssuerDisName'] = AuthClientCtrl.bstrUserCertInfoValue('IssuerDisName');
+			resp['CertSerial'] = AuthClientCtrl.bstrUserCertInfoValue('CertSerial');
+			resp['EMail'] = AuthClientCtrl.bstrUserCertInfoValue('EMail');
+			resp['Org'] = AuthClientCtrl.bstrUserCertInfoValue('Org');
+			resp['OrgUnit'] = AuthClientCtrl.bstrUserCertInfoValue('OrgUnit');
+			resp['City'] = AuthClientCtrl.bstrUserCertInfoValue('City');
+			resp['State'] = AuthClientCtrl.bstrUserCertInfoValue('State');
+			resp['Descption'] = AuthClientCtrl.bstrUserCertInfoValue('Descption');
+			resp['Version'] = AuthClientCtrl.bstrUserCertInfoValue('Version');
+			resp['BeginTime'] = AuthClientCtrl.bstrUserCertInfoValue('BeginTime');
+			resp['EndTime'] = AuthClientCtrl.bstrUserCertInfoValue('EndTime');
+			//resp['authresult'] = AuthClientCtrl.lAuthResult;
+			notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_activex.Login = function (appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+	{
+		alert("Login IE插件未实现");
+	}
+
+oneNetHelper_activex.ChangeUKeyPin = function (old_key_pin,new_key_pin,notify_web)
+	{
+		alert("ChangeUKeyPin IE插件未实现");
+	}
+
+oneNetHelper_activex.SSLUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("SSLUsbKeyLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.SSLUserPwdLogin = function (appToken,gw_id,username,userpwd,notify_web)
+	{
+		alert("SSLUserPwdLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.IPSecUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("IPSecUsbKeyLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.Logout = function (appToken,notify_web)
+	{
+		alert("Logout IE插件未实现");
+	}
+	
+oneNetHelper_activex.QuerySecPortalStatus = function (appToken,notify_web)
+	{
+		alert("QuerySecPortalStatus IE插件未实现");
+	}
+	
+oneNetHelper_activex.HeartBeat = function (appToken,notify_web)
+	{
+		alert("HeartBeat IE插件未实现");
+	}
+	
+oneNetHelper_activex.GetGateWayAddrList = function (notify_web)
+	{
+		setTimeout(function (){
+		var msg = InitCmdMsg("GetGateWayAddrList", "");	
+		var resp = {};	
+		AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+		var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+		resp = obj.info;
+		notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_activex.JsonActionTestCmdDeal = function (notify_web)
+	{
+		setTimeout(function (){
+		var msg = InitCmdMsg("testAction", "");	
+		var resp = {};	
+		AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+		var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+		resp = obj.info;
+		notify_web(resp);
+		}, 0);
+	}

+ 92 - 0
public/onenethelper.js

@@ -0,0 +1,92 @@
+var onenetHelperInit = new Object();
+var oneNetHelper;
+onenetHelperInit.Init = function () {
+	var IsIE = (!!window.ActiveXObject || "ActiveXObject" in window) ? true : false;
+	if (IsIE){
+		oneNetHelper = oneNetHelper_activex;
+	}
+	else {
+		var brs = getBrowserType();
+		if (brs == "qax" || brs == "uos") {
+			oneNetHelper = oneNetHelper_np;
+		}
+		else if (brs == "chrome") {
+			if (isLinux()) {
+				oneNetHelper = oneNetHelper_np;
+			}
+			else {
+				oneNetHelper = oneNetHelper_webext;
+			}
+		}
+		else {
+			oneNetHelper = oneNetHelper_webext;
+		}
+	}
+}
+
+/***
+ * 获取当前浏览器类型
+ */
+function getBrowserType() {
+    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
+    var isOpera = userAgent.indexOf("Opera") > -1;
+    if (isOpera) { //判断是否Opera浏览器
+        return "opera";
+    }
+	if (userAgent.indexOf("Firefox/31") > -1) { //判断是否Firefox浏览器
+        return "uos";
+    }
+	if (userAgent.indexOf("Firefox") > -1) { //判断是否Firefox浏览器
+        return "firefox";
+    }
+    if (userAgent.indexOf("Chrome") > -1) {
+		var bsrt = getShellerType();
+		if (bsrt == "") {
+			return "chrome";
+		} else {
+			return bsrt;
+		} 
+    }
+    if (userAgent.indexOf("Safari") > -1) { //判断是否Safari浏览器
+        return "safari";
+    }
+    if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) { //判断是否IE浏览器
+        return "ie";
+    }
+	return "";
+}
+
+function getShellerType() {
+	var brwType = "",
+		userAgent = window.navigator.userAgent,
+		external = window.external;
+
+	if(external && 'SEVersion' in external) { // 搜狗浏览器
+		brwType = 'sougou';
+	} else if(external && 'LiebaoGetVersion' in external) { // 猎豹浏览器
+		brwType = 'liebao';
+	} else if(/QQBrowser/.test(userAgent)) { //qq浏览器
+		brwType = 'qq';
+	} else if(/Maxthon/.test(userAgent)) { //遨游浏览器
+		brwType = 'maxthon';
+	} else if(/TaoBrowser/.test(userAgent)) { //淘宝浏览器
+		brwType = 'taobao';
+	} else if(/BIDUBrowser/.test(userAgent)) { //百度浏览器
+		brwType = 'baidu';
+	} else if(/UBrowser/.test(userAgent)) { //UC浏览器
+		brwType = 'uc';
+	} else if(/Qaxbrowser/.test(userAgent)) { //奇安信浏览器
+		brwType = 'qax';
+	} else if(/UOS/.test(userAgent)) { //uos浏览器
+		brwType = 'uos';
+	}
+	return brwType;
+}
+
+function isLinux() {
+	var userAgent = navigator.userAgent;
+	if(userAgent.indexOf('Linux') > -1) {
+		return true;
+	}
+	return false;
+}

+ 160 - 0
public/onenethelper.np.js

@@ -0,0 +1,160 @@
+var oneNetHelper_np=new Object();
+oneNetHelper_np.isAvailable = false;
+oneNetHelper_np.IsAddonAvailable = function ()
+	{
+		if(!oneNetHelper_np.isAvailable)
+		{
+			oneNetHelper_np.isAvailable = (plugin) ? true : false;
+			if(oneNetHelper_np.isAvailable)
+			{
+				try
+				{			
+					//AuthClientCtrl.Test();
+				}
+				catch(e)
+				{
+					alert("plugin.Test失败!");
+				}	
+			}
+			else
+			{
+				alert("加载plugin 对象失败!");
+			}
+		}
+		
+		
+		return oneNetHelper_np.isAvailable;
+	}
+	
+oneNetHelper_np.AddonAvailableNotify = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			resp['addon']=oneNetHelper_np.IsAddonAvailable();
+			notify_web(resp);	
+		}, 0);
+	}
+	
+oneNetHelper_np.GetUASToken = function (notify_web)
+	{
+		alert("GetUASToken np插件未实现");
+	}	
+
+oneNetHelper_np.GetUserInfo = function (notify_web)
+	{	
+		var msg = {};
+		msg['logid'] = 'GetUserInfo';
+		msg['action'] = 'UIGetUserInfo'; 
+		msg['data'] = "";
+		var req = JSON.stringify(msg);
+		
+		setTimeout(function (){
+			var resp = {};
+			var outStr = plugin.HandleJsonReq(req);
+			resp = JSON.parse(outStr);
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_np.GetSignAndToken = function (randomnum, notify_web)
+	{
+		/*1.调整np插件获取令牌的anction为GetSignAndToken,保持与非np插件一致;
+		  2.同时为兼容旧版本客户端,当outStr为空时,需调用action UIGetSignAndToken*/
+		var msg = {};
+		var hostname = location.hostname;
+		msg['logid'] = 'GetSignAndToken';
+		msg['action'] = 'GetSignAndToken'; 
+		msg['data'] = randomnum;
+		msg['appServerAddr'] = hostname;
+		var req = JSON.stringify(msg);		
+		setTimeout(function (){
+			var resp = {};		
+			var outStr = plugin.HandleJsonReq(req);
+			if(outStr != '{}')
+			{
+				resp = JSON.parse(outStr);
+				notify_web(resp);
+			}
+			else
+			{
+				msg['action'] = 'UIGetSignAndToken'; 
+				req = JSON.stringify(msg);	
+				outStr = plugin.HandleJsonReq(req);
+				resp = JSON.parse(outStr);
+				notify_web(resp);
+			}
+			
+		}, 0);
+	}
+	
+oneNetHelper_np.GetUserCertInfo = function (notify_web)
+	{
+		var msg = {};
+		msg['logid'] = 'UIGetCertInfo';
+		msg['action'] = 'UIGetCertInfo'; 
+		msg['data'] = "";
+		var req = JSON.stringify(msg);
+		
+		setTimeout(function (){
+			var resp = {};	
+			var outStr = plugin.HandleJsonReq(req);
+			resp = JSON.parse(outStr);
+			notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_np.Login = function (appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+	{
+		alert("Login np插件未实现");
+	}
+
+oneNetHelper_np.SSLUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("SSLUsbKeyLogin np插件未实现");
+	}
+	
+oneNetHelper_np.SSLUserPwdLogin = function (appToken,gw_id,username,userpwd,notify_web)
+	{
+		alert("SSLUserPwdLogin np插件未实现");
+	}
+	
+oneNetHelper_np.IPSecUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("IPSecUsbKeyLogin np插件未实现");
+	}
+	
+oneNetHelper_np.Logout = function (appToken,notify_web)
+	{
+		alert("Logout np插件未实现");
+	}
+	
+oneNetHelper_np.QuerySecPortalStatus = function (appToken,notify_web)
+	{
+		alert("QuerySecPortalStatus np插件未实现");
+	}
+	
+oneNetHelper_np.HeartBeat = function (appToken,notify_web)
+	{
+		alert("HeartBeat np插件未实现");
+	}
+	
+oneNetHelper_np.GetWebServiceAddr = function (notify_web)
+	{
+		alert("GetWebServiceAddr np插件未实现");
+	}
+	
+oneNetHelper_np.GetGateWayAddrList = function (notify_web)
+{
+	var msg = {};
+	msg['logid'] = 'GetGateWayAddrList';
+	msg['action'] = 'GetGateWayAddrList'; 
+	msg['data'] = "";
+	var req = JSON.stringify(msg);
+	
+	setTimeout(function (){
+		var resp = {};		
+		var outStr = plugin.HandleJsonReq(req);
+		resp = JSON.parse(outStr);
+		notify_web(resp);
+	}, 0);
+}

+ 324 - 0
public/onenethelper.webext.js

@@ -0,0 +1,324 @@
+function vLog(msg)
+{
+	var args = Array.prototype.slice.call(arguments); 
+  	args.unshift('[onenet]');
+  	console.log.apply(console, args);
+}
+
+function onenet_guid()
+{
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+        return v.toString(16);
+    });
+    
+}
+
+
+class COneNetHelper{
+	constructor()
+	{
+		this.name = 'OneNet';
+		this.mCmdCbMap = new Map();
+		this.evtReqName = 'EventOneNetHost';
+		this.evtRespName = 'EventOneNetWeb';
+		this.type = 'OneNetReqBg';
+		this.msgGetUserInfo = 'GetUserInfo';
+		this.msgGetSignAndToken = 'GetSignAndToken';
+		this.msgGetUserCertInfo = 'GetUserCertInfo';
+		this.msgLogin ='Login';
+		this.msgLogout ='Logout';
+		this.msgQuerySecPortalStatus = 'QuerySecPortalStatus';
+		this.msgHeartBeat = 'HeartBeat';
+		this.msgGetGateWayAddrList = 'GetGateWayAddrList';
+		this.msgCheckExtensionInstalled = 'ExtensionInstalled';
+		this.msgGetUASToken = 'GetUASToken';
+		this.msgChangeUKeyPin = 'ChangeUKeyPin';
+		this.msgTestAction = 'testAction';		
+		this.isInstalled = 0;
+		this.timeout = 30000;
+        
+        this.AddonAvailableNotifyCB;
+        
+	}
+
+	InsertCmdCBHandler(msg, webCB)
+	{
+		var that=this;
+		this.mCmdCbMap.set(msg['logid'], webCB);
+		setTimeout(function (){	
+			var resp = msg;
+			var cb = that.mCmdCbMap.get(resp.logid);
+			if( cb !== undefined)
+			{
+				that.DeleteCmdCBHandler(resp);
+				if(cb == that.AddonAvailableNotifyCB)
+				{
+					that.isInstalled = 0;
+					resp['addon']=that.isInstalled;
+				}
+				else
+				{
+					resp['ret'] = 0;
+					resp['errinfo'] = 'timeout';					
+				}
+				webCB(resp);
+			}
+		}, that.timeout);
+	}
+	
+	DeleteCmdCBHandler(obj)
+	{
+		this.mCmdCbMap.delete(obj.logid);
+	}
+	
+	InitCmdMsg(action, data)
+	{
+		var msg = {};
+		if(action == this.msgCheckExtensionInstalled)
+		{
+			msg['logid'] = action;
+		}
+		else
+		{
+			msg['logid'] = onenet_guid();
+		}
+		msg['action'] = action; 
+		msg['data'] = data;
+		return msg;
+	}
+
+	SendCustomCmd(msg,webCB)
+	{
+		if(msg['action'] === undefined)
+		{			
+			vLog('CallEx() action error: ' + msg);
+			return;
+		}
+
+		if(msg['data'] === undefined)
+		{
+			msg['data']="";
+		}		
+		var tmpmsg = this.InitCmdMsg(msg['action'], msg['data']);
+		this.InsertCmdCBHandler(tmpmsg, webCB);
+		this.BgRequest(tmpmsg);
+	}
+	
+	GetUASToken(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUASToken, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+
+	GetUserInfo(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUserInfo, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+
+	GetSignAndToken(randomnum, notify_web)
+	{	
+		var hostname = location.hostname;
+		vLog('GetSignAndToken: ' + hostname);
+		var msg = this.InitCmdMsg(this.msgGetSignAndToken, randomnum);
+		msg['appServerAddr'] = hostname; 
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	GetUserCertInfo(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUserCertInfo, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+    Login(appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+    {
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] = username;        
+		msg['password'] = userpwd;
+		msg['authtype']= authtype; 
+       	msg['svctype']= svctype; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }	
+
+	ChangeUKeyPin(old_key_pin,new_key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgChangeUKeyPin, "");
+		msg['oldpin'] = old_key_pin;
+		msg['newpin'] = new_key_pin; 
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+	SSLUsbKeyLogin(appToken,gw_id,key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] ="";        
+		msg['password'] =key_pin;
+		msg['authtype']= "1"; 
+       	msg['svctype']= "1"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+    
+	SSLUserPwdLogin(appToken,gw_id,username,userpwd,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] =username;        
+		msg['password'] =userpwd;
+		msg['authtype']= "2"; 
+       	msg['svctype']= "1"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+	IPSecUsbKeyLogin(appToken,gw_id,key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] ="";        
+		msg['password'] =key_pin;
+		msg['authtype']= "1"; 
+       	msg['svctype']= "2"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+    Logout(appToken,notify_web)
+    {
+        var msg = this.InitCmdMsg(this.msgLogout, "");
+		msg['token'] = appToken;    
+       	this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);            
+    }
+
+	QuerySecPortalStatus(appToken,notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgQuerySecPortalStatus, "");
+		msg['token'] = appToken;
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	HeartBeat(appToken,notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgHeartBeat, "");
+		msg['token'] = appToken;
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	GetGateWayAddrList(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetGateWayAddrList, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+    
+	JsonActionTestCmdDeal(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgTestAction, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	IsAddonAvailable()
+	{
+		return this.isInstalled;
+	}
+	
+	AddonAvailableNotify(notify_web)
+	{		
+		if( notify_web === undefined)
+		{
+			alert('AddonAvailableNotify no set notify_web callback!');
+			return;
+		}
+		
+		this.AddonAvailableNotifyCB=notify_web;
+		var msg = this.InitCmdMsg(this.msgCheckExtensionInstalled, "");   
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);	
+	}	
+
+	BgRespone(msg)
+	{
+		vLog('BgRespone() rcv:' + msg);
+		var obj = JSON.parse(msg);
+		
+		if(obj.action == this.msgCheckExtensionInstalled)
+		{
+			if(this.AddonAvailableNotifyCB !== undefined)
+			{
+				obj['logid'] = this.msgCheckExtensionInstalled;
+			}
+		    else
+			{
+				this.isInstalled = 1;
+				return;
+			}
+		}
+
+		//var call = this.mCmdCbMap.get(obj.action);
+		var cb = this.mCmdCbMap.get(obj.logid);
+		if( cb !== undefined)
+		{
+			this.DeleteCmdCBHandler(obj);
+			if(obj.action == this.msgCheckExtensionInstalled)
+			{
+				this.isInstalled = 1;
+				obj['addon'] = this.isInstalled;
+				this.AddonAvailableNotifyCB(obj);
+			}
+			else
+			{
+				cb(obj.info);
+			}
+		}
+		else
+		{
+			vLog('OneNetHelper BgRespone() action error: ' + obj.action);
+		}
+	}
+	
+	BgRequest(msg)
+	{		
+		var that=this;
+		if(this.isInstalled == 1 || msg['action'] == this.msgCheckExtensionInstalled)
+		{
+			vLog('OneNetHelper BgRequest() send:' + JSON.stringify(msg));
+			var evt = window.top.document.createEvent("CustomEvent");  
+			evt.initCustomEvent(this.evtReqName, true, false, msg);	
+			window.top.document.dispatchEvent(evt);
+		}
+		else
+		{
+			vLog('OneNetHelper BgRequest() err: oneNetHelper extension current is not available;' + JSON.stringify(msg));
+            
+            this.DeleteCmdCBHandler(msg.logid);
+			
+		}
+	}
+}
+
+var oneNetHelper_webext=new COneNetHelper();
+
+//OneNetHandle: {"type":"ReqBg", "message":{"action":"GetUserInfo", "data":""}}
+window.top.document.addEventListener(oneNetHelper_webext.evtRespName, function(evt) 
+{
+	vLog('addEventListener::EventOneNetWeb():' + evt.detail);
+	oneNetHelper_webext.BgRespone(evt.detail);
+}, false);

+ 826 - 0
public/onenettest.html

@@ -0,0 +1,826 @@
+<!DOCTYPE html>
+<html>
+<head>
+<!--meta charset="utf-8"-->
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+<style>
+	form  { display: table;      }
+	p     { display: table-row;  }
+	label { display: table-cell; }
+	input { display: table-cell; }
+	h1{ color:red;}
+	h2{ color:red;}
+</style>
+<!-- <title>Onenet插件测试页面</title> -->
+
+<!-- <h1>重要提示:</h1>
+<h2>请不要直接在本地打开onenettest.html进行测试,这样会导致调用onenethelper.js的接口失败</h2>
+<h2>一定要将demo目录下的文件,放置到web服务器中,通过浏览器访问的方式进行测试。</h2>
+<h2>各个接口的详细说明,请务必参考《【非密】卫士通安全网关V4.0接口开发手册.pdf》</h2> -->
+
+
+<!-- (1) 可选 , 针对IE浏览器 申明引用ActiveX 对象(如果业务系统不需要支持IE浏览器,可以不引用ActiveX对象) -->
+<object id="AuthClientCtrl" classid="clsid:C966EBD9-49E9-4E9C-B854-270861C58382" width="0" height="0"></object> 
+<!-- 可选 , 针对奇安信浏览器 引用plugin 对象 --> 
+<object id="plugin" type="application/onenet-plugin" width="0" height="0"></object>
+<!-- 可选 , 针对老版本IE浏览器 兼容模式不支持json的情况下,引用json2.js,解决json 解析问题。(如果业务系统不需要支持IE浏览器,可以不引用) -->
+<script type="text/javascript" src="json2.js"></script> 
+<!-- (2)引入onenethelper浏览器插件的js文件,总共四个文件 -->
+
+<script type="text/javascript" src="onenethelper.webext.js"></script>
+<script type="text/javascript" src="onenethelper.np.js"></script> 
+<script type="text/javascript" src="onenethelper.ie.js"></script>  
+<script type="text/javascript" src="onenethelper.js"></script>   
+
+</head>
+ 
+<body>
+<script src="./axios.min.js"></script>
+<script>
+//(3) 初始化onenethelper插件
+onenetHelperInit.Init();
+
+//(4) 判断onenethelper插件是否可用
+function IsAddonAvailable()
+{
+	if(oneNetHelper.IsAddonAvailable())
+	{
+		form1.T01.value = "true";
+	}
+	else
+	{	
+		alert("请先安装插件!")
+//(5) 当onenethelper插件不可用时,调用通知接口加载插件
+		oneNetHelper.AddonAvailableNotify(AddonAvailableCb);
+	}
+}
+
+function AddonAvailableCb(ob)
+{  
+	form1.T01.value=ob.addon;
+}
+
+
+function ClearAddonStatusButton()
+{
+	form1.T01.value = "";
+}
+
+//(6)以下为具体的业务调用。
+function GetUserInfoCb(ob)
+{
+	//console.log('GetUserInfoCb return :' + JSON.stringify(ob));
+	form1.T6.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T1.value=ob.authresult;
+		form1.T2.value=ob.userid;
+	    form1.T3.value=ob.username;
+		form1.T4.value=ob.certuserid;
+		form1.T5.value=ob.certusername;
+		form1.T7.value="成功";
+	}
+	else
+	{
+		form1.T7.value=ob.errinfo;
+	}	
+}
+
+function GetUserInfoClear()
+{
+	form1.T1.value="";
+	form1.T2.value="";
+    form1.T3.value="";
+	form1.T4.value="";
+    form1.T5.value="";
+	form1.T6.value="";
+	form1.T7.value="";
+}
+
+function GetUserInfo()
+{
+	if(form1.T01.value == "false" || form1.T01.value == 0)
+	{
+		alert("请先安装插件!")
+	}
+	oneNetHelper.GetUserInfo(GetUserInfoCb);
+}
+
+function GetSignAndTokenCb(ob)
+{
+	//console.log('GetSignAndTokenCb return:' + JSON.stringify(ob));
+	form1.T10.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		console.log(ob.signandtoken,'组合令牌')
+		form1.T9.value = ob.signandtoken;//获取组合令牌数据
+		form1.T11.value="成功";
+		axios({
+						method: 'post', //
+						url:' http://127.0.0.1:6006/webservice/verifyIdentityTicket ', // 配制api
+						data: { // 配制参数
+							challenge: form1.T8.value,//随机挑战数
+							identityTicket:form1.T9.value,//组合令牌数据
+							appServerID:'0'//服务器ID
+
+						},
+						headers: {
+
+						}
+					}).then(res => {
+						if(res.expiresIn==7200) {
+
+						}
+					})
+	}
+	else
+	{
+		form1.T11.value=ob.errinfo;
+	}	
+}
+
+function GetSignAndTokenClear()
+{
+	//form1.T8.value="";
+	form1.T9.value="";
+    form1.T10.value="";
+	form1.T11.value="";
+}
+
+function GetSignAndToken()
+{
+	if(form1.T01.value == "false" || form1.T01.value == 0)
+	{
+		alert("请先安装插件!")
+	}
+	if (form1.T8.value == "")
+	{
+		alert("请输入随机数");
+	}
+	else
+	{
+		axios({
+                    method: 'post', //
+                    url:' http://127.0.0.1:6006/webservice/generatorchallenge', // 配制api
+                    data: { // 配制参数
+
+                    },
+                    headers: {
+
+                    }
+                  }).then(res => {
+					if(res.data.code ==0)
+					console.log(res.data.msg,'随机挑战数')
+                    form1.T8.value = res.data.msg//获取随机挑战数
+					oneNetHelper.GetSignAndToken(form1.T8.value, GetSignAndTokenCb);
+                  })
+		
+					
+	}
+}
+
+
+function GetUserCertInfoCb(ob)
+{
+	//console.log('GetUserCertInfoCb  return :' + JSON.stringify(ob));
+	form1.T37.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T39.value=ob.DNStringAll;
+		form1.T21.value=ob.UserName;
+		form1.T22.value=ob.UserID;
+	    form1.T23.value=ob.DNCode;
+		form1.T24.value=ob.DisName;
+		form1.T25.value=ob.UniqueId;
+		form1.T26.value=ob.IssuerDisName;
+		form1.T27.value=ob.CertSerial;
+		form1.T28.value=ob.EMail;
+	    form1.T29.value=ob.Org;
+		form1.T30.value=ob.OrgUnit;
+		form1.T31.value=ob.City;
+		form1.T32.value=ob.State;
+	    form1.T33.value=ob.Descption;
+		form1.T34.value=ob.Version;
+		form1.T35.value=ob.BeginTime;
+		form1.T36.value=ob.EndTime;
+		form1.T38.value="成功";
+	}
+	else
+	{
+		form1.T38.value=ob.errinfo;
+	}	
+}
+
+function GetUserCertInfoClear()
+{
+	form1.T21.value="";
+	form1.T22.value="";
+    form1.T23.value="";
+	form1.T24.value="";
+    form1.T25.value="";
+	form1.T26.value="";
+	form1.T27.value="";
+	form1.T28.value="";
+	form1.T29.value="";
+    form1.T30.value="";
+	form1.T31.value="";
+    form1.T32.value="";
+	form1.T33.value="";
+	form1.T34.value="";
+	form1.T35.value="";
+	form1.T36.value="";
+	form1.T37.value="";
+	form1.T38.value="";
+	form1.T39.value="";
+}
+
+function GetUserCertInfo()
+{
+	if(form1.T01.value == "false" || form1.T01.value == 0)
+	{
+		alert("请先安装插件!")
+	}
+	oneNetHelper.GetUserCertInfo(GetUserCertInfoCb);
+}
+
+//获取统一认证Token的应用举例
+function GetUASTokenCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	if(ob.ret == 1)
+	{
+		form1.S01.value="成功";
+		form1.S02.value=ob.token;
+		form1.S03.value=ob.expiredate;
+	}
+	else
+	{
+		form1.S01.value=ob.errinfo;
+	}
+}
+
+function GetUASToken()
+{
+	oneNetHelper.GetUASToken(GetUASTokenCb);		
+}
+
+function GetUASTokenClear()
+{
+	form1.S01.value="";
+	form1.S02.value="";
+	form1.S03.value="";
+}
+
+function SSLUsbKeyLoginCb(ob)
+{
+	// console.log('SSLUsbKeyLoginCb return :' + JSON.stringify(ob));
+
+	form1.T44.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T45.value="认证成功";
+	}
+	else
+	{
+		form1.T45.value=ob.errinfo;
+	}	
+}
+function SSLUsbKeyLoginClear()
+{
+    form1.T41.value="";
+	form1.T42.value="";
+    form1.T43.value="";
+	form1.T44.value="";
+	form1.T45.value="";
+}
+
+
+function SSLUsbKeyLogin()
+{
+	if (form1.T41.value == ""||form1.T42.value == ""||form1.T43.value == "")
+	{
+		alert("请输入登录参数");
+	}
+	else
+	{
+		oneNetHelper.SSLUsbKeyLogin(form1.T41.value,form1.T42.value,form1.T43.value,SSLUsbKeyLoginCb);
+	}
+}
+
+function SSLUserPwdLoginCb(ob)
+{
+	//console.log('SSLUserPwdLoginCb return :' + JSON.stringify(ob));
+	form1.T50.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T51.value="认证成功";
+	}
+	else
+	{
+		form1.T51.value=ob.errinfo;
+	}	
+}
+function SSLUserPwdLoginClear()
+{
+	form1.T46.value="";
+	form1.T47.value="";
+	form1.T48.value="";
+	form1.T49.value="";
+	form1.T50.value="";
+	form1.T51.value="";
+}
+
+
+function SSLUserPwdLogin()
+{
+	if (form1.T46.value == ""||form1.T47.value == ""||form1.T48.value == ""||form1.T49.value == "")
+	{
+		alert("请输入登录参数");
+	}
+	else
+	{
+		oneNetHelper.SSLUserPwdLogin(form1.T46.value,form1.T47.value,form1.T48.value,form1.T49.value,SSLUserPwdLoginCb);
+	}
+}
+
+function IPSecUsbKeyLoginCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));
+	form1.T55.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T56.value="认证成功";
+	}
+	else
+	{
+		form1.T56.value=ob.errinfo;
+	}	
+}
+function IPSecUsbKeyLoginClear()
+{
+	form1.T52.value="";
+    form1.T53.value="";
+	form1.T54.value="";
+	form1.T55.value="";
+	form1.T56.value="";
+}
+
+function IPSecUsbKeyLogin()
+{
+	if (form1.T52.value == ""||form1.T53.value == ""||form1.T54.value == "")
+	{
+		alert("请输入登录参数");
+	}
+	else
+	{
+		oneNetHelper.IPSecUsbKeyLogin(form1.T52.value,form1.T53.value,form1.T54.value,IPSecUsbKeyLoginCb);
+	}
+}
+
+function LoginCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));
+	form1.T63.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T64.value="认证成功";
+	}
+	else
+	{
+		form1.T64.value=ob.errinfo;
+	}	
+}
+function LoginClear()
+{	
+	form1.T57.value="";
+	form1.T58.value="";
+	form1.T59.value="";
+	form1.T60.value="";
+	form1.T61.value="";
+	form1.T62.value="";
+	form1.T63.value="";
+	form1.T64.value="";
+}
+
+
+function Login()
+{
+	oneNetHelper.Login(form1.T57.value,form1.T58.value,form1.T59.value,form1.T60.value,form1.T61.value,form1.T62.value,LoginCb);
+}
+
+
+function LogoutCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T72.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T73.value="退出成功";
+	}
+	else
+	{
+		form1.T73.value=ob.errinfo;
+	}
+}
+
+function Logout()
+{
+	if (form1.T71.value == "")
+	{
+		alert("请输入登出参数");
+	}
+	else
+	{
+		oneNetHelper.Logout(form1.T71.value, LogoutCb);
+	}
+}
+
+function LogoutClear()
+{
+	form1.T71.value="";
+	form1.T72.value="";
+	form1.T73.value="";
+}
+
+function QuerySecPortalStatusCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T83.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T82.value=ob.AuthEvent;
+		form1.T84.value="成功";
+	}
+	else
+	{
+		form1.T84.value=ob.errinfo;
+	}
+}
+
+function QuerySecPortalStatus()
+{
+	if (form1.T81.value == "")
+	{
+		alert("请输入参数");
+	}
+	else
+	{
+		oneNetHelper.QuerySecPortalStatus(form1.T81.value, QuerySecPortalStatusCb);
+	}
+}
+
+function QuerySecPortalStatusClear()
+{
+	form1.T81.value="";
+	form1.T82.value="";
+	form1.T83.value="";
+	form1.T84.value="";
+}
+
+function HeartBeatCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T92.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T93.value="成功";
+	}
+	else
+	{
+		form1.T93.value=ob.errinfo;
+	}
+}
+
+function HeartBeat()
+{
+	if (form1.T91.value == "")
+	{
+		alert("请输入参数");
+	}
+	else
+	{
+		oneNetHelper.HeartBeat(form1.T91.value, HeartBeatCb);		//oneNetHelper.HeartBeat(form1.T91.value,null);
+	}
+}
+
+function HeartBeatClear()
+{
+	form1.T91.value="";
+	form1.T92.value="";
+	form1.T93.value="";
+}
+
+function ClearAll()
+{
+	GetUserNameClear();
+	GetSignAndTokenClear();
+	GetUserCertInfoClear();
+	LoginClear();
+	LogoutClear();
+	QuerySecPortalStatusClear();
+	HeartBeatClear();
+}
+
+function GetGateWayAddrListCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T101.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T102.value="成功";
+		form1.T103.value=ob.wbaddrNum;
+		if(ob.wbaddrNum > 0)
+		{
+			form1.T104.value=ob.webserviceList;
+			form1.T105.value=ob.webserviceList[0]; 
+		}
+		
+		form1.T106.value=ob.gwaddrNum;
+		if(ob.gwaddrNum > 0)
+		{
+			form1.T107.value=ob.gatewayaddrList;
+			form1.T108.value=ob.gatewayaddrList[0]; 
+		}
+	}
+	else
+	{
+		form1.T102.value=ob.errinfo;
+	}
+}
+
+function GetGateWayAddrList()
+{
+	oneNetHelper.GetGateWayAddrList(GetGateWayAddrListCb);		
+}
+
+function GetGateWayAddrListClear()
+{
+	form1.T101.value="";
+	form1.T102.value="";
+	form1.T103.value="";
+	form1.T104.value="";
+	form1.T105.value="";
+	form1.T106.value="";
+	form1.T107.value="";
+	form1.T108.value="";
+}
+
+function ChangeUKeyPinCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T111.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T112.value="成功";
+	}
+	else
+	{
+		form1.T112.value=ob.errinfo;
+	}
+}
+
+function ChangeUKeyPin()
+{
+	if (form1.T113.value == "" ||form1.T114.value == ""||form1.T115.value == "")
+	{
+		alert("请输入PIN码");
+	}
+	else
+	{	 
+	 if(form1.T114.value == form1.T115.value )
+	 {
+		oneNetHelper.ChangeUKeyPin(form1.T113.value,form1.T114.value,ChangeUKeyPinCb);
+	 }
+	 else
+	 {
+		alert("两次输入的新PIN码不一致");
+	 }
+	}			
+}
+function ChangeUKeyPinClear()
+{
+	form1.T111.value="";
+	form1.T112.value="";
+	form1.T113.value="";
+	form1.T114.value="";
+	form1.T115.value="";
+}
+
+function JsonActionTestCmdDealCb(ob)
+{
+	//console.log('obj:' + JSON.stringify(ob));	
+	form1.T121.value=ob.ret;
+	if(ob.ret == 1)
+	{
+		form1.T122.value="成功";
+		form1.T123.value=ob.value;
+	}
+	else
+	{
+		form1.T122.value=ob.errinfo;
+	}
+}
+
+function JsonActionTestCmdDeal()
+{
+	oneNetHelper.JsonActionTestCmdDeal(JsonActionTestCmdDealCb);		
+}
+
+function JsonActionTestCmdDealClear()
+{
+	form1.T121.value="";
+	form1.T122.value="";
+	form1.T123.value="";
+}
+
+</script>
+
+<form method="POST" action="--WEBBOT-SELF--" name="form1">
+  <!-- <p><label>OnenetHelper测试页面</label> </p> -->
+  <br/>
+  <p>
+  	<label/><input type="button" value="获取插件状态" name="获取插件状态" OnClick = "IsAddonAvailable()">
+	<label/><input type="button" value="清空插件状态" name="B01" OnClick = "ClearAddonStatusButton()">
+  </p>
+  <p>
+  	<label>安装结果:</label><input type="text" name="T01" value="0" size="80">
+  </p>
+   <p><label/><br/></p>
+  <p/>
+  
+  <p>  
+  	<label/><input type="button" value="获取用户信息" name="获取用户信息" OnClick="return GetUserInfo()">
+  	<label/><input type="button" value="清空用户信息" name="B1" OnClick = "return GetUserInfoClear()">
+  </p>
+  <p><label>认证结果:</label> <input type="text" name="T1" size="80"></p>
+  <p><label>用户ID:</label> <input type="text" name="T2" size="80"></p>
+  <p><label>用户名:</label> <input type="text" name="T3" size="80"></p>
+  <p><label>证书用户ID:</label> <input type="text" name="T4" size="80"></p>
+  <p><label>证书用户名:</label><input type="text" name="T5" size="80"></p>
+  <p><label>调用结果:</label><input type="text" name="T6" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T7" size="80"></p>
+  <br/>
+  
+  <p>
+  	<label/><input type="button" value="获取令牌和签名值" name="获取令牌签名值" OnClick = "return GetSignAndToken()">
+  	<label/><input type="button" value="清空令牌签名值" name="B4" OnClick = "return GetSignAndTokenClear()">
+  </p>
+  <p><label>随机数:</label><input type="text" name="T8" size="80" value="asfsadfsadfsadfasfsadf"></p>
+  <p><label>令牌和签名值:</label><textarea        style="OVERFLOW:hidden" type="text" name="T9" rows="6" cols="80" ></textarea></p>
+  <p><label>调用结果:</label><input type="text" name="T10" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T11" size="80"></p>
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="获取证书信息" name="获取证书信息" OnClick = "return GetUserCertInfo()">
+  	<label/><input type="button" value="清空证书信息" name="B4" OnClick = "return GetUserCertInfoClear()">
+  </p>
+  <p><label>DNStringAll</label> <input type="text" name="T39" size="120"></p>
+  <p><label>UserName:</label> <input type="text" name="T21" size="80"></p>
+  <p><label>UserID:</label> <input type="text" name="T22" size="80"></p>
+  <p><label>DNCode:</label> <input type="text" name="T23" size="80"></p> 
+  <p><label>DisName:</label> <input type="text" name="T24" size="80"></p>  
+  <p><label>UniqueId:</label> <input type="text" name="T25" size="80"></p>  
+  <p><label>IssuerDisName</label><input type="text" name="T26" size="80"></p>
+  <p><label>CertSerial</label><input type="text" name="T27" size="80"></p>
+  <p><label>EMail</label><input type="text" name="T28" size="80"></p>
+  <p><label>Org</label><input type="text" name="T29" size="80"></p>
+  <p><label>OrgUnit</label><input type="text" name="T30" size="80"></p>
+  <p><label>City</label><input type="text" name="T31" size="80"></p>
+  <p><label>State</label><input type="text" name="T32" size="80"></p>
+  <p><label>Descption</label><input type="text" name="T33" size="80"></p>  
+  <p><label>Version</label><input type="text" name="T34" size="80"></p>
+  <p><label>BeginTime</label><input type="text" name="T35" size="80"></p>
+  <p><label>EndTime</label><input type="text" name="T36" size="80"></p>
+  <p><label>调用结果:</label><input type="text" name="T37" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T38" size="80"></p>
+  <br/>
+  <br/>
+  
+   <p>
+  	<label/><input type="button" value="获取统一认证Token" name="获取统一认证Token" OnClick = "GetUASToken()">
+	<label/><input type="button" value="清空统一认证Token" name="C01" OnClick = "GetUASTokenClear()">
+  </p>
+  <p><label>调用结果:</label><input type="text" name="S01" value="0" size="80"></p>
+  <p><label>Token值:</label> <input type="text" name="S02" size="80"></p>
+  <p><label>Token有效时间:</label> <input type="text" name="S03" size="80"></p>
+  </p>
+   <p><label/><br/></p>
+   
+  <p>
+  	<label/><input type="button" value="SSL USBKEY登录" name="SSL USBKEY登录" OnClick = "return SSLUsbKeyLogin()">
+  	<label/><input type="button" value="清空SSL USBKEY登录" name="B5" OnClick = "return SSLUsbKeyLoginClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T41" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>服务器ID:    </label><input type="text" name="T42" size="80" value="0"></p>
+  <p><label>UsbKeyPIN码:</label><input type="text" name="T43" size="80" value="11111111"></p>
+  <p><label>调用结果:</label><input type="text" name="T44" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T45" size="80"></p>
+    <br/>
+  <br/>
+   <p>
+  	<label/><input type="button" value="SSL用户名口令登录" name="SSL用户名口令登录" OnClick = "return SSLUserPwdLogin()">
+  	<label/><input type="button" value="清空SSL用户名口令登录" name="B5" OnClick = "return SSLUserPwdLoginClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T46" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>服务器ID:    </label><input type="text" name="T47" size="80" value="0"></p>
+  <p><label>用户名:  </label><input type="text" name="T48" size="80" value="testsx1"></p>
+  <p><label>密  码:  </label><input type="text" name="T49" size="80" value="11111111Aa"></p>
+  <p><label>调用结果:</label><input type="text" name="T50" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T51" size="80"></p>
+    <br/>
+  <br/>
+   <p>
+  	<label/><input type="button" value="IPSec USBKEY登录" name="IPSec USBKEY登录" OnClick = "return IPSecUsbKeyLogin()">
+  	<label/><input type="button" value="清空IPSec USBKEY登录" name="B5" OnClick = "return IPSecUsbKeyLoginClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T52" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>服务器ID:    </label><input type="text" name="T53" size="80" value="0"></p>
+  <p><label>UsbKeyPIN码:</label><input type="text" name="T54" size="80" value="11111111"></p>
+  <p><label>调用结果:</label><input type="text" name="T55" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T56" size="80"></p>
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="登录" name="登录" OnClick = "return Login()">
+  	<label/><input type="button" value="清空登录" name="B5" OnClick = "return LoginClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T57" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>用户名:  </label><input type="text" name="T58" size="80" value="testsx1"></p>
+  <p><label>密码:    </label><input type="text" name="T59" size="80" value="11111111Aa"></p>
+  <p><label>认证方式:</label><input type="text" name="T60" size="80" value="2"></p>
+  <p><label>协议类型:</label><input type="text" name="T61" size="80" value="1"></p>
+  <p><label>服务器ID:</label><input type="text" name="T62" size="80" value="0"></p>
+  <p><label>调用结果:</label><input type="text" name="T63" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T64" size="80"></p>
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="退出登录" name="退出" OnClick = "return Logout()">
+  	<label/><input type="button" value="清空退出" name="B6" OnClick = "return LogoutClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T71" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>调用结果:</label><input type="text" name="T72" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T73" size="80"></p>
+  
+  <br/>
+  <br/>
+     <p>
+  	<label/><input type="button" value="查询SecPortal状态" name="查询状态" OnClick = "return QuerySecPortalStatus()">
+  	<label/><input type="button" value="清空查询状态" name="B6" OnClick = "return QuerySecPortalStatusClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T81" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>状态值:</label><input type="text" name="T82" size="80"></p>
+  <p><label>调用结果:</label><input type="text" name="T83" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T84" size="80"></p>
+  
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="发送心跳" name="心跳" OnClick = "return HeartBeat()">
+  	<label/><input type="button" value="清空心跳" name="B6" OnClick = "return HeartBeatClear()">
+  </p>
+  <p><label>appToken:  </label><input type="text" name="T91" size="80" value="561BB220-58D4-4B7F-935D-E8113D80CC47"></p>
+  <p><label>调用结果:</label><input type="text" name="T92" size="80"></p>
+  <p><label>错误信息:</label><input type="text" name="T93" size="80"></p>
+
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="获取SSL网关地址列表" name="获取SSL网关地址列表" OnClick = "return GetGateWayAddrList()">
+  	<label/><input type="button" value="清空获取SSL网关地址列表" name="B6" OnClick = "return GetGateWayAddrListClear()">
+  </p>
+  <p><label>内网口地址个数:  </label><input type="text" name="T103" size="80"></p>
+  <p><label>内网口地址数组:  </label><input type="text" name="T104" size="80"></p>   
+  <p><label>第一个内网口地址:</label><input type="text" name="T105" size="80"></p> 
+  <p><label>外网口地址个数:  </label><input type="text" name="T106" size="80"></p>
+  <p><label>外网口地址数组:  </label><input type="text" name="T107" size="80"></p>   
+  <p><label>第一个外网口地址:</label><input type="text" name="T108" size="80"></p> 
+  <p><label>调用结果:  </label><input type="text" name="T101" size="80"></p>
+  <p><label>错误信息:  </label><input type="text" name="T102" size="80"></p>   
+  
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="修改UKPIN码" name="修改UKPIN码" OnClick = "return ChangeUKeyPin()">
+  	<label/><input type="button" value="清空修改UKPIN码" name="B6" OnClick = "return ChangeUKeyPinClear()">
+  </p>
+  <p><label>旧口令:    </label><input type="text" name="T113" size="80"></p>
+  <p><label>新口令:    </label><input type="text" name="T114" size="80"></p>   
+  <p><label>确认新口令:</label><input type="text" name="T115" size="80"></p> 
+  <p><label>调用结果:  </label><input type="text" name="T111" size="80"></p>
+  <p><label>错误信息:  </label><input type="text" name="T112" size="80"></p>     
+  
+  <br/>
+  <br/>
+  <p>
+  	<label/><input type="button" value="Action命令处理" name="Action命令处理" OnClick = "return JsonActionTestCmdDeal()">
+  	<label/><input type="button" value="清空命令处理" name="B6" OnClick = "return JsonActionTestCmdDealClear()">
+  </p>
+  <p><label>测试返回:  </label><input type="text" name="T123" size="80"></p>
+  <p><label>调用结果:  </label><input type="text" name="T121" size="80"></p>
+  <p><label>错误信息:  </label><input type="text" name="T122" size="80"></p> 
+  
+</form>
+</body>
+</html> 

+ 201 - 0
src/views/pages/onenethelper.ie.js

@@ -0,0 +1,201 @@
+function onenet_guid()
+{
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+        return v.toString(16);
+    });
+    
+}
+
+function InitCmdMsg(action, data)
+{
+	var msg = {};
+	msg['logid'] = onenet_guid();
+	msg['action'] = action; 
+	msg['data'] = data;
+	return msg;
+}
+	
+
+var oneNetHelper_activex=new Object();
+oneNetHelper_activex.isAvailable = false;
+oneNetHelper_activex.IsAddonAvailable = function ()
+	{
+		if(!oneNetHelper_activex.isAvailable)
+		{
+			oneNetHelper_activex.isAvailable = (AuthClientCtrl)? true : false;
+			if(oneNetHelper_activex.isAvailable)
+			{
+				try
+				{			
+					AuthClientCtrl.Test();
+				}
+				catch(e)
+				{
+					oneNetHelper_activex.isAvailable = false;
+					alert("AuthClientCtrl.Test失败!");
+				}	
+			}
+			else
+			{
+				alert("加载AuthClientCtrl 对象失败!");
+			}
+		}
+		
+		
+		return oneNetHelper_activex.isAvailable;
+	}
+	
+oneNetHelper_activex.AddonAvailableNotify = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			resp['addon']=oneNetHelper_activex.isAvailable;
+			notify_web(resp);	
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetUASToken = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			AuthClientCtrl.GetUASToken();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['token'] = AuthClientCtrl.bstrUASToken;
+			resp['expiredate'] = AuthClientCtrl.bstrUASExpireDate;		
+			notify_web(resp);	
+		}, 0);
+	}	
+
+oneNetHelper_activex.GetUserInfo = function (notify_web)
+	{		
+		setTimeout(function (){
+			var resp = {};		
+			AuthClientCtrl.GetUserInfo();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['userid'] = AuthClientCtrl.bstrUserID;
+			resp['username'] = AuthClientCtrl.bstrUserName;
+			resp['certuserid'] = AuthClientCtrl.bstrCertUserID;
+			resp['certusername'] = AuthClientCtrl.bstrCertUserName;
+			resp['authresult'] = AuthClientCtrl.lAuthResult;
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetSignAndToken = function (randomnum, notify_web)
+	{
+		setTimeout(function (){
+			var hostname = location.hostname;
+			var msg = InitCmdMsg("GetSignAndToken", randomnum);
+			msg['appServerAddr'] = hostname;
+			var resp = {};	
+			AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+			var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+			resp = obj.info;
+			/*说明:1.针对老版本客户端底层未处理GetSignAndToken action方式,再次调用原接口获取令牌;
+					2.若提示AuthClientCtrl未定义JsonActionCmdDeal方法,则直接使用GetSignAndToken方法*/
+			if(resp['ret'] == -2003)
+			{
+				AuthClientCtrl.GetSignAndToken(randomnum);
+				resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+				resp['errinfo'] = AuthClientCtrl.bstrError;	
+				resp['signandtoken'] = AuthClientCtrl.bstrSignValAndToken;	
+			}
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_activex.GetUserCertInfo = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};		
+			AuthClientCtrl.GetUserCertInfo();
+			resp['ret'] = AuthClientCtrl.lResult == 0 ? 1 : 0;
+			resp['errinfo'] = AuthClientCtrl.bstrError;	
+			resp['DNStringAll'] = AuthClientCtrl.bstrUserCertInfoValue('DNStringAll');
+			resp['UserName'] = AuthClientCtrl.bstrUserCertInfoValue('UserName');
+			resp['UserID'] = AuthClientCtrl.bstrUserCertInfoValue('UserID');
+			resp['DNCode'] = AuthClientCtrl.bstrUserCertInfoValue('DNCode');
+			resp['DisName'] = AuthClientCtrl.bstrUserCertInfoValue('DisName');
+			resp['UniqueId'] = AuthClientCtrl.bstrUserCertInfoValue('UniqueId');
+			resp['IssuerDisName'] = AuthClientCtrl.bstrUserCertInfoValue('IssuerDisName');
+			resp['CertSerial'] = AuthClientCtrl.bstrUserCertInfoValue('CertSerial');
+			resp['EMail'] = AuthClientCtrl.bstrUserCertInfoValue('EMail');
+			resp['Org'] = AuthClientCtrl.bstrUserCertInfoValue('Org');
+			resp['OrgUnit'] = AuthClientCtrl.bstrUserCertInfoValue('OrgUnit');
+			resp['City'] = AuthClientCtrl.bstrUserCertInfoValue('City');
+			resp['State'] = AuthClientCtrl.bstrUserCertInfoValue('State');
+			resp['Descption'] = AuthClientCtrl.bstrUserCertInfoValue('Descption');
+			resp['Version'] = AuthClientCtrl.bstrUserCertInfoValue('Version');
+			resp['BeginTime'] = AuthClientCtrl.bstrUserCertInfoValue('BeginTime');
+			resp['EndTime'] = AuthClientCtrl.bstrUserCertInfoValue('EndTime');
+			//resp['authresult'] = AuthClientCtrl.lAuthResult;
+			notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_activex.Login = function (appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+	{
+		alert("Login IE插件未实现");
+	}
+
+oneNetHelper_activex.ChangeUKeyPin = function (old_key_pin,new_key_pin,notify_web)
+	{
+		alert("ChangeUKeyPin IE插件未实现");
+	}
+
+oneNetHelper_activex.SSLUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("SSLUsbKeyLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.SSLUserPwdLogin = function (appToken,gw_id,username,userpwd,notify_web)
+	{
+		alert("SSLUserPwdLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.IPSecUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("IPSecUsbKeyLogin IE插件未实现");
+	}
+	
+oneNetHelper_activex.Logout = function (appToken,notify_web)
+	{
+		alert("Logout IE插件未实现");
+	}
+	
+oneNetHelper_activex.QuerySecPortalStatus = function (appToken,notify_web)
+	{
+		alert("QuerySecPortalStatus IE插件未实现");
+	}
+	
+oneNetHelper_activex.HeartBeat = function (appToken,notify_web)
+	{
+		alert("HeartBeat IE插件未实现");
+	}
+	
+oneNetHelper_activex.GetGateWayAddrList = function (notify_web)
+	{
+		setTimeout(function (){
+		var msg = InitCmdMsg("GetGateWayAddrList", "");	
+		var resp = {};	
+		AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+		var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+		resp = obj.info;
+		notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_activex.JsonActionTestCmdDeal = function (notify_web)
+	{
+		setTimeout(function (){
+		var msg = InitCmdMsg("testAction", "");	
+		var resp = {};	
+		AuthClientCtrl.JsonActionCmdDeal(JSON.stringify(msg));
+		var obj = JSON.parse(AuthClientCtrl.bstrResponse);
+		resp = obj.info;
+		notify_web(resp);
+		}, 0);
+	}

+ 92 - 0
src/views/pages/onenethelper.js

@@ -0,0 +1,92 @@
+var onenetHelperInit = new Object();
+var oneNetHelper;
+onenetHelperInit.Init = function () {
+	var IsIE = (!!window.ActiveXObject || "ActiveXObject" in window) ? true : false;
+	if (IsIE){
+		oneNetHelper = oneNetHelper_activex;
+	}
+	else {
+		var brs = getBrowserType();
+		if (brs == "qax" || brs == "uos") {
+			oneNetHelper = oneNetHelper_np;
+		}
+		else if (brs == "chrome") {
+			if (isLinux()) {
+				oneNetHelper = oneNetHelper_np;
+			}
+			else {
+				oneNetHelper = oneNetHelper_webext;
+			}
+		}
+		else {
+			oneNetHelper = oneNetHelper_webext;
+		}
+	}
+}
+
+/***
+ * 获取当前浏览器类型
+ */
+function getBrowserType() {
+    var userAgent = navigator.userAgent; //取得浏览器的userAgent字符串
+    var isOpera = userAgent.indexOf("Opera") > -1;
+    if (isOpera) { //判断是否Opera浏览器
+        return "opera";
+    }
+	if (userAgent.indexOf("Firefox/31") > -1) { //判断是否Firefox浏览器
+        return "uos";
+    }
+	if (userAgent.indexOf("Firefox") > -1) { //判断是否Firefox浏览器
+        return "firefox";
+    }
+    if (userAgent.indexOf("Chrome") > -1) {
+		var bsrt = getShellerType();
+		if (bsrt == "") {
+			return "chrome";
+		} else {
+			return bsrt;
+		} 
+    }
+    if (userAgent.indexOf("Safari") > -1) { //判断是否Safari浏览器
+        return "safari";
+    }
+    if (userAgent.indexOf("compatible") > -1 && userAgent.indexOf("MSIE") > -1 && !isOpera) { //判断是否IE浏览器
+        return "ie";
+    }
+	return "";
+}
+
+function getShellerType() {
+	var brwType = "",
+		userAgent = window.navigator.userAgent,
+		external = window.external;
+
+	if(external && 'SEVersion' in external) { // 搜狗浏览器
+		brwType = 'sougou';
+	} else if(external && 'LiebaoGetVersion' in external) { // 猎豹浏览器
+		brwType = 'liebao';
+	} else if(/QQBrowser/.test(userAgent)) { //qq浏览器
+		brwType = 'qq';
+	} else if(/Maxthon/.test(userAgent)) { //遨游浏览器
+		brwType = 'maxthon';
+	} else if(/TaoBrowser/.test(userAgent)) { //淘宝浏览器
+		brwType = 'taobao';
+	} else if(/BIDUBrowser/.test(userAgent)) { //百度浏览器
+		brwType = 'baidu';
+	} else if(/UBrowser/.test(userAgent)) { //UC浏览器
+		brwType = 'uc';
+	} else if(/Qaxbrowser/.test(userAgent)) { //奇安信浏览器
+		brwType = 'qax';
+	} else if(/UOS/.test(userAgent)) { //uos浏览器
+		brwType = 'uos';
+	}
+	return brwType;
+}
+
+function isLinux() {
+	var userAgent = navigator.userAgent;
+	if(userAgent.indexOf('Linux') > -1) {
+		return true;
+	}
+	return false;
+}

+ 160 - 0
src/views/pages/onenethelper.np.js

@@ -0,0 +1,160 @@
+var oneNetHelper_np=new Object();
+oneNetHelper_np.isAvailable = false;
+oneNetHelper_np.IsAddonAvailable = function ()
+	{
+		if(!oneNetHelper_np.isAvailable)
+		{
+			oneNetHelper_np.isAvailable = (plugin) ? true : false;
+			if(oneNetHelper_np.isAvailable)
+			{
+				try
+				{			
+					//AuthClientCtrl.Test();
+				}
+				catch(e)
+				{
+					alert("plugin.Test失败!");
+				}	
+			}
+			else
+			{
+				alert("加载plugin 对象失败!");
+			}
+		}
+		
+		
+		return oneNetHelper_np.isAvailable;
+	}
+	
+oneNetHelper_np.AddonAvailableNotify = function (notify_web)
+	{
+		setTimeout(function (){
+			var resp = {};
+			resp['addon']=oneNetHelper_np.IsAddonAvailable();
+			notify_web(resp);	
+		}, 0);
+	}
+	
+oneNetHelper_np.GetUASToken = function (notify_web)
+	{
+		alert("GetUASToken np插件未实现");
+	}	
+
+oneNetHelper_np.GetUserInfo = function (notify_web)
+	{	
+		var msg = {};
+		msg['logid'] = 'GetUserInfo';
+		msg['action'] = 'UIGetUserInfo'; 
+		msg['data'] = "";
+		var req = JSON.stringify(msg);
+		
+		setTimeout(function (){
+			var resp = {};
+			var outStr = plugin.HandleJsonReq(req);
+			resp = JSON.parse(outStr);
+			notify_web(resp);
+		}, 0);
+	}
+	
+oneNetHelper_np.GetSignAndToken = function (randomnum, notify_web)
+	{
+		/*1.调整np插件获取令牌的anction为GetSignAndToken,保持与非np插件一致;
+		  2.同时为兼容旧版本客户端,当outStr为空时,需调用action UIGetSignAndToken*/
+		var msg = {};
+		var hostname = location.hostname;
+		msg['logid'] = 'GetSignAndToken';
+		msg['action'] = 'GetSignAndToken'; 
+		msg['data'] = randomnum;
+		msg['appServerAddr'] = hostname;
+		var req = JSON.stringify(msg);		
+		setTimeout(function (){
+			var resp = {};		
+			var outStr = plugin.HandleJsonReq(req);
+			if(outStr != '{}')
+			{
+				resp = JSON.parse(outStr);
+				notify_web(resp);
+			}
+			else
+			{
+				msg['action'] = 'UIGetSignAndToken'; 
+				req = JSON.stringify(msg);	
+				outStr = plugin.HandleJsonReq(req);
+				resp = JSON.parse(outStr);
+				notify_web(resp);
+			}
+			
+		}, 0);
+	}
+	
+oneNetHelper_np.GetUserCertInfo = function (notify_web)
+	{
+		var msg = {};
+		msg['logid'] = 'UIGetCertInfo';
+		msg['action'] = 'UIGetCertInfo'; 
+		msg['data'] = "";
+		var req = JSON.stringify(msg);
+		
+		setTimeout(function (){
+			var resp = {};	
+			var outStr = plugin.HandleJsonReq(req);
+			resp = JSON.parse(outStr);
+			notify_web(resp);
+		}, 0);
+	}
+
+oneNetHelper_np.Login = function (appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+	{
+		alert("Login np插件未实现");
+	}
+
+oneNetHelper_np.SSLUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("SSLUsbKeyLogin np插件未实现");
+	}
+	
+oneNetHelper_np.SSLUserPwdLogin = function (appToken,gw_id,username,userpwd,notify_web)
+	{
+		alert("SSLUserPwdLogin np插件未实现");
+	}
+	
+oneNetHelper_np.IPSecUsbKeyLogin = function (appToken,gw_id,key_pin,notify_web)
+	{
+		alert("IPSecUsbKeyLogin np插件未实现");
+	}
+	
+oneNetHelper_np.Logout = function (appToken,notify_web)
+	{
+		alert("Logout np插件未实现");
+	}
+	
+oneNetHelper_np.QuerySecPortalStatus = function (appToken,notify_web)
+	{
+		alert("QuerySecPortalStatus np插件未实现");
+	}
+	
+oneNetHelper_np.HeartBeat = function (appToken,notify_web)
+	{
+		alert("HeartBeat np插件未实现");
+	}
+	
+oneNetHelper_np.GetWebServiceAddr = function (notify_web)
+	{
+		alert("GetWebServiceAddr np插件未实现");
+	}
+	
+oneNetHelper_np.GetGateWayAddrList = function (notify_web)
+{
+	var msg = {};
+	msg['logid'] = 'GetGateWayAddrList';
+	msg['action'] = 'GetGateWayAddrList'; 
+	msg['data'] = "";
+	var req = JSON.stringify(msg);
+	
+	setTimeout(function (){
+		var resp = {};		
+		var outStr = plugin.HandleJsonReq(req);
+		resp = JSON.parse(outStr);
+		notify_web(resp);
+	}, 0);
+}

+ 324 - 0
src/views/pages/onenethelper.webext.js

@@ -0,0 +1,324 @@
+function vLog(msg)
+{
+	var args = Array.prototype.slice.call(arguments); 
+  	args.unshift('[onenet]');
+  	console.log.apply(console, args);
+}
+
+function onenet_guid()
+{
+    return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, function(c) {
+        var r = Math.random()*16|0, v = c == 'x' ? r : (r&0x3|0x8);
+        return v.toString(16);
+    });
+    
+}
+
+
+class COneNetHelper{
+	constructor()
+	{
+		this.name = 'OneNet';
+		this.mCmdCbMap = new Map();
+		this.evtReqName = 'EventOneNetHost';
+		this.evtRespName = 'EventOneNetWeb';
+		this.type = 'OneNetReqBg';
+		this.msgGetUserInfo = 'GetUserInfo';
+		this.msgGetSignAndToken = 'GetSignAndToken';
+		this.msgGetUserCertInfo = 'GetUserCertInfo';
+		this.msgLogin ='Login';
+		this.msgLogout ='Logout';
+		this.msgQuerySecPortalStatus = 'QuerySecPortalStatus';
+		this.msgHeartBeat = 'HeartBeat';
+		this.msgGetGateWayAddrList = 'GetGateWayAddrList';
+		this.msgCheckExtensionInstalled = 'ExtensionInstalled';
+		this.msgGetUASToken = 'GetUASToken';
+		this.msgChangeUKeyPin = 'ChangeUKeyPin';
+		this.msgTestAction = 'testAction';		
+		this.isInstalled = 0;
+		this.timeout = 30000;
+        
+        this.AddonAvailableNotifyCB;
+        
+	}
+
+	InsertCmdCBHandler(msg, webCB)
+	{
+		var that=this;
+		this.mCmdCbMap.set(msg['logid'], webCB);
+		setTimeout(function (){	
+			var resp = msg;
+			var cb = that.mCmdCbMap.get(resp.logid);
+			if( cb !== undefined)
+			{
+				that.DeleteCmdCBHandler(resp);
+				if(cb == that.AddonAvailableNotifyCB)
+				{
+					that.isInstalled = 0;
+					resp['addon']=that.isInstalled;
+				}
+				else
+				{
+					resp['ret'] = 0;
+					resp['errinfo'] = 'timeout';					
+				}
+				webCB(resp);
+			}
+		}, that.timeout);
+	}
+	
+	DeleteCmdCBHandler(obj)
+	{
+		this.mCmdCbMap.delete(obj.logid);
+	}
+	
+	InitCmdMsg(action, data)
+	{
+		var msg = {};
+		if(action == this.msgCheckExtensionInstalled)
+		{
+			msg['logid'] = action;
+		}
+		else
+		{
+			msg['logid'] = onenet_guid();
+		}
+		msg['action'] = action; 
+		msg['data'] = data;
+		return msg;
+	}
+
+	SendCustomCmd(msg,webCB)
+	{
+		if(msg['action'] === undefined)
+		{			
+			vLog('CallEx() action error: ' + msg);
+			return;
+		}
+
+		if(msg['data'] === undefined)
+		{
+			msg['data']="";
+		}		
+		var tmpmsg = this.InitCmdMsg(msg['action'], msg['data']);
+		this.InsertCmdCBHandler(tmpmsg, webCB);
+		this.BgRequest(tmpmsg);
+	}
+	
+	GetUASToken(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUASToken, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+
+	GetUserInfo(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUserInfo, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+
+	GetSignAndToken(randomnum, notify_web)
+	{	
+		var hostname = location.hostname;
+		vLog('GetSignAndToken: ' + hostname);
+		var msg = this.InitCmdMsg(this.msgGetSignAndToken, randomnum);
+		msg['appServerAddr'] = hostname; 
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	GetUserCertInfo(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetUserCertInfo, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+    Login(appToken,username,userpwd,authtype,svctype, gw_id, notify_web)
+    {
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] = username;        
+		msg['password'] = userpwd;
+		msg['authtype']= authtype; 
+       	msg['svctype']= svctype; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }	
+
+	ChangeUKeyPin(old_key_pin,new_key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgChangeUKeyPin, "");
+		msg['oldpin'] = old_key_pin;
+		msg['newpin'] = new_key_pin; 
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+	SSLUsbKeyLogin(appToken,gw_id,key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] ="";        
+		msg['password'] =key_pin;
+		msg['authtype']= "1"; 
+       	msg['svctype']= "1"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+    
+	SSLUserPwdLogin(appToken,gw_id,username,userpwd,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] =username;        
+		msg['password'] =userpwd;
+		msg['authtype']= "2"; 
+       	msg['svctype']= "1"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+	IPSecUsbKeyLogin(appToken,gw_id,key_pin,notify_web)
+	{
+        var msg = this.InitCmdMsg(this.msgLogin, "");
+		msg['token'] = appToken;
+		msg['username'] ="";        
+		msg['password'] =key_pin;
+		msg['authtype']= "1"; 
+       	msg['svctype']= "2"; 
+		msg['gw_id']= gw_id;        
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);         
+    }
+	
+    Logout(appToken,notify_web)
+    {
+        var msg = this.InitCmdMsg(this.msgLogout, "");
+		msg['token'] = appToken;    
+       	this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);            
+    }
+
+	QuerySecPortalStatus(appToken,notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgQuerySecPortalStatus, "");
+		msg['token'] = appToken;
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	HeartBeat(appToken,notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgHeartBeat, "");
+		msg['token'] = appToken;
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	GetGateWayAddrList(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgGetGateWayAddrList, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+    
+	JsonActionTestCmdDeal(notify_web)
+	{
+		var msg = this.InitCmdMsg(this.msgTestAction, "");
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);
+	}
+	
+	IsAddonAvailable()
+	{
+		return this.isInstalled;
+	}
+	
+	AddonAvailableNotify(notify_web)
+	{		
+		if( notify_web === undefined)
+		{
+			alert('AddonAvailableNotify no set notify_web callback!');
+			return;
+		}
+		
+		this.AddonAvailableNotifyCB=notify_web;
+		var msg = this.InitCmdMsg(this.msgCheckExtensionInstalled, "");   
+		this.InsertCmdCBHandler(msg, notify_web);
+		this.BgRequest(msg);	
+	}	
+
+	BgRespone(msg)
+	{
+		vLog('BgRespone() rcv:' + msg);
+		var obj = JSON.parse(msg);
+		
+		if(obj.action == this.msgCheckExtensionInstalled)
+		{
+			if(this.AddonAvailableNotifyCB !== undefined)
+			{
+				obj['logid'] = this.msgCheckExtensionInstalled;
+			}
+		    else
+			{
+				this.isInstalled = 1;
+				return;
+			}
+		}
+
+		//var call = this.mCmdCbMap.get(obj.action);
+		var cb = this.mCmdCbMap.get(obj.logid);
+		if( cb !== undefined)
+		{
+			this.DeleteCmdCBHandler(obj);
+			if(obj.action == this.msgCheckExtensionInstalled)
+			{
+				this.isInstalled = 1;
+				obj['addon'] = this.isInstalled;
+				this.AddonAvailableNotifyCB(obj);
+			}
+			else
+			{
+				cb(obj.info);
+			}
+		}
+		else
+		{
+			vLog('OneNetHelper BgRespone() action error: ' + obj.action);
+		}
+	}
+	
+	BgRequest(msg)
+	{		
+		var that=this;
+		if(this.isInstalled == 1 || msg['action'] == this.msgCheckExtensionInstalled)
+		{
+			vLog('OneNetHelper BgRequest() send:' + JSON.stringify(msg));
+			var evt = window.top.document.createEvent("CustomEvent");  
+			evt.initCustomEvent(this.evtReqName, true, false, msg);	
+			window.top.document.dispatchEvent(evt);
+		}
+		else
+		{
+			vLog('OneNetHelper BgRequest() err: oneNetHelper extension current is not available;' + JSON.stringify(msg));
+            
+            this.DeleteCmdCBHandler(msg.logid);
+			
+		}
+	}
+}
+
+var oneNetHelper_webext=new COneNetHelper();
+
+//OneNetHandle: {"type":"ReqBg", "message":{"action":"GetUserInfo", "data":""}}
+window.top.document.addEventListener(oneNetHelper_webext.evtRespName, function(evt) 
+{
+	vLog('addEventListener::EventOneNetWeb():' + evt.detail);
+	oneNetHelper_webext.BgRespone(evt.detail);
+}, false);