1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/extensions/cookie/test/unit/test_permmanager_load_invalid_entries.js Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,129 @@ 1.4 +/* Any copyright is dedicated to the Public Domain. 1.5 + http://creativecommons.org/publicdomain/zero/1.0/ */ 1.6 + 1.7 +var DEBUG_TEST = false; 1.8 + 1.9 +function run_test() { 1.10 + // Setup a profile directory. 1.11 + var dir = do_get_profile(); 1.12 + // Get the db file. 1.13 + var file = dir.clone(); 1.14 + file.append("permissions.sqlite"); 1.15 + 1.16 + var storage = Cc["@mozilla.org/storage/service;1"] 1.17 + .getService(Ci.mozIStorageService); 1.18 + 1.19 + // Create database. 1.20 + var connection = storage.openDatabase(file); 1.21 + // The file should now exist. 1.22 + do_check_true(file.exists()); 1.23 + 1.24 + connection.schemaVersion = 3; 1.25 + connection.executeSimpleSQL( 1.26 + "CREATE TABLE moz_hosts (" + 1.27 + " id INTEGER PRIMARY KEY" + 1.28 + ",host TEXT" + 1.29 + ",type TEXT" + 1.30 + ",permission INTEGER" + 1.31 + ",expireType INTEGER" + 1.32 + ",expireTime INTEGER" + 1.33 + ",appId INTEGER" + 1.34 + ",isInBrowserElement INTEGER" + 1.35 + ")"); 1.36 + 1.37 + // Now we can inject garbadge in the database. 1.38 + var garbadge = [ 1.39 + // Regular entry. 1.40 + { host: '42', type: '0', permission: 1, expireType: 0, expireTime: 0, 1.41 + appId: 0, isInBrowserElement: 0 }, 1.42 + 1.43 + // Special values in host (some being invalid). 1.44 + { host: 'scheme:file', type: '1', permission: 0, expireType: 0, 1.45 + expireTime: 0, appId: 0, isInBrowserElement: 0 }, 1.46 + { host: '192.168.0.1', type: '2', permission: 0, expireType: 0, 1.47 + expireTime: 0, appId: 0, isInBrowserElement: 0 }, 1.48 + { host: '2001:0db8:0000:0000:0000:ff00:0042:8329', type: '3', permission: 0, 1.49 + expireType: 0, expireTime: 0, appId: 0, isInBrowserElement: 0 }, 1.50 + { host: '::1', type: '4', permission: 0, expireType: 0, expireTime: 0, 1.51 + appId: 0, isInBrowserElement: 0 }, 1.52 + 1.53 + // Permission is UNKNOWN_ACTION. 1.54 + { host: '42', type: '5', permission: Ci.nsIPermissionManager.UNKNOWN_ACTION, 1.55 + expireType: 0, expireTime: 0, appId: 0, isInBrowserElement: 0 }, 1.56 + 1.57 + // Permission is out of range. 1.58 + { host: '42', type: '6', permission: 100, expireType: 0, expireTime: 0, 1.59 + appId: 0, isInBrowserElement: 0 }, 1.60 + { host: '42', type: '7', permission: -100, expireType: 0, expireTime: 0, 1.61 + appId: 0, isInBrowserElement: 0 }, 1.62 + 1.63 + // ExpireType is out of range. 1.64 + { host: '42', type: '8', permission: 1, expireType: -100, expireTime: 0, 1.65 + appId: 0, isInBrowserElement: 0 }, 1.66 + { host: '42', type: '9', permission: 1, expireType: 100, expireTime: 0, 1.67 + appId: 0, isInBrowserElement: 0 }, 1.68 + 1.69 + // ExpireTime is at 0 with ExpireType = Time. 1.70 + { host: '42', type: '10', permission: 1, 1.71 + expireType: Ci.nsIPermissionManager.EXPIRE_TIME, expireTime: 0, appId: 0, 1.72 + isInBrowserElement: 0 }, 1.73 + 1.74 + // ExpireTime has a value with ExpireType != Time 1.75 + { host: '42', type: '11', permission: 1, 1.76 + expireType: Ci.nsIPermissionManager.EXPIRE_SESSION, expireTime: 1000, 1.77 + appId: 0, isInBrowserElement: 0 }, 1.78 + { host: '42', type: '12', permission: 1, 1.79 + expireType: Ci.nsIPermissionManager.EXPIRE_NEVER, expireTime: 1000, 1.80 + appId: 0, isInBrowserElement: 0 }, 1.81 + 1.82 + // ExpireTime is negative. 1.83 + { host: '42', type: '13', permission: 1, 1.84 + expireType: Ci.nsIPermissionManager.EXPIRE_TIME, expireTime: -1, 1.85 + appId: 0, isInBrowserElement: 0 }, 1.86 + 1.87 + // AppId is negative. 1.88 + { host: '42', type: '14', permission: 1, expireType: 0, expireTime: 0, 1.89 + appId: -1, isInBrowserElement: 0 }, 1.90 + 1.91 + // IsInBrowserElement is negative or higher than 1. 1.92 + { host: '42', type: '15', permission: 1, expireType: 0, expireTime: 0, 1.93 + appId: 0, isInBrowserElement: -1 }, 1.94 + { host: '42', type: '16', permission: 1, expireType: 0, expireTime: 0, 1.95 + appId: 0, isInBrowserElement: 10 }, 1.96 + 1.97 + // This insertion should be the last one. It is used to make sure we always 1.98 + // load it regardless of the previous entries validities. 1.99 + { host: 'example.org', type: 'test-load-invalid-entries', 1.100 + permission: Ci.nsIPermissionManager.ALLOW_ACTION, expireType: 0, 1.101 + expireTime: 0, appId: 0, isInBrowserElement: 0 }, 1.102 + ]; 1.103 + 1.104 + for (var i=0; i<garbadge.length; ++i) { 1.105 + if (DEBUG_TEST) { 1.106 + dump("\n value #" + i + "\n\n"); 1.107 + } 1.108 + var data = garbadge[i]; 1.109 + connection.executeSimpleSQL( 1.110 + "INSERT INTO moz_hosts " + 1.111 + " (id, host, type, permission, expireType, expireTime, appId, isInBrowserElement) " + 1.112 + "VALUES (" + i + ", '" + data.host + "', '" + data.type + "', " 1.113 + + data.permission + ", " + data.expireType + ", " 1.114 + + data.expireTime + ", " + data.appId + ", " 1.115 + + data.isInBrowserElement + ")" 1.116 + ); 1.117 + } 1.118 + 1.119 + // Initialize the permission manager service 1.120 + var pm = Cc["@mozilla.org/permissionmanager;1"] 1.121 + .getService(Ci.nsIPermissionManager); 1.122 + 1.123 + // The schema should still be 3. We want this test to be updated for each 1.124 + // schema update. 1.125 + do_check_eq(connection.schemaVersion, 3); 1.126 + 1.127 + // This permission should always be there. 1.128 + let principal = Cc["@mozilla.org/scriptsecuritymanager;1"] 1.129 + .getService(Ci.nsIScriptSecurityManager) 1.130 + .getNoAppCodebasePrincipal(NetUtil.newURI("http://example.org")); 1.131 + do_check_eq(pm.testPermissionFromPrincipal(principal, 'test-load-invalid-entries'), Ci.nsIPermissionManager.ALLOW_ACTION); 1.132 +}