|
22 | 22 | from oauth2_provider.models import get_application_model |
23 | 23 | from oauthlib.oauth2.rfc6749.errors import InvalidClientError, InvalidGrantError |
24 | 24 | from urllib.parse import urlparse, parse_qs |
25 | | - |
| 25 | +import html |
26 | 26 | from apps.dot_ext.scopes import CapabilitiesScopes |
27 | 27 | import apps.logging.request_logger as bb2logging |
28 | 28 |
|
@@ -120,12 +120,12 @@ def sensitive_info_check(self, request): |
120 | 120 | def get_template_names(self): |
121 | 121 | flag = get_waffle_flag_model().get("limit_data_access") |
122 | 122 | if waffle.switch_is_active('require-scopes'): |
123 | | - if flag.rollout or (flag.id is not None and flag.is_active_for_user(self.application.user)): |
| 123 | + if flag.rollout or (flag.id is not None and self.application and flag.is_active_for_user(self.application.user)): |
124 | 124 | return ["design_system/new_authorize_v2.html"] |
125 | 125 | else: |
126 | 126 | return ["design_system/authorize_v2.html"] |
127 | 127 | else: |
128 | | - if flag.rollout or (flag.id is not None and flag.is_active_for_user(self.user)): |
| 128 | + if flag.rollout or (flag.id is not None and self.user and flag.is_active_for_user(self.user)): |
129 | 129 | return ["design_system/new_authorize_v2.html"] |
130 | 130 | else: |
131 | 131 | return ["design_system/authorize.html"] |
@@ -179,7 +179,7 @@ def form_valid(self, form): |
179 | 179 | refresh_token_delete_cnt = 0 |
180 | 180 |
|
181 | 181 | if not scopes: |
182 | | - return self.error_response("No scopes defined", application) |
| 182 | + return self.error_response("No scopes", application) |
183 | 183 | try: |
184 | 184 | uri, headers, body, status = self.create_authorization_response( |
185 | 185 | request=self.request, scopes=scopes, credentials=credentials, allow=allow |
@@ -356,6 +356,40 @@ def post(self, request, *args, **kwargs): |
356 | 356 | return super().post(request, args, kwargs) |
357 | 357 |
|
358 | 358 |
|
| 359 | +@method_decorator(csrf_exempt, name="dispatch") |
| 360 | +class RevokeView(DotRevokeTokenView): |
| 361 | + |
| 362 | + @method_decorator(sensitive_post_parameters("password")) |
| 363 | + def post(self, request, *args, **kwargs): |
| 364 | + at_model = get_access_token_model() |
| 365 | + try: |
| 366 | + app = validate_app_is_active(request) |
| 367 | + except (InvalidClientError, InvalidGrantError) as error: |
| 368 | + return json_response_from_oauth2_error(error) |
| 369 | + |
| 370 | + tkn = request.POST.get('token') |
| 371 | + if tkn is not None: |
| 372 | + escaped_tkn = html.escape(tkn) |
| 373 | + else: |
| 374 | + escaped_tkn = "" |
| 375 | + |
| 376 | + try: |
| 377 | + token = at_model.objects.get(token=tkn) |
| 378 | + except at_model.DoesNotExist: |
| 379 | + log.debug(f"Token {escaped_tkn} was not found.") |
| 380 | + |
| 381 | + try: |
| 382 | + dag = DataAccessGrant.objects.get( |
| 383 | + beneficiary=token.user, |
| 384 | + application=app |
| 385 | + ) |
| 386 | + dag.delete() |
| 387 | + except Exception: |
| 388 | + log.debug(f"DAG lookup failed for token {escaped_tkn}.") |
| 389 | + |
| 390 | + return super().post(request, args, kwargs) |
| 391 | + |
| 392 | + |
359 | 393 | @method_decorator(csrf_exempt, name="dispatch") |
360 | 394 | class IntrospectTokenView(DotIntrospectTokenView): |
361 | 395 |
|
|
0 commit comments