11from collections import OrderedDict
2+ from django .conf import settings
3+ from django .contrib .auth import get_user_model
24from django .http import JsonResponse
35from oauth2_provider .contrib .rest_framework import OAuth2Authentication
46from oauth2_provider .decorators import protected_resource
7+ from oauth2_provider .models import get_access_token_model , get_application_model
58from rest_framework .decorators import api_view , permission_classes , authentication_classes
9+ from waffle import get_waffle_flag_model
610
711from apps .authorization .permissions import DataAccessGrantPermission
812from apps .capabilities .permissions import TokenHasProtectedCapability
@@ -45,6 +49,19 @@ def _get_userinfo(user, version=Versions.NOT_AN_API_VERSION):
4549@protected_resource () # Django OAuth Toolkit -> resource_owner = AccessToken
4650def _openidconnect_userinfo (request , version = Versions .NOT_AN_API_VERSION ):
4751 # NOTE: The **kwargs are not used anywhere down the callchain, and are being ignored.
52+ # 4250: Handling to ensure this only returns successfully if the flag is enabled for the application
53+ # associated with the user making the call
54+ if version == Versions .V3 :
55+ user = get_user_model ().objects .get (username = request .resource_owner )
56+ access_token = get_access_token_model ().objects .get (user_id = user .id )
57+ application = get_application_model ().objects .get (id = access_token .application_id )
58+ application_user = get_user_model ().objects .get (id = application .user_id )
59+ flag = get_waffle_flag_model ().get ('v3_early_adopter' )
60+ if flag .id is None or not flag .is_active_for_user (application_user ):
61+ return JsonResponse (
62+ {'status_code' : 403 , 'message' : settings .APPLICATION_DOES_NOT_HAVE_V3_ENABLED_YET .format (application .name )},
63+ status = 403 ,
64+ )
4865
4966 return JsonResponse (_get_userinfo (request .resource_owner , version ))
5067
@@ -58,6 +75,8 @@ def openidconnect_userinfo_v2(request):
5875
5976
6077def openidconnect_userinfo_v3 (request ):
78+ print ("openidconnect_userinfo_v3 request: " , request .__dict__ )
79+ print ("openidconnect_userinfo_v3 user: " , request .user .__dict__ )
6180 return _openidconnect_userinfo (request , version = Versions .V3 )
6281
6382
0 commit comments