test_api.py 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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(
  14. name='baz', organization=organization, teams=[team])
  15. member = self.create_member(
  16. user=user, organization=organization, teams=[team])
  17. setattr(member.flags, 'sso:linked', True)
  18. member.save()
  19. group = self.create_group(project=project)
  20. self.create_event(group=group)
  21. auth_provider = AuthProvider.objects.create(
  22. organization=organization,
  23. provider='dummy',
  24. flags=0,
  25. )
  26. AuthIdentity.objects.create(
  27. auth_provider=auth_provider,
  28. user=user,
  29. )
  30. self.login_as(user)
  31. paths = (
  32. '/api/0/organizations/{}/'.format(organization.slug),
  33. '/api/0/projects/{}/{}/'.format(organization.slug, project.slug),
  34. '/api/0/teams/{}/{}/'.format(organization.slug, team.slug),
  35. '/api/0/issues/{}/'.format(group.id),
  36. # this uses the internal API, which once upon a time was broken
  37. '/api/0/issues/{}/events/latest/'.format(group.id),
  38. )
  39. for path in paths:
  40. # we should be redirecting the user to the authentication form as they
  41. # haven't verified this specific organization
  42. resp = self.client.get(path)
  43. assert resp.status_code == 401, (resp.status_code, resp.content)
  44. # superuser should still require SSO as they're a member of the org
  45. user.update(is_superuser=True)
  46. for path in paths:
  47. resp = self.client.get(path)
  48. assert resp.status_code == 401, (resp.status_code, resp.content)
  49. # XXX(dcramer): using internal API as exposing a request object is hard
  50. self.session[SSO_SESSION_KEY] = six.text_type(organization.id)
  51. self.save_session()
  52. # now that SSO is marked as complete, we should be able to access dash
  53. for path in paths:
  54. resp = self.client.get(path)
  55. assert resp.status_code == 200, (path,
  56. resp.status_code, resp.content)
  57. def test_sso_auth_required_signed_link(self):
  58. user = self.create_user('foo@example.com', is_superuser=False)
  59. organization = self.create_organization(name='foo')
  60. team = self.create_team(name='bar', organization=organization)
  61. project = self.create_project(
  62. name='baz', organization=organization, teams=[team])
  63. member = self.create_member(
  64. user=user, organization=organization, teams=[team])
  65. setattr(member.flags, 'sso:linked', True)
  66. member.save()
  67. group = self.create_group(project=project)
  68. self.create_event(group=group)
  69. auth_provider = AuthProvider.objects.create(
  70. organization=organization,
  71. provider='dummy',
  72. flags=0,
  73. )
  74. AuthIdentity.objects.create(
  75. auth_provider=auth_provider,
  76. user=user,
  77. )
  78. self.login_as(user)
  79. unsigned_link = reverse(
  80. 'sentry-api-0-project-fix-processing-issues',
  81. kwargs={
  82. 'project_slug': project.slug,
  83. 'organization_slug': organization.slug,
  84. }
  85. )
  86. resp = self.client.get(unsigned_link)
  87. assert resp.status_code == 401, (resp.status_code, resp.content)
  88. signed_link = generate_signed_link(
  89. user,
  90. 'sentry-api-0-project-fix-processing-issues',
  91. kwargs={
  92. 'project_slug': project.slug,
  93. 'organization_slug': organization.slug,
  94. }
  95. )
  96. resp = self.client.get(signed_link)
  97. assert resp.status_code == 200