Example #1
0
    def post(self, request, organization=None, *args, **kwargs):
        """
        Process a login request via username/password. SSO login is handled
        elsewhere.
        """
        login_form = AuthenticationForm(request, request.data)

        # Rate limit logins
        is_limited = ratelimiter.is_limited(
            "auth:login:username:{}".format(
                md5_text(
                    login_form.clean_username(
                        request.data.get("username"))).hexdigest()),
            limit=10,
            window=60,  # 10 per minute should be enough for anyone
        )

        if is_limited:
            errors = {"__all__": [login_form.error_messages["rate_limited"]]}
            metrics.incr("login.attempt",
                         instance="rate_limited",
                         skip_internal=True,
                         sample_rate=1.0)

            return self.respond_with_error(errors)

        if not login_form.is_valid():
            metrics.incr("login.attempt",
                         instance="failure",
                         skip_internal=True,
                         sample_rate=1.0)
            return self.respond_with_error(login_form.errors)

        user = login_form.get_user()

        auth.login(request,
                   user,
                   organization_id=organization.id if organization else None)
        metrics.incr("login.attempt",
                     instance="success",
                     skip_internal=True,
                     sample_rate=1.0)

        if not user.is_active:
            return Response({
                "nextUri":
                "/auth/reactivate/",
                "user":
                serialize(user, user, DetailedUserSerializer()),
            })

        active_org = self.get_active_organization(request)
        redirect_url = auth.get_org_redirect_url(request, active_org)

        return Response({
            "nextUri":
            auth.get_login_redirect(request, redirect_url),
            "user":
            serialize(user, user, DetailedUserSerializer()),
        })
Example #2
0
def get_default_context(request, existing_context=None, team=None):
    from sentry import options
    from sentry.plugins import plugins

    context = {
        "URL_PREFIX": options.get("system.url-prefix"),
        "SINGLE_ORGANIZATION": settings.SENTRY_SINGLE_ORGANIZATION,
        "PLUGINS": plugins,
        "ONPREMISE": settings.SENTRY_ONPREMISE,
    }

    if existing_context:
        if team is None and "team" in existing_context:
            team = existing_context["team"]

        if "project" in existing_context:
            project = existing_context["project"]
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({"request": request})

        if (not existing_context
                or "TEAM_LIST" not in existing_context) and team:
            context["TEAM_LIST"] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True)

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context["selectedOrganization"] = serialize(organization, user)
    if team:
        context["selectedTeam"] = serialize(team, user)
    if project:
        context["selectedProject"] = serialize(project, user)

    if not existing_context or "ACCESS" not in existing_context:
        if request:
            context["ACCESS"] = access.from_request(
                request=request,
                organization=organization).to_django_context()
        else:
            context["ACCESS"] = access.from_user(
                user=user, organization=organization).to_django_context()

    return context
Example #3
0
    def post(self, request, organization=None, *args, **kwargs):
        """
        Process a login request via username/password. SSO login is handled
        elsewhere.
        """
        login_form = AuthenticationForm(request, request.DATA)

        # Rate limit logins
        is_limited = ratelimiter.is_limited(
            u'auth:login:username:{}'.format(
                md5_text(request.DATA.get('username').lower()).hexdigest()),
            limit=10,
            window=60,  # 10 per minute should be enough for anyone
        )

        if is_limited:
            errors = {'__all__': [login_form.error_messages['rate_limited']]}
            metrics.incr('login.attempt',
                         instance='rate_limited',
                         skip_internal=True,
                         sample_rate=1.0)

            return self.respond_with_error(errors)

        if not login_form.is_valid():
            metrics.incr('login.attempt',
                         instance='failure',
                         skip_internal=True,
                         sample_rate=1.0)
            return self.respond_with_error(login_form.errors)

        user = login_form.get_user()

        auth.login(
            request,
            user,
            organization_id=organization.id if organization else None,
        )
        metrics.incr('login.attempt',
                     instance='success',
                     skip_internal=True,
                     sample_rate=1.0)

        if not user.is_active:
            return Response({
                'nextUri':
                '/auth/reactivate/',
                'user':
                serialize(user, user, DetailedUserSerializer()),
            })

        active_org = self.get_active_organization(request)
        redirect_url = auth.get_org_redirect_url(request, active_org)

        return Response({
            'nextUri':
            auth.get_login_redirect(request, redirect_url),
            'user':
            serialize(user, user, DetailedUserSerializer()),
        })
Example #4
0
def get_default_context(request, existing_context=None, team=None):
    from sentry.plugins import plugins

    context = {
        'EVENTS_PER_PAGE': EVENTS_PER_PAGE,
        'URL_PREFIX': settings.SENTRY_URL_PREFIX,
        'SINGLE_ORGANIZATION': settings.SENTRY_SINGLE_ORGANIZATION,
        'PLUGINS': plugins,
        'ALLOWED_HOSTS': settings.ALLOWED_HOSTS,
        'SENTRY_RAVEN_JS_URL': settings.SENTRY_RAVEN_JS_URL,
    }

    if existing_context:
        if team is None and 'team' in existing_context:
            team = existing_context['team']

        if 'project' in existing_context:
            project = existing_context['project']
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({
            'request': request,
        })

        if (not existing_context or 'TEAM_LIST' not in existing_context) and team:
            context['TEAM_LIST'] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True,
            )

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context['selectedOrganization'] = serialize(organization, user)
    if team:
        context['selectedTeam'] = serialize(team, user)
    if project:
        context['selectedProject'] = serialize(project, user)

    if not existing_context or 'ACCESS' not in existing_context:
        context['ACCESS'] = access.from_user(
            user=user,
            organization=organization,
        ).to_django_context()

    return context
Example #5
0
def get_default_context(request, existing_context=None, team=None):
    from sentry.plugins import plugins

    context = {
        'EVENTS_PER_PAGE': EVENTS_PER_PAGE,
        'URL_PREFIX': settings.SENTRY_URL_PREFIX,
        'SINGLE_ORGANIZATION': settings.SENTRY_SINGLE_ORGANIZATION,
        'PLUGINS': plugins,
        'ALLOWED_HOSTS': settings.ALLOWED_HOSTS,
        'SENTRY_RAVEN_JS_URL': settings.SENTRY_RAVEN_JS_URL,
    }

    if existing_context:
        if team is None and 'team' in existing_context:
            team = existing_context['team']

        if 'project' in existing_context:
            project = existing_context['project']
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({
            'request': request,
        })

        if (not existing_context or 'TEAM_LIST' not in existing_context) and team:
            context['TEAM_LIST'] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True,
            )

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context['selectedOrganization'] = serialize(organization, user)
    if team:
        context['selectedTeam'] = serialize(team, user)
    if project:
        context['selectedProject'] = serialize(project, user)

    if not existing_context or 'ACCESS' not in existing_context:
        context['ACCESS'] = access.from_user(
            user=user,
            organization=organization,
        ).to_django_context()

    return context
 def test_view_avatar_for_superuser(self):
     """
     Tests that superusers can see all doc integration avatars
     """
     self.login_as(user=self.superuser, superuser=True)
     for doc in [self.published_doc, self.draft_doc]:
         response = self.get_success_response(
             doc.slug, status_code=status.HTTP_200_OK)
         assert serialize(doc) == response.data
         assert serialize(doc.avatar.get()) == response.data["avatar"]
 def test_view_avatar_for_user(self):
     """
     Tests that regular users can see only published doc integration avatars
     """
     self.login_as(user=self.user)
     response = self.get_success_response(self.published_doc.slug,
                                          status_code=status.HTTP_200_OK)
     assert serialize(self.published_doc) == response.data
     assert serialize(
         self.published_doc.avatar.get()) == response.data["avatar"]
     response = self.get_error_response(
         self.draft_doc.slug, status_code=status.HTTP_403_FORBIDDEN)
 def test_upload_avatar_for_superuser(self):
     """
     Tests that superusers can upload avatars
     """
     self.login_as(user=self.superuser, superuser=True)
     for doc in [self.published_doc, self.draft_doc]:
         prev_avatar = doc.avatar.get()
         response = self.get_success_response(
             doc.slug,
             status_code=status.HTTP_200_OK,
             **self.avatar_payload)
         assert serialize(doc) == response.data
         assert serialize(doc.avatar.get()) == response.data["avatar"]
         assert serialize(prev_avatar) != response.data["avatar"]
         assert prev_avatar.file_id != doc.avatar.get().file_id
Example #9
0
def get_react_config(context):
    if 'request' in context:
        user = context['request'].user
    else:
        user = None

    if user:
        user = extract_lazy_object(user)

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if features.has('auth:register', actor=user):
        enabled_features.append('auth:register')

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'urlPrefix': settings.SENTRY_URL_PREFIX,
        'version': _get_version_info(),
        'features': enabled_features,
        'mediaUrl': reverse('sentry-media', args=['sentry', '']),
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user),
        })
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return mark_safe(json.dumps(context))
Example #10
0
def get_react_config(context):
    if 'request' in context:
        user = getattr(context['request'], 'user', None) or AnonymousUser()
        messages = get_messages(context['request'])
        try:
            is_superuser = context['request'].is_superuser()
        except AttributeError:
            is_superuser = False
    else:
        user = None
        messages = []
        is_superuser = False

    if user:
        user = extract_lazy_object(user)

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if auth.has_user_registration():
        enabled_features.append('auth:register')

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'supportEmail': get_support_mail(),
        'urlPrefix': options.get('system.url-prefix'),
        'version': version_info,
        'features': enabled_features,
        'mediaUrl': get_asset_url('sentry', ''),
        'needsUpgrade': needs_upgrade,
        'dsn': _get_public_dsn(),
        'statuspage': _get_statuspage(),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
        'isOnPremise': settings.SENTRY_ONPREMISE,
        'invitesEnabled': settings.SENTRY_ENABLE_INVITES,
        'gravatarBaseUrl': settings.SENTRY_GRAVATAR_BASE_URL,
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return json.dumps_htmlsafe(context)
Example #11
0
 def test_update_publish_without_avatar(self):
     """
     Tests that the DocIntegration cannot be published without an
     associated DocIntegrationAvatar.
     """
     self.login_as(user=self.superuser, superuser=True)
     response = self.get_error_response(
         self.doc_1.slug,
         status_code=status.HTTP_400_BAD_REQUEST,
         **self.payload)
     assert "avatar" in response.data.keys()
     avatar = self.create_doc_integration_avatar(doc_integration=self.doc_1)
     response = self.get_success_response(self.doc_1.slug,
                                          status_code=status.HTTP_200_OK,
                                          **self.payload)
     self.doc_1.refresh_from_db()
     assert serialize(self.doc_1) == response.data
     assert serialize(avatar) == response.data["avatar"]
Example #12
0
 def test_read_doc_for_public(self):
     """
     Tests that only non-draft DocIntegrations (with all the expected data)
     are visible for those without superuser permissions
     """
     self.login_as(user=self.user)
     # Non-draft DocIntegration, with features and an avatar
     response = self.get_success_response(self.doc_2.slug,
                                          status_code=status.HTTP_200_OK)
     assert serialize(self.doc_2) == response.data
     features = IntegrationFeature.objects.filter(
         target_id=self.doc_2.id,
         target_type=IntegrationTypes.DOC_INTEGRATION.value)
     for feature in features:
         assert serialize(feature) in serialize(self.doc_2)["features"]
     assert serialize(self.doc_2.avatar.get()) == response.data["avatar"]
     # Draft DocIntegration, without features or an avatar
     self.get_error_response(self.doc_1.slug,
                             status_code=status.HTTP_403_FORBIDDEN)
Example #13
0
def get_react_config(context):
    if 'request' in context:
        user = context['request'].user
        messages = get_messages(context['request'])
        try:
            is_superuser = context['request'].is_superuser()
        except AttributeError:
            is_superuser = False
    else:
        user = None
        messages = []
        is_superuser = False

    if user:
        user = extract_lazy_object(user)

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if features.has('auth:register', actor=user):
        enabled_features.append('auth:register')

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'urlPrefix': options.get('system.url-prefix'),
        'version': version_info,
        'features': enabled_features,
        'mediaUrl': get_asset_url('sentry', ''),
        'needsUpgrade': needs_upgrade,
        'dsn': _get_public_dsn(),
        'statuspage': _get_statuspage(),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return mark_safe(json.dumps(context))
Example #14
0
 def test_create_doc_for_superuser(self):
     """
     Tests that a draft DocIntegration is created for superuser requests along
     with all the appropriate IntegrationFeatures
     """
     self.login_as(user=self.superuser, superuser=True)
     response = self.get_success_response(status_code=status.HTTP_201_CREATED, **self.payload)
     doc = DocIntegration.objects.get(name=self.payload["name"], author=self.payload["author"])
     assert serialize(doc) == response.data
     assert doc.is_draft
     features = IntegrationFeature.objects.filter(
         target_id=doc.id, target_type=IntegrationTypes.DOC_INTEGRATION.value
     )
     assert features.exists()
     assert len(features) == 3
     for feature in features:
         # Ensure payload features are in the database
         assert feature.feature in self.payload["features"]
         # Ensure they are also serialized in the response
         assert serialize(feature) in response.data["features"]
Example #15
0
 def test_read_docs_public(self):
     """
     Tests that only non-draft DocIntegrations are returned for users,
     along with serialized versions of their avatars and IntegrationFeatures
     """
     self.login_as(user=self.user)
     response = self.get_success_response(status_code=status.HTTP_200_OK)
     assert len(response.data) == 2
     for doc in [self.doc_1, self.doc_3]:
         assert serialize(doc) in response.data
     # Check that the DocIntegrationAvatar was serialized
     assert self.doc_1.avatar.exists()
     assert serialize(self.doc_1.avatar.get()) in self.get_avatars(response)
     # Check that IntegrationFeatures were also serialized
     features = IntegrationFeature.objects.filter(
         target_id=self.doc_3.id, target_type=IntegrationTypes.DOC_INTEGRATION.value
     )
     assert len(features) == 3
     for feature in features:
         assert serialize(feature) in serialize(self.doc_3)["features"]
Example #16
0
 def test_update_doc_for_superuser(self):
     """
     Tests that a DocIntegration can be updated by superuser requests
     """
     self.login_as(user=self.superuser, superuser=True)
     response = self.get_success_response(self.doc_2.slug,
                                          status_code=status.HTTP_200_OK,
                                          **self.payload)
     self.doc_2.refresh_from_db()
     assert serialize(self.doc_2) == response.data
     features = IntegrationFeature.objects.filter(
         target_id=self.doc_2.id,
         target_type=IntegrationTypes.DOC_INTEGRATION.value)
     assert features.exists()
     assert len(features) == 3
     for feature in features:
         # Ensure payload features are in the database
         assert feature.feature in self.payload["features"]
         # Ensure they are also serialized in the response
         assert serialize(feature) in response.data["features"]
Example #17
0
 def test_read_doc_for_superuser(self):
     """
     Tests that any DocIntegration is visible (with all the expected data)
     for those with superuser permissions
     """
     self.login_as(user=self.superuser, superuser=True)
     # Non-draft DocIntegration, with features and an avatar
     response = self.get_success_response(self.doc_2.slug,
                                          status_code=status.HTTP_200_OK)
     assert serialize(self.doc_2) == response.data
     features = IntegrationFeature.objects.filter(
         target_id=self.doc_2.id,
         target_type=IntegrationTypes.DOC_INTEGRATION.value)
     for feature in features:
         assert serialize(feature) in response.data["features"]
     assert serialize(self.doc_2.avatar.get()) == response.data["avatar"]
     # Draft DocIntegration, without features or an avatar
     response = self.get_success_response(self.doc_1.slug,
                                          status_code=status.HTTP_200_OK)
     assert serialize(self.doc_1) == response.data
     assert not response.data["avatar"]
Example #18
0
 def test_update_simple_without_avatar(self):
     """
     Tests that the DocIntegration can be edited without an
     associated DocIntegrationAvatar.
     """
     self.login_as(user=self.superuser, superuser=True)
     payload = {**self.payload, "is_draft": True}
     response = self.get_success_response(self.doc_1.slug,
                                          status_code=status.HTTP_200_OK,
                                          **payload)
     self.doc_1.refresh_from_db()
     assert serialize(self.doc_1) == response.data
Example #19
0
def get_react_config(context):
    if 'request' in context:
        user = context['request'].user
        messages = get_messages(context['request'])
        try:
            is_superuser = context['request'].is_superuser()
        except AttributeError:
            is_superuser = False
    else:
        user = None
        messages = []
        is_superuser = False

    if user:
        user = extract_lazy_object(user)

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if features.has('auth:register', actor=user):
        enabled_features.append('auth:register')

    context = {
        'singleOrganization':
        settings.SENTRY_SINGLE_ORGANIZATION,
        'urlPrefix':
        settings.SENTRY_URL_PREFIX,
        'version':
        _get_version_info(),
        'features':
        enabled_features,
        'mediaUrl':
        get_asset_url('sentry', ''),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return mark_safe(json.dumps(context))
 def serialize(self, obj, attrs, user):
     return {
         "uuid": str(obj.uuid),
         "type": obj.type,
         "schema": obj.schema,
         "sentryApp": {
             "uuid":
             obj.sentry_app.uuid,
             "slug":
             obj.sentry_app.slug,
             "name":
             obj.sentry_app.name,
             "avatars":
             [serialize(avatar) for avatar in obj.sentry_app.avatar.all()],
         },
     }
Example #21
0
def get_react_config(context):
    if 'request' in context:
        user = context['request'].user
        messages = get_messages(context['request'])
        is_superuser = context['request'].is_superuser()
    else:
        user = None
        messages = []
        is_superuser = False

    if user:
        user = extract_lazy_object(user)

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if features.has('auth:register', actor=user):
        enabled_features.append('auth:register')

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'urlPrefix': settings.SENTRY_URL_PREFIX,
        'version': _get_version_info(),
        'features': enabled_features,
        'mediaUrl': get_asset_url('sentry', ''),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return mark_safe(json.dumps(context))
    def test_superuser_has_access(self):
        self.login_as(user=self.superuser, superuser=True)

        response = self.client.get(self.url, format="json")

        assert response.status_code == 200
        assert {
            "id": self.app_2.id,
            "uuid": self.app_2.uuid,
            "slug": self.app_2.slug,
            "name": self.app_2.name,
            "installs": 1,
            "avatars": [],
        } in json.loads(response.content)

        assert {
            "id": self.app_1.id,
            "uuid": self.app_1.uuid,
            "slug": self.app_1.slug,
            "name": self.app_1.name,
            "installs": 1,
            "avatars": [serialize(self.app_1_avatar)],
        } in json.loads(response.content)
Example #23
0
def get_client_config(request=None):
    """
    Provides initial bootstrap data needed to boot the frontend application.
    """
    if request is not None:
        user = getattr(request, "user", None) or AnonymousUser()
        messages = get_messages(request)
        session = getattr(request, "session", None)
        is_superuser = is_active_superuser(request)
        language_code = getattr(request, "LANGUAGE_CODE", "en")

        # User identity is used by the sentry SDK
        user_identity = {"ip_address": request.META["REMOTE_ADDR"]}
        if user and user.is_authenticated():
            user_identity.update({
                "email": user.email,
                "id": user.id,
                "isStaff": user.is_staff
            })
            if user.name:
                user_identity["name"] = user.name
    else:
        user = None
        user_identity = {}
        messages = []
        session = None
        is_superuser = False
        language_code = "en"

    enabled_features = []
    if features.has("organizations:create", actor=user):
        enabled_features.append("organizations:create")
    if auth.has_user_registration():
        enabled_features.append("auth:register")

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    public_dsn = _get_public_dsn()

    context = {
        "singleOrganization":
        settings.SENTRY_SINGLE_ORGANIZATION,
        "supportEmail":
        get_support_mail(),
        "urlPrefix":
        options.get("system.url-prefix"),
        "version":
        version_info,
        "features":
        enabled_features,
        "distPrefix":
        get_asset_url("sentry", "dist/"),
        "needsUpgrade":
        needs_upgrade,
        "dsn":
        public_dsn,
        "dsn_requests":
        _get_dsn_requests(),
        "statuspage":
        _get_statuspage(),
        "messages": [{
            "message": msg.message,
            "level": msg.tags
        } for msg in messages],
        "apmSampling":
        float(settings.SENTRY_FRONTEND_APM_SAMPLING or 0),
        "isOnPremise":
        settings.SENTRY_ONPREMISE,
        "invitesEnabled":
        settings.SENTRY_ENABLE_INVITES,
        "gravatarBaseUrl":
        settings.SENTRY_GRAVATAR_BASE_URL,
        "termsUrl":
        settings.TERMS_URL,
        "privacyUrl":
        settings.PRIVACY_URL,
        # Note `lastOrganization` should not be expected to update throughout frontend app lifecycle
        # It should only be used on a fresh browser nav to a path where an
        # organization is not in context
        "lastOrganization":
        session["activeorg"] if session and "activeorg" in session else None,
        "languageCode":
        language_code,
        "userIdentity":
        user_identity,
        "csrfCookieName":
        settings.CSRF_COOKIE_NAME,
        "sentryConfig": {
            "dsn":
            public_dsn,
            "release":
            settings.SENTRY_SDK_CONFIG["release"],
            "environment":
            settings.SENTRY_SDK_CONFIG["environment"],
            # By default `ALLOWED_HOSTS` is [*], however the JS SDK does not support globbing
            "whitelistUrls": (settings.SENTRY_FRONTEND_WHITELIST_URLS
                              if settings.SENTRY_FRONTEND_WHITELIST_URLS else
                              list("" if settings.ALLOWED_HOSTS ==
                                   ["*"] else settings.ALLOWED_HOSTS)),
        },
    }
    if user and user.is_authenticated():
        context.update({
            "isAuthenticated": True,
            "user": serialize(user, user, DetailedUserSerializer())
        })

        if request.user.is_superuser:
            # Note: This intentionally does not use the "active" superuser flag as
            # the frontend should only ever use this flag as a hint that the user can be a superuser
            # the API will always need to check for active superuser.
            #
            # This is needed in the case where you access a different org and get denied, but the UI
            # can open the sudo dialog if you are an "inactive" superuser
            context["user"]["isSuperuser"] = request.user.is_superuser
    else:
        context.update({"isAuthenticated": False, "user": None})

    return context
Example #24
0
def get_sentry_app_avatars(sentry_app: SentryApp):
    return [serialize(avatar) for avatar in sentry_app.avatar.all()]
Example #25
0
def get_default_context(request, existing_context=None, team=None):
    from sentry import options
    from sentry.plugins import plugins

    context = {
        'CSRF_COOKIE_NAME': settings.CSRF_COOKIE_NAME,
        'URL_PREFIX': options.get('system.url-prefix'),
        'SINGLE_ORGANIZATION': settings.SENTRY_SINGLE_ORGANIZATION,
        'PLUGINS': plugins,
        'ALLOWED_HOSTS': list(settings.ALLOWED_HOSTS),
        'ONPREMISE': settings.SENTRY_ONPREMISE,
    }

    if existing_context:
        if team is None and 'team' in existing_context:
            team = existing_context['team']

        if 'project' in existing_context:
            project = existing_context['project']
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({
            'request': request,
        })

        if (not existing_context or 'TEAM_LIST' not in existing_context) and team:
            context['TEAM_LIST'] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True,
            )

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context['selectedOrganization'] = serialize(organization, user)
    if team:
        context['selectedTeam'] = serialize(team, user)
    if project:
        context['selectedProject'] = serialize(project, user)

    if not existing_context or 'ACCESS' not in existing_context:
        if request:
            context['ACCESS'] = access.from_request(
                request=request,
                organization=organization,
            ).to_django_context()
        else:
            context['ACCESS'] = access.from_user(
                user=user,
                organization=organization,
            ).to_django_context()

    return context
Example #26
0
def get_client_config(request=None):
    """
    Provides initial bootstrap data needed to boot the frontend application.
    """
    if request is not None:
        user = getattr(request, "user", None) or AnonymousUser()
        messages = get_messages(request)
        session = getattr(request, "session", None)
        is_superuser = is_active_superuser(request)
        language_code = getattr(request, "LANGUAGE_CODE", "en")

        # User identity is used by the sentry SDK
        user_identity = {"ip_address": request.META["REMOTE_ADDR"]}
        if user and user.is_authenticated():
            user_identity.update({"email": user.email, "id": user.id})
            if user.name:
                user_identity["name"] = user.name
    else:
        user = None
        user_identity = {}
        messages = []
        is_superuser = False
        language_code = "en"

    enabled_features = []
    if features.has("organizations:create", actor=user):
        enabled_features.append("organizations:create")
    if auth.has_user_registration():
        enabled_features.append("auth:register")

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        "singleOrganization":
        settings.SENTRY_SINGLE_ORGANIZATION,
        "supportEmail":
        get_support_mail(),
        "urlPrefix":
        options.get("system.url-prefix"),
        "version":
        version_info,
        "features":
        enabled_features,
        "distPrefix":
        get_asset_url("sentry", "dist/"),
        "needsUpgrade":
        needs_upgrade,
        "dsn":
        _get_public_dsn(),
        "statuspage":
        _get_statuspage(),
        "messages": [{
            "message": msg.message,
            "level": msg.tags
        } for msg in messages],
        "isOnPremise":
        settings.SENTRY_ONPREMISE,
        "invitesEnabled":
        settings.SENTRY_ENABLE_INVITES,
        "gravatarBaseUrl":
        settings.SENTRY_GRAVATAR_BASE_URL,
        "termsUrl":
        settings.TERMS_URL,
        "privacyUrl":
        settings.PRIVACY_URL,
        # Note `lastOrganization` should not be expected to update throughout frontend app lifecycle
        # It should only be used on a fresh browser nav to a path where an
        # organization is not in context
        "lastOrganization":
        session["activeorg"] if session and "activeorg" in session else None,
        "languageCode":
        language_code,
        "userIdentity":
        user_identity,
        "csrfCookieName":
        settings.CSRF_COOKIE_NAME,
        "sentryConfig": {
            "dsn": _get_public_dsn(),
            "release": version_info["build"],
            "whitelistUrls": list(settings.ALLOWED_HOSTS),
        },
    }
    if user and user.is_authenticated():
        context.update({
            "isAuthenticated": True,
            "user": serialize(user, user, DetailedUserSerializer())
        })
        context["user"]["isSuperuser"] = is_superuser
    else:
        context.update({"isAuthenticated": False, "user": None})

    return context
Example #27
0
def get_react_config(context):
    if 'request' in context:
        user = getattr(context['request'], 'user', None) or AnonymousUser()
        messages = get_messages(context['request'])
        session = getattr(context['request'], 'session', None)
        try:
            is_superuser = context['request'].is_superuser()
        except AttributeError:
            is_superuser = False
    else:
        user = None
        messages = []
        is_superuser = False

    if user:
        user = extract_lazy_object(user)
        is_superuser = user.is_superuser

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if auth.has_user_registration():
        enabled_features.append('auth:register')

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'supportEmail': get_support_mail(),
        'urlPrefix': options.get('system.url-prefix'),
        'version': version_info,
        'features': enabled_features,
        'mediaUrl': get_asset_url('sentry', ''),
        'needsUpgrade': needs_upgrade,
        'dsn': get_public_dsn(),
        'statuspage': _get_statuspage(),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
        'isOnPremise': settings.SENTRY_ONPREMISE,
        'invitesEnabled': settings.SENTRY_ENABLE_INVITES,
        'gravatarBaseUrl': settings.SENTRY_GRAVATAR_BASE_URL,
        'termsUrl': settings.TERMS_URL,
        'privacyUrl': settings.PRIVACY_URL,
        # Note `lastOrganization` should not be expected to update throughout frontend app lifecycle
        # It should only be used on a fresh browser nav to a path where an
        # organization is not in context
        'lastOrganization': session['activeorg'] if session and 'activeorg' in session else None,
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user, DetailedUserSerializer()),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return json.dumps_htmlsafe(context)
Example #28
0
def get_default_context(request, existing_context=None, team=None):
    from sentry import options
    from sentry.plugins import plugins

    context = {
        'URL_PREFIX': options.get('system.url-prefix'),
        'SINGLE_ORGANIZATION': settings.SENTRY_SINGLE_ORGANIZATION,
        'PLUGINS': plugins,
        'ONPREMISE': settings.SENTRY_ONPREMISE,
    }

    if existing_context:
        if team is None and 'team' in existing_context:
            team = existing_context['team']

        if 'project' in existing_context:
            project = existing_context['project']
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({
            'request': request,
        })

        if (not existing_context
                or 'TEAM_LIST' not in existing_context) and team:
            context['TEAM_LIST'] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True,
            )

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context['selectedOrganization'] = serialize(organization, user)
    if team:
        context['selectedTeam'] = serialize(team, user)
    if project:
        context['selectedProject'] = serialize(project, user)

    if not existing_context or 'ACCESS' not in existing_context:
        if request:
            context['ACCESS'] = access.from_request(
                request=request,
                organization=organization,
            ).to_django_context()
        else:
            context['ACCESS'] = access.from_user(
                user=user,
                organization=organization,
            ).to_django_context()

    return context
Example #29
0
def get_default_context(request, existing_context=None, team=None):
    from sentry import options
    from clims.services import ioc
    from django.contrib.auth.models import AnonymousUser  # Django 1.9 setup issue
    from sentry.api.serializers.base import serialize  # Django 1.9 setup issue
    from sentry.models import Team  # Django 1.9 setup issue

    context = {
        'CSRF_COOKIE_NAME': settings.CSRF_COOKIE_NAME,
        'URL_PREFIX': options.get('system.url-prefix'),
        'SINGLE_ORGANIZATION': settings.SENTRY_SINGLE_ORGANIZATION,
        'PLUGINS': ioc.app.plugins,
        'ALLOWED_HOSTS': list(settings.ALLOWED_HOSTS),
        'ONPREMISE': settings.SENTRY_ONPREMISE,
    }

    if existing_context:
        if team is None and 'team' in existing_context:
            team = existing_context['team']

        if 'project' in existing_context:
            project = existing_context['project']
        else:
            project = None
    else:
        project = None

    if team:
        organization = team.organization
    elif project:
        organization = project.organization
    else:
        organization = None

    if request:
        context.update({
            'request': request,
        })

        if (not existing_context or 'TEAM_LIST' not in existing_context) and team:
            context['TEAM_LIST'] = Team.objects.get_for_user(
                organization=team.organization,
                user=request.user,
                with_projects=True,
            )

        user = request.user
    else:
        user = AnonymousUser()

    if organization:
        context['selectedOrganization'] = serialize(organization, user)
    if team:
        context['selectedTeam'] = serialize(team, user)
    if project:
        context['selectedProject'] = serialize(project, user)

    if not existing_context or 'ACCESS' not in existing_context:
        if request:
            context['ACCESS'] = access.from_request(
                request=request,
                organization=organization,
            ).to_django_context()
        else:
            context['ACCESS'] = access.from_user(
                user=user,
                organization=organization,
            ).to_django_context()

    return context
Example #30
0
def get_react_config(context):
    if 'request' in context:
        request = context['request']
        user = getattr(request, 'user', None) or AnonymousUser()
        messages = get_messages(request)
        session = getattr(request, 'session', None)
        is_superuser = is_active_superuser(request)
    else:
        user = None
        messages = []
        is_superuser = False

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if auth.has_user_registration():
        enabled_features.append('auth:register')

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        'singleOrganization':
        settings.SENTRY_SINGLE_ORGANIZATION,
        'supportEmail':
        get_support_mail(),
        'urlPrefix':
        options.get('system.url-prefix'),
        'version':
        version_info,
        'features':
        enabled_features,
        'needsUpgrade':
        needs_upgrade,
        'dsn':
        get_public_dsn(),
        'statuspage':
        _get_statuspage(),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
        'isOnPremise':
        settings.SENTRY_ONPREMISE,
        'invitesEnabled':
        settings.SENTRY_ENABLE_INVITES,
        'gravatarBaseUrl':
        settings.SENTRY_GRAVATAR_BASE_URL,
        'termsUrl':
        settings.TERMS_URL,
        'privacyUrl':
        settings.PRIVACY_URL,
        # Note `lastOrganization` should not be expected to update throughout frontend app lifecycle
        # It should only be used on a fresh browser nav to a path where an
        # organization is not in context
        'lastOrganization':
        session['activeorg'] if session and 'activeorg' in session else None,
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user, DetailedUserSerializer()),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return json.dumps_htmlsafe(context)
Example #31
0
def get_react_config(context):
    if 'request' in context:
        request = context['request']
        user = getattr(request, 'user', None) or AnonymousUser()
        messages = get_messages(request)
        session = getattr(request, 'session', None)
        is_superuser = is_active_superuser(request)
        language_code = getattr(request, 'LANGUAGE_CODE', 'en')
    else:
        user = None
        messages = []
        is_superuser = False
        language_code = 'en'

    # User identity is used by the sentry SDK
    if request and user:
        user_identity = {'ip_address': request.META['REMOTE_ADDR']}
        if user and user.is_authenticated():
            user_identity.update({
                'email': user.email,
                'id': user.id,
            })
            if user.name:
                user_identity['name'] = user.name
    else:
        user_identity = {}

    enabled_features = []
    if features.has('organizations:create', actor=user):
        enabled_features.append('organizations:create')
    if auth.has_user_registration():
        enabled_features.append('auth:register')

    version_info = _get_version_info()

    needs_upgrade = False

    if is_superuser:
        needs_upgrade = _needs_upgrade()

    context = {
        'singleOrganization': settings.SENTRY_SINGLE_ORGANIZATION,
        'supportEmail': get_support_mail(),
        'urlPrefix': options.get('system.url-prefix'),
        'version': version_info,
        'features': enabled_features,
        'distPrefix': get_asset_url('sentry', 'dist/'),
        'needsUpgrade': needs_upgrade,
        'dsn': _get_public_dsn(),
        'statuspage': _get_statuspage(),
        'messages': [{
            'message': msg.message,
            'level': msg.tags,
        } for msg in messages],
        'isOnPremise': settings.SENTRY_ONPREMISE,
        'invitesEnabled': settings.SENTRY_ENABLE_INVITES,
        'gravatarBaseUrl': settings.SENTRY_GRAVATAR_BASE_URL,
        'termsUrl': settings.TERMS_URL,
        'privacyUrl': settings.PRIVACY_URL,
        # Note `lastOrganization` should not be expected to update throughout frontend app lifecycle
        # It should only be used on a fresh browser nav to a path where an
        # organization is not in context
        'lastOrganization': session['activeorg'] if session and 'activeorg' in session else None,
        'languageCode': language_code,
        'userIdentity': user_identity,
        'csrfCookieName': settings.CSRF_COOKIE_NAME,
        'sentryConfig': {
            'dsn': _get_public_dsn(),
            'release': version_info['build'],
            'whitelistUrls': list(settings.ALLOWED_HOSTS),
        },
    }
    if user and user.is_authenticated():
        context.update({
            'isAuthenticated': True,
            'user': serialize(user, user, DetailedUserSerializer()),
        })
        context['user']['isSuperuser'] = is_superuser
    else:
        context.update({
            'isAuthenticated': False,
            'user': None,
        })
    return json.dumps_htmlsafe(context)