|
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/. */ |
|
4 |
|
5 "use strict"; |
|
6 |
|
7 function debug(aMsg) { |
|
8 //dump("-*- PermissionSettings.js: " + aMsg + "\n"); |
|
9 } |
|
10 |
|
11 const Cc = Components.classes; |
|
12 const Ci = Components.interfaces; |
|
13 const Cu = Components.utils; |
|
14 |
|
15 Cu.import("resource://gre/modules/XPCOMUtils.jsm"); |
|
16 Cu.import("resource://gre/modules/Services.jsm"); |
|
17 Cu.import("resource://gre/modules/PermissionsTable.jsm"); |
|
18 |
|
19 var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender); |
|
20 |
|
21 // PermissionSettings |
|
22 |
|
23 const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1"; |
|
24 const PERMISSIONSETTINGS_CID = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}"); |
|
25 |
|
26 function PermissionSettings() |
|
27 { |
|
28 debug("Constructor"); |
|
29 } |
|
30 |
|
31 XPCOMUtils.defineLazyServiceGetter(this, |
|
32 "permissionManager", |
|
33 "@mozilla.org/permissionmanager;1", |
|
34 "nsIPermissionManager"); |
|
35 |
|
36 XPCOMUtils.defineLazyServiceGetter(this, |
|
37 "secMan", |
|
38 "@mozilla.org/scriptsecuritymanager;1", |
|
39 "nsIScriptSecurityManager"); |
|
40 |
|
41 XPCOMUtils.defineLazyServiceGetter(this, |
|
42 "appsService", |
|
43 "@mozilla.org/AppsService;1", |
|
44 "nsIAppsService"); |
|
45 |
|
46 PermissionSettings.prototype = { |
|
47 get: function get(aPermName, aManifestURL, aOrigin, aBrowserFlag) { |
|
48 debug("Get called with: " + aPermName + ", " + aManifestURL + ", " + aOrigin + ", " + aBrowserFlag); |
|
49 let uri = Services.io.newURI(aOrigin, null, null); |
|
50 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); |
|
51 let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); |
|
52 let result = permissionManager.testExactPermanentPermission(principal, aPermName); |
|
53 |
|
54 switch (result) |
|
55 { |
|
56 case Ci.nsIPermissionManager.UNKNOWN_ACTION: |
|
57 return "unknown"; |
|
58 case Ci.nsIPermissionManager.ALLOW_ACTION: |
|
59 return "allow"; |
|
60 case Ci.nsIPermissionManager.DENY_ACTION: |
|
61 return "deny"; |
|
62 case Ci.nsIPermissionManager.PROMPT_ACTION: |
|
63 return "prompt"; |
|
64 default: |
|
65 dump("Unsupported PermissionSettings Action!\n"); |
|
66 return "unknown"; |
|
67 } |
|
68 }, |
|
69 |
|
70 isExplicit: function isExplicit(aPermName, aManifestURL, aOrigin, |
|
71 aBrowserFlag) { |
|
72 debug("isExplicit: " + aPermName + ", " + aManifestURL + ", " + aOrigin); |
|
73 let uri = Services.io.newURI(aOrigin, null, null); |
|
74 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); |
|
75 let principal = secMan.getAppCodebasePrincipal(uri, appID, aBrowserFlag); |
|
76 |
|
77 return isExplicitInPermissionsTable(aPermName, principal.appStatus); |
|
78 }, |
|
79 |
|
80 set: function set(aPermName, aPermValue, aManifestURL, aOrigin, |
|
81 aBrowserFlag) { |
|
82 debug("Set called with: " + aPermName + ", " + aManifestURL + ", " + |
|
83 aOrigin + ", " + aPermValue + ", " + aBrowserFlag); |
|
84 let currentPermValue = this.get(aPermName, aManifestURL, aOrigin, |
|
85 aBrowserFlag); |
|
86 let action; |
|
87 // Check for invalid calls so that we throw an exception rather than get |
|
88 // killed by parent process |
|
89 if (currentPermValue === "unknown" || |
|
90 aPermValue === "unknown" || |
|
91 !this.isExplicit(aPermName, aManifestURL, aOrigin, aBrowserFlag)) { |
|
92 let errorMsg = "PermissionSettings.js: '" + aPermName + "'" + |
|
93 " is an implicit permission for '" + aManifestURL + |
|
94 "' or the permission isn't set"; |
|
95 Cu.reportError(errorMsg); |
|
96 throw new Components.Exception(errorMsg); |
|
97 } |
|
98 |
|
99 cpm.sendSyncMessage("PermissionSettings:AddPermission", { |
|
100 type: aPermName, |
|
101 origin: aOrigin, |
|
102 manifestURL: aManifestURL, |
|
103 value: aPermValue, |
|
104 browserFlag: aBrowserFlag |
|
105 }); |
|
106 }, |
|
107 |
|
108 remove: function remove(aPermName, aManifestURL, aOrigin) { |
|
109 let uri = Services.io.newURI(aOrigin, null, null); |
|
110 let appID = appsService.getAppLocalIdByManifestURL(aManifestURL); |
|
111 let principal = secMan.getAppCodebasePrincipal(uri, appID, true); |
|
112 |
|
113 if (principal.appStatus !== Ci.nsIPrincipal.APP_STATUS_NOT_INSTALLED) { |
|
114 let errorMsg = "PermissionSettings.js: '" + aOrigin + "'" + |
|
115 " is installed or permission is implicit, cannot remove '" + |
|
116 aPermName + "'."; |
|
117 Cu.reportError(errorMsg); |
|
118 throw new Components.Exception(errorMsg); |
|
119 } |
|
120 |
|
121 // PermissionSettings.jsm handles delete when value is "unknown" |
|
122 cpm.sendSyncMessage("PermissionSettings:AddPermission", { |
|
123 type: aPermName, |
|
124 origin: aOrigin, |
|
125 manifestURL: aManifestURL, |
|
126 value: "unknown", |
|
127 browserFlag: true |
|
128 }); |
|
129 }, |
|
130 |
|
131 classID : PERMISSIONSETTINGS_CID, |
|
132 QueryInterface : XPCOMUtils.generateQI([]) |
|
133 } |
|
134 |
|
135 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings]) |