oncall-engine/engine/apps/social_auth/middlewares.py
Ildar Iskhakov 07d289b0a3
SocialAuthAuthCanceledExceptionMiddleware should only process social … (#5221)
…auth related exceptions

# What this PR does

## Which issue(s) this PR closes

Related to [issue link here]

<!--
*Note*: If you want the issue to be auto-closed once the PR is merged,
change "Related to" to "Closes" in the line above.
If you have more than one GitHub issue that this PR closes, be sure to
preface
each issue link with a [closing
keyword](https://docs.github.com/en/get-started/writing-on-github/working-with-advanced-formatting/using-keywords-in-issues-and-pull-requests#linking-a-pull-request-to-an-issue).
This ensures that the issue(s) are auto-closed once the PR has been
merged.
-->

## Checklist

- [ ] Unit, integration, and e2e (if applicable) tests updated
- [ ] Documentation added (or `pr:no public docs` PR label added if not
required)
- [ ] Added the relevant release notes label (see labels prefixed w/
`release:`). These labels dictate how your PR will
    show up in the autogenerated release notes.
2024-11-04 04:54:47 +00:00

45 lines
2.3 KiB
Python

import logging
from django.http import HttpResponse
from django.shortcuts import redirect
from rest_framework import status
from social_core import exceptions
from social_django.middleware import SocialAuthExceptionMiddleware
from apps.grafana_plugin.ui_url_builder import UIURLBuilder
from apps.social_auth.backends import LoginSlackOAuth2V2
from apps.social_auth.exceptions import InstallMultiRegionSlackException
from common.constants.slack_auth import REDIRECT_AFTER_SLACK_INSTALL, SLACK_AUTH_FAILED, SLACK_REGION_ERROR
logger = logging.getLogger(__name__)
class SocialAuthAuthCanceledExceptionMiddleware(SocialAuthExceptionMiddleware):
def process_exception(self, request, exception):
strategy = getattr(request, "social_strategy", None)
if strategy is None or self.raise_exception(request, exception):
return
if isinstance(exception, exceptions.SocialAuthBaseException):
backend = getattr(exception, "backend", None)
url_builder = UIURLBuilder(request.user.organization)
url_builder_function = url_builder.chatops
if backend is not None and isinstance(backend, LoginSlackOAuth2V2):
url_builder_function = url_builder.user_profile
if exception:
logger.warning(f"SocialAuthAuthCanceledExceptionMiddleware.process_exception: {exception}")
if isinstance(exception, exceptions.AuthCanceled):
# if user canceled authentication, redirect them to the previous page using the same link
# as we used to redirect after auth/install
return redirect(url_builder_function())
elif isinstance(exception, exceptions.AuthFailed):
# if authentication was failed, redirect user to the plugin page using the same link
# as we used to redirect after auth/install with error flag
return redirect(url_builder_function(f"?slack_error={SLACK_AUTH_FAILED}"))
elif isinstance(exception, KeyError) and REDIRECT_AFTER_SLACK_INSTALL in exception.args:
return HttpResponse(status=status.HTTP_401_UNAUTHORIZED)
elif isinstance(exception, InstallMultiRegionSlackException):
return redirect(url_builder_function(f"?tab=Slack&slack_error={SLACK_REGION_ERROR}"))