Skip to content

Commit 58f9c34

Browse files
authored
Merge branch 'main' into upload-attestations
2 parents 9345a6f + 609871e commit 58f9c34

File tree

90 files changed

+1277
-486
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

90 files changed

+1277
-486
lines changed

docker-compose.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -153,7 +153,7 @@ services:
153153
worker:
154154
image: warehouse:docker-compose
155155
pull_policy: never
156-
command: hupper -m celery -A warehouse worker --beat --scheduler redbeat.RedBeatScheduler -l info
156+
command: hupper --shutdown-interval 10 --reload-interval 10 -m celery -A warehouse worker --beat --scheduler redbeat.RedBeatScheduler -l info
157157
volumes:
158158
- ./warehouse:/opt/warehouse/src/warehouse:z
159159
- packages:/var/opt/warehouse/packages

requirements/main.txt

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1541,12 +1541,12 @@ protobuf==4.25.3 \
15411541
# googleapis-common-protos
15421542
# grpcio-status
15431543
# proto-plus
1544-
psycopg[c]==3.1.19 \
1545-
--hash=sha256:92d7b78ad82426cdcf1a0440678209faa890c6e1721361c2f8901f0dccd62961 \
1546-
--hash=sha256:dca5e5521c859f6606686432ae1c94e8766d29cc91f2ee595378c510cc5b0731
1544+
psycopg[c]==3.2.1 \
1545+
--hash=sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7 \
1546+
--hash=sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175
15471547
# via -r requirements/main.in
1548-
psycopg-c==3.1.19 \
1549-
--hash=sha256:8e90f53c430e7d661cb3a9298e2761847212ead1b24c5fb058fc9d0fd9616017
1548+
psycopg-c==3.2.1 \
1549+
--hash=sha256:2d09943cc8a855c42c1e23b4298957b7ce8f27bf3683258c52fd139f601f7cda
15501550
# via psycopg
15511551
pyasn1==0.6.0 \
15521552
--hash=sha256:3a35ab2c4b5ef98e17dfdec8ab074046fbda76e281c5a706ccd82328cfc8f64c \

requirements/tests.txt

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -225,9 +225,9 @@ psutil==6.0.0 \
225225
--hash=sha256:fc8c9510cde0146432bbdb433322861ee8c3efbf8589865c8bf8d21cb30c4d14 \
226226
--hash=sha256:ffe7fc9b6b36beadc8c322f84e1caff51e8703b88eee1da46d1e3a6ae11b4fd0
227227
# via mirakuru
228-
psycopg==3.1.19 \
229-
--hash=sha256:92d7b78ad82426cdcf1a0440678209faa890c6e1721361c2f8901f0dccd62961 \
230-
--hash=sha256:dca5e5521c859f6606686432ae1c94e8766d29cc91f2ee595378c510cc5b0731
228+
psycopg==3.2.1 \
229+
--hash=sha256:dc8da6dc8729dacacda3cc2f17d2c9397a70a66cf0d2b69c91065d60d5f00cb7 \
230+
--hash=sha256:ece385fb413a37db332f97c49208b36cf030ff02b199d7635ed2fbd378724175
231231
# via pytest-postgresql
232232
pytest==8.2.2 \
233233
--hash=sha256:c434598117762e2bd304e526244f67bf66bbd7b5d6cf22138be51ff661980343 \

tests/unit/accounts/test_core.py

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
database_login_factory,
3030
)
3131
from warehouse.accounts.tasks import compute_user_metrics
32-
from warehouse.accounts.utils import UserTokenContext
32+
from warehouse.accounts.utils import UserContext
3333
from warehouse.oidc.interfaces import SignedClaims
3434
from warehouse.oidc.models import OIDCPublisher
3535
from warehouse.oidc.utils import PublisherTokenContext
@@ -40,15 +40,16 @@
4040

4141

4242
class TestUser:
43-
def test_with_user(self, db_request):
43+
def test_with_user_context_no_macaroon(self, db_request):
4444
user = UserFactory.create()
45-
request = pretend.stub(identity=user)
45+
user_ctx = UserContext(user, None)
46+
request = pretend.stub(identity=user_ctx)
4647

4748
assert accounts._user(request) is user
4849

49-
def test_with_user_token_context(self, db_request):
50+
def test_with_user_token_context_macaroon(self, db_request):
5051
user = UserFactory.create()
51-
user_ctx = UserTokenContext(user, pretend.stub())
52+
user_ctx = UserContext(user, pretend.stub())
5253
request = pretend.stub(identity=user_ctx)
5354

5455
assert accounts._user(request) is user
@@ -107,7 +108,7 @@ class TestOrganizationAccess:
107108
def test_organization_access(self, db_session, identity, flag, orgs, expected):
108109
user = None if not identity else UserFactory()
109110
request = pretend.stub(
110-
identity=user,
111+
identity=UserContext(user, None),
111112
find_service=lambda interface, context=None: pretend.stub(
112113
get_organizations_by_user=lambda x: orgs
113114
),

tests/unit/accounts/test_security_policy.py

Lines changed: 44 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
from pyramid.interfaces import ISecurityPolicy
1919
from zope.interface.verify import verifyClass
2020

21-
from warehouse.accounts import security_policy
21+
from warehouse.accounts import UserContext, security_policy
2222
from warehouse.accounts.interfaces import IUserService
2323
from warehouse.utils.security_policy import AuthenticationMethod
2424

@@ -451,7 +451,7 @@ def test_identity(self, monkeypatch):
451451
remote_addr="1.2.3.4",
452452
)
453453

454-
assert policy.identity(request) is user
454+
assert policy.identity(request).user is user
455455
assert request.authentication_method == AuthenticationMethod.SESSION
456456
assert session_helper_obj.authenticated_userid.calls == [pretend.call(request)]
457457
assert session_helper_cls.calls == [pretend.call()]
@@ -518,14 +518,15 @@ class TestPermits:
518518
"principals,expected", [("user:5", True), ("user:1", False)]
519519
)
520520
def test_acl(self, monkeypatch, policy_class, principals, expected):
521-
monkeypatch.setattr(security_policy, "User", pretend.stub)
522-
523521
request = pretend.stub(
524522
flags=pretend.stub(enabled=lambda flag: False),
525-
identity=pretend.stub(
526-
__principals__=lambda: principals,
527-
has_primary_verified_email=True,
528-
has_two_factor=True,
523+
identity=UserContext(
524+
user=pretend.stub(
525+
__principals__=lambda: principals,
526+
has_primary_verified_email=True,
527+
has_two_factor=True,
528+
),
529+
macaroon=None,
529530
),
530531
matched_route=pretend.stub(name="random.route"),
531532
)
@@ -535,13 +536,14 @@ def test_acl(self, monkeypatch, policy_class, principals, expected):
535536
assert bool(policy.permits(request, context, "myperm")) == expected
536537

537538
def test_permits_with_unverified_email(self, monkeypatch, policy_class):
538-
monkeypatch.setattr(security_policy, "User", pretend.stub)
539-
540539
request = pretend.stub(
541-
identity=pretend.stub(
542-
__principals__=lambda: ["user:5"],
543-
has_primary_verified_email=False,
544-
has_two_factor=False,
540+
identity=UserContext(
541+
user=pretend.stub(
542+
__principals__=lambda: ["user:5"],
543+
has_primary_verified_email=False,
544+
has_two_factor=False,
545+
),
546+
macaroon=None,
545547
),
546548
matched_route=pretend.stub(name="manage.projects"),
547549
)
@@ -551,13 +553,14 @@ def test_permits_with_unverified_email(self, monkeypatch, policy_class):
551553
assert not policy.permits(request, context, "myperm")
552554

553555
def test_permits_manage_projects_with_2fa(self, monkeypatch, policy_class):
554-
monkeypatch.setattr(security_policy, "User", pretend.stub)
555-
556556
request = pretend.stub(
557-
identity=pretend.stub(
558-
__principals__=lambda: ["user:5"],
559-
has_primary_verified_email=True,
560-
has_two_factor=True,
557+
identity=UserContext(
558+
user=pretend.stub(
559+
__principals__=lambda: ["user:5"],
560+
has_primary_verified_email=True,
561+
has_two_factor=True,
562+
),
563+
macaroon=None,
561564
),
562565
matched_route=pretend.stub(name="manage.projects"),
563566
)
@@ -567,14 +570,15 @@ def test_permits_manage_projects_with_2fa(self, monkeypatch, policy_class):
567570
assert policy.permits(request, context, "myperm")
568571

569572
def test_deny_manage_projects_without_2fa(self, monkeypatch, policy_class):
570-
monkeypatch.setattr(security_policy, "User", pretend.stub)
571-
572573
request = pretend.stub(
573574
flags=pretend.stub(enabled=lambda flag: False),
574-
identity=pretend.stub(
575-
__principals__=lambda: ["user:5"],
576-
has_primary_verified_email=True,
577-
has_two_factor=False,
575+
identity=UserContext(
576+
user=pretend.stub(
577+
__principals__=lambda: ["user:5"],
578+
has_primary_verified_email=True,
579+
has_two_factor=False,
580+
),
581+
macaroon=None,
578582
),
579583
matched_route=pretend.stub(name="manage.projects"),
580584
)
@@ -584,14 +588,15 @@ def test_deny_manage_projects_without_2fa(self, monkeypatch, policy_class):
584588
assert not policy.permits(request, context, "myperm")
585589

586590
def test_deny_forklift_file_upload_without_2fa(self, monkeypatch, policy_class):
587-
monkeypatch.setattr(security_policy, "User", pretend.stub)
588-
589591
request = pretend.stub(
590592
flags=pretend.stub(enabled=lambda flag: False),
591-
identity=pretend.stub(
592-
__principals__=lambda: ["user:5"],
593-
has_primary_verified_email=True,
594-
has_two_factor=False,
593+
identity=UserContext(
594+
user=pretend.stub(
595+
__principals__=lambda: ["user:5"],
596+
has_primary_verified_email=True,
597+
has_two_factor=False,
598+
),
599+
macaroon=None,
595600
),
596601
matched_route=pretend.stub(name="forklift.legacy.file_upload"),
597602
)
@@ -614,13 +619,14 @@ def test_deny_forklift_file_upload_without_2fa(self, monkeypatch, policy_class):
614619
def test_permits_2fa_routes_without_2fa(
615620
self, monkeypatch, policy_class, matched_route
616621
):
617-
monkeypatch.setattr(security_policy, "User", pretend.stub)
618-
619622
request = pretend.stub(
620-
identity=pretend.stub(
621-
__principals__=lambda: ["user:5"],
622-
has_primary_verified_email=True,
623-
has_two_factor=False,
623+
identity=UserContext(
624+
user=pretend.stub(
625+
__principals__=lambda: ["user:5"],
626+
has_primary_verified_email=True,
627+
has_two_factor=False,
628+
),
629+
macaroon=None,
624630
),
625631
matched_route=pretend.stub(name=matched_route),
626632
)

tests/unit/forklift/test_legacy.py

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@
3737
from trove_classifiers import classifiers
3838
from webob.multidict import MultiDict
3939

40-
from warehouse.accounts.utils import UserTokenContext
40+
from warehouse.accounts.utils import UserContext
4141
from warehouse.admin.flags import AdminFlag, AdminFlagValue
4242
from warehouse.classifiers.models import Classifier
4343
from warehouse.forklift import legacy, metadata
@@ -975,7 +975,7 @@ def test_upload_escapes_nul_characters(self, pyramid_config, db_request):
975975

976976
assert "\x00" not in db_request.POST["summary"]
977977

978-
@pytest.mark.parametrize("token_context", [True, False])
978+
@pytest.mark.parametrize("macaroon_in_user_context", [True, False])
979979
@pytest.mark.parametrize(
980980
("digests",),
981981
[
@@ -1004,7 +1004,7 @@ def test_successful_upload(
10041004
pyramid_config,
10051005
db_request,
10061006
digests,
1007-
token_context,
1007+
macaroon_in_user_context,
10081008
metrics,
10091009
):
10101010
monkeypatch.setattr(tempfile, "tempdir", str(tmpdir))
@@ -1020,11 +1020,10 @@ def test_successful_upload(
10201020
filename = f"{project.name}-{release.version}.tar.gz"
10211021

10221022
db_request.user = user
1023-
if token_context:
1024-
user_context = UserTokenContext(user, pretend.stub())
1025-
pyramid_config.testing_securitypolicy(identity=user_context)
1026-
else:
1027-
pyramid_config.testing_securitypolicy(identity=user)
1023+
user_context = UserContext(
1024+
user, pretend.stub() if macaroon_in_user_context else None
1025+
)
1026+
pyramid_config.testing_securitypolicy(identity=user_context)
10281027

10291028
db_request.user_agent = "warehouse-tests/6.6.6"
10301029

@@ -4480,7 +4479,7 @@ def test_upload_with_token_api_warns_if_trusted_publisher_configured(
44804479
[caveats.RequestUser(user_id=str(maintainer.id))],
44814480
user_id=maintainer.id,
44824481
)
4483-
identity = UserTokenContext(maintainer, macaroon)
4482+
identity = UserContext(maintainer, macaroon)
44844483
else:
44854484
claims = {"sha": "somesha"}
44864485
identity = PublisherTokenContext(publisher, SignedClaims(claims))

tests/unit/macaroons/test_caveats.py

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from pymacaroons import Macaroon
2121

2222
from warehouse.accounts import _oidc_publisher
23-
from warehouse.accounts.utils import UserTokenContext
23+
from warehouse.accounts.utils import UserContext
2424
from warehouse.macaroons import caveats
2525
from warehouse.macaroons.caveats import (
2626
Caveat,
@@ -271,21 +271,32 @@ def test_verify_no_identity(self):
271271

272272
assert result == Failure("token with user restriction without a user")
273273

274-
def test_verify_invalid_identity(self):
274+
def test_verify_invalid_identity_no_user(self):
275275
caveat = RequestUser(user_id="invalid")
276276
result = caveat.verify(
277277
pretend.stub(identity=pretend.stub()), pretend.stub(), pretend.stub()
278278
)
279279

280280
assert result == Failure("token with user restriction without a user")
281281

282+
def test_verify_invalid_identity_no_macaroon(self, db_request):
283+
user = UserFactory.create()
284+
user_context = UserContext(user, None)
285+
286+
caveat = RequestUser(user_id=str(user.id))
287+
result = caveat.verify(
288+
pretend.stub(identity=user_context), pretend.stub(), pretend.stub()
289+
)
290+
291+
assert result == Failure("token with user restriction without a macaroon")
292+
282293
def test_verify_invalid_user_id(self, db_request):
283294
user = UserFactory.create()
284-
user_token_context = UserTokenContext(user, pretend.stub())
295+
user_context = UserContext(user, pretend.stub())
285296

286297
caveat = RequestUser(user_id="invalid")
287298
result = caveat.verify(
288-
pretend.stub(identity=user_token_context), pretend.stub(), pretend.stub()
299+
pretend.stub(identity=user_context), pretend.stub(), pretend.stub()
289300
)
290301

291302
assert result == Failure(
@@ -294,11 +305,11 @@ def test_verify_invalid_user_id(self, db_request):
294305

295306
def test_verify_ok(self, db_request):
296307
user = UserFactory.create()
297-
user_token_context = UserTokenContext(user, pretend.stub())
308+
user_context = UserContext(user, pretend.stub())
298309

299310
caveat = RequestUser(user_id=str(user.id))
300311
result = caveat.verify(
301-
pretend.stub(identity=user_token_context), pretend.stub(), pretend.stub()
312+
pretend.stub(identity=user_context), pretend.stub(), pretend.stub()
302313
)
303314

304315
assert result == Success()

tests/unit/macaroons/test_security_policy.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@
2020
from zope.interface.verify import verifyClass
2121

2222
from warehouse.accounts.interfaces import IUserService
23-
from warehouse.accounts.utils import UserTokenContext
23+
from warehouse.accounts.utils import UserContext
2424
from warehouse.authnz import Permissions
2525
from warehouse.macaroons import security_policy
2626
from warehouse.macaroons.interfaces import IMacaroonService
@@ -215,7 +215,7 @@ def test_identity_user(self, monkeypatch):
215215
),
216216
)
217217

218-
assert policy.identity(request) == UserTokenContext(user, macaroon)
218+
assert policy.identity(request) == UserContext(user, macaroon)
219219
assert extract_http_macaroon.calls == [pretend.call(request)]
220220
assert request.find_service.calls == [
221221
pretend.call(IMacaroonService, context=None),

tests/unit/macaroons/test_utils.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -13,12 +13,12 @@
1313
import pretend
1414

1515
from tests.common.db.accounts import UserFactory
16-
from warehouse.accounts.utils import UserTokenContext
16+
from warehouse.accounts.utils import UserContext
1717
from warehouse.utils.security_policy import principals_for
1818

1919

20-
def test_usertoken_context_principals(db_request):
20+
def test_user_context_principals(db_request):
2121
user = UserFactory.create()
2222
assert principals_for(
23-
UserTokenContext(user=user, macaroon=pretend.stub())
23+
UserContext(user=user, macaroon=pretend.stub())
2424
) == principals_for(user)

0 commit comments

Comments
 (0)