dom/permission/PermissionSettings.js

changeset 0
6474c204b198
     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])

mercurial