1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027 |
- import responses
- from django.contrib.auth import get_user_model
- from django.urls import reverse
- from responses.matchers import header_matcher, urlencoded_params_matcher
- from ...conf.test import override_dynamic_settings
- from ...test import assert_contains
- from ...users.bans import ban_ip, ban_user
- from ..client import SESSION_STATE
- from ..models import Subject
- User = get_user_model()
- def test_oauth2_complete_view_returns_404_if_oauth_is_disabled(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is False
- response = client.get(reverse("misago:oauth2-complete"))
- assert response.status_code == 404
- def test_oauth2_complete_view_returns_error_404_if_user_ip_is_banned_and_oauth_is_disabled(
- client, dynamic_settings
- ):
- ban_ip("127.*", "Ya got banned!")
- assert dynamic_settings.enable_oauth2_client is False
- response = client.get(reverse("misago:oauth2-complete"))
- assert response.status_code == 404
- @override_dynamic_settings(
- enable_oauth2_client=True,
- oauth2_client_id="clientid123",
- oauth2_scopes="scopes",
- oauth2_login_url="https://example.com/oauth2/login",
- )
- def test_oauth2_complete_view_returns_error_403_if_user_ip_is_banned(
- client, dynamic_settings
- ):
- ban_ip("127.*", "Ya got banned!")
- assert dynamic_settings.enable_oauth2_client is True
- response = client.get(reverse("misago:oauth2-complete"))
- assert_contains(response, "Ya got banned", 403)
- @override_dynamic_settings(
- enable_oauth2_client=True,
- oauth2_client_id="clientid123",
- oauth2_scopes="scopes",
- oauth2_login_url="https://example.com/oauth2/login",
- )
- def test_oauth2_complete_view_returns_error_400_if_user_canceled_sign_in(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- response = client.get("%s?error=access_denied" % reverse("misago:oauth2-complete"))
- assert_contains(response, "The OAuth2 process was canceled by the provider.", 400)
- @override_dynamic_settings(
- enable_oauth2_client=True,
- oauth2_client_id="clientid123",
- oauth2_scopes="scopes",
- oauth2_login_url="https://example.com/oauth2/login",
- )
- def test_oauth2_complete_view_returns_error_400_if_state_is_not_set(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- response = client.get(reverse("misago:oauth2-complete"))
- assert_contains(response, "OAuth2 session is missing state.", 400)
- @override_dynamic_settings(
- enable_oauth2_client=True,
- oauth2_client_id="clientid123",
- oauth2_scopes="scopes",
- oauth2_login_url="https://example.com/oauth2/login",
- )
- def test_oauth2_complete_view_returns_error_400_if_state_is_invalid(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- session = client.session
- session[SESSION_STATE] = "state123"
- session.save()
- response = client.get(
- "%s?state=invalid&code=1234" % reverse("misago:oauth2-complete")
- )
- assert_contains(
- response,
- "OAuth2 state sent by the provider did not match one in the session.",
- 400,
- )
- @override_dynamic_settings(
- enable_oauth2_client=True,
- oauth2_client_id="clientid123",
- oauth2_scopes="scopes",
- oauth2_login_url="https://example.com/oauth2/login",
- )
- def test_oauth2_complete_view_returns_error_400_if_code_is_missing(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- session = client.session
- session[SESSION_STATE] = "state123"
- session.save()
- response = client.get("%s?state=state123&code=" % reverse("misago:oauth2-complete"))
- assert_contains(
- response,
- "OAuth2 authorization code was not sent by the provider.",
- 400,
- )
- TEST_SETTINGS = {
- "enable_oauth2_client": True,
- "oauth2_client_id": "oauth2_client_id",
- "oauth2_client_secret": "oauth2_client_secret",
- "oauth2_login_url": "https://example.com/oauth2/login",
- "oauth2_token_url": "https://example.com/oauth2/token",
- "oauth2_token_method": "POST",
- "oauth2_json_token_path": "token.bearer",
- "oauth2_user_url": "https://example.com/oauth2/user",
- "oauth2_user_method": "POST",
- "oauth2_user_token_name": "Authorization",
- "oauth2_user_token_location": "HEADER_BEARER",
- "oauth2_send_welcome_email": True,
- "oauth2_json_id_path": "id",
- "oauth2_json_name_path": "profile.name",
- "oauth2_json_email_path": "profile.email",
- }
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_creates_new_user(client, dynamic_settings, mailoutbox):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert response.status_code == 302
- # User and subject are created
- subject = Subject.objects.get(sub="1234")
- user = User.objects.get_by_email("john@example.com")
- assert subject.user_id == user.id
- assert user.username == "John_Doe"
- assert user.slug == "john-doe"
- assert user.email == "john@example.com"
- assert user.requires_activation == User.ACTIVATION_NONE
- # User is authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] == user.id
- # User welcome e-mail is sent
- assert len(mailoutbox) == 1
- assert mailoutbox[0].subject == "Welcome on Misago forums!"
- TEST_SETTINGS_EMAIL_DISABLED = TEST_SETTINGS.copy()
- TEST_SETTINGS_EMAIL_DISABLED["oauth2_send_welcome_email"] = False
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS_EMAIL_DISABLED)
- def test_oauth2_complete_view_doesnt_send_welcome_mail_if_option_is_disabled(
- client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert response.status_code == 302
- # User and subject are created
- subject = Subject.objects.get(sub="1234")
- user = User.objects.get_by_email("john@example.com")
- assert subject.user_id == user.id
- # User is authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] == user.id
- # User welcome e-mail is not sent
- assert len(mailoutbox) == 0
- TEST_SETTINGS_EXTRA_TOKEN_HEADERS = TEST_SETTINGS.copy()
- TEST_SETTINGS_EXTRA_TOKEN_HEADERS[
- "oauth2_token_extra_headers"
- ] = """
- Accept: application/json
- API-Version: 2.1.3.7
- """.strip()
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS_EXTRA_TOKEN_HEADERS)
- def test_oauth2_complete_view_includes_extra_headers_in_token_request(
- client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- header_matcher(
- {
- "Accept": "application/json",
- "API-Version": "2.1.3.7",
- }
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert response.status_code == 302
- # User and subject are created
- subject = Subject.objects.get(sub="1234")
- user = User.objects.get_by_email("john@example.com")
- assert subject.user_id == user.id
- # User is authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] == user.id
- TEST_SETTINGS_EXTRA_USER_HEADERS = TEST_SETTINGS.copy()
- TEST_SETTINGS_EXTRA_USER_HEADERS[
- "oauth2_user_extra_headers"
- ] = """
- X-Header: its-a-test
- API-Version: 2.1.3.7
- """.strip()
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS_EXTRA_USER_HEADERS)
- def test_oauth2_complete_view_includes_extra_headers_in_user_request(
- client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher(
- {
- "Authorization": f"Bearer {access_token}",
- "X-Header": "its-a-test",
- "API-Version": "2.1.3.7",
- }
- ),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert response.status_code == 302
- # User and subject are created
- subject = Subject.objects.get(sub="1234")
- user = User.objects.get_by_email("john@example.com")
- assert subject.user_id == user.id
- # User is authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] == user.id
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_updates_existing_user(
- user, client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- Subject.objects.create(sub="1234", user=user)
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert response.status_code == 302
- # User is updated
- user.refresh_from_db()
- assert user.username == "John_Doe"
- assert user.slug == "john-doe"
- assert user.email == "john@example.com"
- # User is authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] == user.id
- # User welcome e-mail is not sent
- assert len(mailoutbox) == 0
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_returns_error_400_if_code_grant_is_rejected(
- client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "error": "Permission denied",
- },
- status=403,
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(
- response,
- "The OAuth2 provider responded with error for an access token request.",
- 400,
- )
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_returns_error_400_if_access_token_is_rejected(
- user, client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- Subject.objects.create(sub="1234", user=user)
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "error": "Permission denied",
- },
- status=403,
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(
- response,
- "The OAuth2 provider responded with error for user profile request.",
- 400,
- )
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_returns_error_400_if_user_data_didnt_validate(
- user, client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- Subject.objects.create(sub="1234", user=user)
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(response, "Enter a valid email address.", 400)
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_returns_error_400_if_user_data_causes_integrity_error(
- user, client, dynamic_settings
- ):
- assert dynamic_settings.enable_oauth2_client is True
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": user.email,
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(response, "This e-mail address is not available.", 400)
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_updates_deactivated_user_but_returns_error_400(
- user, client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- Subject.objects.create(sub="1234", user=user)
- user.is_active = False
- user.save()
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(
- response,
- (
- "User account associated with the profile from the OAuth2 provider "
- "was deactivated by the site administrator."
- ),
- 400,
- )
- # User is updated but still deactivated
- user.refresh_from_db()
- assert user.username == "John_Doe"
- assert user.slug == "john-doe"
- assert user.email == "john@example.com"
- assert user.is_active is False
- # User is not authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] is None
- # User welcome e-mail is not sent
- assert len(mailoutbox) == 0
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_creates_banned_user_but_returns_error_403(
- user, client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- user.username = "John_Doe"
- ban_user(user, "Banned for a test.")
- user.refresh_from_db()
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(response, "Banned for a test.", 403)
- # User is created
- new_user = User.objects.get_by_email("john@example.com")
- assert new_user
- assert new_user.id != user.id
- assert new_user.username == "John_Doe"
- assert new_user.slug == "john-doe"
- assert new_user.email == "john@example.com"
- # User is not authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] is None
- # User welcome e-mail is not sent
- assert len(mailoutbox) == 0
- @responses.activate
- @override_dynamic_settings(**TEST_SETTINGS)
- def test_oauth2_complete_view_updates_banned_user_but_returns_error_403(
- user, client, dynamic_settings, mailoutbox
- ):
- assert dynamic_settings.enable_oauth2_client is True
- Subject.objects.create(sub="1234", user=user)
- user.username = "John_Doe"
- ban_user(user, "Banned for a test.")
- user.refresh_from_db()
- code_grant = "12345grant"
- session_state = "12345state"
- access_token = "12345token"
- session = client.session
- session[SESSION_STATE] = session_state
- session.save()
- responses.post(
- "https://example.com/oauth2/token",
- json={
- "token": {
- "bearer": access_token,
- },
- },
- match=[
- urlencoded_params_matcher(
- {
- "grant_type": "authorization_code",
- "client_id": "oauth2_client_id",
- "client_secret": "oauth2_client_secret",
- "redirect_uri": "http://testserver/oauth2/complete/",
- "code": code_grant,
- },
- ),
- ],
- )
- responses.post(
- "https://example.com/oauth2/user",
- json={
- "id": 1234,
- "profile": {
- "name": "John Doe",
- "email": "john@example.com",
- },
- },
- match=[
- header_matcher({"Authorization": f"Bearer {access_token}"}),
- ],
- )
- response = client.get(
- "%s?state=%s&code=%s"
- % (
- reverse("misago:oauth2-complete"),
- session_state,
- code_grant,
- )
- )
- assert_contains(response, "Banned for a test.", 403)
- # User is updated
- user.refresh_from_db()
- assert user.username == "John_Doe"
- assert user.slug == "john-doe"
- assert user.email == "john@example.com"
- # User is not authenticated
- auth_api = client.get(reverse("misago:api:auth")).json()
- assert auth_api["id"] is None
- # User welcome e-mail is not sent
- assert len(mailoutbox) == 0
|