Files
insights/.semgrep/rules/security/idor-team-scoped-models.py
zeekay b7f9a67e2a fix: sever the ee coupling the rebase reintroduced, and boot
The rebase pulled upstream files that import ee/, a tree this distribution does
not carry, so `django.setup()` raised ModuleNotFoundError: No module named 'ee'
before any request could be served. main had already severed this; the rebase
lost the severance.

Restore insights/models/ee_models.py: the four RBAC models upstream keeps under
ee/, mapped managed=False onto the tables that actually exist
(ee_accesscontrol, ee_dashboardprivilege, ee_role, ee_rolemembership -- verified
against the live database, which has those four and no other ee_ table). 131
files repointed at it.

Restore main's insights/rbac/access_control_api_mixin.py. The rebase left a
fallback of `class AccessControlViewSetMixin: pass`, which drops the
dangerously_get_required_scopes hook that insights/api/project.py,
insights/api/team.py and products/replay_vision reach through super() -- an
AttributeError on scope derivation. Enforcement itself is unaffected either way:
it lives in insights/rbac/user_access_control.py, in-tree.

ExplicitTeamMembership has no table in this distribution, so it cannot emit the
signal the org serializer cache subscribes to; drop the registration.

SyncIterableToAsync moves in-tree next to the other streaming helpers, written
from the interface rather than carried over, so the MCP store proxy no longer
reaches into ee/ for a generic ASGI adapter.

bin/debrand renamed the hog_flow directory and the HogFlow symbol but not the
module path between them, leaving `from .hog_flow.hog_flow import InsightsFlow`
pointing at a path that no longer exists (33 sites). Add the missing text rule
so the rename is closed, and apply it.
2026-08-01 22:22:44 -07:00

825 lines
29 KiB
Python

from django.shortcuts import get_object_or_404
from insights.models import Notebook
from products.approvals.backend.models import ChangeRequest
from products.cohorts.backend.models.cohort import Cohort
from products.product_analytics.backend.models.insight import Insight
from products.actions.backend.models.action import Action
from insights.models.personal_api_key import PersonalAPIKey
from insights.models.project import Project
from insights.models.user_scene_personalisation import UserScenePersonalisation
from insights.models.ee_models import Role, RoleMembership
# ============================================================
# idor-taint-user-input-to-model-get (ERROR - user input flows to lookup)
# ============================================================
def vulnerable_get_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return Cohort.objects.get(pk=cohort_id)
def vulnerable_get_from_kwargs(kwargs):
action_id = kwargs.get("action_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return Action.objects.get(id=action_id)
def vulnerable_filter_from_data(request):
insight_id = request.data.get("insight_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return Insight.objects.filter(pk=insight_id)
# ok: idor-taint-user-input-to-model-get
def safe_get_with_team(request, team):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.get(pk=cohort_id, team__project_id=team.project_id)
# ok: idor-taint-user-input-to-model-get
def safe_get_with_team_id(request, team_id):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.get(pk=cohort_id, team_id=team_id)
# ok: idor-taint-user-input-to-model-get
def safe_filter_with_team(request, team):
insight_id = request.data.get("insight_id")
# ok: idor-lookup-without-team
return Insight.objects.filter(pk=insight_id, team=team)
# ok: idor-taint-user-input-to-model-get
def safe_get_with_for_team(request, team_id):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.for_team(team_id).get(pk=cohort_id)
# ok: idor-taint-user-input-to-model-get
def not_user_input():
# ruleid: idor-lookup-without-team
return Cohort.objects.get(pk=123)
# ============================================================
# idor-lookup-without-team (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.get(pk=cohort_id)
# ruleid: idor-lookup-without-team
action = Action.objects.get(id=action_id)
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.get(pk=cohort_id, deleted=False)
# ok: idor-lookup-without-team
cohort = Cohort.objects.get(pk=cohort_id, team__project_id=team.project_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.get(pk=cohort_id, team=team)
# ok: idor-lookup-without-team
cohort = Cohort.objects.get(pk=cohort_id, team_id=team_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.annotate(effective_project_id=1).filter(id=cohort_id, effective_project_id=project_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.annotate(effective_project_id=1).get(pk=cohort_id, effective_project_id=project_id)
# ok: idor-lookup-without-team
ChangeRequest.objects.select_for_update().get(pk=self.change_request.pk)
# ok: idor-lookup-without-team
Notebook.objects.get(pk=instance.pk)
# ok: idor-lookup-without-team
Notebook.objects.select_for_update().get(pk=instance.id)
# ============================================================
# idor-lookup-without-team (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-team
insights = Insight.objects.filter(pk=insight_id)
# ruleid: idor-lookup-without-team
cohorts = Cohort.objects.filter(pk__in=cohort_ids)
# ruleid: idor-lookup-without-team
actions = Action.objects.filter(id=action_id, deleted=False)
# ok: idor-lookup-without-team
insights = Insight.objects.filter(pk=insight_id, team_id=team_id)
# ok: idor-lookup-without-team
cohorts = Cohort.objects.filter(pk__in=cohort_ids, team__project_id=team.project_id)
# ok: idor-lookup-without-team
actions = Action.objects.filter(id=action_id, team=team)
# ============================================================
# idor-lookup-without-team (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-team
obj, created = Cohort.objects.get_or_create(name="test")
# ruleid: idor-lookup-without-team
obj, created = Action.objects.update_or_create(name="test", defaults={"deleted": False})
# ok: idor-lookup-without-team
obj, created = Cohort.objects.get_or_create(name="test", team_id=team_id)
# ok: idor-lookup-without-team
obj, created = Action.objects.update_or_create(name="test", team=team, defaults={"deleted": False})
# ok: idor-lookup-without-team
obj, created = Insight.objects.get_or_create(name="test", team__project_id=team.project_id)
# ruleid: idor-lookup-without-team
obj = Cohort.objects.aget_or_create(name="test")
# ok: idor-lookup-without-team
obj = Cohort.objects.aget_or_create(name="test", team_id=team_id)
# ============================================================
# NEW: get_object_or_404 — team-scoped
# ============================================================
# ruleid: idor-lookup-without-team
get_object_or_404(Cohort, pk=cohort_id)
# ruleid: idor-lookup-without-team
get_object_or_404(Action, id=action_id)
# ok: idor-lookup-without-team
get_object_or_404(Cohort, pk=cohort_id, team_id=team_id)
# ok: idor-lookup-without-team
get_object_or_404(Action, id=action_id, team__project_id=team.project_id)
# ok: idor-lookup-without-team
get_object_or_404(Cohort, pk=cohort_id, team=team)
def vulnerable_get_object_or_404_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return get_object_or_404(Cohort, pk=cohort_id)
# ok: idor-taint-user-input-to-model-get
def safe_get_object_or_404_with_team(request, team_id):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return get_object_or_404(Cohort, pk=cohort_id, team_id=team_id)
# ============================================================
# NEW: select_related/prefetch_related chains — team-scoped
# ============================================================
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.select_related("team").get(pk=cohort_id)
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.prefetch_related("team").get(pk=cohort_id)
# ruleid: idor-lookup-without-team
insights = Insight.objects.select_related("team").filter(pk=insight_id)
# ruleid: idor-lookup-without-team
insights = Insight.objects.prefetch_related("team").filter(id=insight_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.select_related("team").get(pk=cohort_id, team_id=team_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.prefetch_related("team").get(pk=cohort_id, team=team)
# ok: idor-lookup-without-team
insights = Insight.objects.select_related("team").filter(pk=insight_id, team__project_id=team.project_id)
# ok: idor-lookup-without-team
insights = Insight.objects.prefetch_related("team").filter(id=insight_id, team_id=team_id)
def vulnerable_select_related_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return Cohort.objects.select_related("team").get(pk=cohort_id)
# ok: idor-taint-user-input-to-model-get
def safe_select_related_with_team(request, team_id):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.select_related("team").get(pk=cohort_id, team_id=team_id)
# ============================================================
# NEW: async aget — team-scoped
# ============================================================
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.aget(pk=cohort_id)
# ruleid: idor-lookup-without-team
action = Action.objects.aget(id=action_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.aget(pk=cohort_id, team_id=team_id)
# ok: idor-lookup-without-team
action = Action.objects.aget(id=action_id, team=team)
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.select_related("team").aget(pk=cohort_id)
# ruleid: idor-lookup-without-team
cohort = Cohort.objects.prefetch_related("team").aget(pk=cohort_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.select_related("team").aget(pk=cohort_id, team_id=team_id)
# ok: idor-lookup-without-team
cohort = Cohort.objects.prefetch_related("team").aget(pk=cohort_id, team=team)
def vulnerable_aget_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ruleid: idor-taint-user-input-to-model-get, idor-lookup-without-team
return Cohort.objects.aget(pk=cohort_id)
# ok: idor-taint-user-input-to-model-get
def safe_aget_with_team(request, team_id):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.aget(pk=cohort_id, team_id=team_id)
# ============================================================
# Methods that should NOT be flagged (exclude, create, etc.)
# ============================================================
# ok: idor-lookup-without-team
Cohort.objects.exclude(id=cohort_id)
# ok: idor-lookup-without-team
Cohort.objects.create(id=cohort_id, name="test")
# ok: idor-lookup-without-team
Cohort.objects.filter(team__project_id=project_id).exclude(id=cohort_id)
# ok: idor-lookup-without-team
Cohort.objects.select_related("team").exclude(id=cohort_id)
# ok: idor-taint-user-input-to-model-get
def safe_exclude_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.exclude(id=cohort_id)
# ok: idor-taint-user-input-to-model-get
def safe_create_from_request(request):
cohort_id = request.GET.get("cohort_id")
# ok: idor-lookup-without-team
return Cohort.objects.create(id=cohort_id, name="test")
# ============================================================
# Models whose names are superstrings of listed models should NOT match
# ============================================================
# ok: idor-lookup-without-team, idor-taint-user-input-to-model-get
DashboardTile.objects.get(pk=tile_id)
# ok: idor-lookup-without-team, idor-taint-user-input-to-model-get
ActionStep.objects.filter(id=step_id)
# ok: idor-lookup-without-team, idor-taint-user-input-to-model-get
TaggedItem.objects.get(pk=item_id)
# ============================================================
# idor-taint-user-input-to-org-model (ERROR - user input flows to org model lookup)
# ============================================================
def vulnerable_org_get_from_request(request):
project_id = request.GET.get("project_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return Project.objects.get(pk=project_id)
def vulnerable_org_get_from_kwargs(kwargs):
role_id = kwargs.get("role_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return Role.objects.get(id=role_id)
def vulnerable_org_filter_from_data(request):
membership_id = request.data.get("membership_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return RoleMembership.objects.filter(pk=membership_id)
# ok: idor-taint-user-input-to-org-model
def safe_org_get_with_organization(request, organization):
project_id = request.GET.get("project_id")
# ok: idor-lookup-without-org
return Project.objects.get(pk=project_id, organization=organization)
# ok: idor-taint-user-input-to-org-model
def safe_org_get_with_organization_id(request, organization_id):
role_id = request.GET.get("role_id")
# ok: idor-lookup-without-org
return Role.objects.get(pk=role_id, organization_id=organization_id)
# ok: idor-taint-user-input-to-org-model
def safe_org_filter_with_role_organization(request, organization):
membership_id = request.data.get("membership_id")
# ok: idor-lookup-without-org
return RoleMembership.objects.filter(pk=membership_id, role__organization=organization)
# ============================================================
# idor-lookup-without-org (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-org
project = Project.objects.get(pk=project_id)
# ruleid: idor-lookup-without-org
role = Role.objects.get(id=role_id)
# ruleid: idor-lookup-without-org
membership = RoleMembership.objects.filter(pk=membership_id)
# ok: idor-lookup-without-org
project = Project.objects.get(pk=project_id, organization=organization)
# ok: idor-lookup-without-org
role = Role.objects.get(id=role_id, organization_id=organization_id)
# ok: idor-lookup-without-org
membership = RoleMembership.objects.filter(pk=membership_id, role__organization=organization)
# ok: idor-lookup-without-org
membership = RoleMembership.objects.filter(pk=membership_id, role__organization_id=organization_id)
# ruleid: idor-lookup-without-org
obj, created = Role.objects.get_or_create(name="test")
# ok: idor-lookup-without-org
obj, created = Role.objects.get_or_create(name="test", organization=organization)
# ruleid: idor-lookup-without-org
obj = Role.objects.aget_or_create(name="test")
# ok: idor-lookup-without-org
obj = Role.objects.aget_or_create(name="test", organization=organization)
# ok: idor-lookup-without-org
Project.objects.get(pk=instance.pk)
# ok: idor-lookup-without-org
Role.objects.select_for_update().get(pk=self.role.id)
# ============================================================
# NEW: get_object_or_404 — org-scoped
# ============================================================
# ruleid: idor-lookup-without-org
get_object_or_404(Project, pk=project_id)
# ok: idor-lookup-without-org
get_object_or_404(Project, pk=project_id, organization=organization)
# ok: idor-lookup-without-org
get_object_or_404(Project, pk=project_id, organization_id=organization_id)
# ok: idor-lookup-without-org
get_object_or_404(RoleMembership, pk=membership_id, role__organization=organization)
def vulnerable_org_get_object_or_404(request):
project_id = request.GET.get("project_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return get_object_or_404(Project, pk=project_id)
# ok: idor-taint-user-input-to-org-model
def safe_org_get_object_or_404(request, organization):
project_id = request.GET.get("project_id")
# ok: idor-lookup-without-org
return get_object_or_404(Project, pk=project_id, organization=organization)
# ============================================================
# NEW: select_related/prefetch_related — org-scoped
# ============================================================
# ruleid: idor-lookup-without-org
project = Project.objects.select_related("organization").get(pk=project_id)
# ruleid: idor-lookup-without-org
role = Role.objects.prefetch_related("organization").get(id=role_id)
# ok: idor-lookup-without-org
project = Project.objects.select_related("organization").get(pk=project_id, organization=organization)
# ok: idor-lookup-without-org
role = Role.objects.prefetch_related("organization").get(id=role_id, organization_id=organization_id)
def vulnerable_org_select_related(request):
project_id = request.GET.get("project_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return Project.objects.select_related("organization").get(pk=project_id)
# ok: idor-taint-user-input-to-org-model
def safe_org_select_related(request, organization):
project_id = request.GET.get("project_id")
# ok: idor-lookup-without-org
return Project.objects.select_related("organization").get(pk=project_id, organization=organization)
# ============================================================
# NEW: async aget — org-scoped
# ============================================================
# ruleid: idor-lookup-without-org
project = Project.objects.aget(pk=project_id)
# ok: idor-lookup-without-org
project = Project.objects.aget(pk=project_id, organization=organization)
# ruleid: idor-lookup-without-org
project = Project.objects.select_related("organization").aget(pk=project_id)
# ok: idor-lookup-without-org
project = Project.objects.select_related("organization").aget(pk=project_id, organization=organization)
def vulnerable_org_aget(request):
project_id = request.GET.get("project_id")
# ruleid: idor-taint-user-input-to-org-model, idor-lookup-without-org
return Project.objects.aget(pk=project_id)
# ok: idor-taint-user-input-to-org-model
def safe_org_aget(request, organization):
project_id = request.GET.get("project_id")
# ok: idor-lookup-without-org
return Project.objects.aget(pk=project_id, organization=organization)
# ============================================================
# idor-taint-user-input-to-user-model (ERROR - user input flows to user model lookup)
# ============================================================
def vulnerable_user_get_from_request(request):
key_id = request.GET.get("key_id")
# ruleid: idor-taint-user-input-to-user-model, idor-lookup-without-user
return PersonalAPIKey.objects.get(pk=key_id)
def vulnerable_user_filter_from_data(request):
key_id = request.data.get("key_id")
# ruleid: idor-taint-user-input-to-user-model, idor-lookup-without-user
return PersonalAPIKey.objects.filter(id=key_id)
# ok: idor-taint-user-input-to-user-model
def safe_user_get_with_user(request, user):
key_id = request.GET.get("key_id")
# ok: idor-lookup-without-user
return PersonalAPIKey.objects.get(pk=key_id, user=user)
# ok: idor-taint-user-input-to-user-model
def safe_user_get_with_user_id(request, user_id):
key_id = request.GET.get("key_id")
# ok: idor-lookup-without-user
return PersonalAPIKey.objects.get(pk=key_id, user_id=user_id)
# ============================================================
# idor-lookup-without-user (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.get(pk=key_id)
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.filter(id=key_id)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.get(pk=key_id, user=user)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.filter(id=key_id, user_id=user_id)
# ruleid: idor-lookup-without-user
obj, created = PersonalAPIKey.objects.get_or_create(label="test")
# ok: idor-lookup-without-user
obj, created = PersonalAPIKey.objects.get_or_create(label="test", user=user)
# ruleid: idor-lookup-without-user
obj = PersonalAPIKey.objects.aget_or_create(label="test")
# ok: idor-lookup-without-user
obj = PersonalAPIKey.objects.aget_or_create(label="test", user=user)
# ok: idor-lookup-without-user
PersonalAPIKey.objects.get(pk=instance.pk)
# ok: idor-lookup-without-user
PersonalAPIKey.objects.select_for_update().get(id=self.key.id)
# ============================================================
# NEW: get_object_or_404 — user-scoped
# ============================================================
# ruleid: idor-lookup-without-user
get_object_or_404(PersonalAPIKey, pk=key_id)
# ok: idor-lookup-without-user
get_object_or_404(PersonalAPIKey, pk=key_id, user=user)
# ok: idor-lookup-without-user
get_object_or_404(PersonalAPIKey, pk=key_id, user_id=user_id)
def vulnerable_user_get_object_or_404(request):
key_id = request.GET.get("key_id")
# ruleid: idor-taint-user-input-to-user-model, idor-lookup-without-user
return get_object_or_404(PersonalAPIKey, pk=key_id)
# ok: idor-taint-user-input-to-user-model
def safe_user_get_object_or_404(request, user):
key_id = request.GET.get("key_id")
# ok: idor-lookup-without-user
return get_object_or_404(PersonalAPIKey, pk=key_id, user=user)
# ============================================================
# NEW: select_related/prefetch_related — user-scoped
# ============================================================
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.select_related("user").get(pk=key_id)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.select_related("user").get(pk=key_id, user=user)
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.prefetch_related("user").filter(id=key_id)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.prefetch_related("user").filter(id=key_id, user_id=user_id)
def vulnerable_user_select_related(request):
key_id = request.GET.get("key_id")
# ruleid: idor-taint-user-input-to-user-model, idor-lookup-without-user
return PersonalAPIKey.objects.select_related("user").get(pk=key_id)
# ok: idor-taint-user-input-to-user-model
def safe_user_select_related(request, user):
key_id = request.GET.get("key_id")
# ok: idor-lookup-without-user
return PersonalAPIKey.objects.select_related("user").get(pk=key_id, user=user)
# ============================================================
# NEW: async aget — user-scoped
# ============================================================
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.aget(pk=key_id)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.aget(pk=key_id, user=user)
# ruleid: idor-lookup-without-user
key = PersonalAPIKey.objects.select_related("user").aget(pk=key_id)
# ok: idor-lookup-without-user
key = PersonalAPIKey.objects.select_related("user").aget(pk=key_id, user_id=user_id)
def vulnerable_user_aget(request):
key_id = request.GET.get("key_id")
# ruleid: idor-taint-user-input-to-user-model, idor-lookup-without-user
return PersonalAPIKey.objects.aget(pk=key_id)
# ok: idor-taint-user-input-to-user-model
def safe_user_aget(request, user):
key_id = request.GET.get("key_id")
# ok: idor-lookup-without-user
return PersonalAPIKey.objects.aget(pk=key_id, user=user)
# ============================================================
# idor-taint-user-input-to-user-team-model (ERROR - user input flows without BOTH filters)
# ============================================================
def vulnerable_user_team_get_from_request(request):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id)
def vulnerable_user_team_only_user(request, user):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id, user=user)
def vulnerable_user_team_only_team(request, team):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id, team=team)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_with_both(request, user, team):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id, user=user, team=team)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_with_both_ids(request, user_id, team_id):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id, user_id=user_id, team_id=team_id)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_reversed_order(request, user, team):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.get(pk=settings_id, team=team, user=user)
# ============================================================
# idor-lookup-without-user-and-team (WARNING - pattern rule)
# ============================================================
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.get(pk=settings_id)
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.get(pk=settings_id, user=user)
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.get(pk=settings_id, team=team)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.get(pk=settings_id, user=user, team=team)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.get(pk=settings_id, team_id=team_id, user_id=user_id)
# ruleid: idor-lookup-without-user-and-team
obj, created = UserScenePersonalisation.objects.get_or_create(scene="test")
# ruleid: idor-lookup-without-user-and-team
obj, created = UserScenePersonalisation.objects.get_or_create(scene="test", user=user)
# ok: idor-lookup-without-user-and-team
obj, created = UserScenePersonalisation.objects.get_or_create(scene="test", user=user, team=team)
# ruleid: idor-lookup-without-user-and-team
obj = UserScenePersonalisation.objects.aget_or_create(scene="test")
# ok: idor-lookup-without-user-and-team
obj = UserScenePersonalisation.objects.aget_or_create(scene="test", user=user, team=team)
# ok: idor-lookup-without-user-and-team
UserScenePersonalisation.objects.get(pk=instance.pk)
# ok: idor-lookup-without-user-and-team
UserScenePersonalisation.objects.select_for_update().get(id=self.settings.id)
# ============================================================
# NEW: get_object_or_404 — user+team-scoped
# ============================================================
# ruleid: idor-lookup-without-user-and-team
get_object_or_404(UserScenePersonalisation, pk=settings_id)
# ruleid: idor-lookup-without-user-and-team
get_object_or_404(UserScenePersonalisation, pk=settings_id, user=user)
# ruleid: idor-lookup-without-user-and-team
get_object_or_404(UserScenePersonalisation, pk=settings_id, team=team)
# ok: idor-lookup-without-user-and-team
get_object_or_404(UserScenePersonalisation, pk=settings_id, user=user, team=team)
# ok: idor-lookup-without-user-and-team
get_object_or_404(UserScenePersonalisation, pk=settings_id, user_id=user_id, team_id=team_id)
def vulnerable_user_team_get_object_or_404(request):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return get_object_or_404(UserScenePersonalisation, pk=settings_id)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_get_object_or_404(request, user, team):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return get_object_or_404(UserScenePersonalisation, pk=settings_id, user=user, team=team)
# ============================================================
# NEW: select_related/prefetch_related — user+team-scoped
# ============================================================
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.select_related("user", "team").get(pk=settings_id)
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.select_related("user", "team").get(pk=settings_id, user=user)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.select_related("user", "team").get(pk=settings_id, user=user, team=team)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.prefetch_related("user", "team").get(
pk=settings_id, team_id=team_id, user_id=user_id
)
def vulnerable_user_team_select_related(request):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.select_related("user", "team").get(pk=settings_id)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_select_related(request, user, team):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.select_related("user", "team").get(pk=settings_id, user=user, team=team)
# ============================================================
# NEW: async aget — user+team-scoped
# ============================================================
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.aget(pk=settings_id)
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.aget(pk=settings_id, user=user)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.aget(pk=settings_id, user=user, team=team)
# ruleid: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.select_related("user").aget(pk=settings_id)
# ok: idor-lookup-without-user-and-team
settings = UserScenePersonalisation.objects.select_related("user").aget(pk=settings_id, user=user, team_id=team_id)
def vulnerable_user_team_aget(request):
settings_id = request.GET.get("settings_id")
# ruleid: idor-taint-user-input-to-user-team-model, idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.aget(pk=settings_id)
# ok: idor-taint-user-input-to-user-team-model
def safe_user_team_aget(request, user, team):
settings_id = request.GET.get("settings_id")
# ok: idor-lookup-without-user-and-team
return UserScenePersonalisation.objects.aget(pk=settings_id, user=user, team=team)