Skip to content

chore(release): merge release/4.4.0 to main#1949

Merged
amandagonsalves merged 12 commits into
mainfrom
chore/merge-release-4.4.0-to-main
Jun 8, 2026
Merged

chore(release): merge release/4.4.0 to main#1949
amandagonsalves merged 12 commits into
mainfrom
chore/merge-release-4.4.0-to-main

Conversation

@amandagonsalves

@amandagonsalves amandagonsalves commented Jun 5, 2026

Copy link
Copy Markdown
Collaborator

Description

Merges release/4.4.0 into main for the 4.4.0 release.

Context

JiahuiWho and others added 11 commits May 5, 2026 20:12
### Description

Merge `main` to `develop`

### Context

Git flow

### Testing

- `./gradlew test`

### Documentation

N/A

### Known limitations

N/A
* update soroban-sdk to version 26.0.0
### Description
update soroban-sdk to version 26.0.0

### Testing
`cd soroban && cargo test`

### Documentation
N/A

### Known limitations
N/A
### Description

Adds Gateway API (`Gateway` + `HTTPRoute`) support to all three Anchor
Platform helm charts.
 
### Context

Gateway Migration

### Testing

- `./gradlew test`
- `helm lint` passes for all three charts.
- `helm template` with default. Ingress still emitted, no
Gateway/HTTPRoute.
- `helm template` with Gateway API enabled. renders match the shape in
`stellar/kube`.
- Server-side dry-run not available locally

### Documentation

N/A

### Known limitations

N/A
#1940)

### Description

- adds an `httpRoute.responseHeaders` values block that emits a Gateway
API filter to set security response headers
- Explicit `namespace` + `sectionName` on `parentRefs` when using the
chart-managed Gateway

### Context

The first migration PR dropped the existing `ingress.responseHeaders`
block.
Adding `namespace` + `sectionName` on `parentRefs` is purely a
consistency fix to match the established Gateway API pattern.

### Testing

- `helm lint` passes for all three charts. 
- `helm template` with Gateway API enabled.

### Documentation

N/A

### Known limitations

N/A
…d allows cross-customer KYC disclosure and payout destination overwrite (#1946)

### Description

Before this change, \`Sep12Service.validateGetOrPutRequest\` enforced
authorization on \`request.account\` and \`request.memo\` only. When a
caller supplied \`request.id\` without \`account\`, the account check
short-circuited entirely, allowing any valid SEP-10 session to \`GET\`
or \`PUT\` any customer record by its \`id\` — regardless of who created
it. The \`id\` was forwarded unmodified to the business-server callback,
so any conforming business server would act on it.

The fix introduces a \`sep12_customer_ownership\` table. Every
successful \`PUT /sep12/customer\` writes the caller's identity
(\`stellar_account\`, \`memo\`) as the owner of the returned
\`customer_id\`. Subsequent \`GET\` or \`PUT\` requests that supply
\`id\` are checked against this table: if the stored owner does not
match the token, the request is rejected with 403 before the business
server is called. No business server contract changes are required.

**Changes**
- [x] \`Sep12CustomerOwnership\` / \`Sep12CustomerOwnershipStore\`: new
core interfaces defining the ownership record model and its storage
contract.
- [x] \`JdbcSep12CustomerOwnership\` /
\`JdbcSep12CustomerOwnershipRepo\` /
\`JdbcSep12CustomerOwnershipStore\`: platform JDBC implementation backed
by the new \`sep12_customer_ownership\` table.
- [x] \`V29__add_sep12_customer_ownership.sql\`: Flyway migration
creating the table (\`customer_id PK\`, \`stellar_account NOT NULL\`,
\`memo\`).
- [x] \`Sep12Service.putCustomer\`: after every successful callback
response, saves \`(customer_id, token_account, token_memo)\` to the
ownership store, overwriting any prior record on update.
- [x] \`Sep12Service.validateGetOrPutRequest\`: when \`id\` is present
and \`transactionId\` is absent, looks up the ownership record. If a
record exists and the token's identity does not match, returns 403
before reaching the business server. If no record exists (customer
predates the fix or SEP-31 first-time access), the request is allowed
through with the caller's account injected, preserving backward
compatibility.
- [x] \`SepBeans\` / \`DataBeans\`: wire \`Sep12CustomerOwnershipStore\`
into the Spring context.
- [x] \`Sep12ServiceTest\`: mocked \`Sep12CustomerOwnershipStore\`;
updated existing id-path tests; added IDOR unit tests covering
mismatched account rejection, mismatched memo rejection, no-record
allow-through, ownership save on PUT (plain and muxed), transactionId
path bypass, and forward-account-to-callback behaviour.
- [x] \`Sep12Tests\`: added \`test cross-account id access is rejected\`
integration test — registers a victim customer (ownership row written),
attempts raw HTTP \`GET\` and \`PUT\` against that \`id\` from a
different SEP-10 session, asserts 403 on both, and verifies the victim's
record is unchanged.

**Acceptance Criteria**
- [x] \`GET /sep12/customer?id=<id>\` with a SEP-10 token that does not
own that customer returns 403.
- [x] \`PUT /sep12/customer\` with \`{"id":"<id>", ...}\` from a
different SEP-10 session returns 403.
- [x] The same \`GET\` and \`PUT\` succeed when issued by the token that
owns the customer record.
- [x] No ownership record (first access or pre-existing customer) allows
the request through with the caller's account injected.
- [x] The \`transactionId\` path is unaffected.
- [x] All existing \`Sep12ServiceTest\` tests pass.

### Context

[HackerOne #3735379](https://hackerone.com/reports/3735379)

### Testing

- Unit: \`./gradlew :core:test --tests
"org.stellar.anchor.sep12.Sep12ServiceTest"\`
- Integration: \`./gradlew runEssentialTests\` — covers \`test
cross-account id access is rejected\` in \`Sep12Tests\`

### Documentation
N/A

### Known limitations

Customers created before this migration has run have no ownership
record. On their next \`PUT /customer\`, the record is written and all
subsequent id-based requests are fully enforced. Until then, id-based
access for those customers falls back to the caller's account being
injected, relying on the business server's own id+account consistency
check.
* update project version in `build.gradle.kts`

* update docker badge in `readme.md`

* update `version-info.properties`
@amandagonsalves amandagonsalves self-assigned this Jun 5, 2026
@socket-security

socket-security Bot commented Jun 5, 2026

Copy link
Copy Markdown

Review the following changes in direct dependencies. Learn more about Socket for GitHub.

Diff Package Supply Chain
Security
Vulnerability Quality Maintenance License
Updatedcargo/​soroban-sdk@​22.0.5 ⏵ 26.0.081 -1100 +393100100

View full report

### Description

This bumps the version to 4.4.0

### Context

Release

### Testing

- `./gradlew test`

### Documentation

N/A

### Known limitations

N/A

@JiahuiWho JiahuiWho left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

LGTM

@amandagonsalves amandagonsalves marked this pull request as ready for review June 5, 2026 19:30
@amandagonsalves amandagonsalves merged commit c4a2595 into main Jun 8, 2026
20 of 22 checks passed
@amandagonsalves amandagonsalves deleted the chore/merge-release-4.4.0-to-main branch June 8, 2026 16:12
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants