dom/permission/PermissionSettings.js

branch
TOR_BUG_9701
changeset 15
b8a032363ba2
equal deleted inserted replaced
-1:000000000000 0:4706c69bb00a
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])

mercurial