def enable_authz_permpolicy(self, authz_content, filename=None): """Enables the Authz permissions policy. The `authz_content` will be written to `filename`, and may be specified in a triple-quoted string.:: [wiki:WikiStart@*] * = WIKI_VIEW [wiki:PrivatePage@*] john = WIKI_VIEW * = !WIKI_VIEW `authz_content` may also be a dictionary of dictionaries specifying the sections and key/value pairs of each section, however this form should only be used when the order of the entries in the file is not important, as the order cannot be known.:: { 'wiki:WikiStart@*': {'*': 'WIKI_VIEW'}, 'wiki:PrivatePage@*': {'john': 'WIKI_VIEW', '*': '!WIKI_VIEW'}, } The `filename` parameter is optional, and if omitted a filename will be generated by computing a hash of `authz_content`, prefixed with "authz-". """ if filename is None: filename = 'authz-' + \ hashlib.md5(str(authz_content)).hexdigest()[:9] env = self.get_trac_environment() authz_file = os.path.join(env.conf_dir, filename) if os.path.exists(authz_file): wait_for_file_mtime_change(authz_file) if isinstance(authz_content, basestring): authz_content = [ line.strip() + '\n' for line in authz_content.strip().splitlines() ] authz_content = ['# -*- coding: utf-8 -*-\n'] + authz_content create_file(authz_file, authz_content) else: parser = UnicodeConfigParser() for section, options in authz_content.items(): parser.add_section(section) for key, value in options.items(): parser.set(section, key, value) with open(authz_file, 'w') as f: parser.write(f) permission_policies = env.config.get('trac', 'permission_policies') env.config.set('trac', 'permission_policies', 'AuthzPolicy, ' + permission_policies) env.config.set('authz_policy', 'authz_file', authz_file) env.config.set('components', 'tracopt.perm.authz_policy.*', 'enabled') env.config.save()
def enable_authz_permpolicy(self, authz_content, filename=None): """Enables the Authz permissions policy. The `authz_content` will be written to `filename`, and may be specified in a triple-quoted string.:: [wiki:WikiStart@*] * = WIKI_VIEW [wiki:PrivatePage@*] john = WIKI_VIEW * = !WIKI_VIEW `authz_content` may also be a dictionary of dictionaries specifying the sections and key/value pairs of each section, however this form should only be used when the order of the entries in the file is not important, as the order cannot be known.:: { 'wiki:WikiStart@*': {'*': 'WIKI_VIEW'}, 'wiki:PrivatePage@*': {'john': 'WIKI_VIEW', '*': '!WIKI_VIEW'}, } The `filename` parameter is optional, and if omitted a filename will be generated by computing a hash of `authz_content`, prefixed with "authz-". """ if filename is None: filename = 'authz-' + \ hashlib.md5(str(authz_content)).hexdigest()[:9] authz_file = os.path.join(self.tracdir, 'conf', filename) if os.path.exists(authz_file): wait_for_file_mtime_change(authz_file) if isinstance(authz_content, basestring): authz_content = [line.strip() + '\n' for line in authz_content.strip().splitlines()] authz_content = ['# -*- coding: utf-8 -*-\n'] + authz_content create_file(authz_file, authz_content) else: parser = UnicodeConfigParser() for section, options in authz_content.items(): parser.add_section(section) for key, value in options.items(): parser.set(section, key, value) with open(authz_file, 'w') as f: parser.write(f) env = self.get_trac_environment() permission_policies = env.config.get('trac', 'permission_policies') env.config.set('trac', 'permission_policies', 'AuthzPolicy, ' + permission_policies) env.config.set('authz_policy', 'authz_file', authz_file) env.config.set('components', 'tracopt.perm.authz_policy.*', 'enabled') env.config.save()
class UnicodeParserTestCase(unittest.TestCase): def setUp(self): self.tempdir = tempfile.mkdtemp() self.filename = os.path.join(self.tempdir, 'config.ini') _write(self.filename, [ u'[ä]', u'öption = ÿ', u'[ä]', u'optīon = 1.1', u'[č]', u'ôption = ž', u'[č]', u'optïon = 1', u'[ė]', u'optioñ = true', ]) self.parser = UnicodeConfigParser() self._read() def tearDown(self): shutil.rmtree(self.tempdir) def _write(self): with open(self.filename, 'w') as f: self.parser.write(f) def _read(self): self.parser.read(self.filename) def test_sections(self): self.assertEqual([u'ä', u'č', u'ė'], self.parser.sections()) def test_add_section(self): self.parser.add_section(u'ē') self._write() self.assertEqual( u'[ä]\n' u'öption = ÿ\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n' u'optioñ = true\n\n' u'[ē]\n\n', _read(self.filename)) def test_has_section(self): self.assertTrue(self.parser.has_section(u'ä')) self.assertTrue(self.parser.has_section(u'č')) self.assertTrue(self.parser.has_section(u'ė')) self.assertFalse(self.parser.has_section(u'î')) def test_options(self): self.assertEqual([u'öption', u'optīon'], self.parser.options(u'ä')) self.assertEqual([u'ôption', u'optïon'], self.parser.options(u'č')) def test_get(self): self.assertEqual(u'ÿ', self.parser.get(u'ä', u'öption')) self.assertEqual(u'ž', self.parser.get(u'č', u'ôption')) def test_items(self): self.assertEqual([(u'öption', u'ÿ'), (u'optīon', u'1.1')], self.parser.items(u'ä')) self.assertEqual([(u'ôption', u'ž'), (u'optïon', u'1')], self.parser.items(u'č')) def test_getint(self): self.assertEqual(1, self.parser.getint(u'č', u'optïon')) def test_getfloat(self): self.assertEqual(1.1, self.parser.getfloat(u'ä', u'optīon')) def test_getboolean(self): self.assertTrue(self.parser.getboolean(u'ė', u'optioñ')) def test_has_option(self): self.assertTrue(self.parser.has_option(u'ä', u'öption')) self.assertTrue(self.parser.has_option(u'ä', u'optīon')) self.assertTrue(self.parser.has_option(u'č', u'ôption')) self.assertTrue(self.parser.has_option(u'č', u'optïon')) self.assertTrue(self.parser.has_option(u'ė', u'optioñ')) self.assertFalse(self.parser.has_option(u'î', u'optioñ')) def test_set(self): self.parser.set(u'ä', u'öption', u'ù') self.parser.set(u'ė', u'optiœn', None) self._write() self.assertEqual( u'[ä]\n' u'öption = ù\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n' u'optioñ = true\n' u'optiœn = \n\n', _read(self.filename)) def test_remove_option(self): self.parser.remove_option(u'ä', u'öption') self.parser.remove_option(u'ė', u'optioñ') self._write() self.assertEqual( u'[ä]\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n\n', _read(self.filename)) def test_remove_section(self): self.parser.remove_section(u'ä') self.parser.remove_section(u'ė') self._write() self.assertEqual( u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n', _read(self.filename))
class UnicodeParserTestCase(unittest.TestCase): def setUp(self): self.tempdir = mkdtemp() self.filename = os.path.join(self.tempdir, 'config.ini') _write(self.filename, [ u'[ä]', u'öption = ÿ', u'[ä]', u'optīon = 1.1', u'[č]', u'ôption = ž', u'[č]', u'optïon = 1', u'[ė]', u'optioñ = true', ]) self.parser = UnicodeConfigParser() self._read() def tearDown(self): rmtree(self.tempdir) def _write(self): with open(self.filename, 'w') as f: self.parser.write(f) def _read(self): self.parser.read(self.filename) def test_sections(self): self.assertEqual([u'ä', u'č', u'ė'], self.parser.sections()) def test_add_section(self): self.parser.add_section(u'ē') self._write() self.assertEqual( u'[ä]\n' u'öption = ÿ\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n' u'optioñ = true\n\n' u'[ē]\n\n', _read(self.filename)) def test_has_section(self): self.assertTrue(self.parser.has_section(u'ä')) self.assertTrue(self.parser.has_section(u'č')) self.assertTrue(self.parser.has_section(u'ė')) self.assertFalse(self.parser.has_section(u'î')) def test_options(self): self.assertEqual([u'öption', u'optīon'], self.parser.options(u'ä')) self.assertEqual([u'ôption', u'optïon'], self.parser.options(u'č')) def test_get(self): self.assertEqual(u'ÿ', self.parser.get(u'ä', u'öption')) self.assertEqual(u'ž', self.parser.get(u'č', u'ôption')) def test_items(self): self.assertEqual([(u'öption', u'ÿ'), (u'optīon', u'1.1')], self.parser.items(u'ä')) self.assertEqual([(u'ôption', u'ž'), (u'optïon', u'1')], self.parser.items(u'č')) def test_getint(self): self.assertEqual(1, self.parser.getint(u'č', u'optïon')) def test_getfloat(self): self.assertEqual(1.1, self.parser.getfloat(u'ä', u'optīon')) def test_getboolean(self): self.assertTrue(self.parser.getboolean(u'ė', u'optioñ')) def test_has_option(self): self.assertTrue(self.parser.has_option(u'ä', u'öption')) self.assertTrue(self.parser.has_option(u'ä', u'optīon')) self.assertTrue(self.parser.has_option(u'č', u'ôption')) self.assertTrue(self.parser.has_option(u'č', u'optïon')) self.assertTrue(self.parser.has_option(u'ė', u'optioñ')) self.assertFalse(self.parser.has_option(u'î', u'optioñ')) def test_set(self): self.parser.set(u'ä', u'öption', u'ù') self.parser.set(u'ė', u'optiœn', None) self._write() self.assertEqual( u'[ä]\n' u'öption = ù\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n' u'optioñ = true\n' u'optiœn = \n\n', _read(self.filename)) def test_remove_option(self): self.parser.remove_option(u'ä', u'öption') self.parser.remove_option(u'ė', u'optioñ') self._write() self.assertEqual( u'[ä]\n' u'optīon = 1.1\n\n' u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n' u'[ė]\n\n', _read(self.filename)) def test_remove_section(self): self.parser.remove_section(u'ä') self.parser.remove_section(u'ė') self._write() self.assertEqual( u'[č]\n' u'ôption = ž\n' u'optïon = 1\n\n', _read(self.filename))