|
1 #!/usr/bin/env python |
|
2 |
|
3 # This Source Code Form is subject to the terms of the Mozilla Public |
|
4 # License, v. 2.0. If a copy of the MPL was not distributed with this file, |
|
5 # You can obtain one at http://mozilla.org/MPL/2.0/. |
|
6 |
|
7 import mozfile |
|
8 import os |
|
9 import shutil |
|
10 import sqlite3 |
|
11 import tempfile |
|
12 import unittest |
|
13 from mozprofile.permissions import Permissions |
|
14 |
|
15 class PermissionsTest(unittest.TestCase): |
|
16 |
|
17 locations = """http://mochi.test:8888 primary,privileged |
|
18 http://127.0.0.1:80 noxul |
|
19 http://127.0.0.1:8888 privileged |
|
20 """ |
|
21 |
|
22 profile_dir = None |
|
23 locations_file = None |
|
24 |
|
25 def setUp(self): |
|
26 self.profile_dir = tempfile.mkdtemp() |
|
27 self.locations_file = mozfile.NamedTemporaryFile() |
|
28 self.locations_file.write(self.locations) |
|
29 self.locations_file.flush() |
|
30 |
|
31 def tearDown(self): |
|
32 if self.profile_dir: |
|
33 shutil.rmtree(self.profile_dir) |
|
34 if self.locations_file: |
|
35 self.locations_file.close() |
|
36 |
|
37 def write_perm_db(self, version=3): |
|
38 permDB = sqlite3.connect(os.path.join(self.profile_dir, "permissions.sqlite")) |
|
39 cursor = permDB.cursor() |
|
40 |
|
41 cursor.execute("PRAGMA user_version=%d;" % version) |
|
42 |
|
43 if version == 3: |
|
44 cursor.execute("""CREATE TABLE IF NOT EXISTS moz_hosts ( |
|
45 id INTEGER PRIMARY KEY, |
|
46 host TEXT, |
|
47 type TEXT, |
|
48 permission INTEGER, |
|
49 expireType INTEGER, |
|
50 expireTime INTEGER, |
|
51 appId INTEGER, |
|
52 isInBrowserElement INTEGER)""") |
|
53 elif version == 2: |
|
54 cursor.execute("""CREATE TABLE IF NOT EXISTS moz_hosts ( |
|
55 id INTEGER PRIMARY KEY, |
|
56 host TEXT, |
|
57 type TEXT, |
|
58 permission INTEGER, |
|
59 expireType INTEGER, |
|
60 expireTime INTEGER)""") |
|
61 else: |
|
62 raise Exception("version must be 2 or 3") |
|
63 |
|
64 permDB.commit() |
|
65 cursor.close() |
|
66 |
|
67 def test_create_permissions_db(self): |
|
68 perms = Permissions(self.profile_dir, self.locations_file.name) |
|
69 perms_db_filename = os.path.join(self.profile_dir, 'permissions.sqlite') |
|
70 |
|
71 select_stmt = 'select host, type, permission from moz_hosts' |
|
72 |
|
73 con = sqlite3.connect(perms_db_filename) |
|
74 cur = con.cursor() |
|
75 cur.execute(select_stmt) |
|
76 entries = cur.fetchall() |
|
77 |
|
78 self.assertEqual(len(entries), 3) |
|
79 |
|
80 self.assertEqual(entries[0][0], 'mochi.test') |
|
81 self.assertEqual(entries[0][1], 'allowXULXBL') |
|
82 self.assertEqual(entries[0][2], 1) |
|
83 |
|
84 self.assertEqual(entries[1][0], '127.0.0.1') |
|
85 self.assertEqual(entries[1][1], 'allowXULXBL') |
|
86 self.assertEqual(entries[1][2], 2) |
|
87 |
|
88 self.assertEqual(entries[2][0], '127.0.0.1') |
|
89 self.assertEqual(entries[2][1], 'allowXULXBL') |
|
90 self.assertEqual(entries[2][2], 1) |
|
91 |
|
92 perms._locations.add_host('a.b.c', options='noxul') |
|
93 |
|
94 cur.execute(select_stmt) |
|
95 entries = cur.fetchall() |
|
96 |
|
97 self.assertEqual(len(entries), 4) |
|
98 self.assertEqual(entries[3][0], 'a.b.c') |
|
99 self.assertEqual(entries[3][1], 'allowXULXBL') |
|
100 self.assertEqual(entries[3][2], 2) |
|
101 |
|
102 # when creating a DB we should default to user_version==2 |
|
103 cur.execute('PRAGMA user_version') |
|
104 entries = cur.fetchall() |
|
105 self.assertEqual(entries[0][0], 2) |
|
106 |
|
107 perms.clean_db() |
|
108 # table should be removed |
|
109 cur.execute("select * from sqlite_master where type='table'") |
|
110 entries = cur.fetchall() |
|
111 self.assertEqual(len(entries), 0) |
|
112 |
|
113 def test_nw_prefs(self): |
|
114 perms = Permissions(self.profile_dir, self.locations_file.name) |
|
115 |
|
116 prefs, user_prefs = perms.network_prefs(False) |
|
117 |
|
118 self.assertEqual(len(user_prefs), 0) |
|
119 self.assertEqual(len(prefs), 0) |
|
120 |
|
121 prefs, user_prefs = perms.network_prefs(True) |
|
122 self.assertEqual(len(user_prefs), 2) |
|
123 self.assertEqual(user_prefs[0], ('network.proxy.type', 2)) |
|
124 self.assertEqual(user_prefs[1][0], 'network.proxy.autoconfig_url') |
|
125 |
|
126 origins_decl = "var knownOrigins = (function () { return ['http://mochi.test:8888', 'http://127.0.0.1:80', 'http://127.0.0.1:8888'].reduce" |
|
127 self.assertTrue(origins_decl in user_prefs[1][1]) |
|
128 |
|
129 proxy_check = ("'http': 'PROXY mochi.test:8888'", |
|
130 "'https': 'PROXY mochi.test:4443'", |
|
131 "'ws': 'PROXY mochi.test:4443'", |
|
132 "'wss': 'PROXY mochi.test:4443'") |
|
133 self.assertTrue(all(c in user_prefs[1][1] for c in proxy_check)) |
|
134 |
|
135 def verify_user_version(self, version): |
|
136 """Verifies that we call INSERT statements using the correct number |
|
137 of columns for existing databases. |
|
138 """ |
|
139 self.write_perm_db(version=version) |
|
140 Permissions(self.profile_dir, self.locations_file.name) |
|
141 perms_db_filename = os.path.join(self.profile_dir, 'permissions.sqlite') |
|
142 |
|
143 select_stmt = 'select * from moz_hosts' |
|
144 |
|
145 con = sqlite3.connect(perms_db_filename) |
|
146 cur = con.cursor() |
|
147 cur.execute(select_stmt) |
|
148 entries = cur.fetchall() |
|
149 |
|
150 self.assertEqual(len(entries), 3) |
|
151 |
|
152 columns = 8 if version == 3 else 6 |
|
153 self.assertEqual(len(entries[0]), columns) |
|
154 for x in range(4, columns): |
|
155 self.assertEqual(entries[0][x], 0) |
|
156 |
|
157 def test_existing_permissions_db_v2(self): |
|
158 self.verify_user_version(2) |
|
159 |
|
160 def test_existing_permissions_db_v3(self): |
|
161 self.verify_user_version(3) |
|
162 |
|
163 |
|
164 if __name__ == '__main__': |
|
165 unittest.main() |