Skip to content

Commit 428a118

Browse files
ewdurbinmikethemanclaude
authored
Sanitize query parameters on select routes when submitting to analytics (#18407)
Co-authored-by: Mike Fiedler <[email protected]> Co-authored-by: Claude <[email protected]>
1 parent 553dc44 commit 428a118

File tree

4 files changed

+84
-56
lines changed

4 files changed

+84
-56
lines changed

warehouse/locale/messages.pot

Lines changed: 53 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -957,14 +957,14 @@ msgstr ""
957957

958958
#: warehouse/templates/404.html:30 warehouse/templates/500.html:18
959959
#: warehouse/templates/accounts/two-factor.html:35
960-
#: warehouse/templates/base.html:319 warehouse/templates/base.html:325
961-
#: warehouse/templates/base.html:331 warehouse/templates/base.html:337
962-
#: warehouse/templates/base.html:353 warehouse/templates/base.html:359
963-
#: warehouse/templates/base.html:384 warehouse/templates/base.html:390
964-
#: warehouse/templates/base.html:399 warehouse/templates/base.html:412
965-
#: warehouse/templates/base.html:421 warehouse/templates/base.html:427
966-
#: warehouse/templates/base.html:433 warehouse/templates/base.html:446
967-
#: warehouse/templates/base.html:463
960+
#: warehouse/templates/base.html:337 warehouse/templates/base.html:343
961+
#: warehouse/templates/base.html:349 warehouse/templates/base.html:355
962+
#: warehouse/templates/base.html:371 warehouse/templates/base.html:377
963+
#: warehouse/templates/base.html:402 warehouse/templates/base.html:408
964+
#: warehouse/templates/base.html:417 warehouse/templates/base.html:430
965+
#: warehouse/templates/base.html:439 warehouse/templates/base.html:445
966+
#: warehouse/templates/base.html:451 warehouse/templates/base.html:464
967+
#: warehouse/templates/base.html:481
968968
#: warehouse/templates/includes/accounts/profile-callout.html:17
969969
#: warehouse/templates/includes/file-details.html:129
970970
#: warehouse/templates/index.html:98 warehouse/templates/index.html:105
@@ -1117,7 +1117,7 @@ msgid "Main navigation"
11171117
msgstr ""
11181118

11191119
#: warehouse/templates/base.html:33 warehouse/templates/base.html:68
1120-
#: warehouse/templates/base.html:314
1120+
#: warehouse/templates/base.html:332
11211121
#: warehouse/templates/includes/current-user-indicator.html:77
11221122
#: warehouse/templates/pages/help.html:209
11231123
#: warehouse/templates/pages/sitemap.html:19
@@ -1193,16 +1193,16 @@ msgstr ""
11931193
msgid "RSS: 40 newest packages"
11941194
msgstr ""
11951195

1196-
#: warehouse/templates/base.html:185
1196+
#: warehouse/templates/base.html:203
11971197
msgid "Skip to main content"
11981198
msgstr ""
11991199

1200-
#: warehouse/templates/base.html:189
1200+
#: warehouse/templates/base.html:207
12011201
msgid "Switch to mobile version"
12021202
msgstr ""
12031203

1204-
#: warehouse/templates/base.html:196 warehouse/templates/base.html:205
1205-
#: warehouse/templates/base.html:215
1204+
#: warehouse/templates/base.html:214 warehouse/templates/base.html:223
1205+
#: warehouse/templates/base.html:233
12061206
#: warehouse/templates/includes/flash-messages.html:41
12071207
#: warehouse/templates/includes/session-notifications.html:19
12081208
#: warehouse/templates/manage/account.html:845
@@ -1220,177 +1220,177 @@ msgstr ""
12201220
msgid "Warning"
12211221
msgstr ""
12221222

1223-
#: warehouse/templates/base.html:198
1223+
#: warehouse/templates/base.html:216
12241224
msgid "You are using an unsupported browser, upgrade to a newer version."
12251225
msgstr ""
12261226

1227-
#: warehouse/templates/base.html:207
1227+
#: warehouse/templates/base.html:225
12281228
msgid ""
12291229
"You are using TestPyPI – a separate instance of the Python Package Index "
12301230
"that allows you to try distribution tools and processes without affecting"
12311231
" the real index."
12321232
msgstr ""
12331233

1234-
#: warehouse/templates/base.html:217
1234+
#: warehouse/templates/base.html:235
12351235
msgid ""
12361236
"Some features may not work without JavaScript. Please try enabling it if "
12371237
"you encounter problems."
12381238
msgstr ""
12391239

1240-
#: warehouse/templates/base.html:252 warehouse/templates/base.html:284
1240+
#: warehouse/templates/base.html:270 warehouse/templates/base.html:302
12411241
#: warehouse/templates/error-base-with-search.html:8
12421242
#: warehouse/templates/index.html:29
12431243
msgid "Search PyPI"
12441244
msgstr ""
12451245

1246-
#: warehouse/templates/base.html:257 warehouse/templates/index.html:35
1246+
#: warehouse/templates/base.html:275 warehouse/templates/index.html:35
12471247
msgid "Type '/' to search projects"
12481248
msgstr ""
12491249

1250-
#: warehouse/templates/base.html:268 warehouse/templates/base.html:297
1250+
#: warehouse/templates/base.html:286 warehouse/templates/base.html:315
12511251
#: warehouse/templates/error-base-with-search.html:19
12521252
#: warehouse/templates/index.html:44
12531253
msgid "Search"
12541254
msgstr ""
12551255

1256-
#: warehouse/templates/base.html:289
1256+
#: warehouse/templates/base.html:307
12571257
#: warehouse/templates/error-base-with-search.html:13
12581258
msgid "Search projects"
12591259
msgstr ""
12601260

1261-
#: warehouse/templates/base.html:315
1261+
#: warehouse/templates/base.html:333
12621262
msgid "Help navigation"
12631263
msgstr ""
12641264

1265-
#: warehouse/templates/base.html:321
1265+
#: warehouse/templates/base.html:339
12661266
msgid "Installing packages"
12671267
msgstr ""
12681268

1269-
#: warehouse/templates/base.html:327
1269+
#: warehouse/templates/base.html:345
12701270
msgid "Uploading packages"
12711271
msgstr ""
12721272

1273-
#: warehouse/templates/base.html:333
1273+
#: warehouse/templates/base.html:351
12741274
msgid "User guide"
12751275
msgstr ""
12761276

1277-
#: warehouse/templates/base.html:339
1277+
#: warehouse/templates/base.html:357
12781278
msgid "Project name retention"
12791279
msgstr ""
12801280

1281-
#: warehouse/templates/base.html:342
1281+
#: warehouse/templates/base.html:360
12821282
msgid "FAQs"
12831283
msgstr ""
12841284

1285-
#: warehouse/templates/base.html:348 warehouse/templates/pages/sitemap.html:34
1285+
#: warehouse/templates/base.html:366 warehouse/templates/pages/sitemap.html:34
12861286
msgid "About PyPI"
12871287
msgstr ""
12881288

1289-
#: warehouse/templates/base.html:349
1289+
#: warehouse/templates/base.html:367
12901290
msgid "About PyPI navigation"
12911291
msgstr ""
12921292

1293-
#: warehouse/templates/base.html:355
1293+
#: warehouse/templates/base.html:373
12941294
msgid "PyPI Blog"
12951295
msgstr ""
12961296

1297-
#: warehouse/templates/base.html:361
1297+
#: warehouse/templates/base.html:379
12981298
msgid "Infrastructure dashboard"
12991299
msgstr ""
13001300

1301-
#: warehouse/templates/base.html:364 warehouse/templates/pages/sitemap.html:40
1301+
#: warehouse/templates/base.html:382 warehouse/templates/pages/sitemap.html:40
13021302
#: warehouse/templates/pages/stats.html:4
13031303
msgid "Statistics"
13041304
msgstr ""
13051305

1306-
#: warehouse/templates/base.html:367
1306+
#: warehouse/templates/base.html:385
13071307
msgid "Logos & trademarks"
13081308
msgstr ""
13091309

1310-
#: warehouse/templates/base.html:370
1310+
#: warehouse/templates/base.html:388
13111311
msgid "Our sponsors"
13121312
msgstr ""
13131313

1314-
#: warehouse/templates/base.html:376
1314+
#: warehouse/templates/base.html:394
13151315
msgid "Contributing to PyPI"
13161316
msgstr ""
13171317

1318-
#: warehouse/templates/base.html:377
1318+
#: warehouse/templates/base.html:395
13191319
msgid "How to contribute navigation"
13201320
msgstr ""
13211321

1322-
#: warehouse/templates/base.html:380
1322+
#: warehouse/templates/base.html:398
13231323
msgid "Bugs and feedback"
13241324
msgstr ""
13251325

1326-
#: warehouse/templates/base.html:386
1326+
#: warehouse/templates/base.html:404
13271327
msgid "Contribute on GitHub"
13281328
msgstr ""
13291329

1330-
#: warehouse/templates/base.html:392
1330+
#: warehouse/templates/base.html:410
13311331
msgid "Translate PyPI"
13321332
msgstr ""
13331333

1334-
#: warehouse/templates/base.html:395
1334+
#: warehouse/templates/base.html:413
13351335
msgid "Sponsor PyPI"
13361336
msgstr ""
13371337

1338-
#: warehouse/templates/base.html:401
1338+
#: warehouse/templates/base.html:419
13391339
msgid "Development credits"
13401340
msgstr ""
13411341

1342-
#: warehouse/templates/base.html:407 warehouse/templates/pages/sitemap.html:10
1342+
#: warehouse/templates/base.html:425 warehouse/templates/pages/sitemap.html:10
13431343
msgid "Using PyPI"
13441344
msgstr ""
13451345

1346-
#: warehouse/templates/base.html:408
1346+
#: warehouse/templates/base.html:426
13471347
msgid "Using PyPI navigation"
13481348
msgstr ""
13491349

1350-
#: warehouse/templates/base.html:414
1350+
#: warehouse/templates/base.html:432
13511351
#: warehouse/templates/manage/organization/activate_subscription.html:21
13521352
msgid "Terms of Service"
13531353
msgstr ""
13541354

1355-
#: warehouse/templates/base.html:417
1355+
#: warehouse/templates/base.html:435
13561356
msgid "Report security issue"
13571357
msgstr ""
13581358

1359-
#: warehouse/templates/base.html:423
1359+
#: warehouse/templates/base.html:441
13601360
msgid "Code of conduct"
13611361
msgstr ""
13621362

1363-
#: warehouse/templates/base.html:429
1363+
#: warehouse/templates/base.html:447
13641364
msgid "Privacy Notice"
13651365
msgstr ""
13661366

1367-
#: warehouse/templates/base.html:435
1367+
#: warehouse/templates/base.html:453
13681368
msgid "Acceptable Use Policy"
13691369
msgstr ""
13701370

1371-
#: warehouse/templates/base.html:445
1371+
#: warehouse/templates/base.html:463
13721372
msgid "Status:"
13731373
msgstr ""
13741374

1375-
#: warehouse/templates/base.html:449
1375+
#: warehouse/templates/base.html:467
13761376
msgid "all systems operational"
13771377
msgstr ""
13781378

1379-
#: warehouse/templates/base.html:453
1379+
#: warehouse/templates/base.html:471
13801380
msgid ""
13811381
"Developed and maintained by the Python community, for the Python "
13821382
"community."
13831383
msgstr ""
13841384

1385-
#: warehouse/templates/base.html:455
1385+
#: warehouse/templates/base.html:473
13861386
msgid "Donate today!"
13871387
msgstr ""
13881388

1389-
#: warehouse/templates/base.html:467 warehouse/templates/pages/sitemap.html:4
1389+
#: warehouse/templates/base.html:485 warehouse/templates/pages/sitemap.html:4
13901390
msgid "Site map"
13911391
msgstr ""
13921392

1393-
#: warehouse/templates/base.html:474
1393+
#: warehouse/templates/base.html:492
13941394
msgid "Switch to desktop version"
13951395
msgstr ""
13961396

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
window.plausible = window.plausible || function() { (window.plausible.q = window.plausible.q || []).push(arguments); };
2+
3+
// Build sanitized URL without query parameters
4+
var url = window.location.protocol + "//" + window.location.host + window.location.pathname;
5+
window.plausible("pageview", { u: url });

warehouse/templates/base.html

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -168,9 +168,27 @@
168168
<script async src="{{ request.static_path('warehouse:static/dist/js/warehouse' + ('' if request.localizer.locale_name == 'en' else '.' + request.localizer.locale_name) + '.js') }}">
169169
</script>
170170
{% block extra_js %}{% endblock %}
171-
<script defer
172-
data-domain="pypi.org"
173-
src="https://analytics.python.org/js/script.js"></script>
171+
{# Exclude all query parameters from analytics payload on pages where they may contain sensitive information.
172+
# PSF controls the analytics destination, so it is not a third-party tracker,
173+
# but this prevents the parameters from being sent to the analytics service in the payload,
174+
# where it would be further filtered before storage. #}
175+
{% set analytics_sanitize_query_params_routes = [
176+
"accounts.reset-password",
177+
"accounts.verify-email",
178+
"accounts.verify-organization-role",
179+
"accounts.verify-project-role"
180+
] %}
181+
{% if request.matched_route and request.matched_route.name in analytics_sanitize_query_params_routes %}
182+
<script defer
183+
data-domain="pypi.org"
184+
src="https://analytics.python.org/js/script.manual.js"></script>
185+
<script defer
186+
src="{{ request.static_path('warehouse:static/dist/js/utils/plausible-sanitized.js') }}"></script>
187+
{% else %}
188+
<script defer
189+
data-domain="pypi.org"
190+
src="https://analytics.python.org/js/script.js"></script>
191+
{% endif %}
174192
<script defer
175193
src="https://www.fastly-insights.com/insights.js?k=6a52360a-f306-421e-8ed5-7417d0d4a4e9&dnt=true"></script>
176194
<script async

webpack.config.js

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,11 @@ module.exports = [
104104
from: path.resolve(__dirname, "warehouse/static/js/vendor/zxcvbn.js"),
105105
to: "js/vendor/[name].[contenthash][ext]",
106106
},
107+
{
108+
// Copy utility for sanitizing plausible analytics
109+
from: path.resolve(__dirname, "warehouse/static/js/vendor/plausible-sanitized.js"),
110+
to: "js/utils/[name].[contenthash][ext]",
111+
},
107112
],
108113
}),
109114
...sharedCompressionPlugins,

0 commit comments

Comments
 (0)