Source code

Revision control

Copy as Markdown

Other Tools

Test Info: Errors

/* Any copyright is dedicated to the Public Domain.
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
);
}