Commit Graph
4452 Commits
Author SHA1 Message Date
Max Peintner de98c6edb8 fix(login): ClassifiedConnectError breaking ConnectError instanceof checks (#12022)
# Which Problems Are Solved

1. SSL/TLS handshake failures on Cloud Run (middleware self-loopback)
PR #11903 changed the middleware (proxy.ts) to fetch security settings
via fetch(origin + "/security") on every request, including non-proxy
routes like /login. On Cloud Run, this self-loopback goes through the
Google Front End (GFE) load balancer, causing intermittent SSL
routines::record layer failure errors that were tenant-consistent.

2. The ClassifiedConnectError introduced in #11926 set this.name =
"ClassifiedConnectError", which broke ConnectError's custom
Symbol.hasInstance duck-typing check (v.name === "ConnectError"). This
caused ConnectError.from() inside the connectRPC transport's abort
handler to re-wrap classified errors as new ConnectError instances with
Code.Unknown — losing the original gRPC error code and all
classification metadata.

# How the Problems Are Solved

Middleware: eliminate self-loopback fetch:

- Replaced the fetch(origin + "/security") self-loopback with a direct
fetch to ZITADEL_API_URL using the Connect protocol (POST + JSON),
bypassing the load balancer entirely
- Security settings are cached in-memory with a 1-hour TTL per instance
host
- Extracted the fetching/caching logic into
src/lib/server/security-settings.ts
Removed the now-unused /security API route (src/app/security/route.ts)
- CSP headers with iframe origins are now applied to all routes without
any loopback

Error classification interceptor: fixed
- Keep this.name = "ConnectError" in ClassifiedConnectError so the
duck-typing Symbol.hasInstance check passes
- The branded Symbol.for check via isClassifiedError() still correctly
distinguishes the subclass
- Remove redundant Object.setPrototypeOf call (the super constructor
already handles it via new.target)
- Replace remaining instanceof ConnectError checks with
isClassifiedError() in setUserPassword and checkSessionAndSetPassword
2026-04-23 09:11:13 +02:00
RamonandMax Peintner dd9dcf9f72 feat(console): improve org search performance in create project grant page #11121 (#12057)
<!--
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 Project Grant in the Zitadel console, the UI becomes
extremely sluggish/unusable. The issue appears tied to the organization
search dropdown attempting to load a very large dataset.

# How the Problems Are Solved

The refactored `SearchOrgAutocompleteComponent` uses server side
filtering and ondemand loading using infinite scrolling. This makes sure
on a subset of organizations is ever loaded on the client.

# Additional Changes

- Added tailwindcss for easier styling
- Removed build warnings
- Removed some of the SCSS syntax warnings

# Additional Context
- Closes #11121

---------

Co-authored-by: Max Peintner <max@caos.ch>
2026-04-22 11:46:27 +02:00
Ramon bfffd69d60 fix(console): normalize empty OIDC redirect uri updates #12053 (#12067)
# Which Problems Are Solved

- Clearing OIDC redirect URI lists in the console does not persist
correctly resulting in no changes error.

 # How the Problems Are Solved

- Normalizes empty OIDC URI list updates to [""] before sending the save
request.
- Uses the application v2 update call for the affected OIDC config save
path.
 
 # References
- Closes #12053
2026-04-22 09:23:50 +02:00
c0f7bfffdb docs(api): remove incorrect note on CreateInviteCode endpoint (#12073)
# Which Problems Are Solved

The CreateInviteCode endpoint wrongly stated that a new code can only be
issued if the old had expired or was invalidated due to too many
attempts, which is not true.

# How the Problems Are Solved

Removed the note from the proto / API documentation.

# Additional Changes

None

# Additional Context

- noticed by a customer
- requires backport to v4.x

---------

Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Matías Racedo <matiasracedo@gmail.com>
2026-04-16 17:04:47 -03:00
Marco A. 14acc60edd feat: ListSessions to relational (#11987)
# Which Problems Are Solved

This PR introduces the possibility of using the relational DB when
calling the ListSession gRPC endpoint.

# How the Problems Are Solved

  - Implement the Querier interface for ListSession:
- Create a `domain` model for the Session object to be able to map the
gRPC session into it.
- Match the permission filters on ES side to be sure the same sessions
are returned
- Implement converter methods to go from `gRPC` to `domain` models (both
ways)
- Fix the session sql relational migration: rework the trigger to update
the `expiration` field to perform the update only when the input
`lifetime` has a non-zero value.
  - Link the Querier implementation with the gRPC endpoint
- Run the same integration tests against the relational DB, making sure
the outcome is the same. ⚠️ Due to missing permission checks, some
divergence is expected. Hence, specific code to circumvent the
differences has been put in place

# Additional Context

- Closes #11039
2026-04-16 10:58:17 +02:00
Tim Möhlmann 177589a0a8 fix(grpc): increase MaxSendMsgSize (#12066)
# Which Problems Are Solved

Users exporting larger orgsanizations were facing grpc message size
limits of 4 MiB, while trying to export 6.3 MiB of data. Other export
methods like S3 aren't implemented.

# How the Problems Are Solved

Set MaxSendMsgSize to 10 MiB (allow some overhead). This is not a
long-term solution and we should investigate better ways of export.

# Additional Changes

- none

# Additional Context

- Support ticket
2026-04-15 13:04:22 +00:00
Gayathri Vijayan e19bb7a173 feat: implement AddZitadelProvider in ManagementService (#12056)
# Which Problems Are Solved

This PR adds implementation to add a Zitadel IdP at the
organization-level.

# How the Problems Are Solved
- Added handling/converters for the `AddZitadelProvider` endpoint in
`ManagementService` in the server layer
- Registered a new `org.idp.zitadel.added` event for org-level Zitadel
providers
- Added `AddOrgZitadelProvider` command to validate the request and push
`org.idp.zitadel.added` event to the eventstore
- Added the `org.idp.zitadel.added` event to the projection reducer
- Added unit and integration tests

# Additional Changes
added more tests for the ZitadelProvider in AdminService

# Additional Context
- Closes https://github.com/zitadel/zitadel/issues/11823
- Follow-up for PRs https://github.com/zitadel/zitadel/pull/12018,
https://github.com/zitadel/zitadel/pull/12020,
https://github.com/zitadel/zitadel/pull/12055
2026-04-15 14:22:45 +02:00
Gayathri Vijayan 55a9acf3bf feat: projection layer implementation to add Zitadel provider (#12055)
# Which Problems Are Solved

Persisting instance-level Zitadel provider in the projections.

# How the Problems Are Solved
- Defining a new projection table `projections.idp_templates6_zitadel`
and columns for the Zitadel provider
- Adding a reducer `reduceZitadelIDPAdded` to process instance-level
`ZitadelIDPAddedEvent`
- Unit tests 


# Additional Changes
N/A


# Additional Context
- Related to https://github.com/zitadel/zitadel/issues/11823
- Follow-up for PRs https://github.com/zitadel/zitadel/pull/12018,
https://github.com/zitadel/zitadel/pull/12020
2026-04-15 07:59:52 +02:00
SilvanandMarco Ardizzone 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 <marco@zitadel.com>
2026-04-14 06:01:52 +00:00
Gayathri VijayanandCopilot 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 <175728472+Copilot@users.noreply.github.com>
2026-04-13 15:05:36 +00:00
Tim Möhlmanncopilot-swe-agent[bot] <198982749+Copilot@users.noreply.github.com>muhlemmer
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] <198982749+Copilot@users.noreply.github.com>
Co-authored-by: muhlemmer <5411563+muhlemmer@users.noreply.github.com>
2026-04-13 10:59:50 +00:00
Mridang Agarwalla a28ee63b02 feat(login): add ZITADEL_API_AWAITINITIALCONN support (#12032) 2026-04-13 09:41:31 +00:00
Max PeintnerandRamon 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 <mail@conblem.me>
2026-04-13 11:19:50 +02:00
RamonandCopilot 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 <175728472+Copilot@users.noreply.github.com>
2026-04-13 10:59:04 +02:00
Livio SpringandWim Van Laer 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 <wim+github@zitadel.com>
2026-04-13 09:47:04 +02:00
elias terrantiandLivio Spring 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 <9405495+livio-a@users.noreply.github.com>
2026-04-13 05:59:28 +00:00
Oluwatobi MustaphaandGayathri Vijayan 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 <66356931+grvijayan@users.noreply.github.com>
2026-04-10 12:22:40 +00:00
Vitor Bari Buccianti 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
Wim Van LaerandCopilot 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 <175728472+Copilot@users.noreply.github.com>
2026-04-10 09:24:49 +00:00
Mridang Agarwalla ce31ee2272 fix: propagate non-NotFound errors from instance interceptor (#12019) 2026-04-10 08:22:56 +00:00
Wim Van Laer 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
Gayathri VijayanandCopilot 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 <175728472+Copilot@users.noreply.github.com>
2026-04-10 07:40:05 +00:00
Mridang Agarwalla ecea44329a fix(login): load SSL_CERT_DIR certificates without requiring hashed filenames (#12029) 2026-04-10 10:28:17 +03:00
Ramon 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 <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Wim Van Laer <wim+github@zitadel.com>
2026-04-09 11:30:23 +02:00
dependabot[bot]anddependabot[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] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-04-08 10:24:03 +00:00
Ilia CholyandRamon 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 <mail@conblem.me>
2026-04-08 09:02:56 +00:00
Max Peintner 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 Spring 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 Laer 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
Ramon 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
Ramon 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
Romualdo Mathias Filhoandrofilho 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 <romualdomatthias@hotmail.com>
2026-04-07 10:51:55 +02:00
Ramon 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
RamonandMax Peintner 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 <peintnerm@gmail.com>
2026-04-02 15:53:08 +02:00
Max Peintner 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 Agarwalla 140f07e60b feat(login): simplify login client auth and support PKCS#1 keys (#11888) 2026-04-02 13:10:57 +05:30
Aaron Dewes 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 <175728472+Copilot@users.noreply.github.com>
Co-authored-by: Marco A. <marco@zitadel.com>
2026-04-01 12:13:40 +02:00
Marco A. 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 Buccianti 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
Gayathri VijayanandCopilot 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 <175728472+Copilot@users.noreply.github.com>
2026-04-01 10:44:02 +02:00
Mridang Agarwalla 330548e13c feat: support standard OTEL env vars via autoexport (#11864) 2026-04-01 06:14:21 +00:00
Marco A. 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 Peintner 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
mkdavorandMax Peintner 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 <max@caos.ch>
2026-03-31 12:04:28 +00:00
Gayathri VijayanandMarco A. 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. <kwbmm1990@gmail.com>
2026-03-31 11:50:53 +00:00
Max Peintner 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 <mail@conblem.me>
Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com>
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 <abhishek818t@gmail.com>
Co-authored-by: Wim Van Laer <wim+github@zitadel.com>
2026-03-31 09:58:42 +02:00