diff options
Diffstat (limited to 'install/ffextension/chrome/content/kerberosauth.js')
-rw-r--r-- | install/ffextension/chrome/content/kerberosauth.js | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/install/ffextension/chrome/content/kerberosauth.js b/install/ffextension/chrome/content/kerberosauth.js new file mode 100644 index 000000000..a79c925bf --- /dev/null +++ b/install/ffextension/chrome/content/kerberosauth.js @@ -0,0 +1,175 @@ +/* Authors: + * Petr Vobornik <pvoborni@redhat.com> + * + * Copyright (C) 2012 Red Hat + * see file 'COPYING' for use and warranty information + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see <http://www.gnu.org/licenses/>. + */ + +var EXPORTED_SYMBOLS = ["kerberosauth", "kerberosauth_listener"]; + +var Cc = Components.classes; +var Ci = Components.interfaces; + +var kerberosauth = { + + // Dictionary of configuration options this extension can configure. + // An alias (key) is set for each options. Using a set of aliases limits + // configuration pages from supplying potential malicious options. + config_options: { + referer: ['network.http.sendRefererHeader', 'int'], + native_gss_lib: ['network.negotiate-auth.using-native-gsslib', 'bool'], + trusted_uris: ['network.negotiate-auth.trusted-uris', 'str'], + allow_proxies: ['network.negotiate-auth.allow-proxies', 'bool'] + }, + + // Some preconfigurations to make things easier. Can be good if UI is added + // (mostly for future usage). + predefined_configurations: { + ipa: { + referer: '2', + native_gss_lib: 'true', + trusted_uris: '', + allow_proxies: 'true' + } + }, + + page_listener: function(event, dom_window) { + + var self = this; + + var conf = { + event: event, + window: dom_window || window, + element: event.target + }; + + if (!conf.element.hasAttribute('method')) return; + + var method = conf.element.getAttribute('method'); + + if (method === 'configure') self.configure(conf); + if (method === 'can_configure') self.send_response(conf.element, { answer: 'true' }); + }, + + send_response: function(element, options) { + + options = options || {}; + + var doc = element.ownerDocument; + + for (var opt in options) { + element.setAttribute(opt, options[opt]); + } + + var answer_event = doc.createEvent("HTMLEvents"); + answer_event.initEvent("kerberos-auth-answer", true, false); + element.dispatchEvent(answer_event); + }, + + notify_installed: function(window) { + var doc = window.document; + var event = doc.createEvent("HTMLEvents"); + event.initEvent("kerberos-auth-installed", true, false); + doc.dispatchEvent(event); + }, + + configure: function(conf) { + var self = this; + + var options = {}; // options to be configured + var opt; + + // use predefined configuration if supplied + if (conf.element.hasAttribute('predefined')) { + var predefined = conf.element.getAttribute('predefined'); + + var pconfig = self.predefined_configurations[predefined]; + if (pconfig) { + for (opt in pconfig) { + options[opt] = pconfig[opt]; + } + } + } + + // overwrite predefined with supplied and only supported options + for (var i=0; i < conf.element.attributes.length; i++) { + var attr = conf.element.attributes[i].name; + if (attr in self.config_options) { + options[attr] = conf.element.getAttribute(attr); + } + } + + if (self.prompt(conf, options)) { + self.configure_core(conf, options); + self.send_response(conf.element, { answer: 'configured' }); + } else { + self.send_response(conf.element, { answer: 'aborted' }); + } + }, + + configure_core: function(conf, options) { + + var self = this; + + var prefs = Cc["@mozilla.org/preferences-service;1"].getService(Ci.nsIPrefBranch); + + for (var opt in options) { + + var name = self.config_options[opt][0]; + var type = self.config_options[opt][1]; + var value = options[opt]; + + if (type === 'str') { + prefs.setCharPref(name, value); + } else if (type ==='int') { + prefs.setIntPref(name, Number(value)); + } else if (type === 'bool') { + prefs.setBoolPref(name, value === 'true'); + } + } + }, + + prompt: function(conf, options) { + var strs = Cc["@mozilla.org/intl/stringbundle;1"]. + getService(Ci.nsIStringBundleService). + createBundle("chrome://kerberosauth/locale/kerberosauth.properties"); + + var prompts = Cc["@mozilla.org/embedcomp/prompt-service;1"]. + getService(Ci.nsIPromptService); + + var title = strs.GetStringFromName('prompt_title'); + var text = strs.GetStringFromName('prompt_topic'); + + if (options.trusted_uris) { + text += strs.GetStringFromName('prompt_domain').replace('${domain}', options.trusted_uris); + } + text += strs.GetStringFromName('prompt_question'); + + var flags = prompts.STD_YES_NO_BUTTONS; + + var confirmed = prompts.confirmEx(conf.window, title, text, flags, "","","", + null,{value: false}) === 0; + return confirmed; + } +}; + +var kerberosauth_listener = function(window) { + + return function(event) { + + kerberosauth.page_listener(event, window); + }; +};
\ No newline at end of file |