/* This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this file, * You can obtain one at http://mozilla.org/MPL/2.0/. */ "use strict"; function debug(s) { //dump("-*- PermissionSettings Module: " + s + "\n"); } const Cu = Components.utils; const Cc = Components.classes; const Ci = Components.interfaces; let EXPORTED_SYMBOLS = ["PermissionSettingsModule"]; Cu.import("resource://gre/modules/XPCOMUtils.jsm"); Cu.import("resource://gre/modules/Services.jsm"); XPCOMUtils.defineLazyServiceGetter(this, "ppmm", "@mozilla.org/parentprocessmessagemanager;1", "nsIMessageListenerManager"); XPCOMUtils.defineLazyServiceGetter(this, "permissionManager", "@mozilla.org/permissionmanager;1", "nsIPermissionManager"); XPCOMUtils.defineLazyServiceGetter(this, "secMan", "@mozilla.org/scriptsecuritymanager;1", "nsIScriptSecurityManager"); XPCOMUtils.defineLazyServiceGetter(this, "appsService", "@mozilla.org/AppsService;1", "nsIAppsService"); let PermissionSettingsModule = { init: function() { debug("Init"); ppmm.addMessageListener("PermissionSettings:AddPermission", this); Services.obs.addObserver(this, "profile-before-change", false); }, addPermission: function(aData, aCallbacks) { let uri = Services.io.newURI(aData.origin, null, null); let appID = appsService.getAppLocalIdByManifestURL(aData.manifestURL); let principal = secMan.getAppCodebasePrincipal(uri, appID, aData.browserFlag); let action; switch (aData.value) { case "unknown": action = Ci.nsIPermissionManager.UNKNOWN_ACTION; break; case "allow": action = Ci.nsIPermissionManager.ALLOW_ACTION; break; case "deny": action = Ci.nsIPermissionManager.DENY_ACTION; break; case "prompt": action = Ci.nsIPermissionManager.PROMPT_ACTION; break; default: dump("Unsupported PermisionSettings Action: " + aData.value +"\n"); action = Ci.nsIPermissionManager.UNKNOWN_ACTION; } debug("add: " + aData.origin + " " + appID + " " + action); permissionManager.addFromPrincipal(principal, aData.type, action); }, getPermission: function getPermission(aPermission, aManifestURL, aOrigin, aBrowserFlag) { debug("getPermission: " + aPermission + ", " + aManifestURL + ", " + aOrigin); let uri = Services.io.newURI(aOrigin, null, null); let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); let result = permissionManager.testExactPermissionFromPrincipal(principal, aPermission); switch (result) { case Ci.nsIPermissionManager.UNKNOWN_ACTION: return "unknown"; case Ci.nsIPermissionManager.ALLOW_ACTION: return "allow"; case Ci.nsIPermissionManager.DENY_ACTION: return "deny"; case Ci.nsIPermissionManager.PROMPT_ACTION: return "prompt"; default: dump("Unsupported PermissionSettings Action!\n"); return "unknown"; } }, observe: function(aSubject, aTopic, aData) { ppmm.removeMessageListener("PermissionSettings:AddPermission", this); Services.obs.removeObserver(this, "profile-before-change"); ppmm = null; }, receiveMessage: function(aMessage) { debug("PermissionSettings::receiveMessage " + aMessage.name); let mm = aMessage.target; let msg = aMessage.data; let result; switch (aMessage.name) { case "PermissionSettings:AddPermission": this.addPermission(msg); break; } } } PermissionSettingsModule.init();