michael@0: /* This Source Code Form is subject to the terms of the Mozilla Public michael@0: * License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: * You can obtain one at http://mozilla.org/MPL/2.0/. */ michael@0: michael@0: "use strict"; michael@0: michael@0: function debug(aMsg) { michael@0: //dump("-*- PermissionSettings.js: " + aMsg + "\n"); michael@0: } michael@0: michael@0: const Cc = Components.classes; michael@0: const Ci = Components.interfaces; michael@0: const Cu = Components.utils; michael@0: michael@0: Cu.import("resource://gre/modules/XPCOMUtils.jsm"); michael@0: Cu.import("resource://gre/modules/Services.jsm"); michael@0: Cu.import("resource://gre/modules/PermissionsTable.jsm"); michael@0: michael@0: var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender); michael@0: michael@0: // PermissionSettings michael@0: michael@0: const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1"; michael@0: const PERMISSIONSETTINGS_CID = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}"); michael@0: michael@0: function PermissionSettings() michael@0: { michael@0: debug("Constructor"); michael@0: } michael@0: michael@0: XPCOMUtils.defineLazyServiceGetter(this, michael@0: "permissionManager", michael@0: "@mozilla.org/permissionmanager;1", michael@0: "nsIPermissionManager"); michael@0: michael@0: XPCOMUtils.defineLazyServiceGetter(this, michael@0: "secMan", michael@0: "@mozilla.org/scriptsecuritymanager;1", michael@0: "nsIScriptSecurityManager"); michael@0: michael@0: XPCOMUtils.defineLazyServiceGetter(this, michael@0: "appsService", michael@0: "@mozilla.org/AppsService;1", michael@0: "nsIAppsService"); michael@0: michael@0: PermissionSettings.prototype = { michael@0: get: function get(aPermName, aManifestURL, aOrigin, aBrowserFlag) { michael@0: debug("Get called with: " + aPermName + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag); michael@0: let uri = Services.io.newURI(aOrigin, null, null); michael@0: let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); michael@0: let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); michael@0: let result = permissionManager.testExactPermanentPermission(principal, aPermName); michael@0: michael@0: switch (result) michael@0: { michael@0: case Ci.nsIPermissionManager.UNKNOWN_ACTION: michael@0: return "unknown"; michael@0: case Ci.nsIPermissionManager.ALLOW_ACTION: michael@0: return "allow"; michael@0: case Ci.nsIPermissionManager.DENY_ACTION: michael@0: return "deny"; michael@0: case Ci.nsIPermissionManager.PROMPT_ACTION: michael@0: return "prompt"; michael@0: default: michael@0: dump("Unsupported PermissionSettings Action!\n"); michael@0: return "unknown"; michael@0: } michael@0: }, michael@0: michael@0: isExplicit: function isExplicit(aPermName, aManifestURL, aOrigin, michael@0: aBrowserFlag) { michael@0: debug("isExplicit: " + aPermName + ", " + aManifestURL + ", " + aOrigin); michael@0: let uri = Services.io.newURI(aOrigin, null, null); michael@0: let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); michael@0: let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); michael@0: michael@0: return isExplicitInPermissionsTable(aPermName, principal.appStatus); michael@0: }, michael@0: michael@0: set: function set(aPermName, aPermValue, aManifestURL, aOrigin, michael@0: aBrowserFlag) { michael@0: debug("Set called with: " + aPermName + ", " + aManifestURL + ", " + michael@0: aOrigin + ", " + aPermValue + ", " + aBrowserFlag); michael@0: let currentPermValue = this.get(aPermName, aManifestURL, aOrigin, michael@0: aBrowserFlag); michael@0: let action; michael@0: // Check for invalid calls so that we throw an exception rather than get michael@0: // killed by parent process michael@0: if (currentPermValue === "unknown" || michael@0: aPermValue === "unknown" || michael@0: !this.isExplicit(aPermName, aManifestURL, aOrigin, aBrowserFlag)) { michael@0: let errorMsg = "PermissionSettings.js: '" + aPermName + "'" + michael@0: " is an implicit permission for '" + aManifestURL + michael@0: "' or the permission isn't set"; michael@0: Cu.reportError(errorMsg); michael@0: throw new Components.Exception(errorMsg); michael@0: } michael@0: michael@0: cpm.sendSyncMessage("PermissionSettings:AddPermission", { michael@0: type: aPermName, michael@0: origin: aOrigin, michael@0: manifestURL: aManifestURL, michael@0: value: aPermValue, michael@0: browserFlag: aBrowserFlag michael@0: }); michael@0: }, michael@0: michael@0: remove: function remove(aPermName, aManifestURL, aOrigin) { michael@0: let uri = Services.io.newURI(aOrigin, null, null); michael@0: let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); michael@0: let principal = secMan.getAppCodebasePrincipal(uri, appID, true); michael@0: michael@0: if (principal.appStatus !== Ci.nsIPrincipal.APP_STATUS_NOT_INSTALLED) { michael@0: let errorMsg = "PermissionSettings.js: '" + aOrigin + "'" + michael@0: " is installed or permission is implicit, cannot remove '" + michael@0: aPermName + "'."; michael@0: Cu.reportError(errorMsg); michael@0: throw new Components.Exception(errorMsg); michael@0: } michael@0: michael@0: // PermissionSettings.jsm handles delete when value is "unknown" michael@0: cpm.sendSyncMessage("PermissionSettings:AddPermission", { michael@0: type: aPermName, michael@0: origin: aOrigin, michael@0: manifestURL: aManifestURL, michael@0: value: "unknown", michael@0: browserFlag: true michael@0: }); michael@0: }, michael@0: michael@0: classID : PERMISSIONSETTINGS_CID, michael@0: QueryInterface : XPCOMUtils.generateQI([]) michael@0: } michael@0: michael@0: this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings])