Commit Graph
4444 Commits
Author SHA1 Message Date
7b9d2b7d17 feat: add administrator role permission table (#11817)
This update introduces a new table for managing administrator role
permissions, along with the necessary repository and projection logic to
handle adding and removing permissions. It also includes tests to ensure
the correct functionality of the permission management system.

closes https://github.com/zitadel/zitadel/issues/10219

---------

Co-authored-by: Marco Ardizzone <[email protected]>
2026-04-14 06:01:52 +00:00
bb3b52dda3 feat: command layer implementation for AddZitadelProvider (#12020)
# Which Problems Are Solved

This PR contains the command-layer implementation to add an instance IDP
of the type `ZitadelProvider`

# How the Problems Are Solved
- Implementing `AddZitadelProvider` in AdminService 
- Adding the command-layer to create a `ZitadelProvider` and push
`ZitadelIDPAddedEvent`

# Additional Changes
N/A

# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11823
- Follow-up for PR https://github.com/zitadel/zitadel/pull/12018

---------

Co-authored-by: Copilot <[email protected]>
2026-04-13 15:05:36 +00:00
01fe34a526 fix(oidc): use authenticated encryption for opaque tokens (#12017)
# Which Problems Are Solved

Opaque tokens now use authenticated encryption.

# How the Problems Are Solved

- Upgrade zitadel/oidc to v3.47
- Copy crypto implementation for refresh and session tokens (internal to
zitadel)
- Added config that allows validating old tokens for gradual roll-out

# Additional Changes

- Set NX cache for `integration-test-build` to `false`, working on a
seperate fix.

# Additional Context

- closes #11315

---------

Co-authored-by: copilot-swe-agent[bot] <[email protected]>
Co-authored-by: muhlemmer <[email protected]>
2026-04-13 10:59:50 +00:00
Mridang AgarwallaandGitHub a28ee63b02 feat(login): add ZITADEL_API_AWAITINITIALCONN support (#12032) 2026-04-13 09:41:31 +00:00
7d231b43d4 fix(login): replace custom SWR cache with lru-cache (#11945)
# Which Problems Are Solved

The in-memory SWR promiseCache in zitadel.ts used keys like
getBrandingSettings-${org} that had no instance identifier. In
multi-tenant mode, where a single Next.js process serves multiple
instances, an instance A's cached settings without org context
(branding, languages, settings, etc.) could be served to Instance B
request without org context. The cache now additionally is bound to 100
entries by default (configurable via maxSize in `API_CACHE_CONFIG`).
When capacity is exceeded, expired entries are swept first

It additionally replaces the hand-rolled PromiseCache (Map-based, FIFO
eviction) with lru-cache, leveraging its built-in fetchMethod for
stale-while-revalidate, request deduplication, and true LRU eviction.

# How the Problems Are Solved

Added an instanceCacheKey() helpe that prefixes every cache key with
serviceConfig.instanceHost in addition to the org context if available.

---------

Co-authored-by: Ramon <[email protected]>
2026-04-13 11:19:50 +02:00
551883dcab fix(console): update protoc-gen-js (#12046)
<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved
While updating our dependencies the protoc-gen-js library got out of
sync with the google-protobuf npm dependency. This caused problems with
certain grpc code relying on the old `reader.readPackedEnum`.

# How the Problems Are Solved

Updated protoc-gen-js to v4.0.2.

# Additional Changes

Increased the angular build size budget.

# Additional Context

---------

Co-authored-by: Copilot <[email protected]>
2026-04-13 10:59:04 +02:00
a2bf528ca0 feat(domain): introduce error slugs (#12030)
# Which Problems Are Solved

As part of https://github.com/zitadel/zitadel/issues/11917 we want to
introduce error slugs so (API) clients can rely on stable,
machine-readable errors and act accordingly.

# How the Problems Are Solved

- Added a `NewSlug` helper function in the domain package.
- Added `ErrorDetails` to the `ZitadelError`
- Added an `zitadel.error.v2.ErrorDetail` proto message
- Updated the connectRPC error interceptor to map new slug based errors
to the new `ErrorDetail`
- Defined some common slugs and error functions like internal errors
- Defined (session) specific slugs used in the `DeleteSession` and
`CheckUser` functions and replaced old implementations
- Updated integration tests to check specific errors if the relation
database feature is enabled
- Updated doc and guideline to reflect the latest changes and decisions
- Updated DeleteSession endpoint API to list possible slugs

# Additional Changes

None

# Additional Context

- closes #11957

---------

Co-authored-by: Wim Van Laer <[email protected]>
2026-04-13 09:47:04 +02:00
5c9361f6c7 docs: updated zitadel version in docker compose .env example (#11947)
# Which Problems Are Solved

- Zitadel-api failed to reach PostgreSQL with connection refused,
Zitadel v4.11 does not implement a DSN field.

# How the Problems Are Solved

-  Updated ZITADEL_VERSION variable in env.example to v4.13.0

Co-authored-by: Livio Spring <[email protected]>
2026-04-13 05:59:28 +00:00
fbd43ced6e fix(grpc): return 401 for unauthenticated v1 gateway errors (#11786)
Fixes #11730

The v1 gRPC middleware can return native gRPC status errors such as
`codes.Unauthenticated` when the auth header is missing.

Those errors were being passed through the generic gRPC error converter,
which only handled ZITADEL errors and downgraded raw gRPC statuses to
`codes.Unknown`.

Through grpc-gateway that caused `/auth/v1/users/me` to return HTTP 500
instead of HTTP 401.

So this change preserves native gRPC status errors in
`ZITADELToGRPCError`, keeps `ExtractZITADELError` aligned with those
transport codes for activity reporting, and adds regression coverage for
the converter, middleware, and gateway HTTP behavior.

---------

Co-authored-by: Gayathri Vijayan <[email protected]>
2026-04-10 12:22:40 +00:00
Vitor Bari BucciantiandGitHub 035ac4b9a2 fix(api): Add dummy implementation of new LinksSettings APIs to satisfy SettingsServiceHandler interface (#12034)
# Which Problems Are Solved

#11975 introduces new APIs to `SettingsService`, however,
`settingsconnect.SettingsServiceHandler` wasn't updated to satisfy the
interface containing the new APIs.

# How the Problems Are Solved

By adding a dummy implementation of new RPC methods to the
SettingsService Server.

# Additional Changes

n/a 

# Additional Context

n/a
2026-04-10 13:57:32 +02:00
e65cc3007d feat: added contracts for link-settings (#11975)
# Which Problems Are Solved

A new model is needed for links in settings.

# How the Problems Are Solved

Created the new contracts for `LinkSettings`

# Additional Changes


# Additional Context

Replace this example with links to related issues, discussions, discord
threads, or other sources with more context.
Use the Closing #issue syntax for issues that are resolved with this PR.
- Closes #11959
- Discussion #xxx
- Follow-up for PR #xxx
- https://discord.com/channels/xxx/xxx

---------

Co-authored-by: Copilot <[email protected]>
2026-04-10 09:24:49 +00:00
Mridang AgarwallaandGitHub ce31ee2272 fix: propagate non-NotFound errors from instance interceptor (#12019) 2026-04-10 08:22:56 +00:00
Wim Van LaerandGitHub 4fdc3d6d3b docs: fixed login v1 jwt idp callback (#11989)
# Which Problems Are Solved

The example callback url for JWT idP was wrong
2026-04-10 07:51:01 +00:00
61b40975f7 feat: API definition to add new Zitadel providers (#12018)
# Which Problems Are Solved

In the Zitadel API, provide an IdP template which allows connecting to
other Zitadel instances.

# How the Problems Are Solved

This PR adds API definitions to add Zitadel provider at instance and
organization levels.
- Add `AddZitadelProvider` to ManagementService and AdminService
- Add `InstanceRolesInfo` message to help determine instance admin role
assignments

# Additional Changes
N/A

# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11823

---------

Co-authored-by: Copilot <[email protected]>
2026-04-10 07:40:05 +00:00
Mridang AgarwallaandGitHub ecea44329a fix(login): load SSL_CERT_DIR certificates without requiring hashed filenames (#12029) 2026-04-10 10:28:17 +03:00
RamonandGitHub 8b5d7a751a fix(console): jwt provider callback urls #11589 (#11966)
# Which Problems Are Solved
The console didn't specify any callback url's for the JWT idp provider.

# How the Problems Are Solved

Added callback url's to the JWT idp provider screen in the management
console.

# Additional Changes

# Additional Context

- Closes #11589
2026-04-09 21:24:57 +00:00
b558a1f79f feat: allow ECDSA and ED25519 public keys (#11819)
# Which Problems Are Solved
Currently ZITADEL only allows the use of RSA public keys for machine
user authentication (jwt-bearer grant), including for system API users.
Attempting to use ECDSA (e.g. P-256) or ED25519 keys results in
`Errors.Internal` because `BytesToPublicKey` performs an
`ifc.(*rsa.PublicKey)` type assertion that returns `(nil, nil)` for
non-RSA keys, which then causes a nil key panic in go-jose during JWT
verification.

This is the same fix as #8433 (by @livio-a), rebased onto current
`main`.

# How the Problems Are Solved
- `BytesToPublicKey` now returns `crypto.PublicKey` (the standard
library interface) instead of `*rsa.PublicKey`
- A type switch validates the parsed key is one of `*rsa.PublicKey`,
`*ecdsa.PublicKey`, or `ed25519.PublicKey`
- A new `ErrNoPublicKey` sentinel error is returned for unsupported key
types instead of silently returning nil
- Callers in `system_token.go` and `query/key.go` are updated to use the
generic `crypto.PublicKey` interface

# Additional Changes
None

# Additional Context
Duplicate of #8433 which has been open since August 2024. We hit this
bug while implementing OIDC bootstrap for an SGX enclave that generates
ECDSA P-256 keys at runtime -- the `AddKey` API accepts the ECDSA SPKI
PEM fine, but the subsequent `jwt-bearer` token exchange fails with
`Errors.Internal` due to the nil key.

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: Wim Van Laer <[email protected]>
2026-04-09 11:30:23 +02:00
dependabot[bot]GitHubdependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
9135ff4b36 chore(deps): bump the go_modules group across 2 directories with 1 update (#11982)
Bumps the go_modules group with 1 update in the
/apps/login/acceptance/idp/oidc directory:
[github.com/go-jose/go-jose/v4](https://github.com/go-jose/go-jose).
Bumps the go_modules group with 1 update in the
/apps/login/acceptance/oidcrp directory:
[github.com/go-jose/go-jose/v4](https://github.com/go-jose/go-jose).

Updates `github.com/go-jose/go-jose/v4` from 4.0.5 to 4.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/go-jose/go-jose/releases">github.com/go-jose/go-jose/v4's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.3</h2>
<p>This release drops Go 1.23 support as that Go release is no longer
supported. With that, we can drop <code>x/crypto</code> and no longer
have any external dependencies in go-jose outside of the standard
library!</p>
<p>This release fixes a bug where a critical b64 header was ignored if
in an unprotected header. It is now rejected instead of ignored.</p>
<h2>What's Changed</h2>
<ul>
<li>Remove Go 1.23 support by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/205">go-jose/go-jose#205</a></li>
<li>Reject JWS with an unprotected critical b64 header by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/210">go-jose/go-jose#210</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.2...v4.1.3">https://github.com/go-jose/go-jose/compare/v4.1.2...v4.1.3</a></p>
<h2>v4.1.2</h2>
<h2>What's Changed</h2>
<p>go-jose v4.1.2 improves some documentation, errors, and removes the
only 3rd-party dependency.</p>
<ul>
<li>Update go-jose documentation by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/198">go-jose/go-jose#198</a></li>
<li>Remove dependency on testify by <a
href="https://github.com/wardviaene"><code>@​wardviaene</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/197">go-jose/go-jose#197</a></li>
<li>Improve error message for invalid private keys by <a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/195">go-jose/go-jose#195</a></li>
<li>JWK unsupported error when unmarshalling by <a
href="https://github.com/fprojetto"><code>@​fprojetto</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/191">go-jose/go-jose#191</a></li>
<li>Add JSONWebKey type to makeJWERecipient by <a
href="https://github.com/alvarolivie"><code>@​alvarolivie</code></a> in
<a
href="https://redirect.github.com/go-jose/go-jose/pull/200">go-jose/go-jose#200</a></li>
<li>testutils/assert: remove True, Nil, NotNil by <a
href="https://github.com/jsha"><code>@​jsha</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/202">go-jose/go-jose#202</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/wardviaene"><code>@​wardviaene</code></a> made
their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/197">go-jose/go-jose#197</a></li>
<li><a href="https://github.com/fprojetto"><code>@​fprojetto</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/191">go-jose/go-jose#191</a></li>
<li><a
href="https://github.com/alvarolivie"><code>@​alvarolivie</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/200">go-jose/go-jose#200</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.1...v4.1.2">https://github.com/go-jose/go-jose/compare/v4.1.1...v4.1.2</a></p>
<h2>v4.1.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Drop go-cmp dependency by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/186">go-jose/go-jose#186</a></li>
<li>jws: improve performance and allocations for ParseSignedCompact by
<a href="https://github.com/drakkan"><code>@​drakkan</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/188">go-jose/go-jose#188</a></li>
<li>Add missing quote to unknown curve message <a
href="https://redirect.github.com/go-jose/go-jose/issues/170">#170</a>
by <a
href="https://github.com/sudhanvaghebbale"><code>@​sudhanvaghebbale</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/189">go-jose/go-jose#189</a></li>
<li>Fix incorrect validation by <a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/192">go-jose/go-jose#192</a></li>
<li>Restore Go 1.23 compatibility by <a
href="https://github.com/anuraaga"><code>@​anuraaga</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/193">go-jose/go-jose#193</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/drakkan"><code>@​drakkan</code></a> made
their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/188">go-jose/go-jose#188</a></li>
<li><a
href="https://github.com/sudhanvaghebbale"><code>@​sudhanvaghebbale</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/189">go-jose/go-jose#189</a></li>
<li><a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/192">go-jose/go-jose#192</a></li>
<li><a href="https://github.com/anuraaga"><code>@​anuraaga</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/193">go-jose/go-jose#193</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.0...v4.1.1">https://github.com/go-jose/go-jose/compare/v4.1.0...v4.1.1</a></p>
<h2>v4.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Document <code>signatureAlgorithms</code> argument by <a
href="https://github.com/tgeoghegan"><code>@​tgeoghegan</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/163">go-jose/go-jose#163</a></li>
<li>Add custom error for unsupported JWS signature algorithms by <a
href="https://github.com/beautifulentropy"><code>@​beautifulentropy</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/181">go-jose/go-jose#181</a></li>
<li>use stdlib pbkdf2 package on go 1.24 by <a
href="https://github.com/kruskall"><code>@​kruskall</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/180">go-jose/go-jose#180</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/go-jose/go-jose/commit/0e59876635f3dbf46d7b5e97b52bb75a3f96e7d9"><code>0e59876</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/ddffdbcec8bdadea8e02a20bdf19239878228215"><code>ddffdbc</code></a>
Bump actions/checkout from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/213">#213</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/5348b9a4ba4559d2266b5af89fb5353cd1a5360a"><code>5348b9a</code></a>
Reject JWS with an unprotected critical b64 header (<a
href="https://redirect.github.com/go-jose/go-jose/issues/210">#210</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/9153a5e4549c95e97a84e41e6375dc90eac54241"><code>9153a5e</code></a>
Bump actions/setup-python from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/208">#208</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/2126e17f8791f6a234e63b2e4e8cb9fac8605c3a"><code>2126e17</code></a>
Bump actions/setup-go from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/209">#209</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/9860c65054c4821d1e7c22200422b04181f58ebc"><code>9860c65</code></a>
Bump actions/checkout from 4 to 5 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/206">#206</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/14239fdb15b88e1c42e41621ef24f1112cf31b5a"><code>14239fd</code></a>
Remove Go 1.23 support (<a
href="https://redirect.github.com/go-jose/go-jose/issues/205">#205</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/a16e15813482ca5e9a679b7f5bb42ddfae616d43"><code>a16e158</code></a>
Update CI to run on Go 1.24 and 1.25 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/204">#204</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/a1565a41aa008ae6545e0f50a636d254de5b4596"><code>a1565a4</code></a>
testutils/assert: remove True, Nil, NotNil (<a
href="https://redirect.github.com/go-jose/go-jose/issues/202">#202</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/3a80e136a96e747bf44049414eadc02828df4d33"><code>3a80e13</code></a>
jwe: accept non-pointer JSONWebKey in Recipient (<a
href="https://redirect.github.com/go-jose/go-jose/issues/200">#200</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/go-jose/go-jose/compare/v4.0.5...v4.1.4">compare
view</a></li>
</ul>
</details>
<br />

Updates `github.com/go-jose/go-jose/v4` from 4.0.5 to 4.1.4
<details>
<summary>Release notes</summary>
<p><em>Sourced from <a
href="https://github.com/go-jose/go-jose/releases">github.com/go-jose/go-jose/v4's
releases</a>.</em></p>
<blockquote>
<h2>v4.1.3</h2>
<p>This release drops Go 1.23 support as that Go release is no longer
supported. With that, we can drop <code>x/crypto</code> and no longer
have any external dependencies in go-jose outside of the standard
library!</p>
<p>This release fixes a bug where a critical b64 header was ignored if
in an unprotected header. It is now rejected instead of ignored.</p>
<h2>What's Changed</h2>
<ul>
<li>Remove Go 1.23 support by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/205">go-jose/go-jose#205</a></li>
<li>Reject JWS with an unprotected critical b64 header by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/210">go-jose/go-jose#210</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.2...v4.1.3">https://github.com/go-jose/go-jose/compare/v4.1.2...v4.1.3</a></p>
<h2>v4.1.2</h2>
<h2>What's Changed</h2>
<p>go-jose v4.1.2 improves some documentation, errors, and removes the
only 3rd-party dependency.</p>
<ul>
<li>Update go-jose documentation by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/198">go-jose/go-jose#198</a></li>
<li>Remove dependency on testify by <a
href="https://github.com/wardviaene"><code>@​wardviaene</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/197">go-jose/go-jose#197</a></li>
<li>Improve error message for invalid private keys by <a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/195">go-jose/go-jose#195</a></li>
<li>JWK unsupported error when unmarshalling by <a
href="https://github.com/fprojetto"><code>@​fprojetto</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/191">go-jose/go-jose#191</a></li>
<li>Add JSONWebKey type to makeJWERecipient by <a
href="https://github.com/alvarolivie"><code>@​alvarolivie</code></a> in
<a
href="https://redirect.github.com/go-jose/go-jose/pull/200">go-jose/go-jose#200</a></li>
<li>testutils/assert: remove True, Nil, NotNil by <a
href="https://github.com/jsha"><code>@​jsha</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/202">go-jose/go-jose#202</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a
href="https://github.com/wardviaene"><code>@​wardviaene</code></a> made
their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/197">go-jose/go-jose#197</a></li>
<li><a href="https://github.com/fprojetto"><code>@​fprojetto</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/191">go-jose/go-jose#191</a></li>
<li><a
href="https://github.com/alvarolivie"><code>@​alvarolivie</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/200">go-jose/go-jose#200</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.1...v4.1.2">https://github.com/go-jose/go-jose/compare/v4.1.1...v4.1.2</a></p>
<h2>v4.1.1</h2>
<h2>What's Changed</h2>
<ul>
<li>Drop go-cmp dependency by <a
href="https://github.com/mcpherrinm"><code>@​mcpherrinm</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/186">go-jose/go-jose#186</a></li>
<li>jws: improve performance and allocations for ParseSignedCompact by
<a href="https://github.com/drakkan"><code>@​drakkan</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/188">go-jose/go-jose#188</a></li>
<li>Add missing quote to unknown curve message <a
href="https://redirect.github.com/go-jose/go-jose/issues/170">#170</a>
by <a
href="https://github.com/sudhanvaghebbale"><code>@​sudhanvaghebbale</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/189">go-jose/go-jose#189</a></li>
<li>Fix incorrect validation by <a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/192">go-jose/go-jose#192</a></li>
<li>Restore Go 1.23 compatibility by <a
href="https://github.com/anuraaga"><code>@​anuraaga</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/193">go-jose/go-jose#193</a></li>
</ul>
<h2>New Contributors</h2>
<ul>
<li><a href="https://github.com/drakkan"><code>@​drakkan</code></a> made
their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/188">go-jose/go-jose#188</a></li>
<li><a
href="https://github.com/sudhanvaghebbale"><code>@​sudhanvaghebbale</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/189">go-jose/go-jose#189</a></li>
<li><a
href="https://github.com/ProjectMutilation"><code>@​ProjectMutilation</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/192">go-jose/go-jose#192</a></li>
<li><a href="https://github.com/anuraaga"><code>@​anuraaga</code></a>
made their first contribution in <a
href="https://redirect.github.com/go-jose/go-jose/pull/193">go-jose/go-jose#193</a></li>
</ul>
<p><strong>Full Changelog</strong>: <a
href="https://github.com/go-jose/go-jose/compare/v4.1.0...v4.1.1">https://github.com/go-jose/go-jose/compare/v4.1.0...v4.1.1</a></p>
<h2>v4.1.0</h2>
<h2>What's Changed</h2>
<ul>
<li>Document <code>signatureAlgorithms</code> argument by <a
href="https://github.com/tgeoghegan"><code>@​tgeoghegan</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/163">go-jose/go-jose#163</a></li>
<li>Add custom error for unsupported JWS signature algorithms by <a
href="https://github.com/beautifulentropy"><code>@​beautifulentropy</code></a>
in <a
href="https://redirect.github.com/go-jose/go-jose/pull/181">go-jose/go-jose#181</a></li>
<li>use stdlib pbkdf2 package on go 1.24 by <a
href="https://github.com/kruskall"><code>@​kruskall</code></a> in <a
href="https://redirect.github.com/go-jose/go-jose/pull/180">go-jose/go-jose#180</a></li>
</ul>
<!-- raw HTML omitted -->
</blockquote>
<p>... (truncated)</p>
</details>
<details>
<summary>Commits</summary>
<ul>
<li><a
href="https://github.com/go-jose/go-jose/commit/0e59876635f3dbf46d7b5e97b52bb75a3f96e7d9"><code>0e59876</code></a>
Merge commit from fork</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/ddffdbcec8bdadea8e02a20bdf19239878228215"><code>ddffdbc</code></a>
Bump actions/checkout from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/213">#213</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/5348b9a4ba4559d2266b5af89fb5353cd1a5360a"><code>5348b9a</code></a>
Reject JWS with an unprotected critical b64 header (<a
href="https://redirect.github.com/go-jose/go-jose/issues/210">#210</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/9153a5e4549c95e97a84e41e6375dc90eac54241"><code>9153a5e</code></a>
Bump actions/setup-python from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/208">#208</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/2126e17f8791f6a234e63b2e4e8cb9fac8605c3a"><code>2126e17</code></a>
Bump actions/setup-go from 5 to 6 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/209">#209</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/9860c65054c4821d1e7c22200422b04181f58ebc"><code>9860c65</code></a>
Bump actions/checkout from 4 to 5 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/206">#206</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/14239fdb15b88e1c42e41621ef24f1112cf31b5a"><code>14239fd</code></a>
Remove Go 1.23 support (<a
href="https://redirect.github.com/go-jose/go-jose/issues/205">#205</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/a16e15813482ca5e9a679b7f5bb42ddfae616d43"><code>a16e158</code></a>
Update CI to run on Go 1.24 and 1.25 (<a
href="https://redirect.github.com/go-jose/go-jose/issues/204">#204</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/a1565a41aa008ae6545e0f50a636d254de5b4596"><code>a1565a4</code></a>
testutils/assert: remove True, Nil, NotNil (<a
href="https://redirect.github.com/go-jose/go-jose/issues/202">#202</a>)</li>
<li><a
href="https://github.com/go-jose/go-jose/commit/3a80e136a96e747bf44049414eadc02828df4d33"><code>3a80e13</code></a>
jwe: accept non-pointer JSONWebKey in Recipient (<a
href="https://redirect.github.com/go-jose/go-jose/issues/200">#200</a>)</li>
<li>Additional commits viewable in <a
href="https://github.com/go-jose/go-jose/compare/v4.0.5...v4.1.4">compare
view</a></li>
</ul>
</details>
<br />


Dependabot will resolve any conflicts with this PR as long as you don't
alter it yourself. You can also trigger a rebase manually by commenting
`@dependabot rebase`.

[//]: # (dependabot-automerge-start)
[//]: # (dependabot-automerge-end)

---

<details>
<summary>Dependabot commands and options</summary>
<br />

You can trigger Dependabot actions by commenting on this PR:
- `@dependabot rebase` will rebase this PR
- `@dependabot recreate` will recreate this PR, overwriting any edits
that have been made to it
- `@dependabot show <dependency name> ignore conditions` will show all
of the ignore conditions of the specified dependency
- `@dependabot ignore <dependency name> major version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's major version (unless you unignore this specific
dependency's major version or upgrade to it yourself)
- `@dependabot ignore <dependency name> minor version` will close this
group update PR and stop Dependabot creating any more for the specific
dependency's minor version (unless you unignore this specific
dependency's minor version or upgrade to it yourself)
- `@dependabot ignore <dependency name>` will close this group update PR
and stop Dependabot creating any more for the specific dependency
(unless you unignore this specific dependency or upgrade to it yourself)
- `@dependabot unignore <dependency name>` will remove all of the ignore
conditions of the specified dependency
- `@dependabot unignore <dependency name> <ignore condition>` will
remove the ignore condition of the specified dependency and ignore
conditions
You can disable automated security fix PRs for this repo from the
[Security Alerts
page](https://github.com/zitadel/zitadel/network/alerts).

</details>

Signed-off-by: dependabot[bot] <[email protected]>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 10:24:03 +00:00
0bf3045142 fix(console): always show settings page to admin (#11779)
# Which Problems Are Solved

The settings tab is hidden when there's only 1 organization. This was
very confusing when I created an IdP using terraform and then could not
find it. I eventually found the `gs` shortcut which brought me to the
org settings. This was last touched here #10912

# How the Problems Are Solved

Always show the settings tab, even if there's just 1 org.

Co-authored-by: Ramon <[email protected]>
2026-04-08 09:02:56 +00:00
Max PeintnerandGitHub 17f49323dd fix(login): preserve OIDC request context during email verification (#11990)
# Which Problems Are Solved

When a user needed to verify their email during an OIDC login flow, the
requestId was lost, preventing the flow from completing with a redirect
back to the relying party.

# How the Problems Are Solved

In `sendVerification()`, the session cookie lookup used `"loginName" in
command` to decide whether to fall back to `user.preferredLoginName`.
Since the `loginName` property key always exists in the command object
(even when its value is undefined), the fallback was never triggered.
This caused the lookup to search for loginName === undefined, finding no
session — and ultimately redirecting to a dead-end success page.

- /authenticator/set redirect: Added missing requestId to the URL params
when redirecting users who need to set up a primary auth method.
- /verify/success page: Added a "Continue" button that re-enters the
login flow with requestId preserved, handling the edge case where no
session cookie exists (e.g. email link opened in a different browser).
2026-04-08 10:25:43 +02:00
Livio SpringandGitHub fbb6a406c8 chore: fix generators in crypto package (#12008)
# Which Problems Are Solved

`@zitadel/api:generate-go` failed due to duplicate generated files.
https://github.com/zitadel/zitadel/pull/11820 removed the old generated
file and added a generate command to the `internal/crypto/crypto.go`
file. However, there was already a `internal/crypto/generate.go` with a
different output file name (the old file).

# How the Problems Are Solved

Removed the `internal/crypto/generate.go` file and moved the second
generate into `internal/crypto/code.go`.

# Additional Changes

Noticed that mockgen is an old version and updated it. Also then checked
all other tools and updated them.

# Additional Context

- relates to #11820
- noted internally
2026-04-08 08:48:05 +02:00
Wim Van LaerandGitHub 99ad1ea83d test: added checks for timestamps in passkey test (#12003)
# Which Problems Are Solved

A test was failing because of timezone flakiness

# How the Problems Are Solved

The actual problem was an `updatedAt` field was not filled in because of
the `createdAt` was missing on an event. This caused a zero value to be
filled in into the `updatedAt` field. Postgres then stored this value
with seconds in it's timezone info, which go could not store.

By adding filling in the `createdAt` field, this does not occur.
2026-04-07 16:27:45 +02:00
RamonandGitHub 5abb51c263 chore: deps update (#11981)
# Which Problems Are Solved

After merging #11968 and rechecking the dependabot alerts there are
still some issues leftover.

# How the Problems Are Solved

This pr makes overrides for vulnerable transitive depdencies to force
update to safe versions.
It also upgrades the next.js version in the docs and I also ran `pnpm
update` once more.

# Additional Changes

Removed the mochaawesome dependency is this is not really needed and
seems unmaintained.

# Additional Context

- Precursor: #11968
2026-04-07 14:14:12 +02:00
RamonandGitHub 23f0cd0ade chore(console): remove all console eslint warnings (#11853)
<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved

When running the nx target @zitadel/console:lint-check-ng currently
there are a lot of eslint warnings.

# How the Problems Are Solved

Removed unused variables, imports etc.

# Additional Changes

# Additional Context
2026-04-07 09:28:22 +00:00
f803ea8298 feat(login): add Portuguese (pt) translations for Login V2 (#11897)
## What does this PR do?

Adds complete **Portuguese (pt)** locale translations for the Login V2
interface, making it the 14th supported language.

### Problem

The Login V2 component currently supports 13 languages but does not
include Portuguese — one of the most spoken languages in the world
(~260M native speakers). This was reported in #11782.

### What we found

- The Login V2 translations are stored as JSON files under
`apps/login/locales/`
- Available languages are registered in the `LANGS` array in
`apps/login/src/lib/i18n.ts`
- Portuguese (`pt.json`) was missing from both the locales directory and
the `LANGS` array

### What we did

1. Created `apps/login/locales/pt.json` with complete Portuguese
translations for all login screens (loginname, password, register, MFA,
passkeys, OTP, sessions, errors, etc.)
2. Added `{ name: "Português", code: "pt" }` to the `LANGS` array in
`apps/login/src/lib/i18n.ts`

### Translation methodology

- Based on the existing `en.json` and `es.json` as reference
- Follows Brazilian Portuguese (pt-BR) conventions, which is understood
by all Portuguese-speaking countries
- All keys translated — no fallbacks to English needed

### Files changed

| File | Change |
|------|--------|
| `apps/login/locales/pt.json` | **New** — Complete Portuguese
translations |
| `apps/login/src/lib/i18n.ts` | **Modified** — Added `pt` entry to
`LANGS` array |

### Testing

We built and deployed this change from source (tag v4.12.1) to a
production Zitadel instance:

- ✅ Portuguese appears in the language dropdown  
- ✅ All login screens display correct Portuguese translations  
- ✅ Language selection persists across pages  
- ✅ OIDC flow works correctly with Portuguese selected  
- ✅ No build warnings or errors related to the translation  

Closes #11782

Co-authored-by: rofilho <[email protected]>
2026-04-07 10:51:55 +02:00
RamonandGitHub 6877f09c84 fix(console): disallow smtp double create #8964 (#11868)
<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved

When creating a new smtp providers it was possible to click the create
button multiple times and create duplicate smtp providers.

# How the Problems Are Solved

Disable the create button when the smtp provider creation is pending.

# Additional Context
- Closes: #8964
2026-04-03 10:12:25 +00:00
0945195f68 chore: deps update (#11968)
# Which Problems Are Solved
This pr updates major and minor dependencies and is the first step on
getting our dependabot alerts cut down.

# How the Problems Are Solved

Depedency updates across the board eg:
- Upgrade Angular to v21
- Upgrade next.js to v16.2
- Upgrade tailwind to v4 in the login
- Upgrade vitest to v4 in the login

This is an uncompleted list refer to the changed files for a full
overview of all the updates.

# Additional Changes

Migrated all control flow in the console to the modern control flow
syntax.
Fixed the dependsOn setting for the @zitadel/login:test-unit nx target.

# Additional Context

- Closes https://github.com/zitadel/zitadel/issues/11274

---------

Co-authored-by: Max Peintner <[email protected]>
2026-04-02 15:53:08 +02:00
Max PeintnerandGitHub 891c7473ca fix(login): invite flow instead of email verification for users with no primary method, improve sending behaviour (#11837)
Closes #10929

# Which Problems Are Solved

When a human user without a primary authentication method enters their
email on the login screen, the login historically auto-sent an email
code (send=true) and redirected them to the `/verify` flow. If the user
was newly created via the API and already received an initial
verify-email, navigating to the login page would trigger a new invite
code, silently invalidating the code they received in their first email.
Additionally instead of resending the same type of email (invitation) a
regular email verification mail was sent

# How the Problems Are Solved
- Resend an invitation email instead of a email verification if a user
has no method set (still in invitation state)
- Conditional Code Sending: Updated `loginname.ts` to check
`humanUser?.email?.isVerified`. We only auto-send a new code
(`send=true`) if the user's email is already verified. Unverified users
will be redirected with `send=false`, allowing them to safely enter the
code they already have.
- UI State Fix: Fixed an issue in `verify/page.tsx` where the send URL
parameter was being checked directly as a string ("false" is truthy). By
using the properly evaluated doSend boolean, the "Code Sent" alert now
correctly hides itself when a new code is not explicitly sent.
- Translation Updates: Refined the codeSent messaging across all locales
to specify "A new code has been sent..." to provide better context to
the user when they do explicitly request a resend.
2026-04-02 09:58:20 +02:00
Mridang AgarwallaandGitHub 140f07e60b feat(login): simplify login client auth and support PKCS#1 keys (#11888) 2026-04-02 13:10:57 +05:30
Aaron DewesandGitHub c97ffd6eb7 fix(console): pass data to user delete dialog (#11595)
# Which Problems Are Solved

The account deletion modal for users with the user.self.delete
permission was previously broken (displayed no text) because the
properties were not passed to it:

<img width="1920" height="951" alt="grafik"
src="https://github.com/user-attachments/assets/3bfc6126-1777-4f1a-9fa9-c151a8275cea"
/>


# How the Problems Are Solved

The data is correctly passed to the modal.
2026-04-01 17:22:14 +02:00
c7f92a6887 feat: session challenge passkey for the RT model (#11944)
# Which Problems Are Solved

Add Passkey challenge needed for Create/Set session in the RT model.

# How the Problems Are Solved

Introduce `PasskeyChallengeCommand` (validate/execute/events) for
session creation checks
Add a generic `BeginWebAuthNLogin` helper that returns session data +
assertion JSON bytes.
Add unit tests

# Additional Changes
N/A

# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11035

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: Marco A. <[email protected]>
2026-04-01 12:13:40 +02:00
Marco A.andGitHub 701bca6003 feat(session): TOTP Check API with relation tables (#11886)
# Which Problems Are Solved

As part of #11035 , this PR implements the TOTP check logic for session
validation

# How the Problems Are Solved

  - Implement TOTP check logic and tests
- The tarpit function has been moved to a common file so that it can be
used by both TOTP and password checks
- Manual transaction management to avoid stalling the DB while verifier
function is executed
- Update `database.Change` `Matches()` function to allow comparison of
`time.Time` values
  - A converter package from GRPC to Domain model has been added

# Additional Context

This is a cherry-picked PR + changes, coming from
https://github.com/zitadel/zitadel/pull/11164
- Relates to #11035
2026-04-01 11:34:03 +02:00
Vitor Bari BucciantiandGitHub 8c8fc47884 fix(console): Fix onboarding link for user login guide (#11958)
# Which Problems Are Solved

Onboarding steps has broken link to log in documentation:
https://zitadel.com/docs/guides/integrate/login-users

<img width="974" height="409" alt="Screenshot 2026-03-27 at 15 41 58"
src="https://github.com/user-attachments/assets/51863a49-14a2-45f2-b767-cf072dc30ea6"
/>

# How the Problems Are Solved

Change broken link to
https://zitadel.com/docs/guides/integrate/login/login-users

# Additional Changes

n/a

# Additional Context

n/a
2026-04-01 09:01:43 +00:00
5344a7f584 fix: invalid jwt assertion error handling (#11933)
# Which Problems Are Solved

Incorrectly mapped errors on the `/oauth/v2/token` endpoint lead to a
large number of HTTP status 500 errors.

# How the Problems Are Solved

By mapping invalid jwt assertion errors to OIDC `invalid_client` errors,
which returns a HTTP status 400.

# Additional Changes

N/A

# Additional Context

- Closes https://github.com/zitadel/zitadel/issues/11924
- Follow-up: 
- Fix the [error
handling](https://github.com/zitadel/oidc/blob/main/pkg/oidc/verifier.go#L195)
in the oidc package

---------

Co-authored-by: Copilot <[email protected]>
2026-04-01 10:44:02 +02:00
Mridang AgarwallaandGitHub 330548e13c feat: support standard OTEL env vars via autoexport (#11864) 2026-04-01 06:14:21 +00:00
Marco A.andGitHub 7a15a06d69 fix: reducer for PasskeyVerified sets VerifiedAt (#11929)
# Which Problems Are Solved

In https://github.com/zitadel/zitadel/pull/11858#discussion_r2993742914
we discussed on how to translate the ES passkey state to a relational
one. That is used to filter out passkeys during convertion to webauthn
credentials.

It was decided to consider passkeys in ready state those that have a
verified at `time.Time` set.

The change required fixing the reducer for the eventstore event.

# How the Problems Are Solved

  - Set `VerifiedAt` once `HumanWebAuthNVerifiedEvent` is received
  - Also set the verification to `nil`

# Additional Context

- Discussion #11858
- Follow-up for PR #11858
2026-03-31 17:38:47 +02:00
Max PeintnerandGitHub ec0bd5790f fix(login): respect branding themeMode for theme toggle, fix CSP (#11903)
Closes #11721

# Which Problems Are Solved

The login app now correctly handles the themeMode from branding
settings:

- Hide toggle when themeMode is LIGHT or DARK — the theme is forced,
users cannot switch
- Show 3-option toggle (light / system / dark) when themeMode is AUTO or
UNSPECIFIED

# How the Problems Are Solved

- Introduced a `BrandingContext` to pass `themeMode` from `ThemeWrapper`
down to `ThemeSwitch`

# Additional Changes

- removed the CSP from next.config.ts to prevent a precedency issue
where the CSP was actually not applied
2026-03-31 12:25:09 +00:00
604d5cb0a9 fix(login): prevent duplicate email-code verification issue (#11893)
<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved

- With Login V2 and EMAIL_VERIFICATION=true, opening the verify page
with send=true can trigger email code generation twice.
- The second code invalidates the first one, so users may receive two
emails where the first code is always invalid.
- This causes failed verification attempts and blocks onboarding for
affected users.

# How the Problems Are Solved

- Removed side-effectful email-code sending from direct server component
execution path.
- Ensured code sending is executed only once in a safe server-side flow,
so React Server Component re-fetches do not generate additional codes.
- Kept verify flow behavior intact while preventing duplicate code
invalidation.

# Additional Changes

- Added/updated logic around the verify flow to make repeated
render/re-fetch paths idempotent for email-code sending.
- Improved reliability of the Login V2 email verification step under App
Router navigation behavior.

# Additional Context

Fixes #11857
- Tested manually with Login V2 and EMAIL_VERIFICATION=true by
completing a new user registration flow to /verify?send=true.
- Verified that only one verification email is sent and the first
received code is valid (no duplicate invalidating code generated).
Related bug report with reproduction details:
[https://github.com/zitadel/zitadel/issues/11857](vscode-file://vscode-app/Applications/Visual%20Studio%20Code.app/Contents/Resources/app/out/vs/code/electron-browser/workbench/workbench.html)

---------

Co-authored-by: Max Peintner <[email protected]>
2026-03-31 12:04:28 +00:00
7c3d26b23b feat: rt sessions OTP email challenge (#11941)
# Which Problems Are Solved

Add OTP Email challenge needed for Create/Set session in the RT model.

# How the Problems Are Solved

Introduce `OTPEmailChallengeCommand` (validate/execute/events) for
session creation checks
Add unit tests

# Additional Changes
Remove unused fields from `session_challenge_otp_sms.go`

# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11035

---------

Co-authored-by: Marco A. <[email protected]>
2026-03-31 11:50:53 +00:00
Max PeintnerandGitHub 9bab764796 fix(login): add OIDC/SAML requestId to resend invite / resend email code (#11927)
# Which Problems Are Solved

This fixes an issue where resending a code for invite flow did not have
the same context it was initially created for

# How the Problems Are Solved

by passing down thre requestId, the context is preserved though a resend
2026-03-31 11:52:06 +02:00
ff4aae7b3f fix(login): improve error classification (#11926)
Closes #11923

# Which Problems Are Solved

Client-side gRPC errors (e.g. NotFound, InvalidArgument,
PermissionDenied) were being surfaced as HTTP 500 Internal Server
Errors, causing false SRE alerts and poor UI feedback.

# How the Problems Are Solved

- New transport interceptor (`error-classification.ts`): Automatically
enriches every ConnectError with httpStatus and isUserError metadata via
a `ClassifiedConnectError` wrapper
- Route handler protection (`route.ts`, `flow-initiation.ts`): Catches
classified errors from `getAuthRequest` / `getSAMLRequest` and returns
correct HTTP status codes instead of 500
- Type safety: Replaced all magic number error.code === 9 checks with
typed Code.FailedPrecondition + instanceof ConnectError across
`oidc.ts`, `saml.ts`, `password.ts`, `zitadel.ts`
- Classification-aware logging (`session.ts`): Client/user errors log at
warn level, server errors at error level
- Observability (`otel.ts`): Spans now include error.is_user_error and
http.status_code attributes for alert filtering

# Additional Changes

Gitignore `next-env.d.ts`: This file is auto-generated by Next.js on
every next dev and next build invocation. The two modes write slightly
different import paths (.next/dev/types/ vs .next/types/), which causes
git diff --exit-code to fail in CI whenever a developer runs next dev
locally before committing. Since Next.js regenerates it automatically,
there's no need to track it

---------

Co-authored-by: Ramon <[email protected]>
Co-authored-by: Copilot <[email protected]>
2026-03-31 11:20:56 +02:00
8e41d288ff fix: use preparation filter for org existence check during setup (#11932)
<!--
Please inform yourself about the contribution guidelines on submitting a
PR here:
https://github.com/zitadel/zitadel/blob/main/CONTRIBUTING.md#submit-a-pull-request-pr.
Take note of how PR/commit titles should be written and replace the
template texts in the sections below. Don't remove any of the sections.
It is important that the commit history clearly shows what is changed
and why.
Important: By submitting a contribution you agree to the terms from our
Licensing Policy as described here:
https://github.com/zitadel/zitadel/blob/main/LICENSING.md#community-contributions.
-->

# Which Problems Are Solved

- Creating an organization via `SetUpOrg` failed when a custom domain
was provided in the same request.
- The org-domain setup path checked org existence only against persisted
state, so it could not see the newly created organization before the
batch was pushed.

# How the Problems Are Solved

- Added a preparation-aware org existence check that resolves the org
through the validation filter instead of the direct persisted-state
lookup.
- Reused the transaction-aware preparation filter so later validations
can see earlier in-flight commands from the same `PrepareCommands`
batch.

fixes #11677

---------

Co-authored-by: abhishek kumar gupta <[email protected]>
Co-authored-by: Wim Van Laer <[email protected]>
2026-03-31 09:58:42 +02:00
21b28b56ac fix: revert feature key for configs back to ConsoleUseV2UserApi (#11928)
# Which Problems Are Solved

https://github.com/zitadel/zitadel/pull/11390 renamed "Console" to
"Management Console". While
https://github.com/zitadel/zitadel/pull/11706 already reverted an
unintended rename of the feature key to enable the management console to
use the V2 API for user creation. It was now also discovered that the
rename of the feature itself also broke existing (default)
configurations.

# How the Problems Are Solved

Added a `mapstructure` tag on the instance feature to handle existing
configs.

# Additional Changes

Removed unused `TokenExchange` from the default configuration.

# Additional Context

- relates to #11390 
- relates to #11706
- requires backport to v4.x

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: Marco A. <[email protected]>
2026-03-30 15:59:57 +00:00
Livio SpringandGitHub 0390e324e4 fix: do not send init mails for admins on instance setup (#11744)
# Which Problems Are Solved

Currently when setting up an instance, for example from the customer
portal through system api, an instance is created together with an
administrator. If no admin user is specified the default user from the
runtime configuration is automatically added.
For the new onboarding, we can to create instances without prompting the
user to set up a complete account right on start, but the current
behavior of the API prevents this, resp. the created account would
fallback to the default user or password.
By providing an empty `password` field in the `owner_password` in the
`AddInstanceRequest` or `huiman.password` in the
`CreateInstanceRequest`, it's already possible to create an account
without password. Until now this however ended up in an initial mail to
be sent to the user to finalize their account setup.

# How the Problems Are Solved

We simply set the `allowInitMail` to false in the `AddHumanCommand` for
setting up the admins. This will prevent an email to be sent out
immediately and gives us the possibility to use the invite flow later
on.

# Additional Changes

None

# Additional Context

- required for https://github.com/zitadel/website/issues/1611
- backport to v4.x
2026-03-30 15:31:51 +00:00
b145f1c85a docs: added documentation for jwt idp regarding callback uris (#11925)
# Which Problems Are Solved

The documentation did not reflect the difference between login v1 and v2
for configuring a JWT-idp

# How the Problems Are Solved

Added a warning in the docs which highlight that difference.

# Additional Changes

- Restructured the docs to reflect a more generic approach.
- Fixed indentation inside the `<Callout type="warning">` block so the
content renders as formatted text instead of a code block.
- Fixed inconsistent acronym casing in the use-case section: "jwt" →
"JWT" and "idp" → "IdP" to match the rest of the page and UI terms.

# Additional Context

- Closes: #11589

<!-- START COPILOT CODING AGENT TIPS -->
---

💡 You can make Copilot smarter by setting up custom instructions,
customizing its development environment and configuring Model Context
Protocol (MCP) servers. Learn more [Copilot coding agent
tips](https://gh.io/copilot-coding-agent-tips) in the docs.

---------

Co-authored-by: Copilot <[email protected]>
Co-authored-by: copilot-swe-agent[bot] <[email protected]>
2026-03-30 10:23:42 +02:00
022bf74060 feat(session): Passkey Check API with relation tables (#11858)
# Which Problems Are Solved

As part of #11035 , this PR implements the Passkey check logic for
session validation

# How the Problems Are Solved

  - Refactor webauth FinishLogin to support new domain model
  - Add webauth config to defaults
  - Implement passkey check logic and tests
- Manual transaction management to avoid stalling the DB while
FinishLogin callback is executed
- Update passkey Type condition to allow passing a text operation
(equal, contains, etc..)

# Additional Context

This is a cherry-picked PR + minor changes, coming from
https://github.com/zitadel/zitadel/pull/11164
- Relates to #11035

---------

Co-authored-by: Fabienne Bühler <[email protected]>
Co-authored-by: Gayathri Vijayan <[email protected]>
2026-03-27 12:38:40 +01:00
ec7a6d5526 fix: make recovery code active on add (#11734)
# Which Problems Are Solved

- Recovery codes added via `GenerateRecoveryCodes` were never listed as
active authentication methods by `ListAuthenticationMethodTypes`. The
`user_auth_method` projection reducer (`reduceInitAuthMethod`) set the
state to `MFAStateNotReady`, expecting a subsequent verification event
to transition it to `MFAStateReady`. Unlike TOTP, U2F, and Passwordless
— which all have distinct verification events — recovery codes have no
such event, so they were permanently stuck in `NotReady`.

# How the Problems Are Solved

- Introduced a dedicated `reduceAddRecoveryCodes` reducer for
`HumanRecoveryCodesAddedEvent` that sets `MFAStateReady` immediately,
since recovery codes are usable as soon as they are generated.
- Uses `NewUpsertStatement` (instead of `NewCreateStatement`) so that
regenerating recovery codes for the same user updates the existing row
rather than failing on a duplicate key conflict.
- Removed the `HumanRecoveryCodesAddedEvent` case from
`reduceInitAuthMethod`.

# Additional Changes

- Added `UserAuthMethodTypeRecoveryCode` mapping in `authMethodTypeToPb`
unit test.
- Added integration tests for `ListAuthenticationMethodTypes` covering
both the "recovery codes present" and "recovery codes removed" cases.

# Additional Context

* https://github.com/zitadel/zitadel/issues/11317

---------

Co-authored-by: Marco A. <[email protected]>
Co-authored-by: Cursor <[email protected]>
2026-03-27 09:47:16 +00:00
Gayathri VijayanandGitHub f99142bc4a feat: implement otp sms session challenge (#11919)
# Which Problems Are Solved

This PR adds the OTP SMS Challenge needed for CreateSession API
https://github.com/zitadel/zitadel/issues/11035

# How the Problems Are Solved

- Introduce `OTPSMSChallengeCommand` (validate/execute/events) for
session creation checks
- Introduce `GetOTPCryptoGeneratorConfigWithDefault` to fetch
per-instance secret generator settings
- Add unit tests

# Additional Changes

Refactor tests in `session_check_recovery_code_test.go` to make the
helper functions reusable in `session_challenge_otp_sms_test.go`

# Additional Context
Related to https://github.com/zitadel/zitadel/issues/11035
2026-03-26 11:33:44 +00:00
Livio SpringandGitHub f94e4065c2 chore: update go dependencies (#11883)
Updates all dependencies to latests versions (apart from the ones where
there are already issues to solve their updates).
Some updates required minor changes.
2026-03-24 12:27:43 +01:00
SilvanandGitHub 4bc899d052 docs: Improve README for local development and standardize tab usage (#11865)
## Problem statement

- `<Tabs>` were not rendered in docs
- Missing steps in README for local dev

## How it was solved

- Enhance the README to better describe local development setup and
clean up formatting.
- Standardize the use of tabs across various components for consistency.

## Additional info

To not cause merge conflicts with
https://github.com/zitadel/zitadel/pull/11729 changes in
`/self-hosting/manage/configure/configure.mdx` were skipped
2026-03-23 14:39:07 +00:00