From b0df0ee07c5f0dfe366020dd82fe0d29be6f6727 Mon Sep 17 00:00:00 2001 From: Mark Donnelly Date: Thu, 4 Dec 2014 12:50:23 -0500 Subject: [PATCH] GSS now works for Firefox! * 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 | 83 ++++++++++++++++++++++++++++++++++++ firefox/lib/main.js | 4 +- 2 files changed, 85 insertions(+), 2 deletions(-) create mode 100644 firefox/data/gssweb.contentscript.js diff --git a/firefox/data/gssweb.contentscript.js b/firefox/data/gssweb.contentscript.js new file mode 100644 index 0000000..eb28e69 --- /dev/null +++ b/firefox/data/gssweb.contentscript.js @@ -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); + diff --git a/firefox/lib/main.js b/firefox/lib/main.js index 8060a3d..6ff5db1 100644 --- a/firefox/lib/main.js +++ b/firefox/lib/main.js @@ -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); -- 2.1.4