blob: a0faf18e662bb99912f877de248bdbbb1b190d57 [file] [log] [blame]
Armin Ronacherccf284b2007-05-21 16:44:26 +02001# -*- coding: utf-8 -*-
2"""
3 unit test for security features
4 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
5
6 :copyright: 2007 by Armin Ronacher.
7 :license: BSD, see LICENSE for more details.
8"""
Armin Ronacher825e5222007-11-16 16:16:23 +01009from jinja import Environment
10
11
12NONLOCALSET = '''\
13{% for item in range(10) %}
14 {%- set outer = item! -%}
15{% endfor -%}
16{{ outer }}'''
Armin Ronacherccf284b2007-05-21 16:44:26 +020017
18
19class PrivateStuff(object):
20 bar = lambda self: 23
21 foo = lambda self: 42
22 foo.jinja_unsafe_call = True
23
24
25class PublicStuff(object):
26 jinja_allowed_attributes = ['bar']
27 bar = lambda self: 23
28 foo = lambda self: 42
29
30
31test_unsafe = '''
32>>> env.from_string("{{ foo.foo() }}").render(foo=MODULE.PrivateStuff())
33u''
34>>> env.from_string("{{ foo.bar() }}").render(foo=MODULE.PrivateStuff())
35u'23'
36
37>>> env.from_string("{{ foo.foo() }}").render(foo=MODULE.PublicStuff())
38u''
39>>> env.from_string("{{ foo.bar() }}").render(foo=MODULE.PublicStuff())
40u'23'
41
42>>> env.from_string("{{ foo.__class__ }}").render(foo=42)
43u''
44
45>>> env.from_string("{{ foo.func_code }}").render(foo=lambda:None)
46u''
47'''
48
49
50test_restricted = '''
51>>> env.from_string("{% for item.attribute in seq %}...{% endfor %}")
52Traceback (most recent call last):
53 ...
Armin Ronacher1cc232c2007-09-07 17:52:41 +020054TemplateSyntaxError: cannot assign to expression (line 1)
Armin Ronacherecc051b2007-06-01 18:25:28 +020055>>> env.from_string("{% for foo, bar.baz in seq %}...{% endfor %}")
56Traceback (most recent call last):
57 ...
Armin Ronacher1cc232c2007-09-07 17:52:41 +020058TemplateSyntaxError: cannot assign to expression (line 1)
Armin Ronacherccf284b2007-05-21 16:44:26 +020059'''
Armin Ronacher825e5222007-11-16 16:16:23 +010060
61
62def test_nonlocal_set():
63 env = Environment()
64 env.globals['outer'] = 42
65 tmpl = env.from_string(NONLOCALSET)
66 assert tmpl.render() == '9'
67 assert env.globals['outer'] == 42