chiark / gitweb /
VercodeOperation: only allow simple math expresssions and %c
[fdroidserver.git] / tests / lint.TestCase
1 #!/usr/bin/env python3
2
3 # http://www.drdobbs.com/testing/unit-testing-with-python/240165163
4
5 import inspect
6 import logging
7 import optparse
8 import os
9 import shutil
10 import sys
11 import tempfile
12 import unittest
13
14 localmodule = os.path.realpath(
15     os.path.join(os.path.dirname(inspect.getfile(inspect.currentframe())), '..'))
16 print('localmodule: ' + localmodule)
17 if localmodule not in sys.path:
18     sys.path.insert(0, localmodule)
19
20 import fdroidserver.common
21 import fdroidserver.lint
22 import fdroidserver.metadata
23
24
25 class LintTest(unittest.TestCase):
26     '''fdroidserver/lint.py'''
27
28     def setUp(self):
29         logging.basicConfig(level=logging.INFO)
30         self.basedir = os.path.join(localmodule, 'tests')
31         self.tmpdir = os.path.abspath(os.path.join(self.basedir, '..', '.testfiles'))
32         if not os.path.exists(self.tmpdir):
33             os.makedirs(self.tmpdir)
34         os.chdir(self.basedir)
35
36     def test_check_for_unsupported_metadata_files(self):
37         config = dict()
38         fdroidserver.common.fill_config_defaults(config)
39         config['accepted_formats'] = ('txt', 'yml')
40         fdroidserver.common.config = config
41         fdroidserver.lint.config = config
42         self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files())
43
44         tmptestsdir = tempfile.mkdtemp(prefix=inspect.currentframe().f_code.co_name,
45                                        dir=self.tmpdir)
46         self.assertFalse(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/'))
47         shutil.copytree(os.path.join(localmodule, 'tests', 'metadata'),
48                         os.path.join(tmptestsdir, 'metadata'),
49                         ignore=shutil.ignore_patterns('apk', 'dump', '*.json'))
50         self.assertFalse(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/'))
51         shutil.copy(os.path.join(localmodule, 'tests', 'metadata', 'org.adaway.json'),
52                     os.path.join(tmptestsdir, 'metadata'))
53         self.assertTrue(fdroidserver.lint.check_for_unsupported_metadata_files(tmptestsdir + '/'))
54
55     def test_forbidden_html_tags(self):
56         config = dict()
57         fdroidserver.common.fill_config_defaults(config)
58         fdroidserver.common.config = config
59         fdroidserver.lint.config = config
60
61         app = {
62             'Name': 'Bad App',
63             'Summary': 'We pwn you',
64             'Description': 'This way: <style><img src="</style><img src=x onerror=alert(1)//">',
65         }
66
67         anywarns = False
68         for warn in fdroidserver.lint.check_regexes(app):
69             anywarns = True
70             logging.debug(warn)
71         self.assertTrue(anywarns)
72
73     def test_check_vercode_operation(self):
74         config = dict()
75         fdroidserver.common.fill_config_defaults(config)
76         fdroidserver.common.config = config
77         fdroidserver.lint.config = config
78
79         app = fdroidserver.metadata.App()
80         app.Name = 'Bad App'
81         app.Summary = 'We pwn you'
82         app.Description = 'These are some back'
83
84         good_fields = [
85             '6%c',
86             '%c - 1',
87             '%c + 10',
88             '%c*10',
89             '%c*10 + 3',
90             '%c*10 + 8',
91             '%c + 2 ',
92             '%c + 3',
93             '%c + 7',
94         ]
95         bad_fields = [
96             'open("/etc/passwd")',
97             '%C + 1',
98             '%%c * 123',
99             '123 + %%',
100             '%c % 7',
101         ]
102
103         anywarns = False
104         for good in good_fields:
105             app.VercodeOperation = good
106             for warn in fdroidserver.lint.check_vercode_operation(app):
107                 anywarns = True
108                 logging.debug(warn)
109             self.assertFalse(anywarns)
110
111         for bad in bad_fields:
112             anywarns = False
113             app.VercodeOperation = bad
114             for warn in fdroidserver.lint.check_vercode_operation(app):
115                 anywarns = True
116                 logging.debug(warn)
117             self.assertTrue(anywarns)
118
119
120 if __name__ == "__main__":
121     parser = optparse.OptionParser()
122     parser.add_option("-v", "--verbose", action="store_true", default=False,
123                       help="Spew out even more information than normal")
124     (fdroidserver.lint.options, args) = parser.parse_args(['--verbose'])
125     fdroidserver.common.options = fdroidserver.lint.options
126
127     newSuite = unittest.TestSuite()
128     newSuite.addTest(unittest.makeSuite(LintTest))
129     unittest.main(failfast=False)