Skip to content

Commit 7be2ad6

Browse files
authored
Handle missing project when verifying role invitation (#18857)
* Handle missing project when verifying role * Update translations
1 parent 3d9e2fc commit 7be2ad6

File tree

3 files changed

+64
-19
lines changed

3 files changed

+64
-19
lines changed

tests/unit/accounts/test_views.py

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3325,6 +3325,44 @@ def test_verify_fails_with_different_user(
33253325
]
33263326
assert db_request.route_path.calls == [pretend.call("manage.projects")]
33273327

3328+
def test_verify_fails_with_missing_project(
3329+
self, db_request, user_service, token_service
3330+
):
3331+
project = ProjectFactory.create()
3332+
user = UserFactory.create()
3333+
3334+
db_request.user = user
3335+
db_request.method = "POST"
3336+
db_request.GET.update({"token": "RANDOM_KEY"})
3337+
db_request.route_path = pretend.call_recorder(lambda name: "/")
3338+
db_request.remote_addr = "192.168.1.1"
3339+
token_service.loads = pretend.call_recorder(
3340+
lambda token: {
3341+
"action": "email-project-role-verify",
3342+
"desired_role": "Maintainer",
3343+
"user_id": user.id,
3344+
"project_id": project.id,
3345+
"submitter_id": db_request.user.id,
3346+
}
3347+
)
3348+
user_service.get_user = pretend.call_recorder(lambda user_id: user)
3349+
db_request.find_service = pretend.call_recorder(
3350+
lambda iface, context=None, name=None: {
3351+
ITokenService: token_service,
3352+
IUserService: user_service,
3353+
}.get(iface)
3354+
)
3355+
db_request.session.flash = pretend.call_recorder(lambda *a, **kw: None)
3356+
3357+
db_request.db.delete(project)
3358+
3359+
views.verify_project_role(db_request)
3360+
3361+
assert db_request.session.flash.calls == [
3362+
pretend.call("Invalid token: project does not exist", queue="error")
3363+
]
3364+
assert db_request.route_path.calls == [pretend.call("manage.projects")]
3365+
33283366
def test_verify_role_get_confirmation(
33293367
self, db_request, user_service, token_service
33303368
):

warehouse/accounts/views.py

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1264,11 +1264,14 @@ def _error(message):
12641264
if user != request.user:
12651265
return _error(request._("Role invitation is not valid."))
12661266

1267-
project = (
1268-
request.db.query(Project).filter(Project.id == data.get("project_id")).one()
1269-
)
1270-
desired_role = data.get("desired_role")
1267+
try:
1268+
project = (
1269+
request.db.query(Project).filter(Project.id == data.get("project_id")).one()
1270+
)
1271+
except NoResultFound:
1272+
return _error(request._("Invalid token: project does not exist"))
12711273

1274+
desired_role = data.get("desired_role")
12721275
role_invite = (
12731276
request.db.query(RoleInvitation)
12741277
.filter(RoleInvitation.project == project)

warehouse/locale/messages.pot

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -282,47 +282,51 @@ msgstr ""
282282
msgid "Role invitation is not valid."
283283
msgstr ""
284284

285-
#: warehouse/accounts/views.py:1280
285+
#: warehouse/accounts/views.py:1272
286+
msgid "Invalid token: project does not exist"
287+
msgstr ""
288+
289+
#: warehouse/accounts/views.py:1283
286290
msgid "Role invitation no longer exists."
287291
msgstr ""
288292

289-
#: warehouse/accounts/views.py:1312
293+
#: warehouse/accounts/views.py:1315
290294
#, python-brace-format
291295
msgid "Invitation for '${project_name}' is declined."
292296
msgstr ""
293297

294-
#: warehouse/accounts/views.py:1378
298+
#: warehouse/accounts/views.py:1381
295299
#, python-brace-format
296300
msgid "You are now ${role} of the '${project_name}' project."
297301
msgstr ""
298302

299-
#: warehouse/accounts/views.py:1458
303+
#: warehouse/accounts/views.py:1461
300304
#, python-brace-format
301305
msgid "Please review our updated <a href=\"${tos_url}\">Terms of Service</a>."
302306
msgstr ""
303307

304-
#: warehouse/accounts/views.py:1670 warehouse/accounts/views.py:1924
308+
#: warehouse/accounts/views.py:1673 warehouse/accounts/views.py:1927
305309
#: warehouse/manage/views/oidc_publishers.py:120
306310
msgid ""
307311
"Trusted publishing is temporarily disabled. See https://pypi.org/help"
308312
"#admin-intervention for details."
309313
msgstr ""
310314

311-
#: warehouse/accounts/views.py:1691
315+
#: warehouse/accounts/views.py:1694
312316
msgid "disabled. See https://pypi.org/help#admin-intervention for details."
313317
msgstr ""
314318

315-
#: warehouse/accounts/views.py:1707
319+
#: warehouse/accounts/views.py:1710
316320
msgid ""
317321
"You must have a verified email in order to register a pending trusted "
318322
"publisher. See https://pypi.org/help#openid-connect for details."
319323
msgstr ""
320324

321-
#: warehouse/accounts/views.py:1720
325+
#: warehouse/accounts/views.py:1723
322326
msgid "You can't register more than 3 pending trusted publishers at once."
323327
msgstr ""
324328

325-
#: warehouse/accounts/views.py:1735
329+
#: warehouse/accounts/views.py:1738
326330
#: warehouse/manage/views/oidc_publishers.py:302
327331
#: warehouse/manage/views/oidc_publishers.py:417
328332
#: warehouse/manage/views/oidc_publishers.py:531
@@ -332,30 +336,30 @@ msgid ""
332336
"again later."
333337
msgstr ""
334338

335-
#: warehouse/accounts/views.py:1745
339+
#: warehouse/accounts/views.py:1748
336340
#: warehouse/manage/views/oidc_publishers.py:315
337341
#: warehouse/manage/views/oidc_publishers.py:430
338342
#: warehouse/manage/views/oidc_publishers.py:544
339343
#: warehouse/manage/views/oidc_publishers.py:656
340344
msgid "The trusted publisher could not be registered"
341345
msgstr ""
342346

343-
#: warehouse/accounts/views.py:1760
347+
#: warehouse/accounts/views.py:1763
344348
msgid ""
345349
"This trusted publisher has already been registered. Please contact PyPI's"
346350
" admins if this wasn't intentional."
347351
msgstr ""
348352

349-
#: warehouse/accounts/views.py:1794
353+
#: warehouse/accounts/views.py:1797
350354
msgid "Registered a new pending publisher to create "
351355
msgstr ""
352356

353-
#: warehouse/accounts/views.py:1937 warehouse/accounts/views.py:1950
354-
#: warehouse/accounts/views.py:1957
357+
#: warehouse/accounts/views.py:1940 warehouse/accounts/views.py:1953
358+
#: warehouse/accounts/views.py:1960
355359
msgid "Invalid publisher ID"
356360
msgstr ""
357361

358-
#: warehouse/accounts/views.py:1964
362+
#: warehouse/accounts/views.py:1967
359363
msgid "Removed trusted publisher for project "
360364
msgstr ""
361365

0 commit comments

Comments
 (0)