allow context vars, user_email and user_nameid in get_templated_url (#15154)
This commit is contained in:
parent
910faaf196
commit
571cc6d191
|
@ -170,14 +170,27 @@ class Requests(RequestsSession):
|
|||
|
||||
requests = Requests()
|
||||
|
||||
class UnknownTemplateVariableError(KeyError):
|
||||
pass
|
||||
|
||||
def get_templated_url(url):
|
||||
template_vars = settings.TEMPLATE_VARS
|
||||
def get_templated_url(url, context=None):
|
||||
template_vars = {}
|
||||
if context:
|
||||
template_vars.update(context.flatten())
|
||||
user = getattr(context.get('request'), 'user', None)
|
||||
if user and user.is_authenticated():
|
||||
template_vars['user_email'] = quote(user.email)
|
||||
if hasattr(user, 'saml_identifiers') and user.saml_identifiers.exists():
|
||||
template_vars['user_nameid'] = quote(user.saml_identifiers.first().name_id)
|
||||
template_vars.update(settings.TEMPLATE_VARS)
|
||||
def repl(matchobj):
|
||||
if matchobj.group(0)[1:-1] in template_vars:
|
||||
return template_vars[matchobj.group(0)[1:-1]]
|
||||
return matchobj.group(0)
|
||||
return re.sub(r'(\[.*?\])', repl, url)
|
||||
varname = matchobj.group(0)[1:-1]
|
||||
if varname == '[':
|
||||
return '['
|
||||
if varname not in template_vars:
|
||||
raise UnknownTemplateVariableError(varname)
|
||||
return template_vars[varname]
|
||||
return re.sub(r'(\[.+?\])', repl, url)
|
||||
|
||||
|
||||
# Simple signature scheme for query strings
|
||||
|
|
|
@ -1,6 +1,30 @@
|
|||
from combo.utils import aes_hex_decrypt, aes_hex_encrypt, get_templated_url
|
||||
import pytest
|
||||
|
||||
from combo.utils import (aes_hex_decrypt, aes_hex_encrypt, get_templated_url,
|
||||
UnknownTemplateVariableError)
|
||||
from django.conf import settings
|
||||
from django.test import override_settings
|
||||
from django.template import Context
|
||||
from django.test.client import RequestFactory
|
||||
from django.contrib.auth.models import AnonymousUser
|
||||
|
||||
|
||||
class MockSAMLUser(object):
|
||||
name_id = 'r2&d2'
|
||||
|
||||
class MockUser(object):
|
||||
email = 'foo=3@example.net'
|
||||
def is_authenticated(self):
|
||||
return True
|
||||
|
||||
def __init__(self, samlized=True):
|
||||
class MockSAMLUsers(object):
|
||||
def exists(self):
|
||||
return True
|
||||
def first(self):
|
||||
return MockSAMLUser()
|
||||
if samlized:
|
||||
self.saml_identifiers = MockSAMLUsers()
|
||||
|
||||
|
||||
def test_crypto_url():
|
||||
|
@ -10,7 +34,56 @@ def test_crypto_url():
|
|||
|
||||
|
||||
def test_templated_url():
|
||||
assert get_templated_url('[test_url]') == '[test_url]'
|
||||
assert get_templated_url('foobar') == 'foobar'
|
||||
assert get_templated_url('foo[]bar') == 'foo[]bar'
|
||||
assert get_templated_url('foo[bar') == 'foo[bar'
|
||||
assert get_templated_url('foo]bar') == 'foo]bar'
|
||||
assert get_templated_url('foo]bar[') == 'foo]bar['
|
||||
assert get_templated_url('foo]bar]') == 'foo]bar]'
|
||||
assert get_templated_url('foobar[[]') == 'foobar['
|
||||
assert get_templated_url('foobar[[]]') == 'foobar[]'
|
||||
assert get_templated_url('foobar[[]test]') == 'foobar[test]'
|
||||
|
||||
with pytest.raises(UnknownTemplateVariableError):
|
||||
get_templated_url('[test_url]')
|
||||
with override_settings(TEMPLATE_VARS={'test_url': 'http://www.example.net'}):
|
||||
assert get_templated_url('[test_url]') == 'http://www.example.net'
|
||||
assert get_templated_url('[test_url]/hello') == 'http://www.example.net/hello'
|
||||
|
||||
# contexts without users
|
||||
request = RequestFactory().get('/')
|
||||
request.user = None
|
||||
for context in (None, Context({}), Context({'request': None}),
|
||||
Context({'request': request})):
|
||||
with pytest.raises(UnknownTemplateVariableError) as e:
|
||||
get_templated_url('NameID=[user_nameid]', context=context)
|
||||
with pytest.raises(UnknownTemplateVariableError):
|
||||
get_templated_url('email=[user_email]', context=context)
|
||||
if context:
|
||||
context['foobar'] = 'barfoo'
|
||||
assert get_templated_url('[foobar]', context=context) == 'barfoo'
|
||||
|
||||
# contexts with users
|
||||
request = RequestFactory().get('/')
|
||||
request.user = MockUser(samlized=False)
|
||||
context = Context({'request': request})
|
||||
assert get_templated_url('email=[user_email]', context=context) == \
|
||||
'email=foo%3D3%40example.net'
|
||||
request.user = MockUser(samlized=True)
|
||||
assert get_templated_url('email=[user_email]&NameID=[user_nameid]', context=context) == \
|
||||
'email=foo%3D3%40example.net&NameID=r2%26d2'
|
||||
|
||||
# mixed sources
|
||||
request = RequestFactory().get('/')
|
||||
request.user = MockUser(samlized=True)
|
||||
context = Context({'request': request})
|
||||
context['foobar'] = 'barfoo'
|
||||
assert get_templated_url('[foobar]/email=[user_email]&NameID=[user_nameid]',
|
||||
context=context) == 'barfoo/email=foo%3D3%40example.net&NameID=r2%26d2'
|
||||
with override_settings(TEMPLATE_VARS={'test_url': 'http://www.example.net'}):
|
||||
request = RequestFactory().get('/')
|
||||
request.user = MockUser(samlized=True)
|
||||
context = Context({'foobar': 'barfoo', 'request': request})
|
||||
assert get_templated_url('[test_url]/[foobar]/?NameID=[user_nameid]&email=[user_email]',
|
||||
context=context) == \
|
||||
'http://www.example.net/barfoo/?NameID=r2%26d2&email=foo%3D3%40example.net'
|
||||
|
|
Loading…
Reference in New Issue