Skip to content

Commit 025d51a

Browse files
authored
feat(hybridcloud) Make error embed view use region URLs (#58608)
The error-embed view needs to submit to a region domain instead of the root application domain. I've also pinned the historical root domain path to the monolith region for backwards compatibility. Refs HC-518
1 parent f5dc37b commit 025d51a

File tree

5 files changed

+33
-5
lines changed

5 files changed

+33
-5
lines changed

src/sentry/api_gateway/api_gateway.py

+1
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@
2222
"sentry-api-0-relay-publickeys",
2323
"sentry-api-0-relays-healthcheck",
2424
"sentry-api-0-relays-details",
25+
"sentry-error-page-embed",
2526
)
2627

2728

src/sentry/models/options/project_option.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -154,7 +154,7 @@ class ProjectOption(Model):
154154
key = models.CharField(max_length=64)
155155
value = PickledObjectField()
156156

157-
objects = ProjectOptionManager()
157+
objects: ProjectOptionManager = ProjectOptionManager()
158158

159159
class Meta:
160160
app_label = "sentry"

src/sentry/utils/http.py

+1-1
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ def parse_uri_match(value: str) -> ParsedUriMatch:
107107

108108

109109
def is_valid_origin(
110-
origin: str, project: Project | None = None, allowed: frozenset[str] | None = None
110+
origin: str | None, project: Project | None = None, allowed: frozenset[str] | None = None
111111
) -> bool:
112112
"""
113113
Given an ``origin`` which matches a base URI (e.g. http://example.com)

src/sentry/web/frontend/error_page_embed.py

+11-3
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
from __future__ import annotations
2+
13
from django import forms
24
from django.db import IntegrityError, router
35
from django.http import HttpRequest, HttpResponse
@@ -6,17 +8,20 @@
68
from django.utils.translation import gettext_lazy as _
79
from django.views.decorators.csrf import csrf_exempt
810
from django.views.generic import View
11+
from django_stubs_ext import StrOrPromise
912

1013
from sentry import eventstore
1114
from sentry.models.options.project_option import ProjectOption
1215
from sentry.models.project import Project
1316
from sentry.models.projectkey import ProjectKey
1417
from sentry.models.userreport import UserReport
1518
from sentry.signals import user_feedback_received
19+
from sentry.types.region import get_local_region
1620
from sentry.utils import json
1721
from sentry.utils.db import atomic_transaction
18-
from sentry.utils.http import absolute_uri, is_valid_origin, origin_from_request
22+
from sentry.utils.http import is_valid_origin, origin_from_request
1923
from sentry.utils.validators import normalize_event_id
24+
from sentry.web.frontend.base import region_silo_view
2025
from sentry.web.helpers import render_to_response, render_to_string
2126

2227
GENERIC_ERROR = _("An unknown error occurred while submitting your report. Please try again.")
@@ -34,7 +39,7 @@
3439
DEFAULT_CLOSE_LABEL = _("Close")
3540
DEFAULT_SUBMIT_LABEL = _("Submit Crash Report")
3641

37-
DEFAULT_OPTIONS = {
42+
DEFAULT_OPTIONS: dict[str, StrOrPromise] = {
3843
"title": DEFAULT_TITLE,
3944
"subtitle": DEFAULT_SUBTITLE,
4045
"subtitle2": DEFAULT_SUBTITLE2,
@@ -66,6 +71,7 @@ class Meta:
6671
fields = ("name", "email", "comments")
6772

6873

74+
@region_silo_view
6975
class ErrorPageEmbedView(View):
7076
def _get_project_key(self, request: HttpRequest):
7177
try:
@@ -187,6 +193,8 @@ def dispatch(self, request: HttpRequest) -> HttpResponse:
187193
elif request.method == "POST":
188194
return self._smart_response(request, {"errors": dict(form.errors)}, status=400)
189195

196+
region = get_local_region()
197+
endpoint = region.to_url(request.get_full_path())
190198
show_branding = (
191199
ProjectOption.objects.get_value(
192200
project=key.project, key="feedback:branding", default="1"
@@ -211,7 +219,7 @@ def dispatch(self, request: HttpRequest) -> HttpResponse:
211219
)
212220

213221
context = {
214-
"endpoint": mark_safe("*/" + json.dumps(absolute_uri(request.get_full_path())) + ";/*"),
222+
"endpoint": mark_safe("*/" + json.dumps(endpoint) + ";/*"),
215223
"template": mark_safe("*/" + json.dumps(template) + ";/*"),
216224
"strings": mark_safe(
217225
"*/"

tests/sentry/web/frontend/test_error_page_embed.py

+19
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,11 @@
99
from sentry.models.userreport import UserReport
1010
from sentry.testutils.cases import TestCase
1111
from sentry.testutils.helpers.datetime import before_now, iso_format
12+
from sentry.testutils.silo import region_silo_test
13+
from sentry.types.region import get_local_region
1214

1315

16+
@region_silo_test(stable=True)
1417
@override_settings(ROOT_URLCONF="sentry.conf.urls")
1518
class ErrorPageEmbedTest(TestCase):
1619
def setUp(self):
@@ -75,6 +78,21 @@ def test_renders(self):
7578
assert resp["Access-Control-Allow-Origin"] == "*"
7679
self.assertTemplateUsed(resp, "sentry/error-page-embed.html")
7780

81+
def test_endpoint_reflects_region_url(self):
82+
resp = self.client.get(
83+
self.path_with_qs,
84+
HTTP_REFERER="http://example.com",
85+
HTTP_ACCEPT="text/html, text/javascript",
86+
)
87+
assert resp.status_code == 200, resp.content
88+
assert resp["Access-Control-Allow-Origin"] == "*"
89+
self.assertTemplateUsed(resp, "sentry/error-page-embed.html")
90+
91+
region = get_local_region()
92+
region_url = region.to_url(self.path_with_qs)
93+
body = resp.content.decode("utf8")
94+
assert f'endpoint = /**/"{region_url}";/**/' in body
95+
7896
def test_uses_locale_from_header(self):
7997
resp = self.client.get(
8098
self.path_with_qs,
@@ -175,6 +193,7 @@ def test_submission_invalid_event_id(self):
175193
assert resp.status_code == 400, resp.content
176194

177195

196+
@region_silo_test(stable=True)
178197
@override_settings(ROOT_URLCONF="sentry.conf.urls")
179198
class ErrorPageEmbedEnvironmentTest(TestCase):
180199
def setUp(self):

0 commit comments

Comments
 (0)