forked from mirrors/gecko-dev
- Increment permissions database schema version - Apply GetSite to origin keys with type prefixed by "3rdPartyStorage^" - Done in a transaction - Add unit test for migration Differential Revision: https://phabricator.services.mozilla.com/D130676
264 lines
6.1 KiB
JavaScript
264 lines
6.1 KiB
JavaScript
/* Any copyright is dedicated to the Public Domain.
|
|
http://creativecommons.org/publicdomain/zero/1.0/ */
|
|
var DEBUG_TEST = false;
|
|
|
|
function run_test() {
|
|
Services.prefs.setCharPref("permissions.manager.defaultsUrl", "");
|
|
// Setup a profile directory.
|
|
var dir = do_get_profile();
|
|
|
|
// We need to execute a pm method to be sure that the DB is fully
|
|
// initialized.
|
|
var pm = Services.perms;
|
|
Assert.equal(pm.all.length, 0, "No cookies");
|
|
|
|
// Get the db file.
|
|
var file = dir.clone();
|
|
file.append("permissions.sqlite");
|
|
|
|
var storage = Services.storage;
|
|
|
|
// Create database.
|
|
var connection = storage.openDatabase(file);
|
|
// The file should now exist.
|
|
Assert.ok(file.exists());
|
|
|
|
connection.schemaVersion = 3;
|
|
connection.executeSimpleSQL("DROP TABLE moz_hosts");
|
|
connection.executeSimpleSQL(
|
|
"CREATE TABLE moz_hosts (" +
|
|
" id INTEGER PRIMARY KEY" +
|
|
",host TEXT" +
|
|
",type TEXT" +
|
|
",permission INTEGER" +
|
|
",expireType INTEGER" +
|
|
",expireTime INTEGER" +
|
|
",appId INTEGER" +
|
|
",isInBrowserElement INTEGER" +
|
|
")"
|
|
);
|
|
|
|
// Now we can inject garbadge in the database.
|
|
var garbadge = [
|
|
// Regular entry.
|
|
{
|
|
host: "42",
|
|
type: "0",
|
|
permission: 1,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// Special values in host (some being invalid).
|
|
{
|
|
host: "scheme:file",
|
|
type: "1",
|
|
permission: 0,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "192.168.0.1",
|
|
type: "2",
|
|
permission: 0,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "2001:0db8:0000:0000:0000:ff00:0042:8329",
|
|
type: "3",
|
|
permission: 0,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "::1",
|
|
type: "4",
|
|
permission: 0,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// Permission is UNKNOWN_ACTION.
|
|
{
|
|
host: "42",
|
|
type: "5",
|
|
permission: Ci.nsIPermissionManager.UNKNOWN_ACTION,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// Permission is out of range.
|
|
{
|
|
host: "42",
|
|
type: "6",
|
|
permission: 100,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "42",
|
|
type: "7",
|
|
permission: -100,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// ExpireType is out of range.
|
|
{
|
|
host: "42",
|
|
type: "8",
|
|
permission: 1,
|
|
expireType: -100,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "42",
|
|
type: "9",
|
|
permission: 1,
|
|
expireType: 100,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// ExpireTime is at 0 with ExpireType = Time.
|
|
{
|
|
host: "42",
|
|
type: "10",
|
|
permission: 1,
|
|
expireType: Ci.nsIPermissionManager.EXPIRE_TIME,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// ExpireTime has a value with ExpireType != Time
|
|
{
|
|
host: "42",
|
|
type: "11",
|
|
permission: 1,
|
|
expireType: Ci.nsIPermissionManager.EXPIRE_SESSION,
|
|
expireTime: 1000,
|
|
isInBrowserElement: 0,
|
|
},
|
|
{
|
|
host: "42",
|
|
type: "12",
|
|
permission: 1,
|
|
expireType: Ci.nsIPermissionManager.EXPIRE_NEVER,
|
|
expireTime: 1000,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// ExpireTime is negative.
|
|
{
|
|
host: "42",
|
|
type: "13",
|
|
permission: 1,
|
|
expireType: Ci.nsIPermissionManager.EXPIRE_TIME,
|
|
expireTime: -1,
|
|
isInBrowserElement: 0,
|
|
},
|
|
|
|
// IsInBrowserElement is negative or higher than 1.
|
|
{
|
|
host: "42",
|
|
type: "15",
|
|
permission: 1,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: -1,
|
|
},
|
|
{
|
|
host: "42",
|
|
type: "16",
|
|
permission: 1,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 10,
|
|
},
|
|
|
|
// This insertion should be the last one. It is used to make sure we always
|
|
// load it regardless of the previous entries validities.
|
|
{
|
|
host: "example.org",
|
|
type: "test-load-invalid-entries",
|
|
permission: Ci.nsIPermissionManager.ALLOW_ACTION,
|
|
expireType: 0,
|
|
expireTime: 0,
|
|
isInBrowserElement: 0,
|
|
},
|
|
];
|
|
|
|
for (var i = 0; i < garbadge.length; ++i) {
|
|
if (DEBUG_TEST) {
|
|
dump("\n value #" + i + "\n\n");
|
|
}
|
|
var data = garbadge[i];
|
|
connection.executeSimpleSQL(
|
|
"INSERT INTO moz_hosts " +
|
|
" (id, host, type, permission, expireType, expireTime, isInBrowserElement, appId) " +
|
|
"VALUES (" +
|
|
i +
|
|
", '" +
|
|
data.host +
|
|
"', '" +
|
|
data.type +
|
|
"', " +
|
|
data.permission +
|
|
", " +
|
|
data.expireType +
|
|
", " +
|
|
data.expireTime +
|
|
", " +
|
|
data.isInBrowserElement +
|
|
", 0)"
|
|
);
|
|
}
|
|
|
|
// This will force the permission-manager to reload the data.
|
|
Services.obs.notifyObservers(null, "testonly-reload-permissions-from-disk");
|
|
|
|
// Let's do something in order to be sure the DB is read.
|
|
Assert.greater(pm.all.length, 0);
|
|
|
|
// The schema should be upgraded to 11, and a 'modificationTime' column should
|
|
// exist with all records having a value of 0.
|
|
Assert.equal(connection.schemaVersion, 12);
|
|
|
|
let select = connection.createStatement(
|
|
"SELECT modificationTime FROM moz_perms"
|
|
);
|
|
let numMigrated = 0;
|
|
while (select.executeStep()) {
|
|
let thisModTime = select.getInt64(0);
|
|
Assert.ok(
|
|
thisModTime > 0,
|
|
"new modifiedTime field is correct (but it's not 0!)"
|
|
);
|
|
numMigrated += 1;
|
|
}
|
|
// check we found at least 1 record that was migrated.
|
|
Assert.greater(
|
|
numMigrated,
|
|
0,
|
|
"we found at least 1 record that was migrated"
|
|
);
|
|
|
|
// This permission should always be there.
|
|
let ssm = Services.scriptSecurityManager;
|
|
let uri = NetUtil.newURI("http://example.org");
|
|
let principal = ssm.createContentPrincipal(uri, {});
|
|
Assert.equal(
|
|
pm.testPermissionFromPrincipal(principal, "test-load-invalid-entries"),
|
|
Ci.nsIPermissionManager.ALLOW_ACTION
|
|
);
|
|
}
|