PermissionSettings.js 5.3 KB

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