116 lines
3 KiB
Python
116 lines
3 KiB
Python
from django.utils.translation import ugettext as _
|
|
from openid_provider.models import UserInfo
|
|
|
|
|
|
# Standard Claims
|
|
# http://openid.net/specs/openid-connect-core-1_0.html#StandardClaims
|
|
|
|
class StandardClaims(object):
|
|
|
|
__model__ = UserInfo
|
|
|
|
def __init__(self, user, scopes):
|
|
self.user = user
|
|
self.scopes = scopes
|
|
|
|
try:
|
|
self.model = self.__model__.objects.get(user=self.user)
|
|
except self.__model__.DoesNotExist:
|
|
self.model = self.__model__()
|
|
|
|
@property
|
|
def response_dic(self):
|
|
|
|
dic = {}
|
|
|
|
for scope in self.scopes:
|
|
|
|
if scope in self._scopes_registered():
|
|
dic.update(getattr(self, 'scope_' + scope))
|
|
|
|
dic = self._clean_dic(dic)
|
|
|
|
return dic
|
|
|
|
def _scopes_registered(self):
|
|
'''
|
|
Return a list that contains all the scopes registered
|
|
in the class.
|
|
'''
|
|
scopes = []
|
|
|
|
for name in self.__class__.__dict__:
|
|
|
|
if name.startswith('scope_'):
|
|
scope = name.split('scope_')[1]
|
|
scopes.append(scope)
|
|
|
|
return scopes
|
|
|
|
def _clean_dic(self, dic):
|
|
'''
|
|
Clean recursively all empty or None values inside a dict.
|
|
'''
|
|
aux_dic = dic.copy()
|
|
for key, value in dic.iteritems():
|
|
|
|
if not value:
|
|
del aux_dic[key]
|
|
elif type(value) is dict:
|
|
aux_dic[key] = clean_dic(value)
|
|
|
|
return aux_dic
|
|
|
|
@property
|
|
def scope_profile(self):
|
|
dic = {
|
|
'name': self.model.name,
|
|
'given_name': self.model.given_name,
|
|
'family_name': self.model.family_name,
|
|
'middle_name': self.model.middle_name,
|
|
'nickname': self.model.nickname,
|
|
'preferred_username': self.model.preferred_username,
|
|
'profile': self.model.profile,
|
|
'picture': self.model.picture,
|
|
'website': self.model.website,
|
|
'gender': self.model.gender,
|
|
'birthdate': self.model.birthdate,
|
|
'zoneinfo': self.model.zoneinfo,
|
|
'locale': self.model.locale,
|
|
'updated_at': self.model.updated_at,
|
|
}
|
|
|
|
return dic
|
|
|
|
@property
|
|
def scope_email(self):
|
|
dic = {
|
|
'email': self.user.email,
|
|
'email_verified': self.model.email_verified,
|
|
}
|
|
|
|
return dic
|
|
|
|
@property
|
|
def scope_phone(self):
|
|
dic = {
|
|
'phone_number': self.model.phone_number,
|
|
'phone_number_verified': self.model.phone_number_verified,
|
|
}
|
|
|
|
return dic
|
|
|
|
@property
|
|
def scope_address(self):
|
|
dic = {
|
|
'address': {
|
|
'formatted': self.model.address_formatted,
|
|
'street_address': self.model.address_street_address,
|
|
'locality': self.model.address_locality,
|
|
'region': self.model.address_region,
|
|
'postal_code': self.model.address_postal_code,
|
|
'country': self.model.address_country,
|
|
}
|
|
}
|
|
|
|
return dic
|