Commit Graph
689 Commits
Author SHA1 Message Date
chrislu 04b1961a2b more comments 2025-11-05 23:05:55 -08:00
chrislu eec179ef02 fmt 2025-11-05 22:14:31 -08:00
chrislu 50d81319a9 Merge branch 'master' into also-delete-parent-directory-if-empty 2025-11-05 22:13:01 -08:00
Konstantin Lebedevandchrislu 084b377f87 do delete expired entries on s3 list request (#7426)
* do delete expired entries on s3 list request
https://github.com/seaweedfs/seaweedfs/issues/6837

* disable delete expires s3 entry in filer

* pass opt allowDeleteObjectsByTTL to all servers

* delete on get and head

* add lifecycle expiration s3 tests

* fix opt allowDeleteObjectsByTTL for server

* fix test lifecycle expiration

* fix IsExpired

* fix locationPrefix for updateEntriesTTL

* fix s3tests

* resolv  coderabbitai

* GetS3ExpireTime on filer

* go mod

* clear TtlSeconds for volume

* move s3 delete expired entry to filer

* filer delete meta and data

* del unusing func removeExpiredObject

* test s3 put

* test s3 put multipart

* allowDeleteObjectsByTTL by default

* fix pipline tests

* rm dublicate SeaweedFSExpiresS3

* revert expiration tests

* fix updateTTL

* rm log

* resolv comment

* fix delete version object

* fix S3Versioning

* fix delete on FindEntry

* fix delete chunks

* fix sqlite not support concurrent writes/reads

* move deletion out of listing transaction; delete entries and empty folders

* Revert "fix sqlite not support concurrent writes/reads"

This reverts commit 5d5da14e0e.

* clearer handling on recursive empty directory deletion

* handle listing errors

* strut copying

* reuse code to delete empty folders

* use iterative approach with a queue to avoid recursive WithFilerClient calls

* stop a gRPC stream from the client-side callback is to return a specific error, e.g., io.EOF

* still issue UpdateEntry when the flag must be added

* errors join

* join path

* cleaner

* add context, sort directories by depth (deepest first) to avoid redundant checks

* batched operation, refactoring

* prevent deleting bucket

* constant

* reuse code

* more logging

* refactoring

* s3 TTL time

* Safety check

---------

Co-authored-by: chrislu <chris.lu@gmail.com>
2025-11-05 22:05:54 -08:00
chrislu a8a4bc06e8 optionally delete empty parent directories 2025-11-05 21:29:06 -08:00
chrislu 06e9ca70a6 refactoring 2025-11-05 16:03:07 -08:00
chrislu c125060b51 more logging 2025-11-05 15:59:59 -08:00
chrislu 7484fcb137 constant 2025-11-05 14:43:18 -08:00
chrislu 3cff8846c2 batched operation, refactoring 2025-11-05 14:32:20 -08:00
chrislu ec8ca216a5 add context, sort directories by depth (deepest first) to avoid redundant checks 2025-11-05 14:17:38 -08:00
chrislu d8bef68752 join path 2025-11-05 13:50:20 -08:00
chrislu c087a47d38 errors join 2025-11-05 13:50:08 -08:00
chrislu 835e5696d9 still issue UpdateEntry when the flag must be added 2025-11-05 13:49:48 -08:00
chrislu 92525d78ce stop a gRPC stream from the client-side callback is to return a specific error, e.g., io.EOF 2025-11-05 13:38:40 -08:00
chrislu 629b520edf use iterative approach with a queue to avoid recursive WithFilerClient calls 2025-11-05 13:37:40 -08:00
chrislu 0cad84ee36 reuse code to delete empty folders 2025-11-05 13:27:47 -08:00
chrislu 636540aba2 handle listing errors 2025-11-05 13:10:58 -08:00
Konstantin Lebedev cf75abb408 resolv comment 2025-11-05 18:39:21 +05:00
Konstantin Lebedev 360c2387db rm log 2025-11-05 18:16:04 +05:00
Konstantin Lebedev 20fb1ead77 fix updateTTL 2025-11-05 18:14:55 +05:00
Konstantin Lebedev c18004f9f6 rm dublicate SeaweedFSExpiresS3 2025-11-05 14:16:07 +05:00
Konstantin Lebedev 558f4be73b allowDeleteObjectsByTTL by default 2025-11-05 14:06:02 +05:00
Konstantin Lebedev bbd7546cea test s3 put multipart 2025-11-04 20:26:07 +05:00
Konstantin Lebedev 1abea0d9b5 test s3 put 2025-11-04 20:03:36 +05:00
Konstantin Lebedev e8e080b4fa del unusing func removeExpiredObject 2025-11-04 15:29:42 +05:00
Konstantin Lebedev 8d768885c5 move s3 delete expired entry to filer 2025-11-04 13:17:36 +05:00
Konstantin Lebedev d1b5d95d84 Merge branch 'master' into allow_delete_objects_by_TTL 2025-11-04 12:19:34 +05:00
Chris Lu 498ac8903f S3: prevent deleting buckets with object locking (#7434)
* prevent deleting buckets with object locking

* addressing comments

* Update s3api_bucket_handlers.go

* address comments

* early return

* refactor

* simplify

* constant

* go fmt
2025-11-03 15:27:20 -08:00
Konstantin Lebedev f8b874d752 resolv coderabbitai 2025-11-04 01:35:07 +05:00
Konstantin Lebedev 0e6f40e903 fix s3tests 2025-11-04 00:43:30 +05:00
Konstantin Lebedev bff703e126 fix locationPrefix for updateEntriesTTL 2025-11-03 18:21:53 +05:00
Konstantin Lebedev 47c7d5fc8f fix test lifecycle expiration 2025-11-03 17:59:44 +05:00
Konstantin Lebedev 8efd47bf8f delete on get and head 2025-11-03 15:11:28 +05:00
Konstantin Lebedev 391f261ba5 pass opt allowDeleteObjectsByTTL to all servers 2025-11-03 14:16:44 +05:00
Konstantin Lebedev e086793cb3 disable delete expires s3 entry in filer 2025-11-03 14:09:02 +05:00
Konstantin Lebedev dcc84f9f34 do delete expired entries on s3 list request
https://github.com/seaweedfs/seaweedfs/issues/6837
2025-11-03 12:46:22 +05:00
Chris Lu bdc20d1c1e S3: load bucket object locking configuration if not found in cache (#7422)
* load bucket object locking configuration if not found in cache

* fix cache building, more specific error, add back metrics
2025-10-31 22:35:09 -07:00
Chris Lu b7e3284fc5 S3: fix TestSignedStreamingUploadInvalidSignature test (#7421)
* Added continue statements after all state transitions in the state machine to ensure immediate state processing

* simplify

* remove redundant continue clause

* ensure wrong signature
2025-10-31 20:59:44 -07:00
Chris Luandgemini-code-assist[bot] 9f07bca9cc Fix IPv6 host header formatting to match AWS SDK behavior (#7414)
* Add nginx reverse proxy documentation for S3 API

Fixes #7407

Add comprehensive documentation and example configuration for using
nginx as a reverse proxy with SeaweedFS S3 API while maintaining AWS
Signature V4 authentication compatibility.

Changes:
- Add docker/nginx/README.md with detailed setup guide
- Add docker/nginx/s3-example.conf with working configuration
- Update docker/nginx/proxy.conf with important S3 notes

The documentation covers:
- Critical requirements for AWS Signature V4 authentication
- Common mistakes and why they break S3 authentication
- Complete working nginx configurations
- Debugging tips and troubleshooting
- Performance tuning recommendations

* Fix IPv6 host header formatting to match AWS SDK behavior

Follow-up to PR #7403

When a default port (80 for HTTP, 443 for HTTPS) is stripped from an
IPv6 address, the square brackets should also be removed to match AWS
SDK behavior for S3 signature calculation.

Reference: https://github.com/aws/aws-sdk-go-v2/blob/main/aws/signer/internal/v4/host.go
The AWS SDK's stripPort function explicitly removes brackets when
returning an IPv6 address without a port.

Changes:
- Update extractHostHeader to strip brackets from IPv6 addresses when
  no port or default port is used
- Update test expectations to match AWS SDK behavior
- Add detailed comments explaining the AWS SDK compatibility requirement

This ensures S3 signature validation works correctly with IPv6 addresses
behind reverse proxies, matching AWS S3 canonical request format.

Fixes the issue raised in PR #7403 comment:
https://github.com/seaweedfs/seaweedfs/pull/7403#issuecomment-3471105438

* Update docker/nginx/README.md

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* Add nginx reverse proxy documentation for S3 API

Fixes #7407

Add comprehensive documentation and example configuration for using
nginx as a reverse proxy with SeaweedFS S3 API while maintaining AWS
Signature V4 authentication compatibility.

Changes:
- Add docker/nginx/README.md with detailed setup guide
- Add docker/nginx/s3-example.conf with working configuration
- Update docker/nginx/proxy.conf with important S3 notes

The documentation covers:
- Critical requirements for AWS Signature V4 authentication
- Common mistakes and why they break S3 authentication
- Complete working nginx configurations
- Debugging tips and troubleshooting
- Performance tuning recommendations

Fix IPv6 host header formatting to match AWS SDK behavior

Follow-up to PR #7403

When a default port (80 for HTTP, 443 for HTTPS) is stripped from an
IPv6 address, the square brackets should also be removed to match AWS
SDK behavior for S3 signature calculation.

Reference: https://github.com/aws/aws-sdk-go-v2/blob/main/aws/signer/internal/v4/host.go
The AWS SDK's stripPort function explicitly removes brackets when
returning an IPv6 address without a port.

Changes:
- Update extractHostHeader to strip brackets from IPv6 addresses when
  no port or default port is used
- Update test expectations to match AWS SDK behavior
- Add detailed comments explaining the AWS SDK compatibility requirement

This ensures S3 signature validation works correctly with IPv6 addresses
behind reverse proxies, matching AWS S3 canonical request format.

Fixes the issue raised in PR #7403 comment:
https://github.com/seaweedfs/seaweedfs/pull/7403#issuecomment-3471105438

* Revert "Merge branch 'fix-ipv6-brackets-default-port' of https://github.com/seaweedfs/seaweedfs into fix-ipv6-brackets-default-port"

This reverts commit cca3f3985f, reversing
changes made to 2b8f9de78e.

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-30 21:06:00 -07:00
Chris Lu d00a2a8707 Fix S3 bucket policy ARN validation to accept AWS ARNs and simplified formats (#7409)
* Fix S3 bucket policy ARN validation to accept AWS ARNs and simplified formats

Fixes #7252

The bucket policy validation was rejecting valid AWS-style ARNs and
simplified resource formats, causing validation failures with the
error 'resource X does not match bucket X' even when they were
identical strings.

Changes:
- Updated validateResourceForBucket() to accept three formats:
  1. AWS-style ARNs: arn:aws:s3:::bucket-name[/*|/path]
  2. SeaweedFS ARNs: arn:seaweed:s3:::bucket-name[/*|/path]
  3. Simplified formats: bucket-name[/*|/path]

- Added comprehensive test coverage for all three formats
- Added specific test cases from issue #7252 to prevent regression

This ensures compatibility with standard AWS S3 bucket policies
while maintaining support for SeaweedFS-specific ARN format.

* Refactor validateResourceForBucket to reduce code duplication

Simplified the validation logic by stripping ARN prefixes first,
then performing validation on the remaining resource path.
This reduces code duplication and improves maintainability while
maintaining identical functionality.

Addresses review feedback from Gemini Code Assist.

* Use strings.CutPrefix for cleaner ARN prefix stripping

Replace strings.HasPrefix checks with strings.CutPrefix for more
idiomatic Go code. This function is available in Go 1.20+ and
provides cleaner conditional logic with the combined check and
extraction.

Addresses review feedback from Gemini Code Assist.
2025-10-30 11:00:31 -07:00
7e624d5355 * Fix s3 auth with proxy request (#7403)
* * Fix s3 auth with proxy request

* * 6649 Add unit test for signature v4

* address comments

* fix for tests

* ipv6

* address comments

* setting scheme

Works for both cases (direct HTTPS and behind proxy)

* trim for ipv6

* Corrected Scheme Precedence Order

* trim

* accurate

---------

Co-authored-by: chrislu <chris.lu@gmail.com>
Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
2025-10-29 18:01:18 -07:00
Chris Lu eaecd8328b S3: add fallback for CORS (#7404)
* add fallback for cors

* refactor

* expose aws headers

* add fallback to test

* refactor

* Only falls back to global config when there's explicitly no bucket-level config.

* fmt

* Update s3_cors_http_test.go

* refactoring
2025-10-29 13:43:27 -07:00
d4790cb8e6 s3: fix if-match error (#7277)
* s3: fix if-match error

* add more checks

* minor

* minor

---------

Co-authored-by: chrislu <chris.lu@gmail.com>
Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
2025-10-29 12:27:25 -07:00
Chris Luandgemini-code-assist[bot] 85bd593936 S3: adjust for loading credentials (#7400)
* adjust for loading credentials

* Update weed/s3api/auth_credentials_test.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* simplify

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-28 19:05:29 -07:00
20e0d91037 IAM: add support for advanced IAM config file to server command (#7317)
* IAM: add support for advanced IAM config file to server command

* Add support for advanced IAM config file in S3 options

* Fix S3 IAM config handling to simplify checks for configuration presence

* simplify

* simplify again

* copy the value

* const

---------

Co-authored-by: chrislu <chris.lu@gmail.com>
Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
2025-10-28 17:30:12 -07:00
Chris Lu 7d26c8838f S3: auth supports X-Forwarded-Host and X-Forwarded-Port (#7398)
* add fix and tests

* address comments

* idiomatic

* ipv6
2025-10-28 14:16:27 -07:00
chrislu b7ba6785a2 go fmt 2025-10-27 23:04:55 -07:00
Tom Crasset 824dcac3bf s3: combine all signature verification checks into a single function (#7330) 2025-10-25 01:11:45 -07:00
Chris Luandgemini-code-assist[bot] 263e891da0 Clients to volume server requires JWT tokens for all read operations (#7376)
* [Admin UI] Login not possible due to securecookie error

* avoid 404 favicon

* Update weed/admin/dash/auth_middleware.go

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>

* address comments

* avoid variable over shadowing

* log session save error

* When jwt.signing.read.key is enabled in security.toml, the volume server requires JWT tokens for all read operations.

* reuse fileId

* refactor

---------

Co-authored-by: gemini-code-assist[bot] <176961590+gemini-code-assist[bot]@users.noreply.github.com>
2025-10-24 17:09:58 -07:00
bf58c5a688 fix: Use a mixed of virtual and path styles within a single subdomain (#7357)
* fix: Use a mixed of virtual and path styles within a single subdomain

* address comments

* add tests

---------

Co-authored-by: chrislu <chris.lu@gmail.com>
Co-authored-by: Chris Lu <chrislusf@users.noreply.github.com>
2025-10-24 01:45:22 -07:00