GSS now works for Firefox!
authorMark Donnelly <mark@painless-security.com>
Thu, 4 Dec 2014 17:50:23 +0000 (12:50 -0500)
committerMark Donnelly <mark@painless-security.com>
Thu, 4 Dec 2014 17:50:23 +0000 (12:50 -0500)
* Change main.js to load gssweb.contentscript.js intead of navigator.gss.js

* Make some attempts to convert gssweb.contentscript.js into something that
  will work on both Chrome/Chromium and Firefox

* GSS Calls now work in firefox!
  ... authenticate doesn't yet work, because Firefox sends its content-type
       with a character encoding
       ("application/x-www-form-urlencoded; Charset: UTF-8) which causes the
       apache module problems with double-freeing memory, but that's a problem
       for a different commit.

firefox/data/gssweb.contentscript.js [new file with mode: 0644]
firefox/lib/main.js

diff --git a/firefox/data/gssweb.contentscript.js b/firefox/data/gssweb.contentscript.js
new file mode 100644 (file)
index 0000000..eb28e69
--- /dev/null
@@ -0,0 +1,83 @@
+console.log("Loading content script #6...");
+
+
+function addScript(url) {
+  var elt = document.createElement("script");
+  elt.setAttribute("src", 
+                   url   );
+  document.head.appendChild(elt);
+}
+
+var port;
+
+if ("undefined" != typeof(chrome) &&
+    "undefined" != typeof(chrome.extension) &&
+    "undefined" != typeof(chrome.extension.getURL))
+{
+  // Running in chrome
+  gss_script_name = chrome.extension.getURL('navigator.gssEap.js');
+  port = chrome.runtime.connect({name: "com.painlesssecurity.gssweb"});
+} else {
+  // Firefox
+  gss_script_name = 'chrome://gssweb/content/navigator.gssEap.js';
+}
+
+addScript( gss_script_name );
+
+
+sendReplyToWebpage = function(gssReplyJSON) {
+     var appTag = gssReplyJSON.cookies.app_tag;
+     
+     console.log("[" + appTag + "] Extension port listener received message: [" + 
+                  JSON.stringify(gssReplyJSON) + "]"
+               ); 
+     window.postMessage(gssReplyJSON, "*");
+  }
+
+
+/* When we get a message back from the extension 
+ * background script
+ */
+if ("undefined" != typeof(port))
+{
+  port.onMessage.addListener( sendReplyToWebpage );
+}
+if ("undefined" != typeof(self) &&
+    "undefined" != typeof(self.port) )
+{
+  self.port.on('gss_response', sendReplyToWebpage );
+}
+
+
+
+window.addEventListener("message", function(event) {
+    // We only accept messages from ourselves
+//    if ("undefined" != typeof(unsafeWindow) && event.source != unsafeWindow ) // Firefox
+//       ("undefined" == typeof(unsafeWindow) && event.source != window)        // Chrome
+//     return;
+    
+    // Check to see if this message's data is data we care about
+    if ( typeof(event.data.method) == 'undefined' ||
+         typeof(event.data.arguments) == 'undefined' ||
+         typeof(event.data.return_values) != 'undefined' )
+        return;
+    
+    if ( typeof(event.data.cookies) == 'undefined' )
+    {
+      event.data.cookies = {};
+    }
+    var appTag = event.data.cookies.app_tag;
+    
+    console.log("[" + appTag + "] Window message listener received message: [" +
+               JSON.stringify(event.data) + "]"
+               );
+    if ("undefined" != typeof(port) )
+    {
+      port.postMessage(event.data);
+    } else if ("undefined" != typeof(self) && 
+               "undefined" != typeof(self.port) )
+    {
+      self.port.emit("gss_request", event.data);
+    }
+}, false);
+
index 8060a3d..6ff5db1 100644 (file)
@@ -36,7 +36,7 @@ var pageMod = require("sdk/page-mod");
 
 pageMod.PageMod({
   include: "*",
-  contentScriptFile: [data.url("navigator.gss.js")],
+  contentScriptFile: [data.url("gssweb.contentscript.js")],
   contentScriptWhen: "ready"
 });
 
@@ -69,7 +69,7 @@ function invokeNativeGSS(msg)
 }
 
 tabs.on("ready", function(tab) {
-  app = tab.attach({ contentScriptFile: data.url("navigator.gss.js") });
+  app = tab.attach({ contentScriptFile: data.url("gssweb.contentscript.js") });
   app.port.on("gss_request", function(message) {
     var response = invokeNativeGSS(message);
     app.port.emit("gss_response", response);