michael@0: #!/usr/bin/env python michael@0: michael@0: # This Source Code Form is subject to the terms of the Mozilla Public michael@0: # License, v. 2.0. If a copy of the MPL was not distributed with this file, michael@0: # You can obtain one at http://mozilla.org/MPL/2.0/. michael@0: michael@0: import mozfile michael@0: import os michael@0: import shutil michael@0: import sqlite3 michael@0: import tempfile michael@0: import unittest michael@0: from mozprofile.permissions import Permissions michael@0: michael@0: class PermissionsTest(unittest.TestCase): michael@0: michael@0: locations = """http://mochi.test:8888 primary,privileged michael@0: http://127.0.0.1:80 noxul michael@0: http://127.0.0.1:8888 privileged michael@0: """ michael@0: michael@0: profile_dir = None michael@0: locations_file = None michael@0: michael@0: def setUp(self): michael@0: self.profile_dir = tempfile.mkdtemp() michael@0: self.locations_file = mozfile.NamedTemporaryFile() michael@0: self.locations_file.write(self.locations) michael@0: self.locations_file.flush() michael@0: michael@0: def tearDown(self): michael@0: if self.profile_dir: michael@0: shutil.rmtree(self.profile_dir) michael@0: if self.locations_file: michael@0: self.locations_file.close() michael@0: michael@0: def write_perm_db(self, version=3): michael@0: permDB = sqlite3.connect(os.path.join(self.profile_dir, "permissions.sqlite")) michael@0: cursor = permDB.cursor() michael@0: michael@0: cursor.execute("PRAGMA user_version=%d;" % version) michael@0: michael@0: if version == 3: michael@0: cursor.execute("""CREATE TABLE IF NOT EXISTS moz_hosts ( michael@0: id INTEGER PRIMARY KEY, michael@0: host TEXT, michael@0: type TEXT, michael@0: permission INTEGER, michael@0: expireType INTEGER, michael@0: expireTime INTEGER, michael@0: appId INTEGER, michael@0: isInBrowserElement INTEGER)""") michael@0: elif version == 2: michael@0: cursor.execute("""CREATE TABLE IF NOT EXISTS moz_hosts ( michael@0: id INTEGER PRIMARY KEY, michael@0: host TEXT, michael@0: type TEXT, michael@0: permission INTEGER, michael@0: expireType INTEGER, michael@0: expireTime INTEGER)""") michael@0: else: michael@0: raise Exception("version must be 2 or 3") michael@0: michael@0: permDB.commit() michael@0: cursor.close() michael@0: michael@0: def test_create_permissions_db(self): michael@0: perms = Permissions(self.profile_dir, self.locations_file.name) michael@0: perms_db_filename = os.path.join(self.profile_dir, 'permissions.sqlite') michael@0: michael@0: select_stmt = 'select host, type, permission from moz_hosts' michael@0: michael@0: con = sqlite3.connect(perms_db_filename) michael@0: cur = con.cursor() michael@0: cur.execute(select_stmt) michael@0: entries = cur.fetchall() michael@0: michael@0: self.assertEqual(len(entries), 3) michael@0: michael@0: self.assertEqual(entries[0][0], 'mochi.test') michael@0: self.assertEqual(entries[0][1], 'allowXULXBL') michael@0: self.assertEqual(entries[0][2], 1) michael@0: michael@0: self.assertEqual(entries[1][0], '127.0.0.1') michael@0: self.assertEqual(entries[1][1], 'allowXULXBL') michael@0: self.assertEqual(entries[1][2], 2) michael@0: michael@0: self.assertEqual(entries[2][0], '127.0.0.1') michael@0: self.assertEqual(entries[2][1], 'allowXULXBL') michael@0: self.assertEqual(entries[2][2], 1) michael@0: michael@0: perms._locations.add_host('a.b.c', options='noxul') michael@0: michael@0: cur.execute(select_stmt) michael@0: entries = cur.fetchall() michael@0: michael@0: self.assertEqual(len(entries), 4) michael@0: self.assertEqual(entries[3][0], 'a.b.c') michael@0: self.assertEqual(entries[3][1], 'allowXULXBL') michael@0: self.assertEqual(entries[3][2], 2) michael@0: michael@0: # when creating a DB we should default to user_version==2 michael@0: cur.execute('PRAGMA user_version') michael@0: entries = cur.fetchall() michael@0: self.assertEqual(entries[0][0], 2) michael@0: michael@0: perms.clean_db() michael@0: # table should be removed michael@0: cur.execute("select * from sqlite_master where type='table'") michael@0: entries = cur.fetchall() michael@0: self.assertEqual(len(entries), 0) michael@0: michael@0: def test_nw_prefs(self): michael@0: perms = Permissions(self.profile_dir, self.locations_file.name) michael@0: michael@0: prefs, user_prefs = perms.network_prefs(False) michael@0: michael@0: self.assertEqual(len(user_prefs), 0) michael@0: self.assertEqual(len(prefs), 0) michael@0: michael@0: prefs, user_prefs = perms.network_prefs(True) michael@0: self.assertEqual(len(user_prefs), 2) michael@0: self.assertEqual(user_prefs[0], ('network.proxy.type', 2)) michael@0: self.assertEqual(user_prefs[1][0], 'network.proxy.autoconfig_url') michael@0: michael@0: origins_decl = "var knownOrigins = (function () { return ['http://mochi.test:8888', 'http://127.0.0.1:80', 'http://127.0.0.1:8888'].reduce" michael@0: self.assertTrue(origins_decl in user_prefs[1][1]) michael@0: michael@0: proxy_check = ("'http': 'PROXY mochi.test:8888'", michael@0: "'https': 'PROXY mochi.test:4443'", michael@0: "'ws': 'PROXY mochi.test:4443'", michael@0: "'wss': 'PROXY mochi.test:4443'") michael@0: self.assertTrue(all(c in user_prefs[1][1] for c in proxy_check)) michael@0: michael@0: def verify_user_version(self, version): michael@0: """Verifies that we call INSERT statements using the correct number michael@0: of columns for existing databases. michael@0: """ michael@0: self.write_perm_db(version=version) michael@0: Permissions(self.profile_dir, self.locations_file.name) michael@0: perms_db_filename = os.path.join(self.profile_dir, 'permissions.sqlite') michael@0: michael@0: select_stmt = 'select * from moz_hosts' michael@0: michael@0: con = sqlite3.connect(perms_db_filename) michael@0: cur = con.cursor() michael@0: cur.execute(select_stmt) michael@0: entries = cur.fetchall() michael@0: michael@0: self.assertEqual(len(entries), 3) michael@0: michael@0: columns = 8 if version == 3 else 6 michael@0: self.assertEqual(len(entries[0]), columns) michael@0: for x in range(4, columns): michael@0: self.assertEqual(entries[0][x], 0) michael@0: michael@0: def test_existing_permissions_db_v2(self): michael@0: self.verify_user_version(2) michael@0: michael@0: def test_existing_permissions_db_v3(self): michael@0: self.verify_user_version(3) michael@0: michael@0: michael@0: if __name__ == '__main__': michael@0: unittest.main()