Skip to content

Commit 072bb3d

Browse files
author
Stephen Cefali
authored
feat(demo): adds middleware to log user in automatically (#24317)
1 parent 0359392 commit 072bb3d

File tree

3 files changed

+89
-0
lines changed

3 files changed

+89
-0
lines changed

src/sentry/demo/middleware.py

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
from django.conf import settings
2+
3+
from sentry.models import OrganizationMember
4+
from sentry.utils import auth
5+
6+
7+
class DemoMiddleware:
8+
# automatically log in logged out users when they land
9+
# on organization pages
10+
def process_view(self, request, view_func, view_args, view_kwargs):
11+
if not settings.DEMO_MODE:
12+
raise Exception("Demo mode misconfigured")
13+
14+
# only handling org views
15+
if "organization_slug" not in view_kwargs:
16+
return
17+
18+
org_slug = view_kwargs["organization_slug"]
19+
# if authed, make sure it's the same org
20+
if request.user.is_authenticated() and request.user.is_active:
21+
# if already part of org, then quit
22+
if OrganizationMember.objects.filter(
23+
organization__slug=org_slug, user=request.user
24+
).exists():
25+
return
26+
27+
# find a member in the target org
28+
try:
29+
member = OrganizationMember.objects.filter(
30+
organization__slug=org_slug, role="member"
31+
).first()
32+
auth.login(request, member.user)
33+
except OrganizationMember.DoesNotExist:
34+
# TODO: render landing pagee
35+
pass

src/sentry/demo/settings.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,6 @@
1919
"schedule": timedelta(hours=1),
2020
"options": {"expires": 3600, "queue": "cleanup"},
2121
}
22+
MIDDLEWARE_CLASSES = MIDDLEWARE_CLASSES + ("sentry.demo.middleware.DemoMiddleware",)
2223
INSTALLED_APPS = INSTALLED_APPS + ("sentry.demo.apps.Config",)
2324
ROOT_URLCONF = "sentry.demo.urls"
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
import pytest
2+
3+
from django.core.urlresolvers import reverse
4+
from django.test import override_settings
5+
6+
from sentry.demo.settings import MIDDLEWARE_CLASSES
7+
from sentry.testutils import APITestCase
8+
from sentry.utils.compat import mock
9+
10+
from sentry.utils import auth
11+
12+
orig_login = auth.login
13+
14+
15+
class DemoMiddlewareTest(APITestCase):
16+
def setUp(self):
17+
super().setUp()
18+
self.organization2 = self.create_organization()
19+
self.user2 = self.create_user()
20+
self.om2 = self.create_member(
21+
organization=self.organization2, user=self.user2, role="member"
22+
)
23+
self.url = reverse(
24+
"sentry-organization-issue-list",
25+
kwargs={"organization_slug": self.organization2.slug},
26+
)
27+
28+
@override_settings(MIDDLEWARE_CLASSES=MIDDLEWARE_CLASSES, DEMO_MODE=False)
29+
def test_demo_mode_disabled(self):
30+
with pytest.raises(Exception) as e:
31+
self.client.get(self.url)
32+
assert "Demo mode misconfigured" in str(e)
33+
34+
@override_settings(MIDDLEWARE_CLASSES=MIDDLEWARE_CLASSES)
35+
@mock.patch("sentry.demo.middleware.auth.login", side_effect=orig_login)
36+
def test_switch_to_logged_in(self, mock_auth_login):
37+
response = self.client.get(self.url)
38+
assert response.status_code == 200, response.content
39+
mock_auth_login.assert_called_once_with(mock.ANY, self.user2)
40+
41+
@override_settings(MIDDLEWARE_CLASSES=MIDDLEWARE_CLASSES)
42+
@mock.patch("sentry.demo.middleware.auth.login", side_effect=orig_login)
43+
def test_keep_logged_in(self, mock_auth_login):
44+
self.login_as(self.user2)
45+
response = self.client.get(self.url)
46+
assert response.status_code == 200, response.content
47+
assert mock_auth_login.call_count == 0
48+
49+
@override_settings(MIDDLEWARE_CLASSES=MIDDLEWARE_CLASSES)
50+
def test_non_org_route(self):
51+
url = reverse("sentry-account-settings")
52+
response = self.client.get(url)
53+
assert response.status_code == 302, response.content

0 commit comments

Comments
 (0)