Script 'mail_helper' called by obssrc
Hello community,

here is the log from the commit of package gitlab-container-registry for 
openSUSE:Factory checked in at 2026-06-28 21:07:49
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Comparing /work/SRC/openSUSE:Factory/gitlab-container-registry (Old)
 and      /work/SRC/openSUSE:Factory/.gitlab-container-registry.new.11887 (New)
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Package is "gitlab-container-registry"

Sun Jun 28 21:07:49 2026 rev:26 rq:1362095 version:4.40.2

Changes:
--------
--- 
/work/SRC/openSUSE:Factory/gitlab-container-registry/gitlab-container-registry.changes
      2026-05-28 17:32:16.976987753 +0200
+++ 
/work/SRC/openSUSE:Factory/.gitlab-container-registry.new.11887/gitlab-container-registry.changes
   2026-06-28 21:08:42.742478602 +0200
@@ -1,0 +2,39 @@
+Sun Jun 28 06:50:25 UTC 2026 - Johannes Kastl 
<[email protected]>
+
+- Update to version 4.40.2:
+  * Bug Fixes
+    - driver/s3-v2: make retry delayer stateless (e927a39)
+    - driver/s3-v2: strip request checksum and inject content-md5
+      when checksum_disabled (71ff9d7)
+    - handlers: defer router init until metadata DB resolves
+      prefer-fallback (685b376)
+    - s3: fix panic in Stat() call (5bcb779)
+  * Build
+    - deps: update module github.com/alicebob/miniredis/v2 to
+      v2.38.0 (5bbd451)
+    - deps: update module github.com/aws/aws-sdk-go-v2/config to
+      v1.32.17 (54cfdf1)
+    - deps: update module github.com/aws/aws-sdk-go-v2/config to
+      v1.32.20 (ae32dec)
+    - deps: update module github.com/aws/aws-sdk-go-v2/config to
+      v1.32.25 (0dc8ad4)
+    - deps: update module github.com/aws/aws-sdk-go-v2/credentials
+      to v1.19.16 (5fdc189)
+    - deps: update module github.com/aws/aws-sdk-go-v2/credentials
+      to v1.19.24 (15b7b82)
+    - deps: update module
+      github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign to
+      v1.10.0 (5c608ed)
+    - deps: update module
+      github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign to
+      v1.11.0 (a2cd23b)
+    - deps: update module
+      github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign to
+      v1.11.4 (b2af8ef)
+    - deps: update module
+      github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign to
+      v1.11.6 (a0042d4)
+    - upgrade golang.org/x/crypto to v0.53.0 (3e422ec)
+    - upgrade to Go 1.25 (cc3c39a)
+
+-------------------------------------------------------------------

Old:
----
  gitlab-container-registry-4.40.1.obscpio

New:
----
  gitlab-container-registry-4.40.2.obscpio

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Other differences:
------------------
++++++ gitlab-container-registry.spec ++++++
--- /var/tmp/diff_new_pack.iKZUWF/_old  2026-06-28 21:08:44.318531824 +0200
+++ /var/tmp/diff_new_pack.iKZUWF/_new  2026-06-28 21:08:44.322531960 +0200
@@ -1,7 +1,7 @@
 #
 # spec file for package gitlab-container-registry
 #
-# Copyright (c) 2024 SUSE LLC
+# Copyright (c) 2026 SUSE LLC and contributors
 #
 # All modifications and additions to the file contributed by third parties
 # remain the property of their copyright owners, unless otherwise agreed
@@ -17,7 +17,7 @@
 
 
 Name:           gitlab-container-registry
-Version:        4.40.1
+Version:        4.40.2
 Release:        0
 Summary:        The GitLab Container Registry
 License:        Apache-2.0
@@ -28,7 +28,7 @@
 Source2:        %{name}-configuration.yml
 Source3:        %{name}.service
 Source4:       system-user-%{name}.conf
-BuildRequires:  golang(API) >= 1.23
+BuildRequires:  golang(API) >= 1.25
 BuildRequires:  systemd-rpm-macros
 BuildRequires:  sysuser-tools
 

++++++ _service ++++++
--- /var/tmp/diff_new_pack.iKZUWF/_old  2026-06-28 21:08:44.358533176 +0200
+++ /var/tmp/diff_new_pack.iKZUWF/_new  2026-06-28 21:08:44.362533310 +0200
@@ -3,7 +3,7 @@
     <param 
name="url">https://gitlab.com/gitlab-org/container-registry.git</param>
     <param name="scm">git</param>
     <param name="exclude">.git</param>
-    <param name="revision">v4.40.1-gitlab</param>
+    <param name="revision">v4.40.2-gitlab</param>
     <param name="versionformat">@PARENT_TAG@</param>
     <param name="versionrewrite-pattern">v(.*)-gitlab</param>
     <param name="changesgenerate">enable</param>

++++++ _servicedata ++++++
--- /var/tmp/diff_new_pack.iKZUWF/_old  2026-06-28 21:08:44.390534257 +0200
+++ /var/tmp/diff_new_pack.iKZUWF/_new  2026-06-28 21:08:44.394534392 +0200
@@ -1,6 +1,6 @@
 <servicedata>
 <service name="tar_scm">
                 <param 
name="url">https://gitlab.com/gitlab-org/container-registry.git</param>
-              <param 
name="changesrevision">b4c21f9e3907860dbb70cb2a3d6ee438077032cb</param></service></servicedata>
+              <param 
name="changesrevision">14eed6857a7cd4b1e053502dce1aa6f3f74f4be1</param></service></servicedata>
 (No newline at EOF)
 

++++++ gitlab-container-registry-4.40.1.obscpio -> 
gitlab-container-registry-4.40.2.obscpio ++++++
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.40.1/.tool-versions 
new/gitlab-container-registry-4.40.2/.tool-versions
--- old/gitlab-container-registry-4.40.1/.tool-versions 2026-05-22 
21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/.tool-versions 2026-06-24 
16:19:57.000000000 +0200
@@ -3,8 +3,8 @@
 nodejs            22.11.0
 golangci-lint     2.5.0
 # For linting documentation
-markdownlint-cli2 0.19.0
-lychee            0.21.0
-vale              3.13.0
+markdownlint-cli2 0.22.1
+lychee            0.24.2
+vale              3.14.1
 gomigrate         latest
 gotestsum         latest
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.40.1/CHANGELOG.md 
new/gitlab-container-registry-4.40.2/CHANGELOG.md
--- old/gitlab-container-registry-4.40.1/CHANGELOG.md   2026-05-22 
21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/CHANGELOG.md   2026-06-24 
16:19:57.000000000 +0200
@@ -1,3 +1,29 @@
+## 
[4.40.2](https://gitlab.com/gitlab-org/container-registry/compare/v4.40.1-gitlab...v4.40.2)
 (2026-06-23)
+
+
+### 🐛 Bug Fixes 🐛
+
+* **driver/s3-v2:** make retry delayer stateless 
([e927a39](https://gitlab.com/gitlab-org/container-registry/commit/e927a39ca122d15cb3fee64f8a6b094ed06404bf))
+* **driver/s3-v2:** strip request checksum and inject content-md5 when 
checksum_disabled 
([71ff9d7](https://gitlab.com/gitlab-org/container-registry/commit/71ff9d70394cd7c6f62e8afedeb2af17b09d32d9))
+* **handlers:** defer router init until metadata DB resolves prefer-fallback 
([685b376](https://gitlab.com/gitlab-org/container-registry/commit/685b3766b54e58c356d9c7feee8e867aaf0ab21c))
+* **s3:** fix panic in Stat() call 
([5bcb779](https://gitlab.com/gitlab-org/container-registry/commit/5bcb7794d6c7e3f6bd7fa0fb8a6487e9245bb46e))
+
+
+### ⚙️ Build ⚙️
+
+* **deps:** update module github.com/alicebob/miniredis/v2 to v2.38.0 
([5bbd451](https://gitlab.com/gitlab-org/container-registry/commit/5bbd45133960a6ccffe5b2be05f6aafc09633a05))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/config to v1.32.17 
([54cfdf1](https://gitlab.com/gitlab-org/container-registry/commit/54cfdf1eaf76d2f80cf7957a8578c9464bef25a1))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/config to v1.32.20 
([ae32dec](https://gitlab.com/gitlab-org/container-registry/commit/ae32dec10459e600385a4beb37b3afc71efa64e9))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/config to v1.32.25 
([0dc8ad4](https://gitlab.com/gitlab-org/container-registry/commit/0dc8ad4b1e56f1dbb88afe8d7a8a1ffb82645e7a))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/credentials to v1.19.16 
([5fdc189](https://gitlab.com/gitlab-org/container-registry/commit/5fdc18946ed07ff5c34a94e130b40ba214d35989))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/credentials to v1.19.24 
([15b7b82](https://gitlab.com/gitlab-org/container-registry/commit/15b7b82928107c5f9093135f1a9a8e05ad8f83d4))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign 
to v1.10.0 
([5c608ed](https://gitlab.com/gitlab-org/container-registry/commit/5c608ed110e3bbbd37cd924e65f594e6ab15a035))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign 
to v1.11.0 
([a2cd23b](https://gitlab.com/gitlab-org/container-registry/commit/a2cd23bc42759a6d0a7eabd7b08e3c25bfe22ace))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign 
to v1.11.4 
([b2af8ef](https://gitlab.com/gitlab-org/container-registry/commit/b2af8ef2de3d8ea8e9919c03560a1b319190df8e))
+* **deps:** update module github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign 
to v1.11.6 
([a0042d4](https://gitlab.com/gitlab-org/container-registry/commit/a0042d462cd36728097f692bcf5e28b50c70e90a))
+* upgrade golang.org/x/crypto to v0.53.0 
([3e422ec](https://gitlab.com/gitlab-org/container-registry/commit/3e422ecf5f677f18f17c0dcbe53c4d6086b0411e))
+* upgrade to Go 1.25 
([cc3c39a](https://gitlab.com/gitlab-org/container-registry/commit/cc3c39a4643f8fe56005b1efd8c0d39be0e9180b))
+
 ## 
[4.40.1](https://gitlab.com/gitlab-org/container-registry/compare/v4.40.0-gitlab...v4.40.1)
 (2026-05-22)
 
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.40.1/Makefile 
new/gitlab-container-registry-4.40.2/Makefile
--- old/gitlab-container-registry-4.40.1/Makefile       2026-05-22 
21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/Makefile       2026-06-24 
16:19:57.000000000 +0200
@@ -2,7 +2,7 @@
 ROOTDIR=$(dir $(abspath $(lastword $(MAKEFILE_LIST))))
 
 GOLANGCI_VERSION ?= v2.5.0
-DOCSLINT_VERSION ?= 
registry.gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/lint-markdown:alpine-3.22-vale-3.13.0-markdownlint2-0.19.0-lychee-0.21.0
+DOCSLINT_VERSION ?= 
registry.gitlab.com/gitlab-org/technical-writing/docs-gitlab-com/lint-markdown:alpine-3.23-vale-3.14.1-markdownlint2-0.22.1-lychee-0.24.2
 
 DOCKER_IMAGE_REGISTRY ?= registry.gitlab.com/gitlab-org/container-registry
 
@@ -144,7 +144,7 @@
                        @semantic-release/git@10 \
                        conventional-changelog-conventionalcommits@6
 dev-tools: release-tools
-       go install go.uber.org/mock/[email protected]
+       go install go.uber.org/mock/[email protected]
 
 # https://github.com/semantic-release/git#environment-variables
 export GIT_AUTHOR_NAME="$(shell git config user.name)"
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/containers/registry/Dockerfile 
new/gitlab-container-registry-4.40.2/containers/registry/Dockerfile
--- old/gitlab-container-registry-4.40.1/containers/registry/Dockerfile 
2026-05-22 21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/containers/registry/Dockerfile 
2026-06-24 16:19:57.000000000 +0200
@@ -1,4 +1,4 @@
-ARG GOLANG_VERSION=1.24
+ARG GOLANG_VERSION=1.25
 FROM golang:${GOLANG_VERSION}-alpine AS build
 
 ENV DISTRIBUTION_DIR /go/src/github.com/docker/distribution
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/docs/storage-drivers/s3_v2.md 
new/gitlab-container-registry-4.40.2/docs/storage-drivers/s3_v2.md
--- old/gitlab-container-registry-4.40.1/docs/storage-drivers/s3_v2.md  
2026-05-22 21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/docs/storage-drivers/s3_v2.md  
2026-06-24 16:19:57.000000000 +0200
@@ -46,7 +46,7 @@
 | `objectacl` | no | The S3 Canned ACL for objects. The default value is 
"private". If you are using a bucket owned by another AWS account, it is 
recommended that you set this to `bucket-owner-full-control` so that the bucket 
owner can access your objects. |
 | `objectownership` | no | Indicates whether the S3 storage bucket to be used 
by the registry disabled access control lists (ACLs). The default value is 
`false`. This parameter cannot be `true` if the `objectacl` parameter is also 
set. |
 | `checksum_algorithm` | no | The algorithm to use for checksums when 
uploading objects to S3. Can be one of: `CRC32`, `CRC32C`, `SHA1`, `SHA256`, or 
`CRC64NVME`. Defaults to `CRC64NVME`. |
-| `checksum_disabled` | no | If set to true, disables checksum calculation for 
S3 objects. Defaults to false. This parameter takes precedence over 
`checksum_algorithm` if both are provided. |
+| `checksum_disabled` | no | If set to true, disables checksum calculation for 
S3 objects. Defaults to false. This parameter takes precedence over 
`checksum_algorithm` if both are provided. It also makes the driver work with 
strict S3-compatible backends (e.g. QingStor) that reject `DeleteObjects` 
requests carrying an `x-amz-checksum-crc32` header: the driver strips the 
request checksum and sends a `Content-MD5` header instead. |
 
 ## SeaweedFS
 
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.40.1/go.mod 
new/gitlab-container-registry-4.40.2/go.mod
--- old/gitlab-container-registry-4.40.1/go.mod 2026-05-22 21:07:54.000000000 
+0200
+++ new/gitlab-container-registry-4.40.2/go.mod 2026-06-24 16:19:57.000000000 
+0200
@@ -1,6 +1,6 @@
 module github.com/docker/distribution
 
-go 1.24.0
+go 1.25.0
 
 require (
        cloud.google.com/go/compute/metadata v0.9.0
@@ -10,14 +10,14 @@
        github.com/Azure/azure-sdk-for-go/sdk/storage/azblob v1.6.4
        github.com/DATA-DOG/go-sqlmock v1.5.2
        github.com/Shopify/toxiproxy/v2 v2.12.0
-       github.com/alicebob/miniredis/v2 v2.37.0
+       github.com/alicebob/miniredis/v2 v2.38.0
        github.com/aws/aws-sdk-go v1.55.5
-       github.com/aws/aws-sdk-go-v2 v1.41.5
-       github.com/aws/aws-sdk-go-v2/config v1.32.12
-       github.com/aws/aws-sdk-go-v2/credentials v1.19.12
-       github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.21
+       github.com/aws/aws-sdk-go-v2 v1.42.0
+       github.com/aws/aws-sdk-go-v2/config v1.32.25
+       github.com/aws/aws-sdk-go-v2/credentials v1.19.24
+       github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.11.6
        github.com/aws/aws-sdk-go-v2/service/s3 v1.97.3
-       github.com/aws/smithy-go v1.24.3
+       github.com/aws/smithy-go v1.27.1
        github.com/benbjohnson/clock v1.3.5
        github.com/bsm/redislock v0.9.4
        github.com/cenkalti/backoff/v4 v4.3.0
@@ -55,10 +55,10 @@
        gitlab.com/gitlab-org/labkit v1.38.6
        go.uber.org/automaxprocs v1.6.0
        go.uber.org/mock v0.6.0
-       golang.org/x/crypto v0.47.0
-       golang.org/x/net v0.49.0
+       golang.org/x/crypto v0.53.0
+       golang.org/x/net v0.55.0
        golang.org/x/oauth2 v0.35.0
-       golang.org/x/sync v0.19.0
+       golang.org/x/sync v0.21.0
        golang.org/x/time v0.14.0
        google.golang.org/api v0.265.0
        gopkg.in/yaml.v2 v2.4.0
@@ -81,19 +81,18 @@
        
github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping
 v0.55.0 // indirect
        github.com/Microsoft/go-winio v0.6.2 // indirect
        github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 // indirect
-       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 // indirect
-       github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 // indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 
// indirect
+       github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 // indirect
+       github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 // indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 
// indirect
        github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 // 
indirect
+       github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 // 
indirect
        github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 // 
indirect
-       github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 // indirect
-       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 // indirect
-       github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 // indirect
+       github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 // indirect
+       github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 // indirect
+       github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 // indirect
        github.com/beorn7/perks v1.0.1 // indirect
        github.com/cespare/xxhash/v2 v2.3.0 // indirect
        github.com/clipperhouse/displaywidth v0.10.0 // indirect
@@ -202,9 +201,9 @@
        go.yaml.in/yaml/v2 v2.4.2 // indirect
        go.yaml.in/yaml/v3 v3.0.4 // indirect
        golang.org/x/exp v0.0.0-20250813145105-42675adae3e6 // indirect
-       golang.org/x/sys v0.40.0 // indirect
-       golang.org/x/term v0.39.0 // indirect
-       golang.org/x/text v0.33.0 // indirect
+       golang.org/x/sys v0.46.0 // indirect
+       golang.org/x/term v0.44.0 // indirect
+       golang.org/x/text v0.38.0 // indirect
        google.golang.org/genproto v0.0.0-20260128011058-8636f8732409 // 
indirect
        google.golang.org/genproto/googleapis/api 
v0.0.0-20260203192932-546029d2fa20 // indirect
        google.golang.org/genproto/googleapis/rpc 
v0.0.0-20260203192932-546029d2fa20 // indirect
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' old/gitlab-container-registry-4.40.1/go.sum 
new/gitlab-container-registry-4.40.2/go.sum
--- old/gitlab-container-registry-4.40.1/go.sum 2026-05-22 21:07:54.000000000 
+0200
+++ new/gitlab-container-registry-4.40.2/go.sum 2026-06-24 16:19:57.000000000 
+0200
@@ -113,8 +113,8 @@
 github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod 
h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190717042225-c3de453c63f4/go.mod 
h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0=
 github.com/alecthomas/units v0.0.0-20190924025748-f65c72e2690d/go.mod 
h1:rBZYJk541a8SKzHPHnH3zbiI+7dagKZ0cgpgrD7Fyho=
-github.com/alicebob/miniredis/v2 v2.37.0 
h1:RheObYW32G1aiJIj81XVt78ZHJpHonHLHW7OLIshq68=
-github.com/alicebob/miniredis/v2 v2.37.0/go.mod 
h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
+github.com/alicebob/miniredis/v2 v2.38.0 
h1:nZAzCR+Lj+Vxk4ZXzm2NuKq2O33RXj1XxJ2e2uP9jiw=
+github.com/alicebob/miniredis/v2 v2.38.0/go.mod 
h1:TcL7YfarKPGDAthEtl5NBeHZfeUQj6OXMm/+iu5cLMM=
 github.com/antihax/optional v1.0.0/go.mod 
h1:uupD/76wgC+ih3iEmQUL+0Ugr19nfwCT1kdvxnR2qWY=
 github.com/apache/thrift v0.12.0/go.mod 
h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
 github.com/apache/thrift v0.13.0/go.mod 
h1:cp2SuWMxlEZw2r+iP2GNCdIi4C1qmUzdZFSVb+bacwQ=
@@ -127,46 +127,44 @@
 github.com/aws/aws-sdk-go v1.55.5 
h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU=
 github.com/aws/aws-sdk-go v1.55.5/go.mod 
h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU=
 github.com/aws/aws-sdk-go-v2 v0.18.0/go.mod 
h1:JWVYvqSMppoMJC0x5wdwiImzgXTI9FuZwxzkQq9wy+g=
-github.com/aws/aws-sdk-go-v2 v1.41.5 
h1:dj5kopbwUsVUVFgO4Fi5BIT3t4WyqIDjGKCangnV/yY=
-github.com/aws/aws-sdk-go-v2 v1.41.5/go.mod 
h1:mwsPRE8ceUUpiTgF7QmQIJ7lgsKUPQOUl3o72QBrE1o=
+github.com/aws/aws-sdk-go-v2 v1.42.0 
h1:XvXMJTkFQtpBKIWZnmr9ZEOc2InWM2yldjXEJ/bymhA=
+github.com/aws/aws-sdk-go-v2 v1.42.0/go.mod 
h1:27+ACypSLljLAEKsCYOmrjKh83vuTRkuAe9Uv/3A4bg=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8 
h1:eBMB84YGghSocM7PsjmmPffTa+1FBUeNvGvFou6V/4o=
 github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.7.8/go.mod 
h1:lyw7GFp3qENLh7kwzf7iMzAxDn+NzjXEAGjKS2UOKqI=
-github.com/aws/aws-sdk-go-v2/config v1.32.12 
h1:O3csC7HUGn2895eNrLytOJQdoL2xyJy0iYXhoZ1OmP0=
-github.com/aws/aws-sdk-go-v2/config v1.32.12/go.mod 
h1:96zTvoOFR4FURjI+/5wY1vc1ABceROO4lWgWJuxgy0g=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.12 
h1:oqtA6v+y5fZg//tcTWahyN9PEn5eDU/Wpvc2+kJ4aY8=
-github.com/aws/aws-sdk-go-v2/credentials v1.19.12/go.mod 
h1:U3R1RtSHx6NB0DvEQFGyf/0sbrpJrluENHdPy1j/3TE=
-github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.21 
h1:9mXcqEu6bdv8PJkwGn/vtlpqsHeX3mhSEa9u84pvxQQ=
-github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.9.21/go.mod 
h1:Qo/M7UP/PRElbLfPWyac7704MAI6intzLPUVWrYg7NE=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20 
h1:zOgq3uezl5nznfoK3ODuqbhVg1JzAGDUhXOsU0IDCAo=
-github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.20/go.mod 
h1:z/MVwUARehy6GAg/yQ1GO2IMl0k++cu1ohP9zo887wE=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21 
h1:Rgg6wvjjtX8bNHcvi9OnXWwcE0a2vGpbwmtICOsvcf4=
-github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.21/go.mod 
h1:A/kJFst/nm//cyqonihbdpQZwiUhhzpqTsdbhDdRF9c=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21 
h1:PEgGVtPoB6NTpPrBgqSE5hE/o47Ij9qk/SEZFbUOe9A=
-github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.21/go.mod 
h1:p+hz+PRAYlY3zcpJhPwXlLC4C+kqn70WIHwnzAfs6ps=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6 
h1:qYQ4pzQ2Oz6WpQ8T3HvGHnZydA72MnLuFK9tJwmrbHw=
-github.com/aws/aws-sdk-go-v2/internal/ini v1.8.6/go.mod 
h1:O3h0IK87yXci+kg6flUKzJnWeziQUKciKrLjcatSNcY=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22 
h1:rWyie/PxDRIdhNf4DzRk0lvjVOqFJuNnO8WwaIRVxzQ=
-github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.22/go.mod 
h1:zd/JsJ4P7oGfUhXn1VyLqaRZwPmZwg44Jf2dS84Dm3Y=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7 
h1:5EniKhLZe4xzL7a+fU3C2tfUN4nWIqlLesfrjkuPFTY=
-github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.7/go.mod 
h1:x0nZssQ3qZSnIcePWLvcoFisRXJzcTVvYpAAdYX8+GI=
+github.com/aws/aws-sdk-go-v2/config v1.32.25 
h1:ACCejvStYoilgwrfegSt5ZntCbPrk52qfwyNcnl3omM=
+github.com/aws/aws-sdk-go-v2/config v1.32.25/go.mod 
h1:LJyU8sDRbXUxFn8xMJIGP+v9QYYwveNLI8a/giAOiAs=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.24 
h1:2hQqYCV9yqyePQ9o6dCrZc/zO8U3TwPr9mIKlZnPu/I=
+github.com/aws/aws-sdk-go-v2/credentials v1.19.24/go.mod 
h1:IDwpACtwqHLISdzfwUUNq4P9DsB/h5BLg4FwJPNfqFY=
+github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.11.6 
h1:jC4AshBYsq1Qqm1Bcvhgn1b5BO8V7vR3+1WIWzGr4+Q=
+github.com/aws/aws-sdk-go-v2/feature/cloudfront/sign v1.11.6/go.mod 
h1:t9mqBUdYuV6yxB7+WkCwSZF5iYvUwlfLhKycHDSMbck=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29 
h1:r6qZHbT+wxgWO/e9vYNUEtg7lv5+UN3pRqKhLXvnArg=
+github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.18.29/go.mod 
h1:QRnaRcTVGKPGRy8w78HMQtKUGRYcnMZAANATkeVA6Mo=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29 
h1:f3vKqSo13fhTYb+JEcXwXefZQE26I1FB5eTSniU67ko=
+github.com/aws/aws-sdk-go-v2/internal/configsources v1.4.29/go.mod 
h1:MzoLFUArKGpGD+ukmPiTPG1X5x4o6M2kq4v2dr1FiEc=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29 
h1:RdwIf/CuUsvJX3RgJagbOyotl/cxoLY4xviKuE7p2GY=
+github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.7.29/go.mod 
h1:71wt8W2EgswdZy9Mf9KNnzxZ3TiZlv4caKghPktDOkA=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30 
h1:VTGy885W5DKBxWRUJbym9hytNaYzsyaPkCHGRRMAOhU=
+github.com/aws/aws-sdk-go-v2/internal/v4a v1.4.30/go.mod 
h1:AS0HycUvJRFvTt613AYDOgO2jzw+00cVSMny8XB3yMY=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12 
h1:ZD2+BSw9vFsNlKYIasSNt3uDbjqqXIBcM13UJv/Lx2k=
+github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.13.12/go.mod 
h1:Ms4zlcVBbXbiP7EVLhl+lgjvA/a7YphqQ3Ih3174EmI=
 github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13 
h1:JRaIgADQS/U6uXDqlPiefP32yXTda7Kqfx+LgspooZM=
 github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.9.13/go.mod 
h1:CEuVn5WqOMilYl+tbccq8+N2ieCy0gVn3OtRb0vBNNM=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21 
h1:c31//R3xgIJMSC8S6hEVq+38DcvUlgFY0FM6mSI5oto=
-github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.21/go.mod 
h1:r6+pf23ouCB718FUxaqzZdbpYFyDtehyZcmP5KL9FkA=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29 
h1:DRebniUGZ2MqiiIVmQJ04vIXr918hubdHMnarSLEWyU=
+github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.13.29/go.mod 
h1:LfRkPCD8YHDM2E5eTkos2UpwYeZnBcVarTa8L59bJHA=
 github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21 
h1:ZlvrNcHSFFWURB8avufQq9gFsheUgjVD9536obIknfM=
 github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.19.21/go.mod 
h1:cv3TNhVrssKR0O/xxLJVRfd2oazSnZnkUeTf6ctUwfQ=
 github.com/aws/aws-sdk-go-v2/service/s3 v1.97.3 
h1:HwxWTbTrIHm5qY+CAEur0s/figc3qwvLWsNkF4RPToo=
 github.com/aws/aws-sdk-go-v2/service/s3 v1.97.3/go.mod 
h1:uoA43SdFwacedBfSgfFSjjCvYe8aYBS7EnU5GZ/YKMM=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.8 
h1:0GFOLzEbOyZABS3PhYfBIx2rNBACYcKty+XGkTgw1ow=
-github.com/aws/aws-sdk-go-v2/service/signin v1.0.8/go.mod 
h1:LXypKvk85AROkKhOG6/YEcHFPoX+prKTowKnVdcaIxE=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.13 
h1:kiIDLZ005EcKomYYITtfsjn7dtOwHDOFy7IbPXKek2o=
-github.com/aws/aws-sdk-go-v2/service/sso v1.30.13/go.mod 
h1:2h/xGEowcW/g38g06g3KpRWDlT+OTfxxI0o1KqayAB8=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17 
h1:jzKAXIlhZhJbnYwHbvUQZEB8KfgAEuG0dc08Bkda7NU=
-github.com/aws/aws-sdk-go-v2/service/ssooidc v1.35.17/go.mod 
h1:Al9fFsXjv4KfbzQHGe6V4NZSZQXecFcvaIF4e70FoRA=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.9 
h1:Cng+OOwCHmFljXIxpEVXAGMnBia8MSU6Ch5i9PgBkcU=
-github.com/aws/aws-sdk-go-v2/service/sts v1.41.9/go.mod 
h1:LrlIndBDdjA/EeXeyNBle+gyCwTlizzW5ycgWnvIxkk=
-github.com/aws/smithy-go v1.24.3 
h1:XgOAaUgx+HhVBoP4v8n6HCQoTRDhoMghKqw4LNHsDNg=
-github.com/aws/smithy-go v1.24.3/go.mod 
h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
+github.com/aws/aws-sdk-go-v2/service/signin v1.2.0 
h1:3nXpRcFwRCW8n7HgO2QGy0Dc20eQNfBuUemGQhpF8m8=
+github.com/aws/aws-sdk-go-v2/service/signin v1.2.0/go.mod 
h1:LxYujSTLPRlp2vTtcUO/+1ilrew8ytt6SvQyOgejzFQ=
+github.com/aws/aws-sdk-go-v2/service/sso v1.31.3 
h1:ey1XLTYXb9PcLt4535632o5kCGXNXEhNb620Dqwuylo=
+github.com/aws/aws-sdk-go-v2/service/sso v1.31.3/go.mod 
h1:Lk7PlmoTYryQmyBG0EXqj5BcUbj3whXdU2s3yGI3EAc=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6 
h1:yLr03zQE/5Eu5l3QU0Si+xMbLMbSDF2YXsigqXngs6g=
+github.com/aws/aws-sdk-go-v2/service/ssooidc v1.36.6/go.mod 
h1:Q5N6icH+KJZDLh+ESNwzdv6cZ6vLFF/egy3IOxWhmz4=
+github.com/aws/aws-sdk-go-v2/service/sts v1.43.3 
h1:VrIhKRCSK1umelSgB9RghvA9RTUYeQffyAS5ApXehNI=
+github.com/aws/aws-sdk-go-v2/service/sts v1.43.3/go.mod 
h1:r8wkDOuLaaMFqFiYAb8dGY2A3gJCOujMc6CFOVC4Zhc=
+github.com/aws/smithy-go v1.27.1 
h1:4T340VFndXtADGF52gYa1POyL7s9E4Z1OeZ1hCscIw8=
+github.com/aws/smithy-go v1.27.1/go.mod 
h1:YE2RhdIuDbA5E5bTdciG9KrW3+TiEONeUWCqxX9i1Fc=
 github.com/benbjohnson/clock v1.3.5 
h1:VvXlSJBzZpA/zum6Sj74hxwYI2DIxRWuNIoXAzHZz5o=
 github.com/benbjohnson/clock v1.3.5/go.mod 
h1:J11/hYXuz8f4ySSvYwY0FKfm+ezbsZBKZxNJlLklBHA=
 github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod 
h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q=
@@ -874,8 +872,8 @@
 golang.org/x/crypto v0.0.0-20190701094942-4def268fd1a4/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod 
h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI=
 golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod 
h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto=
-golang.org/x/crypto v0.47.0 h1:V6e3FRj+n4dbpw86FJ8Fv7XVOql7TEwpHapKoMJ/GO8=
-golang.org/x/crypto v0.47.0/go.mod 
h1:ff3Y9VzzKbwSSEzWqJsJVBnWmRwRSHt/6Op5n9bQc4A=
+golang.org/x/crypto v0.53.0 h1:QZ4Muo8THX6CizN2vPPd5fBGHyogrdK9fG4wLPFUsto=
+golang.org/x/crypto v0.53.0/go.mod 
h1:DNLU434OwVakk9PzuwV8w62mAJpRJL3vsgcfp4Qnsio=
 golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod 
h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA=
 golang.org/x/exp v0.0.0-20190510132918-efd6b22b2522/go.mod 
h1:ZjyILWgesfNpC6sMxTJOJm9Kp84zZh5NQWvqDGG3Qr8=
@@ -956,8 +954,8 @@
 golang.org/x/net v0.0.0-20210316092652-d523dce5a7f4/go.mod 
h1:RBQZq4jEuRlivfhVLdyRGr576XBO4/greRjx4P4O3yc=
 golang.org/x/net v0.0.0-20210405180319-a5a99cb37ef4/go.mod 
h1:p54w0d4576C0XHj96bSt6lcn1PtDYWL6XObtHCRCNQM=
 golang.org/x/net v0.0.0-20210503060351-7fd8e65b6420/go.mod 
h1:9nx3DQGgdP8bBQD5qxJ1jj9UTztislL4KSBs9R2vV5Y=
-golang.org/x/net v0.49.0 h1:eeHFmOGUTtaaPSGNmjBKpbng9MulQsJURQUAfUwY++o=
-golang.org/x/net v0.49.0/go.mod h1:/ysNB2EvaqvesRkuLAyjI1ycPZlQHM3q01F02UY/MV8=
+golang.org/x/net v0.55.0 h1:bcvxaJn3e1U6InsFWt1JUq1aSjnRxLzT2rtD2KfkDF8=
+golang.org/x/net v0.55.0/go.mod h1:L5U2KuzuOe1lY7Z+aWVIKK6qEeJXnXV9yzGA+WCHJww=
 golang.org/x/oauth2 v0.0.0-20180821212333-d2e6202438be/go.mod 
h1:N/0e6XlmueqKjAGxoOufVs8QHGRruUQn6yWY3a++T0U=
 golang.org/x/oauth2 v0.0.0-20190226205417-e64efc72b421/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
 golang.org/x/oauth2 v0.0.0-20190604053449-0f29369cfe45/go.mod 
h1:gOpvHmFTYa4IltrdGE7lF6nIHvwfUNPOp7c8zoXwtLw=
@@ -985,8 +983,8 @@
 golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
 golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod 
h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
-golang.org/x/sync v0.19.0 h1:vV+1eWNmZ5geRlYjzm2adRgW2/mcpevXNg50YZtPCE4=
-golang.org/x/sync v0.19.0/go.mod 
h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI=
+golang.org/x/sync v0.21.0 h1:HLII4xRRTtCRkxYp4HNFF0Js/Og6q2i++KXbg0gHCwM=
+golang.org/x/sync v0.21.0/go.mod 
h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0=
 golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
 golang.org/x/sys v0.0.0-20180905080454-ebe1bf3edb33/go.mod 
h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
@@ -1049,11 +1047,11 @@
 golang.org/x/sys v0.0.0-20210806184541-e5e7981a1069/go.mod 
h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.1.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
 golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
-golang.org/x/sys v0.40.0 h1:DBZZqJ2Rkml6QMQsZywtnjnnGvHza6BTfYFWY9kjEWQ=
-golang.org/x/sys v0.40.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks=
+golang.org/x/sys v0.46.0 h1:noSf2Fq6F8DBgS+LysIkx7rIExoNHJsxOAtPp4rthXw=
+golang.org/x/sys v0.46.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw=
 golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod 
h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
-golang.org/x/term v0.39.0 h1:RclSuaJf32jOqZz74CkPA9qFuVTX7vhLlpfj/IGWlqY=
-golang.org/x/term v0.39.0/go.mod 
h1:yxzUCTP/U+FzoxfdKmLaA0RV1WgE0VY7hXBwKtY/4ww=
+golang.org/x/term v0.44.0 h1:0rLvDRCtNj0gZkyIXhCyOb2OAzEhLVqc4B+hrsBhrmc=
+golang.org/x/term v0.44.0/go.mod 
h1:7ze4MdzUzLXpSAoFP1H0bOI9aXDqveSvatT5vKcFh2Y=
 golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
 golang.org/x/text v0.3.1-0.20180807135948-17ff2d5776d2/go.mod 
h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
@@ -1062,8 +1060,8 @@
 golang.org/x/text v0.3.4/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.5/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
 golang.org/x/text v0.3.6/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
-golang.org/x/text v0.33.0 h1:B3njUFyqtHDUI5jMn1YIr5B0IE2U0qck04r6d4KPAxE=
-golang.org/x/text v0.33.0/go.mod 
h1:LuMebE6+rBincTi9+xWTY8TztLzKHc/9C1uBCG27+q8=
+golang.org/x/text v0.38.0 h1:sXmwo9DwP3OK9EZ7PqAdaooSGozfl/3a6/xJcbzPRhE=
+golang.org/x/text v0.38.0/go.mod 
h1:YXZt3QhHUKYT53r2lLKFIVi6Ao1jdzrTR/KQ09qyxF4=
 golang.org/x/time v0.0.0-20180412165947-fbb02b2291d2/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20181108054448-85acf8d2951c/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
 golang.org/x/time v0.0.0-20190308202827-9d24e82272b4/go.mod 
h1:tRJNPiyCQ0inRvYxbN9jk5I+vvW/OXSQhTDSoE431IQ=
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/registry/registry_test.go 
new/gitlab-container-registry-4.40.2/registry/registry_test.go
--- old/gitlab-container-registry-4.40.1/registry/registry_test.go      
2026-05-22 21:07:54.000000000 +0200
+++ new/gitlab-container-registry-4.40.2/registry/registry_test.go      
2026-06-24 16:19:57.000000000 +0200
@@ -133,9 +133,10 @@
 }
 
 func TestGracefulShutdown_HTTPDrainTimeout(t *testing.T) {
-       if strings.HasPrefix(runtime.Version(), "go1.25") {
+       goVersion := runtime.Version()
+       if strings.HasPrefix(goVersion, "go1.25") || 
strings.HasPrefix(goVersion, "go1.26") {
                // TODO(prozlach): 
https://gitlab.com/gitlab-org/container-registry/-/issues/1696
-               t.Skip("Skipping test on Go 1.25 - due to upstream shutdown 
handling issue: https://github.com/golang/go/issues/75591";)
+               t.Skip("Skipping test on Go 1.25+ - due to upstream shutdown 
handling issue: https://github.com/golang/go/issues/75591";)
        }
 
        registry, err := setupRegistry()
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/requestcontrol.go
 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/requestcontrol.go
--- 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/requestcontrol.go
    2026-05-22 21:07:54.000000000 +0200
+++ 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/requestcontrol.go
    2026-06-24 16:19:57.000000000 +0200
@@ -3,11 +3,12 @@
 import (
        "context"
        "fmt"
+       "math"
+       "math/rand/v2"
        "time"
 
        "github.com/aws/aws-sdk-go-v2/aws"
        "github.com/aws/aws-sdk-go-v2/aws/retry"
-       "github.com/cenkalti/backoff/v4"
        "github.com/docker/distribution/registry/storage/driver/s3-aws/common"
        "github.com/docker/distribution/registry/storage/internal/metrics"
        log "github.com/sirupsen/logrus"
@@ -16,29 +17,17 @@
 
 var _ retry.BackoffDelayer = (*customDelayer)(nil)
 
-type customDelayer struct {
-       backoff backoff.BackOff
-}
+type customDelayer struct{}
 
 // newCustomDelayer replaces the default delayer provided by aws-sdk-go-v2 with
-// a more flexible `cenkalti/backoff/v4` one which also makes s3_v2 driver
-// behave in a similar way to its predecessor `s3` driver.
+// a more flexible one which also makes s3_v2 driver behave in a similar way to
+// its predecessor `s3` driver.
 func newCustomDelayer() retry.BackoffDelayer {
-       b := backoff.NewExponentialBackOff()
-       b.InitialInterval = common.DefaultInitialInterval
-       b.RandomizationFactor = common.DefaultRandomizationFactor
-       b.Multiplier = common.DefaultMultiplier
-       b.MaxInterval = common.DefaultMaxInterval
-       b.MaxElapsedTime = common.DefaultMaxElapsedTime
-
-       // NOTE(prozlach): We do not specify the max attempts for the backoff 
here,
-       // as it is handled by aws-sdk-go-v2 higher in the stack.
-
-       return &customDelayer{backoff: b}
+       return &customDelayer{}
 }
 
-func (cd *customDelayer) BackoffDelay(attempt int, sourceErr error) 
(time.Duration, error) {
-       delay := cd.backoff.NextBackOff()
+func (*customDelayer) BackoffDelay(attempt int, sourceErr error) 
(time.Duration, error) {
+       delay := delayForAttempt(attempt)
        log.WithFields(
                log.Fields{
                        "attempt": attempt,
@@ -50,6 +39,38 @@
        return delay, nil
 }
 
+// delayForAttempt returns the randomized exponential backoff for a retry
+// attempt. aws-sdk-go-v2 numbers attempts from 1 (the delay before the first
+// retry), so attempt 1 yields ~InitialInterval, attempt 2 ~InitialInterval*
+// Multiplier, and so on, each capped at MaxInterval and jittered by
+// ±RandomizationFactor. It is stateless: a single delayer is safe to share
+// across concurrent requests, and every request restarts the curve at attempt 
1
+// instead of inheriting an interval another request has grown.
+//
+// NOTE(prozlach): This replaces an earlier design that shared a single, 
stateful
+// backoff.ExponentialBackOff across every request. That object mutates an
+// internal currentInterval on each call and is not safe for concurrent use,
+// which both raced under concurrent requests and never reset (so the interval
+// only grew and stuck at the 60s cap). The parameters are the same defaults 
the
+// driver took from cenkalti/backoff, so retry timing is unchanged; the cap is
+// reproduced exactly because cenkalti only ever clamps to MaxInterval once the
+// raw exponential value would already exceed it.
+func delayForAttempt(attempt int) time.Duration {
+       exponent := max(attempt-1, 0)
+
+       // Exponential growth, capped at the maximum interval. A huge attempt 
makes
+       // math.Pow overflow to +Inf, which the comparison clamps to 
MaxInterval.
+       interval := float64(common.DefaultInitialInterval) * 
math.Pow(common.DefaultMultiplier, float64(exponent))
+       if interval > float64(common.DefaultMaxInterval) {
+               interval = float64(common.DefaultMaxInterval)
+       }
+
+       // Jitter into [interval*(1-rf), interval*(1+rf)).
+       delta := common.DefaultRandomizationFactor * interval
+       //nolint:gosec // jitter for retry backoff; cryptographic randomness is 
unnecessary
+       return time.Duration(interval - delta + rand.Float64()*(2*delta))
+}
+
 var _ aws.Retryer = (*customRetryer)(nil)
 
 type customRetryer struct {
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/requestcontrol_test.go
 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/requestcontrol_test.go
--- 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/requestcontrol_test.go
       1970-01-01 01:00:00.000000000 +0100
+++ 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/requestcontrol_test.go
       2026-06-24 16:19:57.000000000 +0200
@@ -0,0 +1,119 @@
+package v2
+
+import (
+       "sync"
+       "testing"
+       "time"
+
+       "github.com/docker/distribution/registry/storage/driver/s3-aws/common"
+       "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
+)
+
+// backoffWindow returns the [lower, upper) bounds delayForAttempt can return 
for
+// a given (un-jittered) interval: [interval*(1-rf), interval*(1+rf)).
+func backoffWindow(interval time.Duration) (lower, upper time.Duration) {
+       lower = time.Duration(float64(interval) * (1 - 
common.DefaultRandomizationFactor))
+       upper = time.Duration(float64(interval) * (1 + 
common.DefaultRandomizationFactor))
+
+       return lower, upper
+}
+
+// TestDelayForAttemptBounds checks that the delay for a given attempt falls
+// within the expected jitter window: attempt 1 (and the non-positive guard)
+// start from InitialInterval, the interval grows by the multiplier, and a high
+// attempt saturates at MaxInterval.
+func TestDelayForAttemptBounds(t *testing.T) {
+       t.Parallel()
+
+       tests := []struct {
+               name     string
+               attempt  int
+               interval time.Duration
+       }{
+               {
+                       name:     "non-positive attempt clamps to the 
InitialInterval window",
+                       attempt:  0,
+                       interval: common.DefaultInitialInterval,
+               },
+               {
+                       name:     "first retry starts in the InitialInterval 
window",
+                       attempt:  1,
+                       interval: common.DefaultInitialInterval,
+               },
+               {
+                       name:     "second retry grows by the multiplier",
+                       attempt:  2,
+                       interval: 
time.Duration(float64(common.DefaultInitialInterval) * 
common.DefaultMultiplier),
+               },
+               {
+                       name:     "high attempt saturates at the MaxInterval 
window",
+                       attempt:  1000,
+                       interval: common.DefaultMaxInterval,
+               },
+       }
+
+       for _, tc := range tests {
+               t.Run(tc.name, func(t *testing.T) {
+                       t.Parallel()
+
+                       lower, upper := backoffWindow(tc.interval)
+
+                       delay := delayForAttempt(tc.attempt)
+
+                       assert.Positive(t, delay)
+                       assert.GreaterOrEqual(t, delay, lower)
+                       assert.Less(t, delay, upper)
+               })
+       }
+}
+
+// TestDelayForAttemptDoesNotCreep hammers attempt 1 many times. Every result
+// must stay inside the attempt-1 window: a shared, stateful backoff would
+// ratchet the interval upward call after call, which is the bug this change
+// fixes.
+func TestDelayForAttemptDoesNotCreep(t *testing.T) {
+       t.Parallel()
+
+       lower, upper := backoffWindow(common.DefaultInitialInterval)
+
+       minDelay, maxDelay := upper, time.Duration(0)
+
+       for range 1000 {
+               delay := delayForAttempt(1)
+               require.GreaterOrEqual(t, delay, lower)
+               require.Less(t, delay, upper)
+
+               minDelay = min(minDelay, delay)
+               maxDelay = max(maxDelay, delay)
+       }
+
+       // The jitter window is symmetric around the interval, so the per-sample
+       // bound checks above would still pass if the jitter collapsed to one 
half
+       // (a dropped factor or a sign error). Across 1000 draws the observed 
minimum
+       // must fall in the lower half and the maximum in the upper half, which 
pins
+       // the jitter to the full window.
+       assert.Less(t, minDelay, common.DefaultInitialInterval, "minimum sample 
should fall in the lower half of the window")
+       assert.Greater(t, maxDelay, common.DefaultInitialInterval, "maximum 
sample should fall in the upper half of the window")
+}
+
+// TestDelayForAttemptConcurrentUseIsRaceFree exercises the delay computation
+// from many goroutines. Run with -race, it guards against reintroducing shared
+// mutable state in the backoff curve.
+func TestDelayForAttemptConcurrentUseIsRaceFree(t *testing.T) {
+       t.Parallel()
+
+       var wg sync.WaitGroup
+
+       for i := range 50 {
+               attempt := i%5 + 1
+
+               wg.Go(func() {
+                       for range 100 {
+                               _ = delayForAttempt(attempt)
+                       }
+               })
+       }
+
+       wg.Wait()
+}
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/s3.go 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/s3.go
--- 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/s3.go    
    2026-05-22 21:07:54.000000000 +0200
+++ 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/s3.go    
    2026-06-24 16:19:57.000000000 +0200
@@ -14,7 +14,9 @@
 import (
        "bytes"
        "context"
+       "crypto/md5" // nolint: gosec,revive // ok for content verification
        "crypto/tls"
+       "encoding/base64"
        "errors"
        "fmt"
        "io"
@@ -36,7 +38,9 @@
        "github.com/aws/aws-sdk-go-v2/service/s3/types"
        "github.com/aws/smithy-go"
        "github.com/aws/smithy-go/logging"
+       smithymiddleware "github.com/aws/smithy-go/middleware"
        "github.com/aws/smithy-go/ptr"
+       smithyhttp "github.com/aws/smithy-go/transport/http"
        dcontext "github.com/docker/distribution/context"
        dlog "github.com/docker/distribution/log"
        storagedriver "github.com/docker/distribution/registry/storage/driver"
@@ -197,6 +201,21 @@
                
middleware.AddUserAgentKey("docker-distribution/"+version.Version+"/"+runtime.Version()),
        )
 
+       // When the operator opts out of request checksums entirely
+       // (checksum_disabled=true), strip SDK v2's request-side checksum 
middleware
+       // from every operation's stack. See removeRequestChecksumMiddleware 
for the
+       // full rationale.
+       if params.ChecksumDisabled {
+               dlog.GetLogger().WithFields(log.Fields{
+                       "component": "registry.storage.s3_v2.internal",
+               }).Info(
+                       "request checksums disabled: stripping SDK v2 
request-side checksums " +
+                               "and injecting Content-MD5 on DeleteObjects for 
strict S3-compatible backends",
+               )
+               cfg.APIOptions = append(cfg.APIOptions, 
removeRequestChecksumMiddleware)
+               cfg.APIOptions = append(cfg.APIOptions, 
addContentMD5ForDeleteObjects)
+       }
+
        if params.RegionEndpoint != "" {
                cfg.BaseEndpoint = ptr.String(params.RegionEndpoint)
        }
@@ -215,6 +234,115 @@
        return client, nil
 }
 
+// removeRequestChecksumMiddleware is an APIOption that removes SDK v2's
+// request-side checksum middleware from every S3 operation's middleware stack.
+// It is applied only when the operator sets checksum_disabled=true.
+//
+// Background: aws.Config.RequestChecksumCalculation=WhenRequired suppresses
+// checksums only for operations whose smithy model does not set
+// httpChecksumRequired. Operations that DO set it (notably DeleteObjects) are
+// code-generated to force a CRC32 request checksum regardless of the config
+// flag — see service/internal/checksum/middleware_setup_context.go. 
DeleteObjects
+// is EnableTrailingChecksum=false, so the SDK sends this checksum as the
+// x-amz-checksum-crc32 request header, not a trailer. Some S3-compatible 
backends
+// reject any x-amz-checksum-* request header with HTTP 400, which breaks the
+// multipart-upload cleanup path used by blob uploads.
+//
+// Up to three middleware are removed:
+//   - AWSChecksum:SetupInputContext           (Initialize) — selects the 
algorithm
+//   - AWSChecksum:ComputeInputPayloadChecksum (Finalize)   — writes header 
form
+//   - addInputChecksumTrailer                 (Finalize)   — writes trailer 
form
+//     (installed only when EnableTrailingChecksum=true, so never for 
DeleteObjects;
+//     removed here purely as defense in depth)
+//
+// Removing the Initialize-stage middleware is what actually prevents the
+// request-side checksum: AWSChecksum:SetupInputContext selects the algorithm,
+// and the Finalize-stage writers no-op when no algorithm is in context (see
+// service/internal/checksum/middleware_compute_input_checksum.go —
+// getInputAlgorithm returns !ok and the finalizer passes the request through
+// untouched). Any finalizers are stripped too as defense in depth.
+//
+// This runs as an APIOption, so it executes once per operation, against that
+// operation's own stack. The SDK only installs the request-checksum middleware
+// on operations whose smithy model requires it (RequireChecksum / a checksum
+// input member) — DeleteObjects, PutObject, UploadPart, … — generated inline
+// per operation (see addInputChecksumMiddleware in the s3 client). Read
+// operations such as GetObject, HeadObject and ListObjectsV2 never carry it, 
so
+// Remove returning "not found" on their stacks is normal and MUST be 
tolerated;
+// failing there would break every read.
+//
+// The error is therefore enforced only on the DeleteObjects stack. 
DeleteObjects
+// is RequireChecksum=true, so the SDK always installs 
AWSChecksum:SetupInputContext
+// on it, and it is the operation strict S3-compatible backends (e.g. QingStor)
+// reject when the CRC32 header is present — the exact path this driver also
+// re-adds Content-MD5 to (see addContentMD5ForDeleteObjects). If that ID is
+// absent on the DeleteObjects stack, a future SDK rename or refactor has moved
+// the middleware and the request-side checksum would silently return and break
+// those backends with HTTP 400 again; we surface that as an error so an SDK 
bump
+// fails the DeleteObjects path loudly at runtime instead of regressing 
silently
+// on master. (The unit tests pin this guard against a synthetic stack with the
+// literal ID; they assert the contract but, on their own, would not catch an
+// upstream rename — only a real DeleteObjects call exercises the live stack.)
+// Everything else stays best-effort. Response-side checksum validation
+// middleware is untouched.
+func removeRequestChecksumMiddleware(stack *smithymiddleware.Stack) error {
+       _, errSetup := stack.Initialize.Remove("AWSChecksum:SetupInputContext")
+       _, _ = stack.Finalize.Remove("AWSChecksum:ComputeInputPayloadChecksum")
+       _, _ = stack.Finalize.Remove("addInputChecksumTrailer")
+
+       if stack.ID() == "DeleteObjects" && errSetup != nil {
+               return fmt.Errorf("s3-v2: AWSChecksum:SetupInputContext not 
found on DeleteObjects stack (SDK checksum layout changed?): %w", errSetup)
+       }
+       return nil
+}
+
+// addContentMD5ForDeleteObjects injects an SDK-v1-style Content-MD5 header on
+// DeleteObjects requests when removeRequestChecksumMiddleware has stripped the
+// SDK v2 request-checksum middleware. Some S3-compatible backends (notably
+// QingStor) strictly enforce the AWS S3 specification, which requires the
+// DeleteObjects request to carry a Content-MD5 (or an x-amz-checksum-*
+// header); a request with neither is rejected with HTTP 400
+// InvalidRequest. The middleware runs at the end of the Build phase so the
+// header is in place before SigV4 signing in Finalize includes it in
+// SignedHeaders.
+//
+// Only DeleteObjects is targeted to avoid an extra body scan on hot paths
+// like UploadPart / PutObject, which the AWS spec does not require to carry
+// Content-MD5. The op-name check also means the middleware no-ops on the
+// presigning client stack (which does not signal DeleteObjects).
+func addContentMD5ForDeleteObjects(stack *smithymiddleware.Stack) error {
+       return stack.Build.Add(
+               
smithymiddleware.BuildMiddlewareFunc("ContentMD5ForDeleteObjects",
+                       func(ctx context.Context, in 
smithymiddleware.BuildInput, next smithymiddleware.BuildHandler) 
(smithymiddleware.BuildOutput, smithymiddleware.Metadata, error) {
+                               if smithymiddleware.GetOperationName(ctx) != 
"DeleteObjects" {
+                                       return next.HandleBuild(ctx, in)
+                               }
+                               req, ok := in.Request.(*smithyhttp.Request)
+                               if !ok {
+                                       return next.HandleBuild(ctx, in)
+                               }
+                               stream := req.GetStream()
+                               if stream == nil {
+                                       return next.HandleBuild(ctx, in)
+                               }
+                               body, err := io.ReadAll(stream)
+                               if err != nil {
+                                       return smithymiddleware.BuildOutput{}, 
smithymiddleware.Metadata{}, fmt.Errorf("DeleteObjects content-md5: reading 
body: %w", err)
+                               }
+                               sum := md5.Sum(body) // nolint: gosec // ok for 
content verification
+                               req.Header.Set("Content-MD5", 
base64.StdEncoding.EncodeToString(sum[:]))
+                               newReq, err := 
req.SetStream(bytes.NewReader(body))
+                               if err != nil {
+                                       return smithymiddleware.BuildOutput{}, 
smithymiddleware.Metadata{}, fmt.Errorf("DeleteObjects content-md5: restoring 
body: %w", err)
+                               }
+                               newReq.ContentLength = int64(len(body))
+                               in.Request = newReq
+                               return next.HandleBuild(ctx, in)
+                       }),
+               smithymiddleware.After,
+       )
+}
+
 func New(params *common.DriverParameters) (storagedriver.StorageDriver, error) 
{
        // TODO Currently multipart uploads have no timestamps, so this would 
be unwise
        // if you initiated a new s3driver while another one is running on the 
same bucket.
@@ -440,6 +568,8 @@
        return d.newWriter(key, *mpUpload.UploadId, allParts), nil
 }
 
+var errUnusableHeadObjectResponse = errors.New("HeadObject returned unusable 
response")
+
 func (d *driver) statHead(ctx context.Context, path string) 
(*storagedriver.FileInfoFields, error) {
        // NOTE(prozlach): This is to cover for the cases when the 
rootDirectory of
        // the driver is either "" or "/".
@@ -458,6 +588,13 @@
        if err != nil {
                return nil, err
        }
+
+       // Some S3 implementations return an empty response for certain keys.
+       // The sentinal error signals the caller to retry with a ListBucket.
+       if resp.ContentLength == nil && resp.LastModified == nil {
+               return nil, errUnusableHeadObjectResponse
+       }
+
        return &storagedriver.FileInfoFields{
                Path:    path,
                IsDir:   false,
@@ -565,7 +702,10 @@
                // error if querying a key which doesn't exist or a key which 
has
                // nested keys and Forbidden if IAM/ACL permissions do not 
allow Head
                // but allow List.
-               if errors.As(err, new(smithy.APIError)) {
+               //
+               // If the response is unusable (due to bugs in alternative S3
+               // implementations), we also fail over to ListObjects.
+               if errors.As(err, new(smithy.APIError)) || errors.Is(err, 
errUnusableHeadObjectResponse) {
                        fi, err := d.statList(ctx, path)
                        if err != nil {
                                return nil, parseError(path, err)
diff -urN '--exclude=CVS' '--exclude=.cvsignore' '--exclude=.svn' 
'--exclude=.svnignore' 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/s3_test.go
 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/s3_test.go
--- 
old/gitlab-container-registry-4.40.1/registry/storage/driver/s3-aws/v2/s3_test.go
   1970-01-01 01:00:00.000000000 +0100
+++ 
new/gitlab-container-registry-4.40.2/registry/storage/driver/s3-aws/v2/s3_test.go
   2026-06-24 16:19:57.000000000 +0200
@@ -0,0 +1,192 @@
+package v2
+
+import (
+       "bytes"
+       "context"
+       "crypto/md5" // nolint: gosec,revive // ok for content verification
+       "encoding/base64"
+       "io"
+       "testing"
+
+       smithymiddleware "github.com/aws/smithy-go/middleware"
+       smithyhttp "github.com/aws/smithy-go/transport/http"
+       "github.com/stretchr/testify/assert"
+       "github.com/stretchr/testify/require"
+)
+
+// TestRemoveRequestChecksumMiddlewareRemovesAllOnDeleteObjects verifies that 
on
+// the DeleteObjects stack — the operation that carries the request-checksum
+// middleware and that strict S3-compatible backends reject — all present
+// request-side checksum middleware are removed by their published IDs while
+// unrelated middleware are left untouched.
+func TestRemoveRequestChecksumMiddlewareRemovesAllOnDeleteObjects(t 
*testing.T) {
+       stack := smithymiddleware.NewStack("DeleteObjects", func() any { return 
nil })
+
+       addInitializeStub(t, stack, "AWSChecksum:SetupInputContext")
+       addInitializeStub(t, stack, "Unrelated:OtherInitialize")
+       addFinalizeStub(t, stack, "AWSChecksum:ComputeInputPayloadChecksum")
+       addFinalizeStub(t, stack, "addInputChecksumTrailer")
+       addFinalizeStub(t, stack, "Unrelated:OtherFinalize")
+
+       err := removeRequestChecksumMiddleware(stack)
+       require.NoError(t, err)
+
+       _, ok := stack.Initialize.Get("AWSChecksum:SetupInputContext")
+       assert.False(t, ok, "SetupInputContext middleware should have been 
removed")
+       _, ok = stack.Finalize.Get("AWSChecksum:ComputeInputPayloadChecksum")
+       assert.False(t, ok, "ComputeInputPayloadChecksum middleware should have 
been removed")
+       _, ok = stack.Finalize.Get("addInputChecksumTrailer")
+       assert.False(t, ok, "addInputChecksumTrailer middleware should have 
been removed")
+
+       _, ok = stack.Initialize.Get("Unrelated:OtherInitialize")
+       assert.True(t, ok, "unrelated initialize middleware should remain")
+       _, ok = stack.Finalize.Get("Unrelated:OtherFinalize")
+       assert.True(t, ok, "unrelated finalize middleware should remain")
+}
+
+// TestRemoveRequestChecksumMiddlewareErrorsWhenSetupAbsentOnDeleteObjects
+// verifies that removal fails loudly when AWSChecksum:SetupInputContext is
+// missing from the DeleteObjects stack. DeleteObjects is RequireChecksum=true,
+// so the SDK always installs that middleware; its ID disappearing means a 
future
+// SDK has renamed or refactored the request-checksum path, so the checksum 
would
+// silently return and break strict S3-compatible backends again. Surfacing an
+// error makes an SDK bump fail the DeleteObjects path loudly at runtime 
instead
+// of regressing silently on master. Note this test pins the guard's contract
+// against a synthetic stack with the literal ID; a real upstream rename 
surfaces
+// only on a live DeleteObjects call, not here.
+func TestRemoveRequestChecksumMiddlewareErrorsWhenSetupAbsentOnDeleteObjects(t 
*testing.T) {
+       stack := smithymiddleware.NewStack("DeleteObjects", func() any { return 
nil })
+       addInitializeStub(t, stack, "Unrelated:OnlyInitialize")
+       addFinalizeStub(t, stack, "AWSChecksum:ComputeInputPayloadChecksum")
+
+       err := removeRequestChecksumMiddleware(stack)
+       require.Error(t, err)
+       assert.Contains(t, err.Error(), "AWSChecksum:SetupInputContext")
+       assert.Contains(t, err.Error(), "DeleteObjects")
+
+       _, ok := stack.Initialize.Get("Unrelated:OnlyInitialize")
+       assert.True(t, ok, "unrelated initialize middleware should remain")
+}
+
+// TestRemoveRequestChecksumMiddlewareToleratesAbsentOnReadOps verifies that 
on a
+// read operation's stack (e.g. GetObject) — which the SDK never equips with 
the
+// request-checksum middleware — a missing AWSChecksum:SetupInputContext is NOT
+// an error. This APIOption runs once per operation against that operation's 
own
+// stack, so failing on read ops would break every read. This is the regression
+// guard for treating absence as fatal everywhere.
+func TestRemoveRequestChecksumMiddlewareToleratesAbsentOnReadOps(t *testing.T) 
{
+       stack := smithymiddleware.NewStack("GetObject", func() any { return nil 
})
+       addInitializeStub(t, stack, "Unrelated:OnlyInitialize")
+       addFinalizeStub(t, stack, "Unrelated:OnlyFinalize")
+
+       err := removeRequestChecksumMiddleware(stack)
+       require.NoError(t, err)
+
+       _, ok := stack.Initialize.Get("Unrelated:OnlyInitialize")
+       assert.True(t, ok, "unrelated initialize middleware should remain")
+       _, ok = stack.Finalize.Get("Unrelated:OnlyFinalize")
+       assert.True(t, ok, "unrelated finalize middleware should remain")
+}
+
+// TestAddContentMD5ForDeleteObjects_AddsHeader verifies that for a 
DeleteObjects
+// operation with a non-empty body, the middleware sets Content-MD5 to the
+// base64-encoded MD5 of the body, restores the stream so downstream middleware
+// can read it again, and sets ContentLength to the body's byte length.
+func TestAddContentMD5ForDeleteObjects_AddsHeader(t *testing.T) {
+       body := []byte(`<?xml version="1.0" 
encoding="UTF-8"?><Delete><Object><Key>a</Key></Object></Delete>`)
+       expectedMD5 := md5.Sum(body)
+       expectedHeader := base64.StdEncoding.EncodeToString(expectedMD5[:])
+
+       req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
+       req, err := req.SetStream(bytes.NewReader(body))
+       require.NoError(t, err)
+       req.ContentLength = -1
+
+       captured := invokeContentMD5Middleware(t, "DeleteObjects", req)
+
+       require.NotNil(t, captured, "next handler must have been invoked")
+       assert.Equal(t, expectedHeader, captured.Header.Get("Content-MD5"))
+       assert.Equal(t, int64(len(body)), captured.ContentLength)
+
+       roundtrip, err := io.ReadAll(captured.GetStream())
+       require.NoError(t, err)
+       assert.Equal(t, body, roundtrip, "body must be readable end-to-end 
after the middleware runs")
+}
+
+// TestAddContentMD5ForDeleteObjects_SkipsOtherOperations verifies that
+// non-DeleteObjects operations pass through untouched: no Content-MD5 header 
is
+// added and the stream is not consumed.
+func TestAddContentMD5ForDeleteObjects_SkipsOtherOperations(t *testing.T) {
+       body := []byte("not a delete-objects body")
+       req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
+       req, err := req.SetStream(bytes.NewReader(body))
+       require.NoError(t, err)
+
+       captured := invokeContentMD5Middleware(t, "PutObject", req)
+
+       require.NotNil(t, captured)
+       assert.Empty(t, captured.Header.Get("Content-MD5"), "Content-MD5 must 
not be set for non-DeleteObjects ops")
+
+       roundtrip, err := io.ReadAll(captured.GetStream())
+       require.NoError(t, err)
+       assert.Equal(t, body, roundtrip, "stream must not be consumed for 
non-DeleteObjects ops")
+}
+
+// TestAddContentMD5ForDeleteObjects_SkipsWhenNoStream verifies that the
+// middleware safely no-ops on a DeleteObjects request with no body (defensive
+// case — the SDK always sends a body, but the middleware should not panic if
+// upstream behavior changes).
+func TestAddContentMD5ForDeleteObjects_SkipsWhenNoStream(t *testing.T) {
+       req := smithyhttp.NewStackRequest().(*smithyhttp.Request)
+
+       captured := invokeContentMD5Middleware(t, "DeleteObjects", req)
+
+       require.NotNil(t, captured)
+       assert.Empty(t, captured.Header.Get("Content-MD5"))
+       assert.Nil(t, captured.GetStream())
+}
+
+// invokeContentMD5Middleware registers addContentMD5ForDeleteObjects on a 
fresh
+// stack, then drives only its Build phase with the supplied operation name and
+// request. It returns the captured request: the in.Request value seen by the
+// next handler, i.e. what the middleware passed downstream.
+func invokeContentMD5Middleware(t *testing.T, opName string, req 
*smithyhttp.Request) *smithyhttp.Request {
+       t.Helper()
+
+       stack := smithymiddleware.NewStack("test", smithyhttp.NewStackRequest)
+       require.NoError(t, addContentMD5ForDeleteObjects(stack))
+
+       m, ok := stack.Build.Get("ContentMD5ForDeleteObjects")
+       require.True(t, ok, "middleware must be registered on the Build step")
+
+       var captured *smithyhttp.Request
+       next := smithymiddleware.BuildHandlerFunc(func(_ context.Context, in 
smithymiddleware.BuildInput) (smithymiddleware.BuildOutput, 
smithymiddleware.Metadata, error) {
+               captured = in.Request.(*smithyhttp.Request)
+               return smithymiddleware.BuildOutput{}, 
smithymiddleware.Metadata{}, nil
+       })
+
+       ctx := smithymiddleware.WithOperationName(context.Background(), opName)
+       _, _, err := m.HandleBuild(ctx, smithymiddleware.BuildInput{Request: 
req}, next)
+       require.NoError(t, err)
+       return captured
+}
+
+func addInitializeStub(t *testing.T, stack *smithymiddleware.Stack, id string) 
{
+       t.Helper()
+       m := smithymiddleware.InitializeMiddlewareFunc(id, func(
+               ctx context.Context, in smithymiddleware.InitializeInput, next 
smithymiddleware.InitializeHandler,
+       ) (smithymiddleware.InitializeOutput, smithymiddleware.Metadata, error) 
{
+               return next.HandleInitialize(ctx, in)
+       })
+       require.NoError(t, stack.Initialize.Add(m, smithymiddleware.After))
+}
+
+func addFinalizeStub(t *testing.T, stack *smithymiddleware.Stack, id string) {
+       t.Helper()
+       m := smithymiddleware.FinalizeMiddlewareFunc(id, func(
+               ctx context.Context, in smithymiddleware.FinalizeInput, next 
smithymiddleware.FinalizeHandler,
+       ) (smithymiddleware.FinalizeOutput, smithymiddleware.Metadata, error) {
+               return next.HandleFinalize(ctx, in)
+       })
+       require.NoError(t, stack.Finalize.Add(m, smithymiddleware.After))
+}

++++++ gitlab-container-registry.obsinfo ++++++
--- /var/tmp/diff_new_pack.iKZUWF/_old  2026-06-28 21:08:47.274631652 +0200
+++ /var/tmp/diff_new_pack.iKZUWF/_new  2026-06-28 21:08:47.278631788 +0200
@@ -1,5 +1,5 @@
 name: gitlab-container-registry
-version: 4.40.1
-mtime: 1779476874
-commit: b4c21f9e3907860dbb70cb2a3d6ee438077032cb
+version: 4.40.2
+mtime: 1782310797
+commit: 14eed6857a7cd4b1e053502dce1aa6f3f74f4be1
 

++++++ vendor.tar.gz ++++++
/work/SRC/openSUSE:Factory/gitlab-container-registry/vendor.tar.gz 
/work/SRC/openSUSE:Factory/.gitlab-container-registry.new.11887/vendor.tar.gz 
differ: char 19, line 1

Reply via email to