1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/dom/permission/PermissionSettings.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,135 @@ 1.4 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.5 + * License, v. 2.0. If a copy of the MPL was not distributed with this file, 1.6 + * You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.7 + 1.8 +"use strict"; 1.9 + 1.10 +function debug(aMsg) { 1.11 + //dump("-*- PermissionSettings.js: " + aMsg + "\n"); 1.12 +} 1.13 + 1.14 +const Cc = Components.classes; 1.15 +const Ci = Components.interfaces; 1.16 +const Cu = Components.utils; 1.17 + 1.18 +Cu.import("resource://gre/modules/XPCOMUtils.jsm"); 1.19 +Cu.import("resource://gre/modules/Services.jsm"); 1.20 +Cu.import("resource://gre/modules/PermissionsTable.jsm"); 1.21 + 1.22 +var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender); 1.23 + 1.24 +// PermissionSettings 1.25 + 1.26 +const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1"; 1.27 +const PERMISSIONSETTINGS_CID = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}"); 1.28 + 1.29 +function PermissionSettings() 1.30 +{ 1.31 + debug("Constructor"); 1.32 +} 1.33 + 1.34 +XPCOMUtils.defineLazyServiceGetter(this, 1.35 + "permissionManager", 1.36 + "@mozilla.org/permissionmanager;1", 1.37 + "nsIPermissionManager"); 1.38 + 1.39 +XPCOMUtils.defineLazyServiceGetter(this, 1.40 + "secMan", 1.41 + "@mozilla.org/scriptsecuritymanager;1", 1.42 + "nsIScriptSecurityManager"); 1.43 + 1.44 +XPCOMUtils.defineLazyServiceGetter(this, 1.45 + "appsService", 1.46 + "@mozilla.org/AppsService;1", 1.47 + "nsIAppsService"); 1.48 + 1.49 +PermissionSettings.prototype = { 1.50 + get: function get(aPermName, aManifestURL, aOrigin, aBrowserFlag) { 1.51 + debug("Get called with: " + aPermName + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag); 1.52 + let uri = Services.io.newURI(aOrigin, null, null); 1.53 + let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); 1.54 + let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); 1.55 + let result = permissionManager.testExactPermanentPermission(principal, aPermName); 1.56 + 1.57 + switch (result) 1.58 + { 1.59 + case Ci.nsIPermissionManager.UNKNOWN_ACTION: 1.60 + return "unknown"; 1.61 + case Ci.nsIPermissionManager.ALLOW_ACTION: 1.62 + return "allow"; 1.63 + case Ci.nsIPermissionManager.DENY_ACTION: 1.64 + return "deny"; 1.65 + case Ci.nsIPermissionManager.PROMPT_ACTION: 1.66 + return "prompt"; 1.67 + default: 1.68 + dump("Unsupported PermissionSettings Action!\n"); 1.69 + return "unknown"; 1.70 + } 1.71 + }, 1.72 + 1.73 + isExplicit: function isExplicit(aPermName, aManifestURL, aOrigin, 1.74 + aBrowserFlag) { 1.75 + debug("isExplicit: " + aPermName + ", " + aManifestURL + ", " + aOrigin); 1.76 + let uri = Services.io.newURI(aOrigin, null, null); 1.77 + let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); 1.78 + let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); 1.79 + 1.80 + return isExplicitInPermissionsTable(aPermName, principal.appStatus); 1.81 + }, 1.82 + 1.83 + set: function set(aPermName, aPermValue, aManifestURL, aOrigin, 1.84 + aBrowserFlag) { 1.85 + debug("Set called with: " + aPermName + ", " + aManifestURL + ", " + 1.86 + aOrigin + ", " + aPermValue + ", " + aBrowserFlag); 1.87 + let currentPermValue = this.get(aPermName, aManifestURL, aOrigin, 1.88 + aBrowserFlag); 1.89 + let action; 1.90 + // Check for invalid calls so that we throw an exception rather than get 1.91 + // killed by parent process 1.92 + if (currentPermValue === "unknown" || 1.93 + aPermValue === "unknown" || 1.94 + !this.isExplicit(aPermName, aManifestURL, aOrigin, aBrowserFlag)) { 1.95 + let errorMsg = "PermissionSettings.js: '" + aPermName + "'" + 1.96 + " is an implicit permission for '" + aManifestURL + 1.97 + "' or the permission isn't set"; 1.98 + Cu.reportError(errorMsg); 1.99 + throw new Components.Exception(errorMsg); 1.100 + } 1.101 + 1.102 + cpm.sendSyncMessage("PermissionSettings:AddPermission", { 1.103 + type: aPermName, 1.104 + origin: aOrigin, 1.105 + manifestURL: aManifestURL, 1.106 + value: aPermValue, 1.107 + browserFlag: aBrowserFlag 1.108 + }); 1.109 + }, 1.110 + 1.111 + remove: function remove(aPermName, aManifestURL, aOrigin) { 1.112 + let uri = Services.io.newURI(aOrigin, null, null); 1.113 + let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); 1.114 + let principal = secMan.getAppCodebasePrincipal(uri, appID, true); 1.115 + 1.116 + if (principal.appStatus !== Ci.nsIPrincipal.APP_STATUS_NOT_INSTALLED) { 1.117 + let errorMsg = "PermissionSettings.js: '" + aOrigin + "'" + 1.118 + " is installed or permission is implicit, cannot remove '" + 1.119 + aPermName + "'."; 1.120 + Cu.reportError(errorMsg); 1.121 + throw new Components.Exception(errorMsg); 1.122 + } 1.123 + 1.124 + // PermissionSettings.jsm handles delete when value is "unknown" 1.125 + cpm.sendSyncMessage("PermissionSettings:AddPermission", { 1.126 + type: aPermName, 1.127 + origin: aOrigin, 1.128 + manifestURL: aManifestURL, 1.129 + value: "unknown", 1.130 + browserFlag: true 1.131 + }); 1.132 + }, 1.133 + 1.134 + classID : PERMISSIONSETTINGS_CID, 1.135 + QueryInterface : XPCOMUtils.generateQI([]) 1.136 +} 1.137 + 1.138 +this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings])