dom/permission/PermissionSettings.js

Thu, 22 Jan 2015 13:21:57 +0100

author
Michael Schloh von Bennewitz <michael@schloh.com>
date
Thu, 22 Jan 2015 13:21:57 +0100
branch
TOR_BUG_9701
changeset 15
b8a032363ba2
permissions
-rw-r--r--

Incorporate requested changes from Mozilla in review:
https://bugzilla.mozilla.org/show_bug.cgi?id=1123480#c6

     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/. */
     5 "use strict";
     7 function debug(aMsg) {
     8   //dump("-*- PermissionSettings.js: " + aMsg + "\n");
     9 }
    11 const Cc = Components.classes;
    12 const Ci = Components.interfaces;
    13 const Cu = Components.utils;
    15 Cu.import("resource://gre/modules/XPCOMUtils.jsm");
    16 Cu.import("resource://gre/modules/Services.jsm");
    17 Cu.import("resource://gre/modules/PermissionsTable.jsm");
    19 var cpm = Cc["@mozilla.org/childprocessmessagemanager;1"].getService(Ci.nsISyncMessageSender);
    21 // PermissionSettings
    23 const PERMISSIONSETTINGS_CONTRACTID = "@mozilla.org/permissionSettings;1";
    24 const PERMISSIONSETTINGS_CID        = Components.ID("{cd2cf7a1-f4c1-487b-8c1b-1a71c7097431}");
    26 function PermissionSettings()
    27 {
    28   debug("Constructor");
    29 }
    31 XPCOMUtils.defineLazyServiceGetter(this,
    32                                    "permissionManager",
    33                                    "@mozilla.org/permissionmanager;1",
    34                                    "nsIPermissionManager");
    36 XPCOMUtils.defineLazyServiceGetter(this,
    37                                    "secMan",
    38                                    "@mozilla.org/scriptsecuritymanager;1",
    39                                    "nsIScriptSecurityManager");
    41 XPCOMUtils.defineLazyServiceGetter(this,
    42                                    "appsService",
    43                                    "@mozilla.org/AppsService;1",
    44                                    "nsIAppsService");
    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);
    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   },
    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);
    77     return isExplicitInPermissionsTable(aPermName, principal.appStatus);
    78   },
    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     }
    99     cpm.sendSyncMessage("PermissionSettings:AddPermission", {
   100       type: aPermName,
   101       origin: aOrigin,
   102       manifestURL: aManifestURL,
   103       value: aPermValue,
   104       browserFlag: aBrowserFlag
   105     });
   106   },
   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);
   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     }
   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   },
   131   classID : PERMISSIONSETTINGS_CID,
   132   QueryInterface : XPCOMUtils.generateQI([])
   133 }
   135 this.NSGetFactory = XPCOMUtils.generateNSGetFactory([PermissionSettings])

mercurial