test_api.py 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596
  1. from __future__ import absolute_import
  2. import six
  3. from django.core.urlresolvers import reverse
  4. from sentry.models import AuthIdentity, AuthProvider
  5. from sentry.testutils import AuthProviderTestCase
  6. from sentry.utils.auth import SSO_SESSION_KEY
  7. from sentry.utils.linksign import generate_signed_link
  8. class AuthenticationTest(AuthProviderTestCase):
  9. def test_sso_auth_required(self):
  10. user = self.create_user("foo@example.com", is_superuser=False)
  11. organization = self.create_organization(name="foo")
  12. team = self.create_team(name="bar", organization=organization)
  13. project = self.create_project(name="baz", organization=organization, teams=[team])
  14. member = self.create_member(user=user, organization=organization, teams=[team])
  15. setattr(member.flags, "sso:linked", True)
  16. member.save()
  17. event = self.store_event(data={}, project_id=project.id)
  18. group_id = event.group_id
  19. auth_provider = AuthProvider.objects.create(
  20. organization=organization, provider="dummy", flags=0
  21. )
  22. AuthIdentity.objects.create(auth_provider=auth_provider, user=user)
  23. self.login_as(user)
  24. paths = (
  25. u"/api/0/organizations/{}/".format(organization.slug),
  26. u"/api/0/projects/{}/{}/".format(organization.slug, project.slug),
  27. u"/api/0/teams/{}/{}/".format(organization.slug, team.slug),
  28. u"/api/0/issues/{}/".format(group_id),
  29. # this uses the internal API, which once upon a time was broken
  30. u"/api/0/issues/{}/events/latest/".format(group_id),
  31. )
  32. for path in paths:
  33. # we should be redirecting the user to the authentication form as they
  34. # haven't verified this specific organization
  35. resp = self.client.get(path)
  36. assert resp.status_code == 401, (resp.status_code, resp.content)
  37. # superuser should still require SSO as they're a member of the org
  38. user.update(is_superuser=True)
  39. for path in paths:
  40. resp = self.client.get(path)
  41. assert resp.status_code == 401, (resp.status_code, resp.content)
  42. # XXX(dcramer): using internal API as exposing a request object is hard
  43. self.session[SSO_SESSION_KEY] = six.text_type(organization.id)
  44. self.save_session()
  45. # now that SSO is marked as complete, we should be able to access dash
  46. for path in paths:
  47. resp = self.client.get(path)
  48. assert resp.status_code == 200, (path, resp.status_code, resp.content)
  49. def test_sso_auth_required_signed_link(self):
  50. user = self.create_user("foo@example.com", is_superuser=False)
  51. organization = self.create_organization(name="foo")
  52. team = self.create_team(name="bar", organization=organization)
  53. project = self.create_project(name="baz", organization=organization, teams=[team])
  54. member = self.create_member(user=user, organization=organization, teams=[team])
  55. setattr(member.flags, "sso:linked", True)
  56. member.save()
  57. self.store_event(data={}, project_id=project.id)
  58. auth_provider = AuthProvider.objects.create(
  59. organization=organization, provider="dummy", flags=0
  60. )
  61. AuthIdentity.objects.create(auth_provider=auth_provider, user=user)
  62. self.login_as(user)
  63. unsigned_link = reverse(
  64. "sentry-api-0-project-fix-processing-issues",
  65. kwargs={"project_slug": project.slug, "organization_slug": organization.slug},
  66. )
  67. resp = self.client.get(unsigned_link)
  68. assert resp.status_code == 401, (resp.status_code, resp.content)
  69. signed_link = generate_signed_link(
  70. user,
  71. "sentry-api-0-project-fix-processing-issues",
  72. kwargs={"project_slug": project.slug, "organization_slug": organization.slug},
  73. )
  74. resp = self.client.get(signed_link)
  75. assert resp.status_code == 200