Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
7 changes: 3 additions & 4 deletions src/sentry/api/helpers/group_index/index.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,6 @@
from typing import Any, ParamSpec, TypeVar

import sentry_sdk
from django.contrib.auth.models import AnonymousUser
from rest_framework.authentication import SessionAuthentication
from rest_framework.exceptions import ParseError
from rest_framework.request import Request
Expand All @@ -15,6 +14,7 @@
from sentry.api.event_search import AggregateFilter, SearchFilter
from sentry.api.helpers.environments import get_environment
from sentry.api.serializers import serialize
from sentry.auth.principal import RequestPrincipal
from sentry.constants import DEFAULT_SORT_OPTION
from sentry.exceptions import InvalidSearchQuery
from sentry.issues.issue_search import convert_query_values, parse_search_query
Expand All @@ -25,7 +25,6 @@
from sentry.models.release import Release
from sentry.signals import advanced_search_feature_gated
from sentry.snuba.referrer import Referrer
from sentry.users.models.user import User
from sentry.utils import metrics
from sentry.utils.cursors import Cursor, CursorResult

Expand All @@ -51,7 +50,7 @@ def parse_and_convert_issue_search_query(
organization: Organization,
projects: Sequence[Project],
environments: Sequence[Environment] | None,
user: User | AnonymousUser,
user: RequestPrincipal,
) -> Sequence[SearchFilter | AggregateFilter]:
try:
search_filters = convert_query_values(
Expand Down Expand Up @@ -129,7 +128,7 @@ def build_query_params_from_request(
def validate_search_filter_permissions(
organization: Organization,
search_filters: Sequence[AggregateFilter | SearchFilter],
user: User | AnonymousUser,
user: RequestPrincipal,
) -> None:
"""
Verifies that an organization is allowed to perform the query that they
Expand Down
5 changes: 2 additions & 3 deletions src/sentry/issues/endpoints/group_event_details.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@
from typing import Any, cast

import sentry_sdk
from django.contrib.auth.models import AnonymousUser
from drf_spectacular.utils import OpenApiParameter, extend_schema
from rest_framework.exceptions import ParseError
from rest_framework.request import Request
Expand Down Expand Up @@ -45,6 +44,7 @@
from sentry.apidocs.parameters import EventParams, GlobalParams, IssueParams
from sentry.apidocs.response_types import DetailResponse
from sentry.apidocs.utils import inline_sentry_response_serializer
from sentry.auth.principal import RequestPrincipal
from sentry.constants import CELL_API_DEPRECATION_DATE
from sentry.exceptions import InvalidParams, InvalidSearchQuery
from sentry.issues.endpoints.bases.group import GroupEndpoint
Expand Down Expand Up @@ -76,7 +76,6 @@
from sentry.services.eventstore.models import Event, GroupEvent
from sentry.snuba.dataset import Dataset
from sentry.types.ratelimit import RateLimit, RateLimitCategory
from sentry.users.models.user import User
from sentry.utils import metrics
from sentry.utils.snuba import get_snuba_column_name

Expand All @@ -92,7 +91,7 @@ def format_search_filter(self, term: SearchFilter) -> WhereType | None:


def issue_search_query_to_conditions(
query: str, group: Group, user: User | AnonymousUser, environments: Sequence[Environment]
query: str, group: Group, user: RequestPrincipal, environments: Sequence[Environment]
) -> tuple[list[Condition], list[Any]]:
from sentry.utils.snuba import resolve_conditions

Expand Down
44 changes: 21 additions & 23 deletions src/sentry/issues/issue_search.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,6 @@
from functools import partial
from typing import cast, overload

from django.contrib.auth.models import AnonymousUser

from sentry.api.event_search import (
AggregateFilter,
ParenExpression,
Expand All @@ -19,6 +17,7 @@
default_config,
)
from sentry.api.event_search import parse_search_query as base_parse_query
from sentry.auth.principal import RequestPrincipal
from sentry.exceptions import InvalidSearchQuery
from sentry.issues.grouptype import (
GroupCategory,
Expand All @@ -45,7 +44,6 @@
from sentry.seer.autofix.constants import FixabilityScoreThresholds
from sentry.seer.autofix.issue_search import AUTOFIX_STATE_VALUES
from sentry.types.group import SUBSTATUS_UPDATE_CHOICES, PriorityLevel
from sentry.users.models.user import User
from sentry.users.services.user import RpcUser

is_filter_translation: dict[str, tuple[str, int]] = {
Expand Down Expand Up @@ -89,7 +87,7 @@
[
Iterable[str],
Sequence[Project],
User | RpcUser | AnonymousUser | None,
RequestPrincipal | None,
Sequence[Environment] | None,
],
str | list[str] | list[RpcUser | Team | None] | list[RpcUser] | list[int] | list[float],
Expand All @@ -99,7 +97,7 @@
def convert_actor_or_none_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[RpcUser | Team | None]:
# TODO: This will make N queries. This should be ok, we don't typically have large
Expand All @@ -116,7 +114,7 @@ def convert_actor_or_none_value(
def convert_user_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[RpcUser]:
# TODO: This will make N queries. This should be ok, we don't typically have large
Expand All @@ -127,7 +125,7 @@ def convert_user_value(
def convert_release_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> str | list[str]:
# TODO: This will make N queries. This should be ok, we don't typically have large
Expand All @@ -144,7 +142,7 @@ def convert_release_value(
def convert_first_release_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[str]:
# TODO: This will make N queries. This should be ok, we don't typically have large
Expand All @@ -158,7 +156,7 @@ def convert_first_release_value(
def convert_substatus_value(
value: Iterable[str | int],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[int]:
parsed = []
Expand All @@ -173,7 +171,7 @@ def convert_substatus_value(
def convert_status_value(
value: Iterable[str | int],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[int]:
parsed = []
Expand All @@ -188,7 +186,7 @@ def convert_status_value(
def convert_category_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[int]:
"""Convert a value like 'error' or 'performance' to the GroupType value for issue lookup"""
Expand All @@ -204,7 +202,7 @@ def convert_category_value(
def convert_priority_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[int]:
"""Convert a value like 'high' or 'medium' to the Priority value for issue lookup"""
Expand All @@ -220,7 +218,7 @@ def convert_priority_value(
def convert_type_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[int]:
"""Convert a value like 'error' or 'performance_n_plus_one_db_queries' to the GroupType value for issue lookup"""
Expand All @@ -236,7 +234,7 @@ def convert_type_value(
def convert_device_class_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[str]:
"""Convert high, medium, and low to the underlying device class values"""
Expand All @@ -252,7 +250,7 @@ def convert_device_class_value(
def convert_seer_actionability_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[float]:
"""Convert high, medium, and low to fixability score thresholds"""
Expand All @@ -268,7 +266,7 @@ def convert_seer_actionability_value(
def convert_issue_progress_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[str]:
results: list[str] = []
Expand All @@ -284,7 +282,7 @@ def convert_issue_progress_value(
def convert_autofix_state_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[str]:
results: list[str] = []
Expand All @@ -298,7 +296,7 @@ def convert_autofix_state_value(
def convert_detector_value(
value: Iterable[str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
) -> list[str]:
"""Convert detector ID(s) to a list of strings for consistent handling"""
Expand Down Expand Up @@ -332,7 +330,7 @@ def convert_detector_value(
def convert_query_values(
search_filters: list[SearchFilter],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
value_converters: Mapping[str, ValueConverter] = value_converters,
allow_aggregate_filters: bool = False,
Expand All @@ -344,7 +342,7 @@ def convert_query_values(
def convert_query_values(
search_filters: Sequence[AggregateFilter | SearchFilter],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
value_converters: Mapping[str, ValueConverter] = value_converters,
allow_aggregate_filters: bool = False,
Expand All @@ -355,7 +353,7 @@ def convert_query_values(
def convert_query_values(
search_filters: Sequence[QueryToken],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
value_converters: Mapping[str, ValueConverter] = value_converters,
allow_aggregate_filters: bool = False,
Expand All @@ -366,7 +364,7 @@ def convert_query_values(
def convert_query_values(
search_filters: Sequence[ParsedTerm],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
value_converters: Mapping[str, ValueConverter] = value_converters,
allow_aggregate_filters: bool = False,
Expand All @@ -376,7 +374,7 @@ def convert_query_values(
def convert_query_values(
search_filters: Sequence[QueryToken | str],
projects: Sequence[Project],
user: User | RpcUser | AnonymousUser | None,
user: RequestPrincipal | None,
environments: Sequence[Environment] | None,
value_converters: Mapping[str, ValueConverter] = value_converters,
allow_aggregate_filters: bool = False,
Expand Down
14 changes: 6 additions & 8 deletions src/sentry/search/utils.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,11 +6,10 @@
from enum import Enum
from typing import Any, Optional

from django.contrib.auth.models import AnonymousUser
from django.db import DataError, connections, router
from django.utils import timezone as django_timezone

from sentry.auth.principal import RequestPrincipal
from sentry.auth.principal import RequestPrincipal, has_user
from sentry.exceptions import InvalidSearchQuery
from sentry.models.environment import Environment
from sentry.models.group import STATUS_QUERY_CHOICES, Group
Expand Down Expand Up @@ -318,12 +317,11 @@ def parse_team_value(projects: Sequence[Project], value: Sequence[str]) -> Team:


def get_teams_for_users(
projects: Sequence[Project],
users: Sequence[User | RpcUser | AnonymousUser | None],
projects: Sequence[Project], users: Sequence[RequestPrincipal | None]
) -> list[Team]:
if not projects:
return []
user_ids = [u.id for u in users if u is not None]
user_ids = [u.id for u in users if u is not None and has_user(u)]
teams = Team.objects.filter(
id__in=OrganizationMemberTeam.objects.filter(
organizationmember__in=OrganizationMember.objects.filter(
Expand All @@ -336,15 +334,15 @@ def get_teams_for_users(


def parse_actor_value(
projects: Sequence[Project], value: str, user: User | RpcUser | AnonymousUser | None
projects: Sequence[Project], value: str, user: RequestPrincipal | None
) -> RpcUser | Team:
if value.startswith("#"):
return parse_team_value(projects, value)
return parse_user_value(value, user)


def parse_actor_or_none_value(
projects: Sequence[Project], value: str, user: User | RpcUser | AnonymousUser | None
projects: Sequence[Project], value: str, user: RequestPrincipal | None
) -> RpcUser | Team | None:
if value == "none":
return None
Expand Down Expand Up @@ -741,7 +739,7 @@ def split_query_into_tokens(query: str) -> Sequence[str]:
def parse_query(
projects: Sequence[Project],
query: str,
user: User | RpcUser | AnonymousUser,
user: RequestPrincipal,
environments: Sequence[Environment],
) -> dict[str, Any]:
"""| Parses the query string and returns a dict of structured query term values:
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@
)
from sentry.apidocs.response_types import DetailResponse
from sentry.apidocs.utils import inline_sentry_response_serializer
from sentry.auth.principal import RequestPrincipal
from sentry.constants import ObjectStatus
from sentry.deletions.models.scheduleddeletion import CellScheduledDeletion
from sentry.exceptions import InvalidSearchQuery
Expand Down Expand Up @@ -86,7 +87,9 @@
parse_detector_query = partial(base_parse_search_query, config=detector_search_config)


def convert_assignee_values(value: Iterable[str], projects: Sequence[Project], user: User) -> Q:
def convert_assignee_values(
value: Iterable[str], projects: Sequence[Project], user: RequestPrincipal
) -> Q:
"""
Convert an assignee search value to a Django Q object for filtering detectors.
"""
Expand Down
2 changes: 1 addition & 1 deletion tests/sentry/auth/test_principal.py
Original file line number Diff line number Diff line change
Expand Up @@ -277,7 +277,7 @@ def _is_request_user_type_check(node: ast.AST) -> bool:
# Lower these as callers move off. Exact, so the baseline can't drift back up.
REQUEST_USER_ID_BASELINE = 133
REQUEST_USER_TYPE_CHECK_BASELINE = 29
REQUEST_USER_ALLOWLIST_BASELINE = 22
REQUEST_USER_ALLOWLIST_BASELINE = 17


def test_request_user_id_uses_only_go_down() -> None:
Expand Down
Loading
Loading