1 /* This Source Code Form is subject to the terms of the Mozilla Public
2 * License, v. 2.0. If a copy of the MPL was not distributed with this file,
3 * You can obtain one at http://mozilla.org/MPL/2.0/. */
8 //dump("-*- PermissionSettings.js: " + aMsg + "\n");
11 const Cc = Components.classes;
12 const Ci = Components.interfaces;
13 const Cu = Components.utils;
15 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
16 Cu.import("resource://gre/modules/Services.jsm");
17 Cu.import("resource://gre/modules/PermissionsTable.jsm");
19 var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
23 const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1";
24 const PERMISSIONSETTINGS_CID = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}");
26 function PermissionSettings()
31 XPCOMUtils.defineLazyServiceGetter(this,
33 "@mozilla.org/AppsService;1",
36 PermissionSettings.prototype = {
37 get: function get(aPermName, aManifestURL, aOrigin, aBrowserFlag) {
38 debug("Get called with: " + aPermName + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag);
39 let uri = Services.io.newURI(aOrigin, null, null);
40 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
41 let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, aBrowserFlag);
42 let result = Services.perms.testExactPermanentPermission(principal, aPermName);
46 case Ci.nsIPermissionManager.UNKNOWN_ACTION:
48 case Ci.nsIPermissionManager.ALLOW_ACTION:
50 case Ci.nsIPermissionManager.DENY_ACTION:
52 case Ci.nsIPermissionManager.PROMPT_ACTION:
55 dump("Unsupported PermissionSettings Action!\n");
60 isExplicit: function isExplicit(aPermName, aManifestURL, aOrigin,
62 debug("isExplicit: " + aPermName + ", " + aManifestURL + ", " + aOrigin);
63 let uri = Services.io.newURI(aOrigin, null, null);
64 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
65 let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, aBrowserFlag);
67 return isExplicitInPermissionsTable(aPermName, principal.appStatus);
70 set: function set(aPermName, aPermValue, aManifestURL, aOrigin,
72 debug("Set called with: " + aPermName + ", " + aManifestURL + ", " +
73 aOrigin + ", " + aPermValue + ", " + aBrowserFlag);
74 let currentPermValue = this.get(aPermName, aManifestURL, aOrigin,
77 // Check for invalid calls so that we throw an exception rather than get
78 // killed by parent process
79 if (currentPermValue === "unknown" ||
80 aPermValue === "unknown" ||
81 !this.isExplicit(aPermName, aManifestURL, aOrigin, aBrowserFlag)) {
82 let errorMsg = "PermissionSettings.js: '" + aPermName + "'" +
83 " is an implicit permission for '" + aManifestURL +
84 "' or the permission isn't set";
85 Cu.reportError(errorMsg);
86 throw new Components.Exception(errorMsg);
89 cpm.sendSyncMessage("PermissionSettings:AddPermission", {
92 manifestURL: aManifestURL,
94 browserFlag: aBrowserFlag
98 remove: function remove(aPermName, aManifestURL, aOrigin) {
99 let uri = Services.io.newURI(aOrigin, null, null);
100 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL);
101 let principal = Services.scriptSecurityManager.getAppCodebasePrincipal(uri, appID, true);
103 if (principal.appStatus !== Ci.nsIPrincipal.APP_STATUS_NOT_INSTALLED) {
104 let errorMsg = "PermissionSettings.js: '" + aOrigin + "'" +
105 " is installed or permission is implicit, cannot remove '" +
107 Cu.reportError(errorMsg);
108 throw new Components.Exception(errorMsg);
111 // PermissionSettings.jsm handles delete when value is "unknown"
112 cpm.sendSyncMessage("PermissionSettings:AddPermission", {
115 manifestURL: aManifestURL,
121 classID : PERMISSIONSETTINGS_CID,
122 QueryInterface : XPCOMUtils.generateQI([])
125 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings])