Skip to content

Commit 07ead56

Browse files
committed
safely handle refresh attempt on datadog pat
1 parent cbddb62 commit 07ead56

3 files changed

Lines changed: 22 additions & 2 deletions

File tree

src/sentry/seer/endpoints/seer_rpc.py

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@
4949
from sentry.hybridcloud.rpc.service import RpcAuthenticationSetupException, RpcResolutionException
5050
from sentry.hybridcloud.rpc.sig import SerializableFunctionValueException
5151
from sentry.identity import default_manager as identity_manager
52+
from sentry.identity.oauth2 import OAuth2Provider
5253
from sentry.identity.services.identity import identity_service
5354
from sentry.integrations.github_enterprise.integration import GitHubEnterpriseIntegration
5455
from sentry.integrations.services.integration import integration_service
@@ -949,8 +950,12 @@ def refresh_monitoring_provider_token(
949950
if idp is None or idp.type not in MONITORING_PROVIDERS:
950951
return RefreshMonitoringProviderTokenErrorResponse(error="identity_not_found")
951952

953+
provider = identity_manager.get(idp.type)
954+
if not isinstance(provider, OAuth2Provider):
955+
# Static-token providers (e.g. Datadog PAT) have no refresh flow.
956+
return RefreshMonitoringProviderTokenErrorResponse(error="refresh_not_supported")
957+
952958
try:
953-
provider = identity_manager.get(idp.type)
954959
provider.refresh_identity(identity)
955960
except IdentityNotValid:
956961
return RefreshMonitoringProviderTokenErrorResponse(error="identity_not_valid")

src/sentry/seer/sentry_data_models.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -885,7 +885,7 @@ def __contains__(self, key: object) -> bool:
885885

886886

887887
class RefreshMonitoringProviderTokenErrorResponse(BaseModel):
888-
"""`refresh_monitoring_provider_token` error: `{"error": <code>}`. The four
888+
"""`refresh_monitoring_provider_token` error: `{"error": <code>}`. The
889889
error codes the function emits — one per refusal branch — encoded as a
890890
Literal so the seer-side caller can switch on them safely."""
891891

@@ -894,6 +894,7 @@ class RefreshMonitoringProviderTokenErrorResponse(BaseModel):
894894
"identity_not_found",
895895
"identity_not_valid",
896896
"refresh_failed",
897+
"refresh_not_supported",
897898
]
898899

899900
def __getitem__(self, key: str) -> Any:

tests/sentry/seer/endpoints/test_seer_rpc.py

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1825,6 +1825,20 @@ def test_missing_access_token_after_refresh(self) -> None:
18251825
# Not "identity_not_valid" due to KeyError from get_oauth_data before reaching the .get() guard
18261826
assert result == {"error": "refresh_failed"}
18271827

1828+
def test_pat_provider_not_refreshable(self) -> None:
1829+
# Static-token providers (Datadog PAT) have no refresh flow.
1830+
pat_idp = self.create_identity_provider(type="datadog_pat", external_id="dd-org-pat")
1831+
pat_identity = self.create_identity(
1832+
user=self.user,
1833+
identity_provider=pat_idp,
1834+
external_id="dd-user-pat",
1835+
data={"access_token": "pat-tok", "site": "datadoghq.com"},
1836+
)
1837+
1838+
result = refresh_monitoring_provider_token(identity_id=pat_identity.id)
1839+
1840+
assert result == {"error": "refresh_not_supported"}
1841+
18281842

18291843
@with_feature("organizations:pr-metrics-attribution")
18301844
@cell_silo_test

0 commit comments

Comments
 (0)