django-oidc-provider/oidc_provider/tests/app/utils.py

124 lines
3.3 KiB
Python
Raw Normal View History

import random
import string
try:
from urlparse import parse_qs, urlsplit
except ImportError:
from urllib.parse import parse_qs, urlsplit
from django.utils import timezone
from django.contrib.auth.models import User
from oidc_provider.models import (
Client,
Code,
Token)
2015-02-11 18:37:51 +00:00
FAKE_NONCE = 'cb584e44c43ed6bd0bc2d9c7e242837d'
FAKE_RANDOM_STRING = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(32))
FAKE_CODE_CHALLENGE = 'YlYXEqXuRm-Xgi2BOUiK50JW1KsGTX6F1TDnZSC8VTg'
FAKE_CODE_VERIFIER = 'SmxGa0XueyNh5bDgTcSrqzAh2_FmXEqU8kDT6CuXicw'
2015-07-16 18:04:33 +00:00
2015-08-11 18:59:57 +00:00
2015-02-11 18:37:51 +00:00
def create_fake_user():
"""
Create a test user.
2015-02-11 18:37:51 +00:00
Return a User object.
"""
user = User()
user.username = 'johndoe'
user.email = 'johndoe@example.com'
user.set_password('1234')
2015-02-11 18:37:51 +00:00
user.save()
2015-02-11 18:37:51 +00:00
return user
2015-02-11 18:37:51 +00:00
2015-08-11 18:59:57 +00:00
2017-03-31 16:34:03 +00:00
def create_fake_client(response_type, is_public=False, require_consent=True):
"""
Create a test client, response_type argument MUST be:
'code', 'id_token' or 'id_token token'.
Return a Client object.
"""
client = Client()
client.name = 'Some Client'
2016-04-14 19:22:38 +00:00
client.client_id = str(random.randint(1, 999999)).zfill(6)
if is_public:
client.client_type = 'public'
client.client_secret = ''
else:
2016-04-14 19:22:38 +00:00
client.client_secret = str(random.randint(1, 999999)).zfill(6)
client.response_type = response_type
client.redirect_uris = ['http://example.com/']
2017-03-31 16:34:03 +00:00
client.require_consent = require_consent
client.save()
return client
2015-08-11 18:59:57 +00:00
def create_fake_token(user, scopes, client):
expires_at = timezone.now() + timezone.timedelta(seconds=60)
token = Token(user=user, client=client, expires_at=expires_at)
token.scope = scopes
token.save()
return token
def is_code_valid(url, user, client):
"""
Check if the code inside the url is valid. Supporting both query string and fragment.
"""
try:
parsed = urlsplit(url)
params = parse_qs(parsed.query or parsed.fragment)
code = params['code'][0]
code = Code.objects.get(code=code)
is_code_ok = (code.client == client) and (code.user == user)
except:
is_code_ok = False
return is_code_ok
2015-08-11 18:59:57 +00:00
2016-07-07 15:50:27 +00:00
def userinfo(claims, user):
"""
2016-07-07 15:50:27 +00:00
Fake function for setting OIDC_USERINFO.
"""
2016-07-07 15:50:27 +00:00
claims['given_name'] = 'John'
claims['family_name'] = 'Doe'
claims['name'] = '{0} {1}'.format(claims['given_name'], claims['family_name'])
claims['email'] = user.email
claims['address']['country'] = 'Argentina'
return claims
def fake_sub_generator(user):
"""
Fake function for setting OIDC_IDTOKEN_SUB_GENERATOR.
"""
return user.email
def fake_idtoken_processing_hook(id_token, user):
"""
2016-02-12 17:51:43 +00:00
Fake function for inserting some keys into token. Testing OIDC_IDTOKEN_PROCESSING_HOOK.
"""
2016-02-12 17:51:43 +00:00
id_token['test_idtoken_processing_hook'] = FAKE_RANDOM_STRING
id_token['test_idtoken_processing_hook_user_email'] = user.email
2016-02-12 17:51:43 +00:00
return id_token
def fake_idtoken_processing_hook2(id_token, user):
"""
Fake function for inserting some keys into token. Testing OIDC_IDTOKEN_PROCESSING_HOOK - tuple or list as param
"""
id_token['test_idtoken_processing_hook2'] = FAKE_RANDOM_STRING
id_token['test_idtoken_processing_hook_user_email2'] = user.email
return id_token