Compare commits

..

97 Commits

Author SHA1 Message Date
authentik-automation[bot]
1775ef4476 core: bump python-kadmin-rs from 0.7.1 to 0.7.2 (cherry-pick #22234 to version-2026.5) (#22238)
core: bump python-kadmin-rs from 0.7.1 to 0.7.2 (#22234)

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2026-05-11 17:49:23 +00:00
authentik-automation[bot]
a638558133 release: 2026.5.0-rc1 2026-05-11 15:23:50 +00:00
Marc 'risson' Schmitt
c60537bc28 ci: fix make gen in release workflows (cherry-pick #22235 to version-2026.5) (#22236)
ci: fix make gen in release workflows

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2026-05-11 16:26:12 +02:00
Marc 'risson' Schmitt
8c89f65ad7 ci: run make gen when tagging a new release (cherry-pick #22229 to version-2026.5) (#22231)
ci: run make gen when tagging a new release

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2026-05-11 14:53:40 +02:00
authentik-automation[bot]
cb07c148f6 core: bump python-kadmin-rs from 0.7.0 to 0.7.1 (cherry-pick #22205 to version-2026.5) (#22227)
core: bump python-kadmin-rs from 0.7.0 to 0.7.1 (#22205)

Bumps [python-kadmin-rs](https://github.com/authentik-community/kadmin-rs) from 0.7.0 to 0.7.1.
- [Release notes](https://github.com/authentik-community/kadmin-rs/releases)
- [Commits](https://github.com/authentik-community/kadmin-rs/compare/kadmin/version/0.7.0...kadmin/version/0.7.1)

---
updated-dependencies:
- dependency-name: python-kadmin-rs
  dependency-version: 0.7.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-11 14:47:01 +02:00
authentik-automation[bot]
b22ce29f8f lifecycle/ak: Add manage support (cherry-pick #22176 to version-2026.5) (#22221)
lifecycle/ak: Add manage support (#22176)

Co-authored-by: Connor Peshek <connor@connorpeshek.me>
2026-05-11 13:10:18 +02:00
authentik-automation[bot]
fd6bf9fd05 providers/saml: make unified saml endpoint (cherry-pick #20026 to version-2026.5) (#22187)
providers/saml: make unified saml endpoint (#20026)

* providers/saml: make unified saml endpoint

Co-authored-by: Connor Peshek <connor@connorpeshek.me>
2026-05-09 10:48:50 -05:00
authentik-automation[bot]
5e0448b541 providers/saml: make issuer url metadata url (cherry-pick #22178 to version-2026.5) (#22184)
providers/saml: make issuer url metadata url (#22178)

Co-authored-by: Connor Peshek <connor@connorpeshek.me>
2026-05-09 15:36:26 +02:00
authentik-automation[bot]
52c37992bd tenants: fix system flags removeable (cherry-pick #22163 to version-2026.5) (#22182)
tenants: fix system flags removeable (#22163)

* tenants: fix system flags removeable



* lint and fix test



---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens L. <jens@goauthentik.io>
2026-05-09 15:14:01 +02:00
authentik-automation[bot]
45b78f78b8 web/admin: legacy modal fixes and fix log viewer in form layout (cherry-pick #22168 to version-2026.5) (#22173)
web/admin: legacy modal fixes and fix log viewer in form layout (#22168)

* web/admin: fix log-viewer layout again

I thought I only recently fixed this...?



* switch closeAfterSuccessfulSubmit -> keepOpenAfterSubmit with correct attribute name and false as default



---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens L. <jens@goauthentik.io>
2026-05-09 00:24:15 +02:00
authentik-automation[bot]
7900399a97 blueprints: fix mismatched API schema and implementation (cherry-pick #22087 to version-2026.5) (#22171)
blueprints: fix mismatched API schema and implementation (#22087)

align blueprint import schema with 200 result response

Co-authored-by: Marcelo Elizeche Landó <marcelo@goauthentik.io>
2026-05-08 20:58:06 +02:00
Simonyi Gergő
e220d8e29b events: fix destination_group_obj not being nullable (#22161)
* events: fix `destination_group_obj` not being nullable

* `make lint-fix`
2026-05-08 17:16:20 +02:00
Simonyi Gergő
9f613a3337 tenants/settings: present unset flags as False (#22162)
* tenants/settings: present unset flags as `False`

* Update authentik/tenants/api/settings.py

Co-authored-by: Jens L. <jens@goauthentik.io>
Signed-off-by: Simonyi Gergő <28359278+gergosimonyi@users.noreply.github.com>

* Update authentik/tenants/api/settings.py

Signed-off-by: Simonyi Gergő <28359278+gergosimonyi@users.noreply.github.com>

---------

Signed-off-by: Simonyi Gergő <28359278+gergosimonyi@users.noreply.github.com>
Co-authored-by: Jens L. <jens@goauthentik.io>
2026-05-08 17:16:11 +02:00
Dominic R
c3253b4410 root: fix version bump sed command (#22149) 2026-05-08 14:14:11 +02:00
Dominic R
8c5edef568 website: Add PhotoPrism integration guide (#22146)
* Add PhotoPrism integration guide

* A word

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-08 11:41:30 +00:00
Dominic R
b9dcd96760 website: Add PostHog integration guide (#22147) 2026-05-08 11:37:34 +00:00
Dominic R
7018c4ddbf website/docs: update user credentials tab docs (#22143)
* website/docs: update user credentials tab docs

* Update website/docs/users-sources/user/user-interface.mdx

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dominic R <dominic@goauthentik.io>

---------

Signed-off-by: Dominic R <dominic@goauthentik.io>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
2026-05-08 02:42:27 +00:00
Connor Peshek
e89b811ded website/docs: release notes for 2026.5.0 (#21997)
* begin release

* add notes from meeting

* Update website/docs/releases/2026/v2026.5.md

Co-authored-by: Marcelo Elizeche Landó <marcelo@goauthentik.io>
Signed-off-by: Connor Peshek <connor@connorpeshek.me>

* Update website/docs/releases/2026/v2026.5.md

Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Signed-off-by: Connor Peshek <connor@connorpeshek.me>

* Update website/docs/releases/2026/v2026.5.md

Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Signed-off-by: Connor Peshek <connor@connorpeshek.me>

* Update website/docs/releases/2026/v2026.5.md

Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Signed-off-by: Connor Peshek <connor@connorpeshek.me>

* update release notes

* Flesh out UI improvements.

* Fix links.

* Update website/docs/releases/2026/v2026.5.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Connor Peshek <connor@connorpeshek.me>

* website/docs: update 2026.5 release notes

* website/docs: clarify account lockdown release note

* website/docs: add 2026.5 integration guides

* website/docs: add Anthropic integration guides

* website/docs: highlight GitHub Enterprise guide split

* website/docs: highlight integration entitlements migration

* website/docs: highlight Seerr integration rename

* website/docs: highlight Home Assistant OIDC guide update

* website/docs: add Splunk integration guide

* website/docs: highlight NetBird guide refresh

* website/docs: nest integration guide updates

* website/docs: credit integration guide updates

* website/docs: trim Seerr release note

* website/docs: simplify entitlements release note

* website/docs: clarify Home Assistant OIDC methods

* website/docs: add 2FA throttling release note

* website/docs: add tap-to-login release note

* website/docs: retitle hashed password imports

* website/docs: link feature notes to docs

* website/docs: correct Rust worker highlight

* website/docs: clarify Rust worker performance note

* website/docs: link Rust setup docs

* website/docs: apply release note style formatting

* website/docs: remove empty release note heading

* website/docs: fix release note spelling

* website/docs: fix authenticator validation link

* website/docs: use relative authenticator validation link

* website/docs: add integration guides to release notes

---------

Signed-off-by: Connor Peshek <connor@connorpeshek.me>
Co-authored-by: Marcelo Elizeche Landó <marcelo@goauthentik.io>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
Co-authored-by: Dominic R <dominic@sdko.org>
Co-authored-by: Dominic R <dominic@goauthentik.io>
2026-05-07 21:34:44 -05:00
Dominic R
85091b9d46 website/docs: document cross-provider token introspection (#22142)
* website/docs: document cross-provider token introspection

* website/docs: fix service account OAuth link
2026-05-07 22:27:14 -04:00
tawfekk
a177ea5656 website/docs: add Wazuh SAML signing certificate step (#22071)
Signed-off-by: tawfekk <a@tawfek.dk>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-08 01:26:10 +00:00
Katsushi Kobayashi
c5c12a3f7e website/docs: fix frontend dev environment paths and compose override usage (#20976)
* website/docs: update frontend dev. environment doc.

* Remove note sentence

Removed note about specifying arbitrary environment variables.

Signed-off-by: Katsushi Kobayashi <ikob@acm.org>

* Update website/docs/developer-docs/setup/frontend-dev-environment.md

Signed-off-by: Katsushi Kobayashi <ikob@acm.org>

---------

Signed-off-by: Katsushi Kobayashi <ikob@acm.org>
Co-authored-by: Dominic R <dominic@goauthentik.io>
2026-05-08 01:25:09 +00:00
jhuesser
a654a4cadb website/integrations: Add Splunk Enterprise Integration Guide (#20765)
* add Splunk Enterprise Interation Guide

* changes by the build command

* website/integrations: add Splunk Enterprise guide

---------

Co-authored-by: Dominic R <dominic@goauthentik.io>
2026-05-08 01:16:05 +00:00
Dominic R
e5ad2d1a41 website/integrations: add Anthropic integration guides (#22134)
* website/integrations: add Anthropic integration guides

* website/integrations: clarify Anthropic JIT entitlements

* website/integrations: move Anthropic JIT entitlement setup

* website/integrations: clarify Anthropic entitlements

* Update website/integrations/platforms/anthropic-workload-identity-federation/index.mdx

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Apply suggestion from @dominic-r

Signed-off-by: Dominic R <dominic@goauthentik.io>

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Dominic R <dominic@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-07 21:10:15 -04:00
Christiaan Goossens
21c5119ee2 website/integrations: Add christiaangoossens/hass-oidc-auth to the Home Assistant integration docs (#21730)
* Add christiaangoossens/hass-oidc-auth as an option for Home Assistant

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>

* Fix tabs default value

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>

* Fix name typo

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>

* Edits to bring doc more inline with current style guide. Add required sections.

* Addressed PR comments

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>

* Add missing lines

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>

* website/integrations: update Home Assistant OIDC docs

* website/integrations: add Home Assistant spelling words

* Remove name, ignore name.

---------

Signed-off-by: Christiaan Goossens <9487666+christiaangoossens@users.noreply.github.com>
Signed-off-by: Dominic R <dominic@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
Co-authored-by: Dominic R <dominic@goauthentik.io>
Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
2026-05-08 00:55:39 +00:00
Andreas Brain
37397b72e9 website/integrations: Use correct API scope for Netbird (#21780)
Use correct API scope

When using `api` alone, authentik logs a warning that the requested and allowed scopes do not match. See also https://docs.goauthentik.io/add-secure-apps/providers/oauth2/#authentik

Signed-off-by: Andreas Brain <abrain@users.noreply.github.com>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@goauthentik.io>
2026-05-08 00:36:27 +00:00
Dewi Roberts
b4c7dea4e8 website/integrations: ? (#22138)
Add ? to all integrations opening headers
2026-05-07 22:32:27 +00:00
Dominic R
100ae2b355 website/docs: add CMake to full dev environment (#22137) 2026-05-07 18:08:59 -04:00
Jens L.
9a23785059 locale: fix de_DE locale placeholder (#22130)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-05-07 22:49:40 +02:00
Dominic R
a3a29d0648 website/docs: stages cleanup (#21558)
* website/docs: stages cleanup

* apply suggestions

* docs review

* website/docs: address review feedback for stages cleanup

Co-authored-by: Codex <codex@openai.com>

* website/docs: fix expression policy stage links

Co-authored-by: Codex <codex@openai.com>

* website/docs: fix SAML user write stage link

---------

Co-authored-by: Codex <codex@openai.com>
2026-05-07 14:36:54 -04:00
dependabot[bot]
5683c66426 website: bump the build group in /website with 3 updates (#22104)
* website: bump the build group in /website with 3 updates

Bumps the build group in /website with 3 updates: [@rspack/binding-darwin-arm64](https://github.com/web-infra-dev/rspack/tree/HEAD/packages/rspack), [@rspack/binding-linux-arm64-gnu](https://github.com/web-infra-dev/rspack/tree/HEAD/packages/rspack) and [@rspack/binding-linux-x64-gnu](https://github.com/web-infra-dev/rspack/tree/HEAD/packages/rspack).


Updates `@rspack/binding-darwin-arm64` from 1.7.11 to 2.0.0
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v2.0.0/packages/rspack)

Updates `@rspack/binding-linux-arm64-gnu` from 1.7.11 to 2.0.0
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v2.0.0/packages/rspack)

Updates `@rspack/binding-linux-x64-gnu` from 1.7.11 to 2.0.0
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v2.0.0/packages/rspack)

---
updated-dependencies:
- dependency-name: "@rspack/binding-darwin-arm64"
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: build
- dependency-name: "@rspack/binding-linux-arm64-gnu"
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: build
- dependency-name: "@rspack/binding-linux-x64-gnu"
  dependency-version: 2.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: build
...

Signed-off-by: dependabot[bot] <support@github.com>

* dependabot pls

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2026-05-07 19:40:31 +02:00
dependabot[bot]
b5323cdd97 web: bump basic-ftp from 5.3.0 to 5.3.1 in /web (#22131)
Bumps [basic-ftp](https://github.com/patrickjuchli/basic-ftp) from 5.3.0 to 5.3.1.
- [Release notes](https://github.com/patrickjuchli/basic-ftp/releases)
- [Changelog](https://github.com/patrickjuchli/basic-ftp/blob/master/CHANGELOG.md)
- [Commits](https://github.com/patrickjuchli/basic-ftp/compare/v5.3.0...v5.3.1)

---
updated-dependencies:
- dependency-name: basic-ftp
  dependency-version: 5.3.1
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 19:40:13 +02:00
dependabot[bot]
f422c359e1 web: bump knip from 6.7.0 to 6.9.0 in /web (#22107)
Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 6.7.0 to 6.9.0.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Commits](https://github.com/webpro-nl/knip/commits/knip@6.9.0/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 6.9.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 19:38:17 +02:00
dependabot[bot]
5a8a7d24d0 lifecycle/aws: bump aws-cdk from 2.1119.0 to 2.1120.0 in /lifecycle/aws (#22105)
Bumps [aws-cdk](https://github.com/aws/aws-cdk-cli/tree/HEAD/packages/aws-cdk) from 2.1119.0 to 2.1120.0.
- [Release notes](https://github.com/aws/aws-cdk-cli/releases)
- [Commits](https://github.com/aws/aws-cdk-cli/commits/aws-cdk@v2.1120.0/packages/aws-cdk)

---
updated-dependencies:
- dependency-name: aws-cdk
  dependency-version: 2.1120.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 19:18:17 +02:00
dependabot[bot]
8b098ce0c1 web: bump @sentry/browser from 10.50.0 to 10.51.0 in /web in the sentry group across 1 directory (#22106)
web: bump @sentry/browser in /web in the sentry group across 1 directory

Bumps the sentry group with 1 update in the /web directory: [@sentry/browser](https://github.com/getsentry/sentry-javascript).


Updates `@sentry/browser` from 10.50.0 to 10.51.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/develop/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.50.0...10.51.0)

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-version: 10.51.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: sentry
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 19:18:08 +02:00
dependabot[bot]
25a4125375 ci: bump taiki-e/install-action from 2.75.30 to 2.76.0 in /.github/actions/setup (#22108)
ci: bump taiki-e/install-action in /.github/actions/setup

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.30 to 2.76.0.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](db5fb34fa7...711e1c3275)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.76.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-07 19:17:58 +02:00
authentik-automation[bot]
ffead56be4 core, web: update translations (#22129)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-05-07 17:14:39 +00:00
Alexander Tereshkin
93abd2e041 stage/authenticator*: expand attempt throttling to email- and sms-based 2FA (#21751)
* stages/authenticator*: enable attempt throttling for email- and sms-based second authentication factor

* stages/authenticator*: add throttling tests

* stage/authenticator_validate: add throttling documentation

* Update website/docs/add-secure-apps/flows-stages/stages/authenticator_validate/index.mdx

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>

* Update website/docs/add-secure-apps/flows-stages/stages/authenticator_validate/index.mdx

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>

* stages/authenticator_validate: update docs wording

* Update website/docs/add-secure-apps/flows-stages/stages/authenticator_validate/index.mdx

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>

* Update website/docs/add-secure-apps/flows-stages/stages/authenticator_validate/index.mdx

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>

* Update website/docs/add-secure-apps/flows-stages/stages/authenticator_validate/index.mdx

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>

---------

Signed-off-by: Alexander Tereshkin <96586+atereshkin@users.noreply.github.com>
Co-authored-by: Dominic R <dominic@sdko.org>
2026-05-07 12:12:06 -05:00
transifex-integration[bot]
f1d3664c96 translate: Updates for project authentik and language pt_PT (#22122)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:37:13 +00:00
transifex-integration[bot]
1f46ed7bab translate: Updates for project authentik and language no_NO (#22120)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:34:16 +00:00
authentik-automation[bot]
8d75cddbbd stages/authenticator_webauthn: Update FIDO MDS3 & Passkey aaguid blobs (#22128)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-05-07 16:25:34 +00:00
transifex-integration[bot]
f840249c11 translate: Updates for project authentik and language ja_JP (#22118)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:25:13 +00:00
transifex-integration[bot]
a0e9159571 translate: Updates for project authentik and language ru_RU (#22119)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:23:28 +00:00
transifex-integration[bot]
868e61029f translate: Updates for project authentik and language tr_TR (#22125)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:22:38 +00:00
transifex-integration[bot]
8707d2dadf translate: Updates for project authentik and language pl_PL (#22124)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:22:35 +00:00
transifex-integration[bot]
9e9ceda831 translate: Updates for project authentik and language pt_BR (#22111)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:22:19 +00:00
transifex-integration[bot]
cf9ebcc6af translate: Updates for project authentik and language it_IT (#22123)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:22:16 +00:00
transifex-integration[bot]
e42158fa33 translate: Updates for project authentik and language zh-Hans (#22121)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:22:02 +00:00
transifex-integration[bot]
d66391fbbc translate: Updates for project authentik and language cs_CZ (#22115)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:21:10 +00:00
transifex-integration[bot]
cf9459d5db translate: Updates for project authentik and language fr_FR (#22117)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:16:09 +00:00
transifex-integration[bot]
7c1ee63c11 translate: Updates for project authentik and language fi_FI (#22114)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:15:08 +00:00
transifex-integration[bot]
86cc2fef2e translate: Updates for project authentik and language de_DE (#22113)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:14:38 +00:00
transifex-integration[bot]
12d981dfaf translate: Updates for project authentik and language es_ES (#22116)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:12:24 +00:00
transifex-integration[bot]
8f7903f3e9 translate: Updates for project authentik and language bg_BG (#22112)
Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2026-05-07 16:00:31 +00:00
Marc 'risson' Schmitt
b420e4fdbd packages/django-dramatiq-postgres/broker: avoid task processing stopping on decode error (#22110) 2026-05-07 15:35:21 +00:00
Teffen Ellis
e50f093685 web/rac: Ignore empty remote clipboard payloads (#22067)
web/rac: ignore empty remote clipboard payloads

Some remote sessions (notably SSH) push empty or whitespace-only
clipboard updates that overwrite the user's local clipboard, leaving
subsequent paste attempts with nothing to deliver. Filter those payloads
in the StringReader.onend callback so the local clipboard is preserved.

Closes #21439

Co-authored-by: Agent (authentik-i21439-featured-elevated-kobicha) <279763771+playpen-agent@users.noreply.github.com>
2026-05-06 20:34:34 +02:00
Jens L.
cf05037761 api: make ordering null-aware (#22099)
* api: make ordering null-aware

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

* add types

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-05-06 20:34:24 +02:00
Jens L.
4d035d1eda web/admin: remove side-padding on user paths (#22088)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-05-06 19:33:46 +02:00
Marc 'risson' Schmitt
ebd18b466d root: ensure uv sync does not update uv.lock (#22084) 2026-05-06 14:48:59 +00:00
dependabot[bot]
b32df17513 core: bump dramatiq from 1.17.1 to 2.1.0 (#22076)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2026-05-06 14:42:29 +00:00
Teffen Ellis
1db6c3af8b web: Fix Vendored Lex package. Add Unit Tests (#22083)
* Fix API reference paths.

* Clean up vendored code.

* Flesh out test.

* Fix edgecase.

* Clean up return value.

* Fix linter.
2026-05-06 14:31:17 +00:00
authentik-automation[bot]
16de9d1b44 core, web: update translations (#22074)
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-05-06 15:26:38 +02:00
dependabot[bot]
9aabe91119 website: bump the build group in /website with 6 updates (#22075)
Bumps the build group in /website with 6 updates:

| Package | From | To |
| --- | --- | --- |
| [@swc/core-darwin-arm64](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |
| [@swc/core-linux-arm64-gnu](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |
| [@swc/core-linux-x64-gnu](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |
| [@swc/html-darwin-arm64](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |
| [@swc/html-linux-arm64-gnu](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |
| [@swc/html-linux-x64-gnu](https://github.com/swc-project/swc) | `1.15.32` | `1.15.33` |

Updates `@swc/core-darwin-arm64` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-arm64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-x64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/html-darwin-arm64` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/html-linux-arm64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/html-linux-x64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

---
updated-dependencies:
- dependency-name: "@swc/core-darwin-arm64"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
- dependency-name: "@swc/core-linux-arm64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
- dependency-name: "@swc/core-linux-x64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
- dependency-name: "@swc/html-darwin-arm64"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
- dependency-name: "@swc/html-linux-arm64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
- dependency-name: "@swc/html-linux-x64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: build
...

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 14:16:14 +02:00
dependabot[bot]
77fae18259 web: bump ip-address from 10.1.0 to 10.2.0 in /web (#22082)
Bumps [ip-address](https://github.com/beaugunderson/ip-address) from 10.1.0 to 10.2.0.
- [Commits](https://github.com/beaugunderson/ip-address/commits)

---
updated-dependencies:
- dependency-name: ip-address
  dependency-version: 10.2.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 13:06:44 +02:00
dependabot[bot]
f6ef4d5479 web: bump the swc group across 1 directory with 11 updates (#22078)
Bumps the swc group with 1 update in the /web directory: [@swc/core](https://github.com/swc-project/swc/tree/HEAD/packages/core).


Updates `@swc/core` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/commits/v1.15.33/packages/core)

Updates `@swc/core-darwin-arm64` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-darwin-x64` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-arm-gnueabihf` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-arm64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-arm64-musl` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-x64-gnu` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-linux-x64-musl` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-win32-arm64-msvc` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-win32-ia32-msvc` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

Updates `@swc/core-win32-x64-msvc` from 1.15.32 to 1.15.33
- [Release notes](https://github.com/swc-project/swc/releases)
- [Changelog](https://github.com/swc-project/swc/blob/main/CHANGELOG.md)
- [Commits](https://github.com/swc-project/swc/compare/v1.15.32...v1.15.33)

---
updated-dependencies:
- dependency-name: "@swc/core"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-arm64"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-x64"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm-gnueabihf"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-musl"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-gnu"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-musl"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-arm64-msvc"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-ia32-msvc"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-x64-msvc"
  dependency-version: 1.15.33
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 12:49:05 +02:00
dependabot[bot]
b3ac4f9c4e ci: bump taiki-e/install-action from 2.75.29 to 2.75.30 in /.github/actions/setup (#22077)
ci: bump taiki-e/install-action in /.github/actions/setup

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.29 to 2.75.30.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](b5fddbb536...db5fb34fa7)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.75.30
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 12:48:52 +02:00
dependabot[bot]
86658f6f03 web: bump country-flag-icons from 1.6.16 to 1.6.17 in /web (#22079)
Bumps [country-flag-icons](https://gitlab.com/catamphetamine/country-flag-icons) from 1.6.16 to 1.6.17.
- [Changelog](https://gitlab.com/catamphetamine/country-flag-icons/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/country-flag-icons/compare/v1.6.16...v1.6.17)

---
updated-dependencies:
- dependency-name: country-flag-icons
  dependency-version: 1.6.17
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 12:48:32 +02:00
dependabot[bot]
548ab05628 web: bump yaml from 2.8.3 to 2.8.4 in /web (#22080)
Bumps [yaml](https://github.com/eemeli/yaml) from 2.8.3 to 2.8.4.
- [Release notes](https://github.com/eemeli/yaml/releases)
- [Commits](https://github.com/eemeli/yaml/compare/v2.8.3...v2.8.4)

---
updated-dependencies:
- dependency-name: yaml
  dependency-version: 2.8.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 12:48:23 +02:00
dependabot[bot]
459fa8e219 core: bump sentry from 0.47.0 to 0.48.0 (#22081)
Bumps [sentry](https://github.com/getsentry/sentry-rust) from 0.47.0 to 0.48.0.
- [Release notes](https://github.com/getsentry/sentry-rust/releases)
- [Changelog](https://github.com/getsentry/sentry-rust/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-rust/compare/0.47.0...0.48.0)

---
updated-dependencies:
- dependency-name: sentry
  dependency-version: 0.48.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-06 12:48:13 +02:00
Teffen Ellis
e40187179d packages/client-ts: Fix TypeScript config, ESBuild warnings (#21863)
* packages/client-ts: drop composite/incremental from tsconfig template

Sync with goauthentik/client-ts#13. The flags are the mechanism of
the missing-dist release bug upstream; harmless in the monorepo (no
publishing) but pointless for a single-package, no-project-references
setup. Keeping the two trees aligned avoids drift.

Co-Authored-By: Agent (authentik-m-sync-packages-final-concrete-buff) <279763771+playpen-agent@users.noreply.github.com>

* Fix package not building.

---------

Co-authored-by: Agent (authentik-m-sync-packages-final-concrete-buff) <279763771+playpen-agent@users.noreply.github.com>
2026-05-06 12:29:46 +02:00
Dominic R
f6024a23ef web: fix identification stage OUIA attributes (#22049)
* web: fix identification stage OUIA attributes

* tests/e2e: update OUIA selectors for identification stage

Match the rename of ouiaId to data-ouia-component-id in
IdentificationStage.ts so the enroll and recovery flow tests can
locate the links again.
2026-05-06 02:31:17 +02:00
Marcelo Elizeche Landó
a8db2882ec stages/invitation: Invitation wizard (#20399) 2026-05-05 11:47:31 -05:00
Ken Sternberg
befc15ad92 Web/release202604/nits 2 (#22040)
* ## What

         window.authentik.flow = {
             "layout": "{{ flow.layout }}",
    +        "background": "{{ flow.background }}",
    +        "title": "{{ flow.title }}",
         };

Amends the `flow.html` template and `GlobalAuthentik` parser to include new parameters, `background` and `title`, in the flow-specific part of the configuration written to the HTML `<head>` object, and to provide those parameters to client code.

## Why

The `layout` is start-up critical: it tells the Flow interface how the admin wants the Flow page to look, and allows the HTML and CSS to be pre-aligned to that condition. `layout` is determined on a per-Flow bases, not a per-Stage basis; Flows are derived from a tuple of `(Brand, Application?)`, where the opening policy *may* direct a user to a different flow if the user reached authentik via a redirect from a specific application, but will otherwise fall back to the default Flow for the Brand.

The `background` is a field that is required if the `Flow`’s layout is of type `frame_background`; in this case, the part of the viewport not dedicated to the FlowExecutor is reserved for an `<iframe>` that will be filled in with whatever the administrator specifies. Although this gives it the same priority as `layout` (whether it’s provided or undefined) for describing the [chrome](https://developer.mozilla.org/en-US/docs/Glossary/Chrome) around a challenge, it is currently not provided to the application in the start-up config; it is provided in the `challenge` and renders the IFrame as part of the initial challenge.

This patch fixes that; if `layout` is provided, `background` ought to be as well, even if it’s empty. The execution of a Challenge ought not have any influence over the look and feel of the Flow-defined appearance *around* that Challenge.

I have added `title` as well; with that, all of the current theme-and-appearance related configuration details are placed into `<head>` and can be removed from the FlowExecutor.

Server-side, `background` is currently specified: `background = FileField(blank=True, default="")` which is … interesting since we also appear to store URLs in it. I don’t see anything in the FlowSerializer that would change that from a client’s point of view.

This patch furthers the effort to separate flow execution from flow presentation.

- \[🐰\] The code has been formatted (`make web`)

* The status label was using HTML booleans incorrectly. It is impossible for a boolean to be null. The default red was alarming, so I chose a neutral grey for the 'not default' state.

* It is not enough to provide a blank cell to ensure the header is spaced correctly; if the table is empty, that will collapse to zero width.  Providing the classes that go with the 'this cell may contain a toggle' provides the correct spacing as well.

* Fix inconsistent wording between menu and page; make the 'select type' radiocard and radiolist interfaces flush with the top of the form container, removing a weird jagged visual line between the menu and the content.

* Document adding 'toggle' to Table classes.

* Fix how the buttons for TablePage's empty state align; slots are still wonky when responding to content layout that we do not control ourselves.

* Do not show pagination controls when there are no pages to turn.

* Fix spacing after ak-alert in documentation show in the front-end.  Without this, headers and paragraphs were edging well into the alert's drop-shadow.

* Remove separator line from radio entries; P4-ism that was visually confusing.

* Make the empty state a slot, so it can be easily overriden, and provide a default if the slot isn't filled from a lightDOM entry. Add one to the columnWidth, since columnWidth doesn't include the action column; this fixes a visual tic where the empty state did not look correctly centered.
2026-05-05 09:43:53 -07:00
Teffen Ellis
2b48c27760 web: Gracefully handle missing element construction. (#21787)
* web: Gracefully handle missing element construction.

* web: Tailor missing element message based on debug capability. (#22048)

Show a developer-oriented hint when CanDebug is set, and an
end-user-friendly suggestion (refresh / clear cache) otherwise.

Co-authored-by: Agent (authentik-i21787-graceful-gross-chrome) <279763771+playpen-agent@users.noreply.github.com>

---------

Co-authored-by: Agent (authentik-i21787-graceful-gross-chrome) <279763771+playpen-agent@users.noreply.github.com>
2026-05-05 18:41:33 +02:00
Jens L.
6be7b2f7b7 root: update django to 5.2.14 (#22064) 2026-05-05 15:49:16 +00:00
Jens L.
7cffbb4d07 tenants: add option to mark flag as deprecated (#22063)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2026-05-05 17:25:01 +02:00
Marcelo Elizeche Landó
5d629bec9b web/stages: better wording for webauthn authenticator attachments options (#22062)
better wording for webauthn authenticator attachments options
2026-05-05 17:02:55 +02:00
dependabot[bot]
5357f42029 web: bump vite from 8.0.8 to 8.0.10 in /web (#21842)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 8.0.8 to 8.0.10.
- [Release notes](https://github.com/vitejs/vite/releases)
- [Changelog](https://github.com/vitejs/vite/blob/main/packages/vite/CHANGELOG.md)
- [Commits](https://github.com/vitejs/vite/commits/v8.0.10/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 8.0.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:50:15 +02:00
Dewi Roberts
716bc6e136 api: set authenticated session user agent nullable properties (#22059)
* Set properties to nullable and regenerate schema

* Make gen

* format

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2026-05-05 14:47:27 +02:00
Dewi Roberts
60355fdf80 web/admin: redirect stage: adds mention of static url (#22060)
Adds mention of static url, not just flow redirect
2026-05-05 14:46:56 +02:00
dependabot[bot]
828a380569 web: bump axios from 1.15.0 to 1.16.0 in /web (#22058)
Bumps [axios](https://github.com/axios/axios) from 1.15.0 to 1.16.0.
- [Release notes](https://github.com/axios/axios/releases)
- [Changelog](https://github.com/axios/axios/blob/v1.x/CHANGELOG.md)
- [Commits](https://github.com/axios/axios/compare/v1.15.0...v1.16.0)

---
updated-dependencies:
- dependency-name: axios
  dependency-version: 1.16.0
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 14:25:07 +02:00
Luca Sannitu
b04f8a6177 providers/oauth2: override RedirectURITypeEnum capitalization for generated API (#22037)
* fix(providers/oauth2): correct RedirectURITypeEnum capitalization in API schema

* fix: remove encoding artifacts introduced during client regeneration
2026-05-05 14:18:02 +02:00
Dominic R
ff190847f2 website/docs: document language settings (#21968) 2026-05-05 08:08:00 -04:00
Dominic R
a7339c7f87 website/docs: document supported PostgreSQL versions (#21967) 2026-05-05 08:07:24 -04:00
dependabot[bot]
38ae472f6c website: bump docusaurus-theme-openapi-docs from 5.0.1 to 5.0.2 in /website (#22052)
* website: bump docusaurus-theme-openapi-docs in /website

Bumps [docusaurus-theme-openapi-docs](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/tree/HEAD/packages/docusaurus-theme-openapi-docs) from 5.0.1 to 5.0.2.
- [Release notes](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/releases)
- [Changelog](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/blob/main/CHANGELOG.md)
- [Commits](https://github.com/PaloAltoNetworks/docusaurus-openapi-docs/commits/v5.0.2/packages/docusaurus-theme-openapi-docs)

---
updated-dependencies:
- dependency-name: docusaurus-theme-openapi-docs
  dependency-version: 5.0.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>

* bump

Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: dependabot[bot] <support@github.com>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2026-05-05 13:36:39 +02:00
dependabot[bot]
7d0656c6fa web: bump the storybook group across 1 directory with 5 updates (#22024)
Bumps the storybook group with 4 updates in the /web directory: [@storybook/addon-docs](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/docs), [@storybook/addon-links](https://github.com/storybookjs/storybook/tree/HEAD/code/addons/links), [@storybook/web-components](https://github.com/storybookjs/storybook/tree/HEAD/code/renderers/web-components) and [@storybook/web-components-vite](https://github.com/storybookjs/storybook/tree/HEAD/code/frameworks/web-components-vite).


Updates `@storybook/addon-docs` from 10.3.5 to 10.3.6
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.3.6/code/addons/docs)

Updates `@storybook/addon-links` from 10.3.5 to 10.3.6
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.3.6/code/addons/links)

Updates `@storybook/web-components` from 10.3.5 to 10.3.6
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.3.6/code/renderers/web-components)

Updates `@storybook/web-components-vite` from 10.3.5 to 10.3.6
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.3.6/code/frameworks/web-components-vite)

Updates `storybook` from 10.3.5 to 10.3.6
- [Release notes](https://github.com/storybookjs/storybook/releases)
- [Changelog](https://github.com/storybookjs/storybook/blob/next/CHANGELOG.md)
- [Commits](https://github.com/storybookjs/storybook/commits/v10.3.6/code/core)

---
updated-dependencies:
- dependency-name: "@storybook/addon-docs"
  dependency-version: 10.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-version: 10.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components"
  dependency-version: 10.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components-vite"
  dependency-version: 10.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-version: 10.3.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 13:18:52 +02:00
Teffen Ellis
0bbe415b5b revert: web: Consistent use of "User Dashboard" (#22038) (#22046)
Revert "web: Consistent use of "User Dashboard" (#22038)"

This reverts commit d69433b314.
2026-05-05 13:17:40 +02:00
dependabot[bot]
e52c1b2bdc core: bump metrics-exporter-prometheus from 0.18.1 to 0.18.3 (#22057)
Bumps [metrics-exporter-prometheus](https://github.com/metrics-rs/metrics) from 0.18.1 to 0.18.3.
- [Changelog](https://github.com/metrics-rs/metrics/blob/main/release.toml)
- [Commits](https://github.com/metrics-rs/metrics/compare/metrics-exporter-prometheus-v0.18.1...metrics-exporter-prometheus-v0.18.3)

---
updated-dependencies:
- dependency-name: metrics-exporter-prometheus
  dependency-version: 0.18.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 13:09:40 +02:00
authentik-automation[bot]
5064167f28 core, web: update translations (#22047)
Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2026-05-05 13:08:29 +02:00
dependabot[bot]
bca0f51b53 core: bump cryptography from 47.0.0 to 48.0.0 (#22053)
Bumps [cryptography](https://github.com/pyca/cryptography) from 47.0.0 to 48.0.0.
- [Changelog](https://github.com/pyca/cryptography/blob/main/CHANGELOG.rst)
- [Commits](https://github.com/pyca/cryptography/compare/47.0.0...48.0.0)

---
updated-dependencies:
- dependency-name: cryptography
  dependency-version: 48.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 13:08:25 +02:00
dependabot[bot]
67c197e5a5 core: bump psycopg[c,pool] from 3.3.3 to 3.3.4 (#22054)
Bumps [psycopg[c,pool]](https://github.com/psycopg/psycopg) from 3.3.3 to 3.3.4.
- [Changelog](https://github.com/psycopg/psycopg/blob/master/docs/news.rst)
- [Commits](https://github.com/psycopg/psycopg/compare/3.3.3...3.3.4)

---
updated-dependencies:
- dependency-name: psycopg[c,pool]
  dependency-version: 3.3.4
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 13:08:21 +02:00
dependabot[bot]
32b17da699 ci: bump taiki-e/install-action from 2.75.28 to 2.75.29 in /.github/actions/setup (#22056)
ci: bump taiki-e/install-action in /.github/actions/setup

Bumps [taiki-e/install-action](https://github.com/taiki-e/install-action) from 2.75.28 to 2.75.29.
- [Release notes](https://github.com/taiki-e/install-action/releases)
- [Changelog](https://github.com/taiki-e/install-action/blob/main/CHANGELOG.md)
- [Commits](51cd0b8c04...b5fddbb536)

---
updated-dependencies:
- dependency-name: taiki-e/install-action
  dependency-version: 2.75.29
  dependency-type: direct:production
  update-type: version-update:semver-patch
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2026-05-05 13:08:16 +02:00
Dominic R
c75eed630a web: remove native fieldset borders from action groups (#21334)
* web: remove native fieldset borders from action groups

Refs:\n- https://authentiksecurity.slack.com/archives/C08C0SCU2JV/p1775085687040019\n- https://authentiksecurity.slack.com/archives/C08C0SCU2JV/p1774988472501059

* Use consistent naming.

* Fix up styles, selector specifics, compatibility mode.

* Fix field autocapitalization, keyboard behavior.

* Fix default height.

* Fix for mid-size tablet viewports.

- Helped with debugging on mobile.

* Fix linter warning.

---------

Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
2026-05-05 06:17:23 +02:00
Dominic R
9f17d6df96 website/docs: document blueprint import options (#21973)
* website/docs: document blueprint import options

Closes: https://github.com/goauthentik/authentik/issues/21204

* Update website/docs/customize/blueprints/index.mdx

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dominic R <dominic@sdko.org>

* Update website/docs/customize/blueprints/working_with_blueprints.md

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dominic R <dominic@sdko.org>

* Clarify blueprint docs

* Apply suggestions from code review

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Dominic R <dominic@sdko.org>

---------

Signed-off-by: Dominic R <dominic@sdko.org>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-05 01:07:23 +00:00
Dominic R
13c8ad5c56 website/integrations: clarify Jellyfin LDAP bind permissions (#21975)
* website/integrations: clarify Jellyfin LDAP bind permissions

Closes: https://github.com/goauthentik/authentik/issues/9770

* website/docs: clarify jellyfin LDAP service account

* website/docs: link jellyfin LDAP setup steps

* Update index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Dominic R <dominic@sdko.org>

---------

Signed-off-by: Dominic R <dominic@sdko.org>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-05 00:58:10 +00:00
Marcelo Elizeche Landó
28209c03e2 docs: Improve docs on webauthn authenticator attachment (#22045)
Improve docs on webauthn authenticator attachment
2026-05-05 00:34:54 +00:00
Marcelo Elizeche Landó
f47cf08d8a website/docs: Add docs for webauthn hints feature (#20933)
* Add docs for webauthn hints feature

* remove accidentally added file

* Apply suggestions from code review

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Marcelo Elizeche Landó <marce@melizeche.com>

* Apply suggestions from code review

* Apply suggestions from code review

* Apply suggestions from code review

* point to our docs

---------

Signed-off-by: Marcelo Elizeche Landó <marce@melizeche.com>
Signed-off-by: Marcelo Elizeche Landó <marcelo@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2026-05-04 23:47:48 +00:00
Teffen Ellis
d69433b314 web: Consistent use of "User Dashboard" (#22038)
* Update app labels.

* Update docs.
2026-05-04 23:46:58 +02:00
497 changed files with 43080 additions and 10057 deletions

View File

@@ -25,7 +25,7 @@ runs:
if: ${{ contains(inputs.dependencies, 'system') || contains(inputs.dependencies, 'python') }}
uses: gerlero/apt-install@f4fa5265092af9e750549565d28c99aec7189639
with:
packages: libpq-dev openssl libxmlsec1-dev pkg-config gettext krb5-multidev libkrb5-dev heimdal-multidev libclang-dev krb5-kdc krb5-user krb5-admin-server
packages: libpq-dev openssl libxmlsec1-dev pkg-config gettext libclang-dev libkadm5clnt-mit12 libkadm5clnt7t64-heimdal libkrb5-dev krb5-kdc krb5-user krb5-admin-server
update: true
upgrade: false
install-recommends: false
@@ -49,7 +49,7 @@ runs:
if: ${{ contains(inputs.dependencies, 'python') }}
shell: bash
working-directory: ${{ inputs.working-directory }}
run: uv sync --all-extras --dev --frozen
run: uv sync --all-extras --dev --locked
- name: Setup rust (stable)
if: ${{ contains(inputs.dependencies, 'rust') && !contains(inputs.dependencies, 'rust-nightly') }}
uses: actions-rust-lang/setup-rust-toolchain@2b1f5e9b395427c92ee4e3331786ca3c37afe2d7 # v1
@@ -64,7 +64,7 @@ runs:
rustflags: ""
- name: Setup rust dependencies
if: ${{ contains(inputs.dependencies, 'rust') }}
uses: taiki-e/install-action@51cd0b8c0499559d9a4d75c0f5c67bec3a894ec8 # v2
uses: taiki-e/install-action@711e1c3275189d76dcc4d34ddea63bf96ac49090 # v2
with:
tool: cargo-deny cargo-machete cargo-llvm-cov nextest
- name: Setup node (web)

View File

@@ -286,10 +286,6 @@ jobs:
glob: tests/openid_conformance/test_oidc_basic.py
- name: oidc_implicit
glob: tests/openid_conformance/test_oidc_implicit.py
- name: oidc_hybrid
glob: tests/openid_conformance/test_oidc_hybrid.py
- name: oidc_config
glob: tests/openid_conformance/test_oidc_config.py
- name: oidc_rp-initiated
glob: tests/openid_conformance/test_oidc_rp_initiated.py
- name: oidc_frontchannel

View File

@@ -68,6 +68,8 @@ jobs:
token: ${{ steps.generate_token.outputs.token }}
- name: Setup authentik env
uses: ./.github/actions/setup
with:
dependencies: "system,python,go,node,runtime,rust-nightly"
- name: Run migrations
run: make migrate
- name: Bump version

View File

@@ -82,10 +82,14 @@ jobs:
token: "${{ steps.app-token.outputs.token }}"
- name: Setup authentik env
uses: ./.github/actions/setup
with:
dependencies: "system,python,go,node,runtime,rust-nightly"
- name: Run migrations
run: make migrate
- name: Bump version
run: "make bump version=${{ inputs.version }}"
- name: Re-generate API Clients
run: make gen
- name: Commit and push
run: |
# ID from https://api.github.com/users/authentik-automation[bot]

117
Cargo.lock generated
View File

@@ -1003,6 +1003,17 @@ dependencies = [
"pin-project-lite",
]
[[package]]
name = "evmap"
version = "11.0.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1b8874945f036109c72242964c1174cf99434e30cfa45bf45fedc983f50046f8"
dependencies = [
"hashbag",
"left-right",
"smallvec",
]
[[package]]
name = "eyre"
version = "0.6.12"
@@ -1219,6 +1230,21 @@ dependencies = [
"slab",
]
[[package]]
name = "generator"
version = "0.8.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "52f04ae4152da20c76fe800fa48659201d5cf627c5149ca0b707b69d7eef6cf9"
dependencies = [
"cc",
"cfg-if",
"libc",
"log",
"rustversion",
"windows-link",
"windows-result",
]
[[package]]
name = "generic-array"
version = "0.14.7"
@@ -1300,6 +1326,12 @@ dependencies = [
"tracing",
]
[[package]]
name = "hashbag"
version = "0.1.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7040a10f52cba493ddb09926e15d10a9d8a28043708a405931fe4c6f19fac064"
[[package]]
name = "hashbrown"
version = "0.15.5"
@@ -1857,6 +1889,17 @@ version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09edd9e8b54e49e587e4f6295a7d29c3ea94d469cb40ab8ca70b288248a81db2"
[[package]]
name = "left-right"
version = "0.11.7"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0f0c21e4c8ff95f487fb34e6f9182875f42c84cef966d29216bf115d9bba835a"
dependencies = [
"crossbeam-utils",
"loom",
"slab",
]
[[package]]
name = "libc"
version = "0.2.183"
@@ -1928,6 +1971,19 @@ version = "0.4.29"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5e5032e24019045c762d3c0f28f5b6b8bbf38563a65908389bf7978758920897"
[[package]]
name = "loom"
version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "419e0dc8046cb947daa77eb95ae174acfbddb7673b4151f56d1eed8e93fbfaca"
dependencies = [
"cfg-if",
"generator",
"scoped-tls",
"tracing",
"tracing-subscriber",
]
[[package]]
name = "lru-slab"
version = "0.1.2"
@@ -1977,11 +2033,12 @@ dependencies = [
[[package]]
name = "metrics-exporter-prometheus"
version = "0.18.1"
version = "0.18.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3589659543c04c7dc5526ec858591015b87cd8746583b51b48ef4353f99dbcda"
checksum = "1db0d8f1fc9e62caebd0319e11eaec5822b0186c171568f0480b46a0137f9108"
dependencies = [
"base64 0.22.1",
"evmap",
"indexmap",
"metrics",
"metrics-util",
@@ -2000,7 +2057,7 @@ dependencies = [
"hashbrown 0.16.1",
"metrics",
"quanta",
"rand 0.9.2",
"rand 0.9.4",
"rand_xoshiro",
"sketches-ddsketch",
]
@@ -2687,7 +2744,7 @@ dependencies = [
"bytes",
"getrandom 0.3.4",
"lru-slab",
"rand 0.9.2",
"rand 0.9.4",
"ring",
"rustc-hash",
"rustls",
@@ -2747,9 +2804,9 @@ dependencies = [
[[package]]
name = "rand"
version = "0.9.2"
version = "0.9.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6db2770f06117d490610c7488547d543617b21bfa07796d7a12f6f1bd53850d1"
checksum = "44c5af06bb1b7d3216d91932aed5265164bf384dc89cd6ba05cf59a35f5f76ea"
dependencies = [
"rand_chacha 0.9.0",
"rand_core 0.9.5",
@@ -3103,6 +3160,12 @@ dependencies = [
"windows-sys 0.61.2",
]
[[package]]
name = "scoped-tls"
version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e1cf6437eb19a8f4a6cc0f7dca544973b0b78843adbfeb3683d1a94a0024a294"
[[package]]
name = "scopeguard"
version = "1.2.0"
@@ -3140,9 +3203,9 @@ checksum = "d767eb0aabc880b29956c35734170f26ed551a859dbd361d140cdbeca61ab1e2"
[[package]]
name = "sentry"
version = "0.47.0"
version = "0.48.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "eb25f439f97d26fea01d717fa626167ceffcd981addaa670001e70505b72acbb"
checksum = "e8ac94aab850a23d7507307cc505332ed2bafd36c65930dfc5c43610f9e9b477"
dependencies = [
"cfg_aliases",
"httpdate",
@@ -3161,9 +3224,9 @@ dependencies = [
[[package]]
name = "sentry-backtrace"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "46a8c2c1bd5c1f735e84f28b48e7d72efcaafc362b7541bc8253e60e8fcdffc6"
checksum = "dc84c325ace9ca2388e510fe7d6672b5d60cd8b3bd0eb4bb4ee8314c323cd686"
dependencies = [
"backtrace",
"regex",
@@ -3172,9 +3235,9 @@ dependencies = [
[[package]]
name = "sentry-contexts"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9b88a90baa654d7f0e1f4b667f6b434293d9f72c71bef16b197c76af5b7d5803"
checksum = "896c1ab62dbfe1746fb262bbf72e6feb2fb9dfb2c14709077bf71beb532e44b2"
dependencies = [
"hostname",
"libc",
@@ -3186,11 +3249,11 @@ dependencies = [
[[package]]
name = "sentry-core"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ac170a5bba8bec6e3339c90432569d89641fa7a3d3e4f44987d24f0762e6adf"
checksum = "d5f5abf20c42cb1593ec1638976e2647da55f79bccac956444c1707b6cce259a"
dependencies = [
"rand 0.9.2",
"rand 0.9.4",
"sentry-types",
"serde",
"serde_json",
@@ -3199,9 +3262,9 @@ dependencies = [
[[package]]
name = "sentry-debug-images"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dd9646a972b57896d4a92ed200cf76139f8e30b3cfd03b6662ae59926d26633c"
checksum = "4b88bbe6a760d5724bb40689827e82e8db1e275947df2c59abe171bfc30bb671"
dependencies = [
"findshlibs",
"sentry-core",
@@ -3209,9 +3272,9 @@ dependencies = [
[[package]]
name = "sentry-panic"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "6127d3d304ba5ce0409401e85aae538e303a569f8dbb031bf64f9ba0f7174346"
checksum = "0260dcb52562b6a79ae7702312a26dba94b79fb5baee7301087529e5ca4e872e"
dependencies = [
"sentry-backtrace",
"sentry-core",
@@ -3219,9 +3282,9 @@ dependencies = [
[[package]]
name = "sentry-tower"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "61c5253dc4ad89863a866b93aeaaac1c9d60f2f774663b5024afe2d57e0a101c"
checksum = "d669616d5d5279b5712febfc80c343acc3695e499de0d101ed70fceacadf37f2"
dependencies = [
"sentry-core",
"tower-layer",
@@ -3230,9 +3293,9 @@ dependencies = [
[[package]]
name = "sentry-tracing"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "27701acc51e68db5281802b709010395bfcbcb128b1d0a4e5873680d3b47ff0c"
checksum = "a1c035f3a0a8671ae1a231c5b457abb68b71acba2bf3054dab2a09a9d4ea487e"
dependencies = [
"bitflags 2.11.0",
"sentry-backtrace",
@@ -3243,13 +3306,13 @@ dependencies = [
[[package]]
name = "sentry-types"
version = "0.47.0"
version = "0.48.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "56780cb5597d676bf22e6c11d1f062eb4def46390ea3bfb047bcbcf7dfd19bdb"
checksum = "82d8e81058ec155992191f61c7b29bfa7b2cf12012131e7cdc0678020898a7c9"
dependencies = [
"debugid",
"hex",
"rand 0.9.2",
"rand 0.9.4",
"serde",
"serde_json",
"thiserror 2.0.18",
@@ -4151,7 +4214,7 @@ dependencies = [
"http",
"httparse",
"log",
"rand 0.9.2",
"rand 0.9.4",
"sha1",
"thiserror 2.0.18",
]

View File

@@ -44,7 +44,7 @@ hyper-util = "= 0.1.20"
ipnet = { version = "= 2.12.0", features = ["serde"] }
json-subscriber = "= 0.2.8"
metrics = "= 0.24.5"
metrics-exporter-prometheus = { version = "= 0.18.1", default-features = false }
metrics-exporter-prometheus = { version = "= 0.18.3", default-features = false }
nix = { version = "= 0.31.2", features = ["hostname", "signal"] }
notify = "= 8.2.0"
pin-project-lite = "= 0.2.17"
@@ -67,7 +67,7 @@ reqwest-middleware = { version = "= 0.5.1", features = [
"rustls",
] }
rustls = { version = "= 0.23.40", features = ["fips"] }
sentry = { version = "= 0.47.0", default-features = false, features = [
sentry = { version = "= 0.48.0", default-features = false, features = [
"backtrace",
"contexts",
"debug-images",

View File

@@ -160,7 +160,7 @@ endif
$(eval current_version := $(shell cat ${PWD}/internal/constants/VERSION))
$(SED_INPLACE) 's/^version = ".*"/version = "$(version)"/' ${PWD}/pyproject.toml
$(SED_INPLACE) 's/^VERSION = ".*"/VERSION = "$(version)"/' ${PWD}/authentik/__init__.py
$(SED_INPLACE) "s/version = \"${current_version}\"/version = \"$(version)\"" ${PWD}/Cargo.toml ${PWD}/Cargo.lock
$(SED_INPLACE) "s/version = \"${current_version}\"/version = \"$(version)\"/" ${PWD}/Cargo.toml ${PWD}/Cargo.lock
$(MAKE) gen-build gen-compose aws-cfn
$(SED_INPLACE) "s/\"${current_version}\"/\"$(version)\"/" ${PWD}/package.json ${PWD}/package-lock.json ${PWD}/web/package.json ${PWD}/web/package-lock.json
echo -n $(version) > ${PWD}/internal/constants/VERSION

36
authentik/api/ordering.py Normal file
View File

@@ -0,0 +1,36 @@
from django.db.models import F, QuerySet
from rest_framework.filters import OrderingFilter
from rest_framework.request import Request
from rest_framework.views import APIView
class NullsAwareOrderingFilter(OrderingFilter):
"""OrderingFilter that sorts NULL values consistently.
For any nullable field, NULLs are treated as the smallest possible value:
- ascending → NULLs appear first (nulls_first=True)
- descending → NULLs appear last (nulls_last=True)
"""
def _nullable_field_names(self, queryset: QuerySet) -> set[str]:
return {f.name for f in queryset.model._meta.get_fields() if hasattr(f, "null") and f.null}
def filter_queryset(self, request: Request, queryset: QuerySet, view: APIView):
queryset = super().filter_queryset(request, queryset, view)
ordering = queryset.query.order_by
if not ordering:
return queryset
nullable = self._nullable_field_names(queryset)
new_ordering = []
changed = False
for term in ordering:
name = term.lstrip("-")
if name in nullable:
changed = True
if term.startswith("-"):
new_ordering.append(F(name).desc(nulls_last=True))
else:
new_ordering.append(F(name).asc(nulls_first=True))
else:
new_ordering.append(term)
return queryset.order_by(*new_ordering) if changed else queryset

View File

@@ -0,0 +1,59 @@
from django.db.models import OrderBy
from django.test import TestCase
from rest_framework.request import Request
from rest_framework.test import APIRequestFactory
from authentik.api.ordering import NullsAwareOrderingFilter
from authentik.core.models import Token, User
class MockView:
ordering_fields = "__all__"
ordering = None
class TestNullsAwareOrderingFilter(TestCase):
def setUp(self):
self.filter = NullsAwareOrderingFilter()
self.view = MockView()
factory = APIRequestFactory()
self._req = lambda ordering: Request(factory.get("/", {"ordering": ordering}))
def _order_by(self, model, ordering):
qs = model.objects.all()
return self.filter.filter_queryset(self._req(ordering), qs, self.view).query.order_by
def test_nullable_asc_nulls_first(self):
"""Ascending sort on a nullable field rewrites to nulls_first=True."""
(expr,) = self._order_by(User, "last_login")
self.assertIsInstance(expr, OrderBy)
self.assertFalse(expr.descending)
self.assertTrue(expr.nulls_first)
def test_nullable_desc_nulls_last(self):
"""Descending sort on a nullable field rewrites to nulls_last=True."""
(expr,) = self._order_by(User, "-last_login")
self.assertIsInstance(expr, OrderBy)
self.assertTrue(expr.descending)
self.assertTrue(expr.nulls_last)
def test_non_nullable_passes_through(self):
"""Non-nullable fields are left as plain string terms."""
(expr,) = self._order_by(User, "username")
self.assertEqual(expr, "username")
def test_mixed_ordering(self):
"""Only nullable terms are rewritten; non-nullable terms pass through unchanged."""
first, second = self._order_by(User, "username,-last_login")
self.assertEqual(first, "username")
self.assertIsInstance(second, OrderBy)
self.assertTrue(second.descending)
self.assertTrue(second.nulls_last)
def test_expires_nullable(self):
"""expires on ExpiringModel is nullable and is rewritten correctly."""
(expr,) = self._order_by(Token, "-expires")
self.assertIsInstance(expr, OrderBy)
self.assertTrue(expr.descending)
self.assertTrue(expr.nulls_last)

View File

@@ -1,5 +1,6 @@
"""Serializer mixin for managed models"""
from json import JSONDecodeError, loads
from typing import cast
from django.conf import settings
@@ -44,6 +45,7 @@ class BlueprintUploadSerializer(PassiveSerializer):
file = FileField(required=False)
path = CharField(required=False)
context = CharField(required=False, allow_blank=True)
def validate_path(self, path: str) -> str:
"""Ensure the path (if set) specified is retrievable"""
@@ -54,6 +56,18 @@ class BlueprintUploadSerializer(PassiveSerializer):
raise ValidationError(_("Blueprint file does not exist"))
return path
def validate_context(self, context: str) -> dict:
"""Parse context as a JSON object"""
if not context:
return {}
try:
parsed = loads(context)
except JSONDecodeError as exc:
raise ValidationError(_("Context must be valid JSON")) from exc
if not isinstance(parsed, dict):
raise ValidationError(_("Context must be a JSON object"))
return parsed
class ManagedSerializer:
"""Managed Serializer"""
@@ -203,10 +217,7 @@ class BlueprintInstanceViewSet(UsedByMixin, ModelViewSet):
@extend_schema(
request={"multipart/form-data": BlueprintUploadSerializer},
responses={
204: BlueprintImportResultSerializer,
400: BlueprintImportResultSerializer,
},
responses={200: BlueprintImportResultSerializer},
)
@action(url_path="import", detail=False, methods=["POST"], parser_classes=(MultiPartParser,))
@validate(
@@ -224,7 +235,8 @@ class BlueprintInstanceViewSet(UsedByMixin, ModelViewSet):
).retrieve_file()
else:
raise ValidationError("Either path or file must be set")
importer = Importer.from_string(string_contents)
context = body.validated_data.get("context") or {}
importer = Importer.from_string(string_contents, context)
check_blueprint_perms(importer.blueprint, request.user)
@@ -232,21 +244,13 @@ class BlueprintInstanceViewSet(UsedByMixin, ModelViewSet):
import_response = self.BlueprintImportResultSerializer(
data={
"logs": [],
"success": False,
"logs": [LogEventSerializer(log).data for log in logs],
"success": valid,
}
)
import_response.is_valid(raise_exception=True)
import_response.initial_data["logs"] = [LogEventSerializer(log).data for log in logs]
import_response.initial_data["success"] = valid
import_response.is_valid()
if not valid:
return Response(data=import_response.initial_data, status=200)
successful = importer.apply()
import_response.initial_data["success"] = successful
import_response.is_valid()
if not successful:
return Response(data=import_response.initial_data, status=200)
if valid:
import_response.initial_data["success"] = importer.apply()
import_response.is_valid()
return Response(data=import_response.initial_data, status=200)

View File

@@ -1,14 +1,19 @@
"""Test blueprints v1 api"""
from json import loads
from json import dumps, loads
from tempfile import NamedTemporaryFile, mkdtemp
from django.core.files.uploadedfile import SimpleUploadedFile
from django.urls import reverse
from rest_framework.test import APITestCase
from yaml import dump
from authentik.core.tests.utils import create_test_admin_user
from authentik.flows.models import Flow
from authentik.lib.config import CONFIG
from authentik.lib.generators import generate_id
from authentik.stages.invitation.models import InvitationStage
from authentik.stages.user_write.models import UserWriteStage
TMP = mkdtemp("authentik-blueprints")
@@ -80,3 +85,121 @@ class TestBlueprintsV1API(APITestCase):
res.content.decode(),
{"content": ["Failed to validate blueprint", "- Invalid blueprint version"]},
)
def test_api_import_with_context(self):
"""Test that the import endpoint applies the supplied context to the real blueprint"""
slug = f"invitation-enrollment-{generate_id()}"
flow_name = f"Invitation Enrollment {generate_id()}"
stage_name = f"invitation-stage-{generate_id()}"
user_type = "internal"
continue_without_invitation = True
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={
"path": "example/flows-invitation-enrollment-minimal.yaml",
"context": dumps(
{
"flow_slug": slug,
"flow_name": flow_name,
"stage_name": stage_name,
"continue_flow_without_invitation": continue_without_invitation,
"user_type": user_type,
}
),
},
format="multipart",
)
self.assertEqual(res.status_code, 200)
self.assertTrue(res.json()["success"])
flow = Flow.objects.get(slug=slug)
self.assertEqual(flow.name, flow_name)
self.assertEqual(flow.title, flow_name)
invitation_stage = InvitationStage.objects.get(name=stage_name)
self.assertEqual(
invitation_stage.continue_flow_without_invitation,
continue_without_invitation,
)
user_write_stage = UserWriteStage.objects.get(
name=f"invitation-enrollment-user-write-{slug}"
)
self.assertEqual(user_write_stage.user_type, user_type)
self.assertEqual(user_write_stage.user_path_template, f"users/{user_type}")
def test_api_import_blank_path(self):
"""Validator returns empty path unchanged (covers api.py:53)."""
with NamedTemporaryFile(mode="w+", suffix=".yaml") as file:
file.write(dump({"version": 1, "entries": []}))
file.flush()
file.seek(0)
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={"path": "", "file": file},
format="multipart",
)
self.assertEqual(res.status_code, 200)
def test_api_import_invalid_blueprint_returns_result_payload(self):
"""Invalid blueprint content returns a result payload instead of a 400 response."""
file = SimpleUploadedFile("invalid-blueprint.yaml", b'{"version": 3}')
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={"file": file},
format="multipart",
)
self.assertEqual(res.status_code, 200)
self.assertFalse(res.json()["success"])
self.assertGreater(len(res.json()["logs"]), 0)
def test_api_import_unknown_path(self):
"""Path not in available blueprints is rejected (covers api.py:56)."""
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={"path": "does/not/exist.yaml"},
format="multipart",
)
self.assertEqual(res.status_code, 400)
self.assertIn("Blueprint file does not exist", res.content.decode())
def test_api_import_blank_context(self):
"""Blank context is normalized to empty dict (covers api.py:62)."""
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={
"path": "example/flows-invitation-enrollment-minimal.yaml",
"context": "",
},
format="multipart",
)
self.assertEqual(res.status_code, 200)
def test_api_import_invalid_json_context(self):
"""Malformed JSON context raises ValidationError (covers api.py:65-66)."""
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={
"path": "example/flows-invitation-enrollment-minimal.yaml",
"context": "{not json",
},
format="multipart",
)
self.assertEqual(res.status_code, 400)
self.assertIn("Context must be valid JSON", res.content.decode())
def test_api_import_non_object_context(self):
"""JSON context that isn't an object is rejected (covers api.py:68)."""
res = self.client.post(
reverse("authentik_api:blueprintinstance-import-"),
data={
"path": "example/flows-invitation-enrollment-minimal.yaml",
"context": "[1, 2, 3]",
},
format="multipart",
)
self.assertEqual(res.status_code, 400)
self.assertIn("Context must be a JSON object", res.content.decode())

View File

@@ -32,19 +32,19 @@ from authentik.rbac.decorators import permission_required
class UserAgentDeviceDict(TypedDict):
"""User agent device"""
brand: str
brand: str | None = None
family: str
model: str
model: str | None = None
class UserAgentOSDict(TypedDict):
"""User agent os"""
family: str
major: str
minor: str
patch: str
patch_minor: str
major: str | None = None
minor: str | None = None
patch: str | None = None
patch_minor: str | None = None
class UserAgentBrowserDict(TypedDict):

View File

@@ -11,7 +11,9 @@ from authentik.events.models import NotificationRule
class NotificationRuleSerializer(ModelSerializer):
"""NotificationRule Serializer"""
destination_group_obj = GroupSerializer(read_only=True, source="destination_group")
destination_group_obj = GroupSerializer(
read_only=True, source="destination_group", required=False, allow_null=True
)
class Meta:
model = NotificationRule

View File

@@ -29,6 +29,7 @@ class RefreshOtherFlowsAfterAuthentication(Flag[bool], key="flows_refresh_others
default = False
visibility = "public"
description = _("Refresh other tabs after successful authentication.")
deprecated = True
class ContinuousLogin(Flag[bool], key="flows_continuous_login"):

View File

@@ -61,6 +61,11 @@ class SAMLProviderSerializer(ProviderSerializer):
url_download_metadata = SerializerMethodField()
url_issuer = SerializerMethodField()
# Unified SAML endpoint (primary)
url_unified = SerializerMethodField()
url_unified_init = SerializerMethodField()
# Legacy endpoints (for backward compatibility)
url_sso_post = SerializerMethodField()
url_sso_redirect = SerializerMethodField()
url_sso_init = SerializerMethodField()
@@ -100,13 +105,43 @@ class SAMLProviderSerializer(ProviderSerializer):
try:
return request.build_absolute_uri(
reverse(
"authentik_providers_saml:base",
"authentik_providers_saml:metadata-download",
kwargs={"application_slug": instance.application.slug},
)
)
except Provider.application.RelatedObjectDoesNotExist:
return DEFAULT_ISSUER
def get_url_unified(self, instance: SAMLProvider) -> str:
"""Get unified SAML endpoint URL (handles SSO and SLO)"""
if "request" not in self._context:
return ""
request: HttpRequest = self._context["request"]._request
try:
return request.build_absolute_uri(
reverse(
"authentik_providers_saml:base",
kwargs={"application_slug": instance.application.slug},
)
)
except Provider.application.RelatedObjectDoesNotExist:
return "-"
def get_url_unified_init(self, instance: SAMLProvider) -> str:
"""Get IdP-initiated SAML URL"""
if "request" not in self._context:
return ""
request: HttpRequest = self._context["request"]._request
try:
return request.build_absolute_uri(
reverse(
"authentik_providers_saml:init",
kwargs={"application_slug": instance.application.slug},
)
)
except Provider.application.RelatedObjectDoesNotExist:
return "-"
def get_url_sso_post(self, instance: SAMLProvider) -> str:
"""Get SSO Post URL"""
if "request" not in self._context:
@@ -243,6 +278,8 @@ class SAMLProviderSerializer(ProviderSerializer):
"default_name_id_policy",
"url_download_metadata",
"url_issuer",
"url_unified",
"url_unified_init",
"url_sso_post",
"url_sso_redirect",
"url_sso_init",

View File

@@ -241,7 +241,7 @@ class SAMLProvider(Provider):
"""Use IDP-Initiated SAML flow as launch URL"""
try:
return reverse(
"authentik_providers_saml:sso-init",
"authentik_providers_saml:init",
kwargs={"application_slug": self.application.slug},
)
except Provider.application.RelatedObjectDoesNotExist:

View File

@@ -147,7 +147,7 @@ class AssertionProcessor:
return self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:base",
"authentik_providers_saml:metadata-download",
kwargs={"application_slug": self.provider.application.slug},
)
)

View File

@@ -48,7 +48,7 @@ class MetadataProcessor:
return self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:base",
"authentik_providers_saml:metadata-download",
kwargs={"application_slug": self.provider.application.slug},
)
)
@@ -81,54 +81,35 @@ class MetadataProcessor:
element.text = name_id_format
yield element
def _get_unified_url(self) -> str:
"""Get the unified SAML endpoint URL"""
return self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:base",
kwargs={"application_slug": self.provider.application.slug},
)
)
def get_sso_bindings(self) -> Iterator[Element]:
"""Get all Bindings supported"""
binding_url_map = {
(SAML_BINDING_REDIRECT, "SingleSignOnService"): self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:sso-redirect",
kwargs={"application_slug": self.provider.application.slug},
)
),
(SAML_BINDING_POST, "SingleSignOnService"): self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:sso-post",
kwargs={"application_slug": self.provider.application.slug},
)
),
}
for binding_svc, url in binding_url_map.items():
binding, svc = binding_svc
"""Get all SSO Bindings - both point to unified endpoint"""
unified_url = self._get_unified_url()
for binding in [SAML_BINDING_REDIRECT, SAML_BINDING_POST]:
if self.force_binding and self.force_binding != binding:
continue
element = Element(f"{{{NS_SAML_METADATA}}}{svc}")
element = Element(f"{{{NS_SAML_METADATA}}}SingleSignOnService")
element.attrib["Binding"] = binding
element.attrib["Location"] = url
element.attrib["Location"] = unified_url
yield element
def get_slo_bindings(self) -> Iterator[Element]:
"""Get all Bindings supported"""
binding_url_map = {
(SAML_BINDING_REDIRECT, "SingleLogoutService"): self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:slo-redirect",
kwargs={"application_slug": self.provider.application.slug},
)
),
(SAML_BINDING_POST, "SingleLogoutService"): self.http_request.build_absolute_uri(
reverse(
"authentik_providers_saml:slo-post",
kwargs={"application_slug": self.provider.application.slug},
)
),
}
for binding_svc, url in binding_url_map.items():
binding, svc = binding_svc
"""Get all SLO Bindings - both point to unified endpoint"""
unified_url = self._get_unified_url()
for binding in [SAML_BINDING_REDIRECT, SAML_BINDING_POST]:
if self.force_binding and self.force_binding != binding:
continue
element = Element(f"{{{NS_SAML_METADATA}}}{svc}")
element = Element(f"{{{NS_SAML_METADATA}}}SingleLogoutService")
element.attrib["Binding"] = binding
element.attrib["Location"] = url
element.attrib["Location"] = unified_url
yield element
def _prepare_signature(self, entity_descriptor: _Element):

View File

@@ -4,19 +4,26 @@ from django.urls import path
from authentik.providers.saml.api.property_mappings import SAMLPropertyMappingViewSet
from authentik.providers.saml.api.providers import SAMLProviderViewSet
from authentik.providers.saml.views import metadata, sso
from authentik.providers.saml.views import metadata, sso, unified
from authentik.providers.saml.views.sp_slo import (
SPInitiatedSLOBindingPOSTView,
SPInitiatedSLOBindingRedirectView,
)
urlpatterns = [
# Base path for Issuer/Entity ID
# Unified Endpoint - handles SSO and SLO based on message type
path(
"<slug:application_slug>/",
sso.SAMLSSOBindingRedirectView.as_view(),
unified.SAMLUnifiedView.as_view(),
name="base",
),
# IdP-initiated
path(
"<slug:application_slug>/init/",
sso.SAMLSSOBindingInitView.as_view(),
name="init",
),
# LEGACY Endpoints (backward compatibility)
# SSO Bindings
path(
"<slug:application_slug>/sso/binding/redirect/",

View File

@@ -0,0 +1,118 @@
"""Unified SAML endpoint - handles SSO and SLO based on message type"""
from base64 import b64decode
from defusedxml.lxml import fromstring
from django.http import HttpRequest, HttpResponse
from django.utils.decorators import method_decorator
from django.views import View
from django.views.decorators.clickjacking import xframe_options_sameorigin
from django.views.decorators.csrf import csrf_exempt
from structlog.stdlib import get_logger
from authentik.common.saml.constants import NS_MAP
from authentik.flows.views.executor import SESSION_KEY_POST
from authentik.lib.views import bad_request_message
from authentik.providers.saml.utils.encoding import decode_base64_and_inflate
from authentik.providers.saml.views.flows import (
REQUEST_KEY_SAML_REQUEST,
REQUEST_KEY_SAML_RESPONSE,
)
from authentik.providers.saml.views.sp_slo import (
SPInitiatedSLOBindingPOSTView,
SPInitiatedSLOBindingRedirectView,
)
from authentik.providers.saml.views.sso import (
SAMLSSOBindingPOSTView,
SAMLSSOBindingRedirectView,
)
LOGGER = get_logger()
# SAML message type constants
SAML_MESSAGE_TYPE_AUTHN_REQUEST = "AuthnRequest"
SAML_MESSAGE_TYPE_LOGOUT_REQUEST = "LogoutRequest"
def detect_saml_message_type(saml_request: str, is_post_binding: bool) -> str | None:
"""Parse SAML request to determine if AuthnRequest or LogoutRequest."""
try:
if is_post_binding:
decoded_xml = b64decode(saml_request.encode())
else:
decoded_xml = decode_base64_and_inflate(saml_request)
root = fromstring(decoded_xml)
if len(root.xpath("//samlp:AuthnRequest", namespaces=NS_MAP)):
return SAML_MESSAGE_TYPE_AUTHN_REQUEST
if len(root.xpath("//samlp:LogoutRequest", namespaces=NS_MAP)):
return SAML_MESSAGE_TYPE_LOGOUT_REQUEST
return None
except Exception: # noqa: BLE001
return None
@method_decorator(xframe_options_sameorigin, name="dispatch")
@method_decorator(csrf_exempt, name="dispatch")
class SAMLUnifiedView(View):
"""Unified SAML endpoint - handles SSO and SLO based on message type.
The operation type is determined by parsing
the incoming SAML message:
- AuthnRequest -> SSO flow (delegates to SAMLSSOBindingRedirectView/POSTView)
- LogoutRequest -> SLO flow (delegates to SPInitiatedSLOBindingRedirectView/POSTView)
- LogoutResponse -> SLO completion (delegates to SPInitiatedSLOBindingRedirectView/POSTView)
"""
def dispatch(self, request: HttpRequest, application_slug: str) -> HttpResponse:
"""Route the request based on SAML message type."""
# ak user was not logged in, redirected to login, and is back w POST payload in session
if SESSION_KEY_POST in request.session:
return self._delegate_to_sso(request, application_slug, is_post_binding=True)
# Determine binding from HTTP method
is_post_binding = request.method == "POST"
data = request.POST if is_post_binding else request.GET
# LogoutResponse - delegate to SLO view (handles it in dispatch)
if REQUEST_KEY_SAML_RESPONSE in data:
return self._delegate_to_slo(request, application_slug, is_post_binding)
# Check for SAML request
if REQUEST_KEY_SAML_REQUEST not in data:
LOGGER.info("SAML payload missing")
return bad_request_message(request, "The SAML request payload is missing.")
# Detect message type and delegate
saml_request = data[REQUEST_KEY_SAML_REQUEST]
message_type = detect_saml_message_type(saml_request, is_post_binding)
if message_type == SAML_MESSAGE_TYPE_AUTHN_REQUEST:
return self._delegate_to_sso(request, application_slug, is_post_binding)
elif message_type == SAML_MESSAGE_TYPE_LOGOUT_REQUEST:
return self._delegate_to_slo(request, application_slug, is_post_binding)
else:
LOGGER.warning("Unknown SAML message type", message_type=message_type)
return bad_request_message(
request, f"Unsupported SAML message type: {message_type or 'unknown'}"
)
def _delegate_to_sso(
self, request: HttpRequest, application_slug: str, is_post_binding: bool
) -> HttpResponse:
"""Delegate to the appropriate SSO view."""
if is_post_binding:
view = SAMLSSOBindingPOSTView.as_view()
else:
view = SAMLSSOBindingRedirectView.as_view()
return view(request, application_slug=application_slug)
def _delegate_to_slo(
self, request: HttpRequest, application_slug: str, is_post_binding: bool
) -> HttpResponse:
"""Delegate to the appropriate SLO view."""
if is_post_binding:
view = SPInitiatedSLOBindingPOSTView.as_view()
else:
view = SPInitiatedSLOBindingRedirectView.as_view()
return view(request, application_slug=application_slug)

View File

@@ -187,6 +187,7 @@ SPECTACULAR_SETTINGS = {
"PolicyEngineMode": "authentik.policies.models.PolicyEngineMode",
"PromptTypeEnum": "authentik.stages.prompt.models.FieldTypes",
"ProxyMode": "authentik.providers.proxy.models.ProxyMode",
"RedirectURITypeEnum": "authentik.providers.oauth2.models.RedirectURIType",
"SAMLBindingsEnum": "authentik.providers.saml.models.SAMLBindings",
"SAMLLogoutMethods": "authentik.providers.saml.models.SAMLLogoutMethods",
"SAMLNameIDPolicyEnum": "authentik.sources.saml.models.SAMLNameIDPolicy",
@@ -220,7 +221,7 @@ REST_FRAMEWORK = {
"authentik.api.search.ql.QLSearch",
"authentik.rbac.filters.ObjectFilter",
"django_filters.rest_framework.DjangoFilterBackend",
"rest_framework.filters.OrderingFilter",
"authentik.api.ordering.NullsAwareOrderingFilter",
],
"DEFAULT_PERMISSION_CLASSES": ("authentik.rbac.permissions.ObjectPermissions",),
"DEFAULT_AUTHENTICATION_CLASSES": (

View File

@@ -389,17 +389,19 @@ class ThrottlingMixin(models.Model):
"""Check if throttling is enabled"""
return self.get_throttle_factor() > 0
def get_throttle_factor(self): # pragma: no cover
def get_throttle_factor(self) -> float: # pragma: no cover
"""
This must be implemented to return the throttle factor.
Returns the throttling factor.
"""
return getattr(self, "_throttle_factor", 1.0)
def set_throttle_factor(self, throttle_factor: float) -> None:
"""
Sets the throttle factor to use. Call this to override the default value of 1.
The number of seconds required between verification attempts will be
:math:`c2^{n-1}` where `c` is this factor and `n` is the number of
previous failures. A factor of 1 translates to delays of 1, 2, 4, 8,
etc. seconds. A factor of 0 disables the throttling.
Normally this is just a wrapper for a plugin-specific setting like
:setting:`OTP_EMAIL_THROTTLE_FACTOR`.
"""
raise NotImplementedError()
self._throttle_factor = throttle_factor

View File

@@ -6,7 +6,6 @@ from threading import Thread
from django.contrib.auth.models import AnonymousUser
from django.db import connection
from django.test import TestCase, TransactionTestCase
from django.test.utils import override_settings
from django.utils import timezone
from freezegun import freeze_time
@@ -110,8 +109,24 @@ class ThrottlingTestMixin:
self.assertEqual(verify_is_allowed3, True)
self.assertEqual(data3, None)
def test_set_throttle_factor_is_reflected(self):
"""`set_throttle_factor` must drive `get_throttle_factor`."""
self.device.set_throttle_factor(5.5)
self.assertEqual(self.device.get_throttle_factor(), 5.5)
self.device.set_throttle_factor(0)
self.assertEqual(self.device.get_throttle_factor(), 0)
def test_throttling_disabled_by_factor_zero(self):
"""Setting the throttle factor to 0 must actually disable throttling.
A failed attempt followed by a successful one must succeed. The lockout
path must not kick in when the factor is 0.
"""
self.device.set_throttle_factor(0)
self.assertFalse(self.device.verify_token(self.invalid_token()))
self.assertTrue(self.device.verify_token(self.valid_token()))
@override_settings(OTP_STATIC_THROTTLE_FACTOR=0)
class APITestCase(TestCase):
"""Test API"""
@@ -119,6 +134,7 @@ class APITestCase(TestCase):
self.alice = create_test_admin_user("alice")
self.bob = create_test_admin_user("bob")
device = self.alice.staticdevice_set.create()
device.set_throttle_factor(0)
self.valid = generate_id(length=16)
device.token_set.create(token=self.valid)
@@ -138,6 +154,8 @@ class APITestCase(TestCase):
verified = verify_token(self.alice, device.persistent_id, "bogus")
self.assertIsNone(verified)
self.alice.staticdevice_set.get().throttle_reset()
verified = verify_token(self.alice, device.persistent_id, self.valid)
self.assertIsNotNone(verified)
@@ -146,11 +164,12 @@ class APITestCase(TestCase):
verified = match_token(self.alice, "bogus")
self.assertIsNone(verified)
self.alice.staticdevice_set.get().throttle_reset()
verified = match_token(self.alice, self.valid)
self.assertEqual(verified, self.alice.staticdevice_set.first())
@override_settings(OTP_STATIC_THROTTLE_FACTOR=0)
class ConcurrencyTestCase(TransactionTestCase):
"""Test concurrent verifications"""

View File

@@ -0,0 +1,33 @@
# Generated by Django 5.2.12 on 2026-04-02 15:14
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
(
"authentik_stages_authenticator_email",
"0002_alter_authenticatoremailstage_friendly_name",
),
]
operations = [
migrations.AddField(
model_name="emaildevice",
name="throttling_failure_count",
field=models.PositiveIntegerField(
default=0, help_text="Number of successive failed attempts."
),
),
migrations.AddField(
model_name="emaildevice",
name="throttling_failure_timestamp",
field=models.DateTimeField(
blank=True,
default=None,
help_text="A timestamp of the last failed verification attempt. Null if last attempt succeeded.",
null=True,
),
),
]

View File

@@ -14,7 +14,7 @@ from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage
from authentik.lib.config import CONFIG
from authentik.lib.models import SerializerModel
from authentik.lib.utils.time import timedelta_string_validator
from authentik.stages.authenticator.models import SideChannelDevice
from authentik.stages.authenticator.models import SideChannelDevice, ThrottlingMixin
from authentik.stages.email.models import EmailTemplates
from authentik.stages.email.utils import TemplateEmailMessage
@@ -116,7 +116,7 @@ class AuthenticatorEmailStage(ConfigurableStage, FriendlyNamedStage, Stage):
verbose_name_plural = _("Email Authenticator Setup Stages")
class EmailDevice(SerializerModel, SideChannelDevice):
class EmailDevice(SerializerModel, ThrottlingMixin, SideChannelDevice):
"""Email Device"""
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
@@ -130,6 +130,20 @@ class EmailDevice(SerializerModel, SideChannelDevice):
return EmailDeviceSerializer
def verify_token(self, token: str) -> bool:
verify_allowed, _ = self.verify_is_allowed()
if verify_allowed:
verified = super().verify_token(token)
if verified:
self.throttle_reset()
else:
self.throttle_increment()
else:
verified = False
return verified
def _compose_email(self) -> TemplateEmailMessage:
try:
pending_user = self.user

View File

@@ -8,6 +8,7 @@ from django.core.mail.backends.locmem import EmailBackend
from django.core.mail.backends.smtp import EmailBackend as SMTPEmailBackend
from django.db.utils import IntegrityError
from django.template.exceptions import TemplateDoesNotExist
from django.test import TestCase
from django.urls import reverse
from django.utils.timezone import now
@@ -16,6 +17,7 @@ from authentik.flows.models import FlowStageBinding
from authentik.flows.tests import FlowTestCase
from authentik.lib.config import CONFIG
from authentik.lib.utils.email import mask_email
from authentik.stages.authenticator.tests import ThrottlingTestMixin
from authentik.stages.authenticator_email.api import (
AuthenticatorEmailStageSerializer,
EmailDeviceSerializer,
@@ -79,6 +81,7 @@ class TestAuthenticatorEmailStage(FlowTestCase):
self.assertFalse(self.device.verify_token("000000"))
# Verify correct token (should clear token after verification)
self.device.throttle_reset(commit=False)
self.assertTrue(self.device.verify_token(token))
self.assertIsNone(self.device.token)
@@ -329,3 +332,27 @@ class TestAuthenticatorEmailStage(FlowTestCase):
# Test AuthenticatorEmailStage send method
self.stage.send(self.device)
self.assertEqual(len(mail.outbox), 1)
class TestEmailDeviceThrottling(ThrottlingTestMixin, TestCase):
def setUp(self):
super().setUp()
flow = create_test_flow()
user = create_test_user()
stage = AuthenticatorEmailStage.objects.create(
name="email-authenticator-throttle",
use_global_settings=True,
from_address="test@authentik.local",
configure_flow=flow,
token_expiry="minutes=30",
) # nosec
self.device = EmailDevice.objects.create(
user=user, stage=stage, email="throttle@authentik.local"
)
self.device.generate_token()
def valid_token(self):
return self.device.token
def invalid_token(self):
return "000000" if self.device.token != "000000" else "111111"

View File

@@ -0,0 +1,30 @@
# Generated by Django 5.2.12 on 2026-04-16 17:28
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_stages_authenticator_sms", "0008_alter_authenticatorsmsstage_friendly_name"),
]
operations = [
migrations.AddField(
model_name="smsdevice",
name="throttling_failure_count",
field=models.PositiveIntegerField(
default=0, help_text="Number of successive failed attempts."
),
),
migrations.AddField(
model_name="smsdevice",
name="throttling_failure_timestamp",
field=models.DateTimeField(
blank=True,
default=None,
help_text="A timestamp of the last failed verification attempt. Null if last attempt succeeded.",
null=True,
),
),
]

View File

@@ -20,7 +20,7 @@ from authentik.events.utils import sanitize_item
from authentik.flows.models import ConfigurableStage, FriendlyNamedStage, Stage
from authentik.lib.models import SerializerModel
from authentik.lib.utils.http import get_http_session
from authentik.stages.authenticator.models import SideChannelDevice
from authentik.stages.authenticator.models import SideChannelDevice, ThrottlingMixin
LOGGER = get_logger()
@@ -197,7 +197,7 @@ def hash_phone_number(phone_number: str) -> str:
return "hash:" + sha256(phone_number.encode()).hexdigest()
class SMSDevice(SerializerModel, SideChannelDevice):
class SMSDevice(SerializerModel, ThrottlingMixin, SideChannelDevice):
"""SMS Device"""
user = models.ForeignKey(get_user_model(), on_delete=models.CASCADE)
@@ -224,11 +224,19 @@ class SMSDevice(SerializerModel, SideChannelDevice):
return SMSDeviceSerializer
def verify_token(self, token):
valid = super().verify_token(token)
if valid:
self.save()
return valid
def verify_token(self, token: str) -> bool:
verify_allowed, _ = self.verify_is_allowed()
if verify_allowed:
verified = super().verify_token(token)
if verified:
self.throttle_reset()
else:
self.throttle_increment()
else:
verified = False
return verified
def __str__(self):
return str(self.name) or str(self.user_id)

View File

@@ -3,6 +3,7 @@
from unittest.mock import MagicMock, patch
from urllib.parse import parse_qsl
from django.test import TestCase
from django.urls import reverse
from requests_mock import Mocker
@@ -12,6 +13,7 @@ from authentik.flows.planner import FlowPlan
from authentik.flows.tests import FlowTestCase
from authentik.flows.views.executor import SESSION_KEY_PLAN
from authentik.lib.generators import generate_id
from authentik.stages.authenticator.tests import ThrottlingTestMixin
from authentik.stages.authenticator_sms.models import (
AuthenticatorSMSStage,
SMSDevice,
@@ -357,3 +359,30 @@ class AuthenticatorSMSStageTests(FlowTestCase):
},
phone_number_required=False,
)
class TestSMSDeviceThrottling(ThrottlingTestMixin, TestCase):
"""Test ThrottlingMixin behaviour on SMSDevice.verify_token"""
def setUp(self):
super().setUp()
flow = create_test_flow()
user = create_test_admin_user()
stage = AuthenticatorSMSStage.objects.create(
flow=flow,
name="sms-throttle",
provider=SMSProviders.GENERIC,
from_number="1234",
)
self.device = SMSDevice.objects.create(
user=user,
stage=stage,
phone_number="+15551230001",
)
self.device.generate_token()
def valid_token(self):
return self.device.token
def invalid_token(self):
return "000000" if self.device.token != "000000" else "111111"

View File

@@ -3,7 +3,6 @@
from base64 import b32encode
from os import urandom
from django.conf import settings
from django.core.validators import MaxValueValidator
from django.db import models
from django.utils.translation import gettext_lazy as _
@@ -78,9 +77,6 @@ class StaticDevice(SerializerModel, ThrottlingMixin, Device):
return StaticDeviceSerializer
def get_throttle_factor(self):
return getattr(settings, "OTP_STATIC_THROTTLE_FACTOR", 1)
def verify_token(self, token):
verify_allowed, _ = self.verify_is_allowed()
if verify_allowed:

View File

@@ -1,6 +1,5 @@
"""Test Static API"""
from django.test.utils import override_settings
from django.urls import reverse
from rest_framework.test import APITestCase
@@ -44,9 +43,6 @@ class DeviceTest(TestCase):
str(device)
@override_settings(
OTP_STATIC_THROTTLE_FACTOR=1,
)
class ThrottlingTestCase(ThrottlingTestMixin, TestCase):
"""Test static device throttling"""

View File

@@ -194,9 +194,6 @@ class TOTPDevice(SerializerModel, ThrottlingMixin, Device):
return verified
def get_throttle_factor(self):
return getattr(settings, "OTP_TOTP_THROTTLE_FACTOR", 1)
@property
def config_url(self):
"""

View File

@@ -63,11 +63,14 @@ class TOTPDeviceMixin:
@override_settings(
OTP_TOTP_SYNC=False,
OTP_TOTP_THROTTLE_FACTOR=0,
)
class TOTPTest(TOTPDeviceMixin, TestCase):
"""TOTP tests"""
def setUp(self):
super().setUp()
self.device.set_throttle_factor(0)
def test_default_key(self):
"""Ensure default_key is valid"""
device = self.alice.totpdevice_set.create()
@@ -190,9 +193,6 @@ class TOTPTest(TOTPDeviceMixin, TestCase):
self.assertEqual(params["image"][0], image_url)
@override_settings(
OTP_TOTP_THROTTLE_FACTOR=1,
)
class ThrottlingTestCase(TOTPDeviceMixin, ThrottlingTestMixin, TestCase):
"""Test TOTP Throttling"""

View File

@@ -39,6 +39,10 @@ class AuthenticatorValidateStageSerializer(StageSerializer):
"webauthn_hints",
"webauthn_allowed_device_types",
"webauthn_allowed_device_types_obj",
"email_otp_throttling_factor",
"sms_otp_throttling_factor",
"totp_otp_throttling_factor",
"static_otp_throttling_factor",
]

View File

@@ -3,6 +3,7 @@
from typing import TYPE_CHECKING
from urllib.parse import urlencode
from django.db import transaction
from django.http import HttpRequest
from django.http.response import Http404
from django.shortcuts import get_object_or_404
@@ -29,8 +30,8 @@ from authentik.flows.stage import StageView
from authentik.lib.utils.email import mask_email
from authentik.lib.utils.time import timedelta_from_string
from authentik.root.middleware import ClientIPMiddleware
from authentik.stages.authenticator import match_token
from authentik.stages.authenticator.models import Device
from authentik.stages.authenticator import devices_for_user
from authentik.stages.authenticator.models import Device, ThrottlingMixin
from authentik.stages.authenticator_duo.models import AuthenticatorDuoStage, DuoDevice
from authentik.stages.authenticator_email.models import EmailDevice
from authentik.stages.authenticator_sms.models import SMSDevice
@@ -143,7 +144,20 @@ def select_challenge_email(request: HttpRequest, device: EmailDevice):
def validate_challenge_code(code: str, stage_view: StageView, user: User) -> Device:
"""Validate code-based challenges. We test against every device, on purpose, as
the user mustn't choose between totp and static devices."""
device = match_token(user, code)
with transaction.atomic():
for device in devices_for_user(user, for_verify=True):
if isinstance(device, ThrottlingMixin):
throttling_factor = stage_view.executor.current_stage.get_throttling_factor(
DeviceClasses.from_model_label(device.model_label())
)
if throttling_factor is not None:
device.set_throttle_factor(throttling_factor)
if device.verify_token(code):
break
else:
device = None
if not device:
login_failed.send(
sender=__name__,

View File

@@ -0,0 +1,36 @@
# Generated by Django 5.2.12 on 2026-04-16 16:33
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
(
"authentik_stages_authenticator_validate",
"0015_authenticatorvalidatestage_webauthn_hints",
),
]
operations = [
migrations.AddField(
model_name="authenticatorvalidatestage",
name="email_otp_throttling_factor",
field=models.FloatField(default=1),
),
migrations.AddField(
model_name="authenticatorvalidatestage",
name="sms_otp_throttling_factor",
field=models.FloatField(default=1),
),
migrations.AddField(
model_name="authenticatorvalidatestage",
name="static_otp_throttling_factor",
field=models.FloatField(default=1),
),
migrations.AddField(
model_name="authenticatorvalidatestage",
name="totp_otp_throttling_factor",
field=models.FloatField(default=1),
),
]

View File

@@ -22,6 +22,12 @@ class DeviceClasses(models.TextChoices):
SMS = "sms", _("SMS")
EMAIL = "email", _("Email")
@staticmethod
def from_model_label(model_label: str) -> DeviceClasses:
return getattr(
DeviceClasses, model_label.rsplit(".", maxsplit=1)[-1][: -len("device")].upper()
)
def default_device_classes() -> list:
"""By default, accept all device classes"""
@@ -82,6 +88,11 @@ class AuthenticatorValidateStage(Stage):
"authentik_stages_authenticator_webauthn.WebAuthnDeviceType", blank=True
)
email_otp_throttling_factor = models.FloatField(default=1)
sms_otp_throttling_factor = models.FloatField(default=1)
totp_otp_throttling_factor = models.FloatField(default=1)
static_otp_throttling_factor = models.FloatField(default=1)
@property
def serializer(self) -> type[BaseSerializer]:
from authentik.stages.authenticator_validate.api import AuthenticatorValidateStageSerializer
@@ -98,6 +109,17 @@ class AuthenticatorValidateStage(Stage):
def component(self) -> str:
return "ak-stage-authenticator-validate-form"
def get_throttling_factor(self, device_class: DeviceClasses) -> float | None:
if device_class == DeviceClasses.EMAIL:
return self.email_otp_throttling_factor
elif device_class == DeviceClasses.SMS:
return self.sms_otp_throttling_factor
elif device_class == DeviceClasses.TOTP:
return self.totp_otp_throttling_factor
elif device_class == DeviceClasses.STATIC:
return self.static_otp_throttling_factor
return None
class Meta:
verbose_name = _("Authenticator Validation Stage")
verbose_name_plural = _("Authenticator Validation Stages")

View File

@@ -0,0 +1,247 @@
from django.test import TestCase
from django.test.client import RequestFactory
from django.urls.base import reverse
from rest_framework.exceptions import ValidationError
from authentik.core.tests.utils import create_test_admin_user, create_test_flow
from authentik.flows.models import FlowStageBinding
from authentik.flows.stage import StageView
from authentik.flows.tests import FlowTestCase
from authentik.flows.views.executor import FlowExecutorView
from authentik.lib.generators import generate_id
from authentik.stages.authenticator_email.models import AuthenticatorEmailStage, EmailDevice
from authentik.stages.authenticator_sms.models import (
AuthenticatorSMSStage,
SMSDevice,
SMSProviders,
)
from authentik.stages.authenticator_validate.challenge import validate_challenge_code
from authentik.stages.authenticator_validate.models import (
AuthenticatorValidateStage,
DeviceClasses,
)
from authentik.stages.identification.models import IdentificationStage, UserFields
class DeviceClassesHelperTests(TestCase):
"""Tests for the DeviceClasses.from_model_label helper."""
def test_from_model_label_all_classes(self):
cases = {
"authentik_stages_authenticator_email.emaildevice": DeviceClasses.EMAIL,
"authentik_stages_authenticator_sms.smsdevice": DeviceClasses.SMS,
"authentik_stages_authenticator_totp.totpdevice": DeviceClasses.TOTP,
"authentik_stages_authenticator_static.staticdevice": DeviceClasses.STATIC,
"authentik_stages_authenticator_duo.duodevice": DeviceClasses.DUO,
"authentik_stages_authenticator_webauthn.webauthndevice": DeviceClasses.WEBAUTHN,
}
for label, expected in cases.items():
with self.subTest(label=label):
self.assertEqual(DeviceClasses.from_model_label(label), expected)
class AuthenticatorValidateStageFactorTests(TestCase):
"""Tests for AuthenticatorValidateStage.get_throttling_factor."""
def test_per_class_factors_returned(self):
stage = AuthenticatorValidateStage.objects.create(
name=generate_id(),
email_otp_throttling_factor=5,
sms_otp_throttling_factor=6,
totp_otp_throttling_factor=7,
static_otp_throttling_factor=8,
)
self.assertEqual(stage.get_throttling_factor(DeviceClasses.EMAIL), 5)
self.assertEqual(stage.get_throttling_factor(DeviceClasses.SMS), 6)
self.assertEqual(stage.get_throttling_factor(DeviceClasses.TOTP), 7)
self.assertEqual(stage.get_throttling_factor(DeviceClasses.STATIC), 8)
def test_no_factor_for_webauthn_or_duo(self):
stage = AuthenticatorValidateStage.objects.create(name=generate_id())
self.assertIsNone(stage.get_throttling_factor(DeviceClasses.WEBAUTHN))
self.assertIsNone(stage.get_throttling_factor(DeviceClasses.DUO))
class ValidateChallengeCodeThrottlingTests(FlowTestCase):
"""Tests for validate_challenge_code throttling behavior."""
def setUp(self) -> None:
super().setUp()
self.user = create_test_admin_user()
self.request_factory = RequestFactory()
self.email_stage = AuthenticatorEmailStage.objects.create(
name="email-stage-validate-throttle",
use_global_settings=True,
from_address="test@authentik.local",
token_expiry="minutes=30",
) # nosec
self.sms_stage = AuthenticatorSMSStage.objects.create(
name="sms-stage-validate-throttle",
provider=SMSProviders.GENERIC,
from_number="1234",
)
def _validate_stage(self, **factors) -> AuthenticatorValidateStage:
return AuthenticatorValidateStage.objects.create(
name=generate_id(),
device_classes=[
DeviceClasses.EMAIL,
DeviceClasses.SMS,
DeviceClasses.TOTP,
DeviceClasses.STATIC,
],
**factors,
)
def _stage_view(self, validate_stage: AuthenticatorValidateStage) -> StageView:
request = self.request_factory.get("/")
return StageView(FlowExecutorView(current_stage=validate_stage), request=request)
def _email_device(self, email: str = "throttle@authentik.local") -> EmailDevice:
return EmailDevice.objects.create(
user=self.user,
stage=self.email_stage,
confirmed=True,
email=email,
)
def _sms_device(self, phone_number: str = "+15551230101") -> SMSDevice:
return SMSDevice.objects.create(
user=self.user,
stage=self.sms_stage,
confirmed=True,
phone_number=phone_number,
)
def test_stage_factor_applied_to_email_device(self):
"""The stage's email_otp_throttling_factor is pushed onto the device before verify."""
stage = self._validate_stage(email_otp_throttling_factor=3)
device = self._email_device()
device.generate_token()
with self.assertRaises(ValidationError):
validate_challenge_code("000000", self._stage_view(stage), self.user)
device.refresh_from_db()
self.assertEqual(device.throttling_failure_count, 1)
# verify_is_allowed must compute the delay using factor=3 (3 * 2^0 = 3s).
device.set_throttle_factor(3)
allowed, data = device.verify_is_allowed()
self.assertFalse(allowed)
required = data["locked_until"] - device.throttling_failure_timestamp
self.assertAlmostEqual(required.total_seconds(), 3, places=3)
def test_factor_zero_disables_throttling_end_to_end(self):
"""With email_otp_throttling_factor=0, repeated failures do not lock the device."""
stage = self._validate_stage(email_otp_throttling_factor=0)
device = self._email_device()
device.generate_token()
token = device.token
for _ in range(10):
with self.assertRaises(ValidationError):
validate_challenge_code("000000", self._stage_view(stage), self.user)
matched = validate_challenge_code(token, self._stage_view(stage), self.user)
self.assertEqual(matched.pk, device.pk)
def test_lockout_persists_across_calls(self):
"""
A correct token on the second call is still blocked and does not increment the counter.
"""
stage = self._validate_stage(email_otp_throttling_factor=1)
device = self._email_device()
device.generate_token()
token = device.token
invalid_token = "000000" if token != "000000" else "111111" # nosec
with self.assertRaises(ValidationError):
validate_challenge_code(invalid_token, self._stage_view(stage), self.user)
# Immediately try with the correct token: lockout still active, attempt must be rejected.
with self.assertRaises(ValidationError):
validate_challenge_code(token, self._stage_view(stage), self.user)
device.refresh_from_db()
# Token wasn't consumed (verification never ran), and counter didn't get incremented.
self.assertEqual(device.token, token)
self.assertEqual(device.throttling_failure_count, 1)
class ValidateStageThrottlingFlowTests(FlowTestCase):
"""End-to-end lockout behavior through the flow executor HTTP API."""
def setUp(self) -> None:
super().setUp()
self.user = create_test_admin_user()
self.email_stage = AuthenticatorEmailStage.objects.create(
name="email-stage-flow-throttle",
use_global_settings=True,
from_address="test@authentik.local",
token_expiry="minutes=30",
) # nosec
self.ident_stage = IdentificationStage.objects.create(
name=generate_id(),
user_fields=[UserFields.USERNAME],
)
self.validate_stage = AuthenticatorValidateStage.objects.create(
name=generate_id(),
device_classes=[DeviceClasses.EMAIL],
email_otp_throttling_factor=1,
)
self.flow = create_test_flow()
FlowStageBinding.objects.create(target=self.flow, stage=self.ident_stage, order=0)
FlowStageBinding.objects.create(target=self.flow, stage=self.validate_stage, order=1)
def _identify(self):
response = self.client.post(
reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}),
{"uid_field": self.user.username},
follow=True,
)
self.assertEqual(response.status_code, 200)
def _select_email(self, device: EmailDevice):
self.client.post(
reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}),
{
"component": "ak-stage-authenticator-validate",
"selected_challenge": {
"device_class": "email",
"device_uid": str(device.pk),
"challenge": {},
"last_used": None,
},
},
)
def test_bad_code_then_correct_code_is_still_blocked(self):
"""After a bad code over HTTP, a subsequent correct code is still rejected
because the lockout persists in the database."""
device = EmailDevice.objects.create(
user=self.user,
confirmed=True,
stage=self.email_stage,
email="throttle-flow@authentik.local",
)
self._identify()
self._select_email(device)
# Server generated and stored the token - grab it from DB.
device.refresh_from_db()
token = device.token
# First attempt: bad code - must increment the DB counter.
self.client.post(
reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}),
{"component": "ak-stage-authenticator-validate", "code": "000000"},
)
device.refresh_from_db()
self.assertEqual(device.throttling_failure_count, 1)
self.assertEqual(device.token, token)
# Second attempt with the correct token - still blocked.
response = self.client.post(
reverse("authentik_api:flow-executor", kwargs={"flow_slug": self.flow.slug}),
{"component": "ak-stage-authenticator-validate", "code": token},
)
self.assertStageResponse(
response,
flow=self.flow,
component="ak-stage-authenticator-validate",
)
device.refresh_from_db()
# Counter wasn't incremented on a blocked attempt
self.assertEqual(device.throttling_failure_count, 1)
# Token wasn't consumed.
self.assertEqual(device.token, token)

File diff suppressed because one or more lines are too long

View File

@@ -16,7 +16,7 @@ class RedirectMode(models.TextChoices):
class RedirectStage(Stage):
"""Redirect the user to another flow, potentially with all gathered context."""
"""Redirect the user to a static URL or another flow, optionally with all gathered context."""
keep_context = models.BooleanField(default=True)
mode = models.TextField(choices=RedirectMode.choices)

View File

@@ -7,7 +7,7 @@ from dramatiq.broker import Broker, MessageProxy, get_broker
from dramatiq.middleware.middleware import Middleware
from dramatiq.middleware.retries import Retries
from dramatiq.results.middleware import Results
from dramatiq.worker import Worker, _ConsumerThread, _WorkerThread
from dramatiq.worker import ConsumerThread, Worker, WorkerThread
from authentik.tasks.broker import PostgresBroker
@@ -20,7 +20,7 @@ class TestWorker(Worker):
self.worker_id = 1000
self.work_queue = PriorityQueue()
self.consumers = {
TESTING_QUEUE: _ConsumerThread(
TESTING_QUEUE: ConsumerThread(
broker=self.broker,
queue_name=TESTING_QUEUE,
prefetch=2,
@@ -33,7 +33,7 @@ class TestWorker(Worker):
prefetch=2,
timeout=1,
)
self._worker = _WorkerThread(
self._worker = WorkerThread(
broker=self.broker,
consumers=self.consumers,
work_queue=self.work_queue,
@@ -78,17 +78,18 @@ def use_test_broker():
actor.broker = broker
actor.broker.declare_actor(actor)
for middleware_class, middleware_kwargs in Conf().middlewares:
middleware: Middleware = import_string(middleware_class)(
for middleware_class_path, middleware_kwargs in Conf().middlewares:
middleware_class = import_string(middleware_class_path)
if issubclass(middleware_class, Results):
middleware_kwargs["backend"] = import_string(Conf().result_backend)(
*Conf().result_backend_args,
**Conf().result_backend_kwargs,
)
middleware: Middleware = middleware_class(
**middleware_kwargs,
)
if isinstance(middleware, Retries):
middleware.max_retries = 0
if isinstance(middleware, Results):
middleware.backend = import_string(Conf().result_backend)(
*Conf().result_backend_args,
**Conf().result_backend_kwargs,
)
broker.add_middleware(middleware)
broker.start()

View File

@@ -19,24 +19,30 @@ from authentik.tenants.models import Tenant
class FlagJSONField(JSONDictField):
def to_internal_value(self, data: str):
flags = super().to_internal_value(data)
for flag in Flag.available(visibility="system", exclude_system=False):
flags[flag().key] = flag.get()
return flags
def to_representation(self, value: dict) -> dict:
"""Exclude any system flags that aren't modifiable"""
new_value = value.copy()
for flag in Flag.available(exclude_system=False):
_flag = flag()
# Exclude any system flags that aren't modifiable
if _flag.visibility == "system":
new_value.pop(_flag.key, None)
# Explicitly present unset flags as if they were set to default
if _flag.key not in value:
value[_flag.key] = _flag.default
return super().to_representation(new_value)
def run_validators(self, value: dict):
super().run_validators(value)
for flag in Flag.available(exclude_system=False):
for flag in Flag.available():
_flag = flag()
if _flag.key not in value:
continue
if _flag.visibility == "system":
value.pop(_flag.key, None)
continue
flag_value = value.get(_flag.key)
flag_type = get_args(_flag.__orig_bases__[0])[0]
if flag_value and not isinstance(flag_value, flag_type):
@@ -59,6 +65,8 @@ class FlagsJSONExtension(OpenApiSerializerFieldExtension):
props[_flag.key] = build_basic_type(get_args(_flag.__orig_bases__[0])[0])
if _flag.description:
props[_flag.key]["description"] = _flag.description
if _flag.deprecated:
props[_flag.key]["deprecated"] = _flag.deprecated
return build_object_type(props, required=props.keys())

View File

@@ -18,6 +18,7 @@ class Flag[T]:
Literal["none"] | Literal["public"] | Literal["authenticated"] | Literal["system"]
) = "none"
description: str | None = None
deprecated = False
def __init_subclass__(cls, key: str, **kwargs):
cls.__key = key

View File

@@ -85,10 +85,30 @@ class TestLocalSettingsAPI(APITestCase):
"flags": {"tenants_test_flag_sys": 123},
},
)
print(response.content)
self.assertEqual(response.status_code, 200)
self.tenant.refresh_from_db()
self.assertEqual(self.tenant.flags, {})
self.assertEqual(self.tenant.flags, {"setup": False, "tenants_test_flag_sys": False})
def test_settings_flags_system_empty_put(self):
"""Test settings API"""
self.tenant.flags = {}
self.tenant.save()
class _TestFlag(Flag[bool], key="tenants_test_flag_sys"):
default = False
visibility = "system"
self.client.force_login(self.local_admin)
response = self.client.patch(
reverse("authentik_api:tenant_settings"),
data={
"flags": {},
},
)
self.assertEqual(response.status_code, 200)
self.tenant.refresh_from_db()
self.assertEqual(self.tenant.flags, {"setup": False, "tenants_test_flag_sys": False})
def test_command(self):
self.tenant.flags = {}

View File

@@ -0,0 +1,211 @@
# Minimal Invitation-based Enrollment Blueprint
#
# Companion to flows-invitation-enrollment.yaml, intended for the "New Invitation"
# wizard in the admin UI. Creates a single enrollment flow with an invitation stage
# bound to it, plus the supporting prompt/user-write/user-login stages.
#
# All user-facing fields are parameterized via !Context with fallback defaults, so
# this blueprint can be imported directly (without context) or through the wizard
# with custom values.
#
# Context keys (all optional):
# flow_name Display name of the enrollment flow.
# flow_slug URL slug of the flow and suffix for sub-entity
# identifiers (so repeated imports with different
# slugs don't overwrite each other).
# stage_name Name of the invitation stage.
# continue_flow_without_invitation Whether the flow continues when no invitation
# is supplied (default: false).
# user_type "external" or "internal" (default: "external").
# Drives the user-write stage's user_type and
# user_path_template.
version: 1
metadata:
labels:
blueprints.goauthentik.io/instantiate: "false"
name: Invitation-based Enrollment (minimal)
entries:
- identifiers:
slug: !Context [flow_slug, invitation-enrollment-flow]
model: authentik_flows.flow
id: flow
attrs:
name: !Context [flow_name, Invitation Enrollment Flow]
title: !Context [flow_name, Invitation Enrollment Flow]
designation: enrollment
authentication: require_unauthenticated
- identifiers:
name: !Context [stage_name, invitation-stage]
id: invitation-stage
model: authentik_stages_invitation.invitationstage
attrs:
continue_flow_without_invitation: !Context [continue_flow_without_invitation, false]
- identifiers:
name:
!Format [
"invitation-enrollment-field-username-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-field-username
model: authentik_stages_prompt.prompt
attrs:
field_key: username
label: Username
type: username
required: true
placeholder: Username
placeholder_expression: false
order: 0
- identifiers:
name:
!Format [
"invitation-enrollment-field-password-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-field-password
model: authentik_stages_prompt.prompt
attrs:
field_key: password
label: Password
type: password
required: true
placeholder: Password
placeholder_expression: false
order: 1
- identifiers:
name:
!Format [
"invitation-enrollment-field-password-repeat-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-field-password-repeat
model: authentik_stages_prompt.prompt
attrs:
field_key: password_repeat
label: Password (repeat)
type: password
required: true
placeholder: Password (repeat)
placeholder_expression: false
order: 2
- identifiers:
name:
!Format [
"invitation-enrollment-field-name-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-field-name
model: authentik_stages_prompt.prompt
attrs:
field_key: name
label: Name
type: text
required: true
placeholder: Name
placeholder_expression: false
order: 0
- identifiers:
name:
!Format [
"invitation-enrollment-field-email-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-field-email
model: authentik_stages_prompt.prompt
attrs:
field_key: email
label: Email
type: email
required: true
placeholder: Email
placeholder_expression: false
order: 1
- identifiers:
name:
!Format [
"invitation-enrollment-prompt-credentials-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-stage-credentials
model: authentik_stages_prompt.promptstage
attrs:
fields:
- !KeyOf prompt-field-username
- !KeyOf prompt-field-password
- !KeyOf prompt-field-password-repeat
- identifiers:
name:
!Format [
"invitation-enrollment-prompt-details-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: prompt-stage-details
model: authentik_stages_prompt.promptstage
attrs:
fields:
- !KeyOf prompt-field-name
- !KeyOf prompt-field-email
- identifiers:
name:
!Format [
"invitation-enrollment-user-write-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: user-write-stage
model: authentik_stages_user_write.userwritestage
attrs:
user_creation_mode: always_create
user_type: !Context [user_type, external]
user_path_template:
!Format ["users/%s", !Context [user_type, external]]
- identifiers:
name:
!Format [
"invitation-enrollment-user-login-%s",
!Context [flow_slug, invitation-enrollment-flow],
]
id: user-login-stage
model: authentik_stages_user_login.userloginstage
- identifiers:
target: !KeyOf flow
stage: !KeyOf invitation-stage
order: 5
model: authentik_flows.flowstagebinding
attrs:
evaluate_on_plan: true
re_evaluate_policies: true
- identifiers:
target: !KeyOf flow
stage: !KeyOf prompt-stage-credentials
order: 10
model: authentik_flows.flowstagebinding
- identifiers:
target: !KeyOf flow
stage: !KeyOf prompt-stage-details
order: 15
model: authentik_flows.flowstagebinding
- identifiers:
target: !KeyOf flow
stage: !KeyOf user-write-stage
order: 20
model: authentik_flows.flowstagebinding
- identifiers:
target: !KeyOf flow
stage: !KeyOf user-login-stage
order: 100
model: authentik_flows.flowstagebinding

View File

@@ -14936,6 +14936,22 @@
"format": "uuid"
},
"title": "Webauthn allowed device types"
},
"email_otp_throttling_factor": {
"type": "number",
"title": "Email otp throttling factor"
},
"sms_otp_throttling_factor": {
"type": "number",
"title": "Sms otp throttling factor"
},
"totp_otp_throttling_factor": {
"type": "number",
"title": "Totp otp throttling factor"
},
"static_otp_throttling_factor": {
"type": "number",
"title": "Static otp throttling factor"
}
},
"required": []

View File

@@ -86,7 +86,6 @@ entries:
grant_types:
- authorization_code
- implicit
- hybrid
- refresh_token
property_mappings:
- !Find [authentik_providers_oauth2.scopemapping, [managed, goauthentik.io/providers/oauth2/scope-openid]]
@@ -130,7 +129,6 @@ entries:
grant_types:
- authorization_code
- implicit
- hybrid
- refresh_token
property_mappings:
- !Find [authentik_providers_oauth2.scopemapping, [managed, goauthentik.io/providers/oauth2/scope-openid]]

View File

@@ -38,6 +38,10 @@ function run_authentik {
echo cargo run -- "$@"
fi
;;
manage)
shift 1
echo python -m manage "$@"
;;
*)
echo "$@"
;;
@@ -79,7 +83,7 @@ function prepare_debug {
apt-get update
apt-get install -y --no-install-recommends krb5-kdc krb5-user krb5-admin-server libkrb5-dev gcc
source "${VENV_PATH}/bin/activate"
uv sync --active --frozen
uv sync --active --locked
touch /unittest.xml
chown authentik:authentik /unittest.xml
}

View File

@@ -9,7 +9,7 @@
"version": "0.0.0",
"license": "MIT",
"devDependencies": {
"aws-cdk": "^2.1119.0",
"aws-cdk": "^2.1120.0",
"cross-env": "^10.1.0"
},
"engines": {
@@ -25,9 +25,9 @@
"license": "MIT"
},
"node_modules/aws-cdk": {
"version": "2.1119.0",
"resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1119.0.tgz",
"integrity": "sha512-XBxZEKH3BY4M1EX6x0qBkmOAj8viErjpww14iH6Z3z6nI0YzjZeJ05eEl7eJwzUgv7NTGagWBS9m/eDJW5+dAg==",
"version": "2.1120.0",
"resolved": "https://registry.npmjs.org/aws-cdk/-/aws-cdk-2.1120.0.tgz",
"integrity": "sha512-vDVa0IX0FhizARdY/GLSParFglKbdHCIhM8IDmynrAv9w8uLLljzWMeLUOhC1XpMErDZ/npYEihAOjfKxTaMIw==",
"dev": true,
"license": "Apache-2.0",
"bin": {

View File

@@ -7,7 +7,7 @@
"aws-cfn": "cross-env CI=false cdk synth --version-reporting=false > template.yaml"
},
"devDependencies": {
"aws-cdk": "^2.1119.0",
"aws-cdk": "^2.1120.0",
"cross-env": "^10.1.0"
},
"engines": {

View File

@@ -200,7 +200,7 @@ RUN --mount=type=bind,target=pyproject.toml,src=pyproject.toml \
--mount=type=bind,target=packages/django-postgres-cache,src=packages/django-postgres-cache \
--mount=type=bind,target=rust-toolchain.toml,src=rust-toolchain.toml \
--mount=type=cache,id=uv-python-deps-$TARGETARCH$TARGETVARIANT,target=/root/.cache/uv \
uv sync --frozen --no-install-project --no-dev
uv sync --locked --no-install-project --no-dev
# Stage: Run
FROM python-base AS final-image
@@ -228,8 +228,7 @@ RUN apt-get update && \
# Required for runtime
apt-get install -y --no-install-recommends \
libpq5 libmaxminddb0 ca-certificates \
krb5-multidev libkrb5-3 libkdb5-10 libkadm5clnt-mit12 \
heimdal-multidev libkadm5clnt7t64-heimdal \
libkadm5clnt-mit12 libkadm5clnt7t64-heimdal \
libltdl7 libxslt1.1 && \
# Required for bootstrap & healtcheck
apt-get install -y --no-install-recommends runit && \

View File

@@ -28,12 +28,7 @@ class HttpHandler(BaseHTTPRequestHandler):
_ = db_conn.cursor()
def do_GET(self):
from django.db import (
DatabaseError,
InterfaceError,
OperationalError,
connections,
)
from django.db import DatabaseError, InterfaceError, OperationalError, connections
from psycopg.errors import AdminShutdown
from authentik.root.monitoring import monitoring_set
@@ -42,7 +37,6 @@ class HttpHandler(BaseHTTPRequestHandler):
AdminShutdown,
InterfaceError,
DatabaseError,
ConnectionError,
OperationalError,
)

Binary file not shown.

File diff suppressed because it is too large Load Diff

Binary file not shown.

View File

@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Václav Nováček <waclaw661@gmail.com>, 2026\n"
"Language-Team: Czech (Czech Republic) (https://app.transifex.com/authentik/teams/119923/cs_CZ/)\n"
@@ -106,6 +106,14 @@ msgstr "Chyba validace"
msgid "Blueprint file does not exist"
msgstr "Soubor s konfigurační šablonou neexistuje"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Ověřování konfigurační šablony selhalo"
@@ -114,6 +122,11 @@ msgstr "Ověřování konfigurační šablony selhalo"
msgid "Either path or content must be set."
msgstr "Musí být nastavena buď cesta, nebo obsah."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "Uživatel nemá oprávnění vytvořit {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Spravuje authentik"
@@ -244,10 +257,13 @@ msgstr ""
"pouze poskytovatele backchannel. Pokud je vypnuto, backchannel poskytovatelé"
" nejsou zahrnuti."
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "Uživatel nemá oprávnění vytvořit {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -309,6 +325,12 @@ msgstr ""
msgid "This field is required."
msgstr "Toto pole je povinné."
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "Jméno"
@@ -415,6 +437,10 @@ msgstr "Interní název aplikace, používaný v URI."
msgid "Open launch URL in a new browser tab or window."
msgstr "Otevřít úvodní URL v novém okně nebo kartě prohlížeče."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Aplikace"
@@ -606,6 +632,14 @@ msgstr "Odstranit dočasné uživatele vytvořené zdroji SAML."
msgid "Go home"
msgstr "Přejít domů"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -712,6 +746,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr "Objevit, importovat a aktualizovat certifikáty na souborovém systému."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -766,6 +804,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -837,6 +883,12 @@ msgstr ""
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -854,6 +906,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Ověřuji Váš prohlížeč..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -870,10 +935,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -901,7 +962,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -915,7 +977,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1158,6 +1220,14 @@ msgstr "Pro použití EAP-TLS je nutná Enterprise licence."
msgid "Enterprise is required to use the OAuth mode."
msgstr "Pro použití OAuth režimu je vyžadována Enterprise licence."
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1239,6 +1309,78 @@ msgstr ""
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Fáze konektoru Endpoint Authenticator Google Device Trust"
@@ -1255,10 +1397,6 @@ msgstr "Koncové zařízení"
msgid "Endpoint Devices"
msgstr "Koncová zařízení"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Ověřuji Váš prohlížeč..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1341,6 +1479,12 @@ msgstr ""
"Odeslat oznámení pouze jednou, například při posílání webhooku do kanálu "
"chatu."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1511,6 +1655,15 @@ msgstr "Zásady před tokem"
msgid "Flow"
msgstr "Tok"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Tok se nevztahuje na aktuálního uživatele."
@@ -1620,8 +1773,8 @@ msgstr "Token Toku"
msgid "Flow Tokens"
msgstr "Tokeny Toků"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -2006,22 +2159,6 @@ msgstr "Reputační skóre"
msgid "Reputation Scores"
msgstr "Reputační skóre"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "Čeká se na ověření..."
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
"Už se přihlašujete na jiné záložce. Stránka se obnoví, jakmile bude ověření "
"dokončeno."
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Ověřit na této záložce"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Nedostatečná oprávnění"
@@ -2147,6 +2284,14 @@ msgstr "Striktní porovnání URL"
msgid "Regular Expression URL matching"
msgstr "Porovnání URL regulárním výrazem"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "Back-channel"
@@ -2504,10 +2649,6 @@ msgstr "Poskytovatel proxy"
msgid "Proxy Providers"
msgstr "Poskytovatelé proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Ukončit relaci na outpostu proxy."
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2635,8 +2776,10 @@ msgstr ""
"omezení publika nebude přidáno."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Také známé jako EntityID."
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2854,6 +2997,10 @@ msgstr "Hodnota SAML NameID pro tuto relaci"
msgid "SAML NameID format"
msgstr "Formát SAML NameID"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "Relace SAML"
@@ -2882,6 +3029,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3158,7 +3313,7 @@ msgstr ""
" Prosím, kontaktujte správce.\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr "Je dovolen pouze jeden zdroj LDAP se synchronizací hesel"
@@ -3688,6 +3843,12 @@ msgstr ""
"Povolit autentikační tok iniciovaný Identity Providerem. Může představovat "
"bezpečnostní riziko, protože se nekontroluje request ID."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4108,6 +4269,10 @@ msgstr "Kroky validace autentikátoru"
msgid "No (allowed) MFA authenticator configured."
msgstr "Žádný (povolený) MFA autentikátor nebyl nastaven."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Krok nastavení autentikátoru WebAuthn"
@@ -4243,6 +4408,10 @@ msgstr "Email OTP"
msgid "Event Notification"
msgstr "Oznámení o události"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Pozvánka"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4361,6 +4530,62 @@ msgstr ""
"\n"
"Tento email byl odeslán z transportu oznámení %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4538,10 +4763,6 @@ msgstr "Pokud je povoleno, pozvánka bude po použití smazána."
msgid "Optional fixed data to enforce on user enrollment."
msgstr ""
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Pozvánka"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Pozvánky"
@@ -4654,6 +4875,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Výběr jazyků, které authentik podporuje"

View File

@@ -14,7 +14,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-23 00:25+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Lukas Nielsen, 2026\n"
"Language-Team: German (Germany) (https://app.transifex.com/authentik/teams/119923/de_DE/)\n"
@@ -111,6 +111,14 @@ msgstr "Validierungsfehler"
msgid "Blueprint file does not exist"
msgstr "Vorlagendatei existiert nicht"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Fehler bei der Validierung der Vorlage"
@@ -257,6 +265,14 @@ msgstr ""
"werden nur die backchannel Provider zurück gegeben. Zudem werden bei "
"Deaktivierung die backchannel Provider ausgeschlossen."
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr "Es sind keine führenden oder abschließenden Schrägstriche erlaubt."
@@ -435,6 +451,10 @@ msgstr "Interner Anwendungsname, wird in URLs verwendet."
msgid "Open launch URL in a new browser tab or window."
msgstr "Start-URL in einem neuen Browser-Fenster öffnen."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Anwendung"
@@ -934,10 +954,6 @@ msgstr "Es muss entweder eine Prüfergruppe oder ein Prüfer festgelegt werden."
msgid "Grace period must be shorter than the interval."
msgstr "Die Nachfrist muss kürzer sein als das Intervall."
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr "Für jeden Objekttyp ist nur eine typweite Regel zulässig."
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -968,10 +984,9 @@ msgid "Go to {self._get_model_name()}"
msgstr "Gehe zu {self._get_model_name()}"
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
"Die Zugriffsüberprüfung für {self.content_type.name} {str(self.object)} "
"steht an"
#: authentik/enterprise/lifecycle/models.py
msgid ""
@@ -988,8 +1003,8 @@ msgstr ""
"erledigt"
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgstr "Aufgaben zur Überprüfung von Lebenszyklusregeln zuweisen."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Apply lifecycle rule."
@@ -1332,6 +1347,78 @@ msgstr "Download"
msgid "Generate data export."
msgstr "Datenexport generieren."
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Endpunkt-Authenticator für Google Gerätevertrauen Verbindungs Stage"
@@ -2777,8 +2864,10 @@ msgstr ""
"Feld leer, wird keine Zielgruppenbeschränkung hinzugefügt."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Auch bekannt als EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -3000,6 +3089,10 @@ msgstr "SAML-NameID-Wert für diese Sitzung"
msgid "SAML NameID format"
msgstr "SAML-NameID-Format"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "SAML Sitzung"
@@ -3032,6 +3125,10 @@ msgstr "Salesforce"
msgid "Webex"
msgstr "Webex"
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -4946,6 +5043,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Statisch: Statischer Wert, wird so angezeigt, wie er ist."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "Authentik: Auswahl der von Authentik unterstützten Gebietsschemata"

View File

@@ -8,7 +8,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-01 03:47+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
@@ -101,6 +101,14 @@ msgstr ""
msgid "Blueprint file does not exist"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr ""

View File

@@ -22,9 +22,12 @@ Gestionnaire
ghec
Gitea
Gravitee
HACS
Homarr
Informatique
Jellyseerr
Kimai
Kiota
Knoc
Knocknoc
Komodo
@@ -43,13 +46,16 @@ Organizr
Packagify
Palo
Papra
PhotoPrism
pfSense
phpipam
Planka
Plesk
PostHog
proftpd
Qube
Relatedly
Seerr
Sidero
snipeit
sonarqube
@@ -61,7 +67,6 @@ Vikunja
Wazuh
Wdio
Weixin
Kiota
Wekan
Xcreds
Zammad

Binary file not shown.

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Marc Schmitt, 2025\n"
"Language-Team: Spanish (Spain) (https://app.transifex.com/authentik/teams/119923/es_ES/)\n"
@@ -105,6 +105,14 @@ msgstr "Error de validación"
msgid "Blueprint file does not exist"
msgstr "El archivo de plantilla(blueprint) no existe"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "No se pudo validar la plantilla(blueprint)"
@@ -113,6 +121,11 @@ msgstr "No se pudo validar la plantilla(blueprint)"
msgid "Either path or content must be set."
msgstr "Se debe establecer una ruta o contenido."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "El usuario carece de permisos para crear {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Administrado por authentik"
@@ -248,10 +261,13 @@ msgstr ""
"secundario. Cuando se configura como falso, se excluyen los proveedores de "
"canal secundario."
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "El usuario carece de permisos para crear {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -313,6 +329,12 @@ msgstr ""
msgid "This field is required."
msgstr ""
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nombre"
@@ -419,6 +441,10 @@ msgstr "Nombre de la aplicación interna, utilizado en las URL."
msgid "Open launch URL in a new browser tab or window."
msgstr "Abrir la URL de inicio en una nueva pestaña o ventana del navegador."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Aplicación"
@@ -609,6 +635,14 @@ msgstr "Eliminar usuarios temporales creados por SAML Sources."
msgid "Go home"
msgstr "Ir al inicio"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -716,6 +750,10 @@ msgid "Discover, import and update certificates from the filesystem."
msgstr ""
"Descubra, importe y actualice certificados desde el sistema de archivos."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -770,6 +808,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -840,6 +886,12 @@ msgstr "Se requiere de Enterprise para crear/actualizar este objeto."
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -857,6 +909,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verificando tu navegador..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -873,10 +938,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -904,7 +965,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -918,7 +980,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1159,6 +1221,14 @@ msgstr ""
msgid "Enterprise is required to use the OAuth mode."
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1240,6 +1310,78 @@ msgstr ""
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr ""
@@ -1260,10 +1402,6 @@ msgstr "Dispositivo de Punto de Conexión"
msgid "Endpoint Devices"
msgstr "Dispositivos de Punto de Conexión"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verificando tu navegador..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1347,6 +1485,12 @@ msgstr ""
"Envía notificaciones solo una vez, por ejemplo, al enviar un webhook a un "
"canal de chat."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1518,6 +1662,15 @@ msgstr "Políticas pre-flujo"
msgid "Flow"
msgstr "Flujo"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "El flujo no aplica al usuario actual."
@@ -1630,8 +1783,8 @@ msgstr "Token de flujo"
msgid "Flow Tokens"
msgstr "Tokens de flujo"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -2022,22 +2175,6 @@ msgstr "Puntuación de Reputacion"
msgid "Reputation Scores"
msgstr "Puntuaciones de Reputacion"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "Esperando autenticación"
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
"Ya estás autenticándote en otra pestaña. Esta página se actualizará una vez "
"que la autenticación se haya completado."
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Autenticar en esta pestaña"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Permiso denegado"
@@ -2166,6 +2303,14 @@ msgstr "Comparación de URL estricta"
msgid "Regular Expression URL matching"
msgstr "Coincidencia de URL con Expresiones Regulares"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr ""
@@ -2528,10 +2673,6 @@ msgstr "Proveedor de Proxy"
msgid "Proxy Providers"
msgstr "Proveedores de Proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Terminar sesión en Proxy outpost."
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2663,8 +2804,10 @@ msgstr ""
"vacío, no se agregará ninguna restricción de audiencia."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "También conocido como EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2877,6 +3020,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr ""
@@ -2905,6 +3052,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3188,7 +3343,7 @@ msgstr ""
" Por favor, contacta a tu administrador.\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
"Solo está permitida una Fuente de LDAP con sincronización de contraseña"
@@ -3722,6 +3877,12 @@ msgstr ""
" un riesgo para la seguridad, ya que no se valida el identificador de la "
"solicitud."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4150,6 +4311,10 @@ msgstr "Etapas de Validación del Autenticador"
msgid "No (allowed) MFA authenticator configured."
msgstr "No hay un autenticador MFA (permitido) configurado."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Etapa de Configuración del Autenticador WebAuthn"
@@ -4288,6 +4453,10 @@ msgstr "OTP por Correo Electrónico"
msgid "Event Notification"
msgstr ""
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Invitación"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4408,6 +4577,62 @@ msgstr ""
"\n"
"Este correo electrónico fue enviado desde el transporte de notificaciones %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4591,10 +4816,6 @@ msgstr "Cuando se habilita, la invitación se eliminará después de su uso."
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Datos fijos opcionales para aplicar en la inscripción de usuarios."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Invitación"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Invitaciones"
@@ -4719,6 +4940,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Estático: valor estático, que se muestra tal cual."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr ""

Binary file not shown.

View File

@@ -5,18 +5,18 @@
#
# Translators:
# Marc Schmitt, 2025
# Skyler Mäntysaari, 2025
# Jiri Grönroos <jiri.gronroos@iki.fi>, 2025
# Viima Veteläinen, 2026
# Uumas, 2026
# Skyler Mäntysaari, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Viima Veteläinen, 2026\n"
"Last-Translator: Skyler Mäntysaari, 2026\n"
"Language-Team: Finnish (Finland) (https://app.transifex.com/authentik/teams/119923/fi_FI/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -113,6 +113,14 @@ msgstr "Vahvistusvirhe"
msgid "Blueprint file does not exist"
msgstr "Suunnitelman tiedostoa ei löydetty"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Suunnitelman validointi ei onnistunut"
@@ -121,6 +129,11 @@ msgstr "Suunnitelman validointi ei onnistunut"
msgid "Either path or content must be set."
msgstr "Joko polku tai sisältö on määritettävä."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "Käyttäjältä puuttuu oikeus luoda {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Authentikin hallinnoima"
@@ -248,10 +261,13 @@ msgstr ""
"true, vain taustakanava-tarjoajat palautetaan. Kun asetus on false, "
"takakanava-tarjoajat suljetaan pois."
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "Käyttäjältä puuttuu oikeus luoda {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -313,6 +329,12 @@ msgstr "Sähköpostivaihetta ei löydetty."
msgid "This field is required."
msgstr "Tämä kenttä on pakollinen."
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nimi"
@@ -419,6 +441,10 @@ msgstr "Sovelluksen sisäinen nimi, jota käytetään URLeissa."
msgid "Open launch URL in a new browser tab or window."
msgstr "Avaa käynnistys-URL uuteen selainvälilehteen tai -ikkunaan."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Sovellus"
@@ -608,6 +634,14 @@ msgstr "Poista SAML-lähteiden luomat tilapäiset käyttäjät."
msgid "Go home"
msgstr "Siirry etusivulle"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr "Sivuston alatunniste"
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -714,6 +748,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr "Havaitse, tuo ja päivitä sertifikaatteja levyjärjestelmästä."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr "Valittu alusta ei ole tuettu"
@@ -768,6 +806,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -838,6 +884,12 @@ msgstr "Tämän objektin luontiin/päivittämiseen tarvitaan Enterprise-versiota
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -855,6 +907,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Selaintasi varmennetaan..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -871,10 +936,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -902,7 +963,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -916,7 +978,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1160,6 +1222,14 @@ msgstr "EAP-TLS:n käyttöön tarvitaan Enterprise-versiota."
msgid "Enterprise is required to use the OAuth mode."
msgstr "OAuth-tilan käyttöön tarvitaan Enterprise-versiota."
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1241,6 +1311,78 @@ msgstr "Lataa"
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Päätepisteen todentaja Google Device Trust Connector -vaihe"
@@ -1257,10 +1399,6 @@ msgstr "Päätelaite"
msgid "Endpoint Devices"
msgstr "Päätelaitteet"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Selaintasi varmennetaan..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1344,6 +1482,12 @@ msgstr ""
"Lähetä notifikaatio vain kerran, esimerkiksi kun lähetetään webhook-"
"tapahtuma pikaviestinkanavalle."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1515,6 +1659,15 @@ msgstr "Prosessia edeltävät käytännöt"
msgid "Flow"
msgstr "Prosessi"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Prosessi ei koske nykyistä käyttäjää."
@@ -1624,9 +1777,9 @@ msgstr "Prosessin tunniste"
msgid "Flow Tokens"
msgstr "Prosessin tunnisteet"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
msgstr "Sivuston alatunniste"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
msgid "Invalid next URL"
@@ -2012,22 +2165,6 @@ msgstr "Mainepistemäärä"
msgid "Reputation Scores"
msgstr "Mainepistemäärät"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "Odotetaan todennusta..."
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
"Kirjaudut jo toisella välilehdellä. Tämä sivu päivittyy kun todennus on "
"valmis."
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Kirjaudu tällä välilehdellä"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Käyttö evätty"
@@ -2156,6 +2293,14 @@ msgstr "Tiukka URL-vertailu"
msgid "Regular Expression URL matching"
msgstr "Regular Expression -pohjainen URL-vertailu"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "Valtuutus"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr "Kirjaudu ulos"
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "Taustakanava"
@@ -2520,10 +2665,6 @@ msgstr "Välityspalveluntarjoaja"
msgid "Proxy Providers"
msgstr "Välityspalveluntarjoajat"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Katkaise istunto välityspalvelutukikohdasta."
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2656,8 +2797,10 @@ msgstr ""
"yleisörajoitusta ei lisätä."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Tunnetaan myös nimellä EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2880,6 +3023,10 @@ msgstr "SAML NameID:n arvo tälle istunnolle"
msgid "SAML NameID format"
msgstr "SAML NameID:n muoto"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "SAML-istunto"
@@ -2908,6 +3055,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr "Salesforce"
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3193,7 +3348,7 @@ msgstr ""
" Ota yhteyttä ylläpitäjään.\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr "Vain yksi LDAP-lähde salasanojen synkronoinnilla on sallittu"
@@ -3730,6 +3885,12 @@ msgstr ""
"Sallii IdP-lähtöiset todentamisprosessit. Tämä voi olla tietoturvariski, "
"koska pyynnön ID:tä ei validoida."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4155,6 +4316,10 @@ msgstr "Todentajan validaatiovaiheet"
msgid "No (allowed) MFA authenticator configured."
msgstr "Yhtään (sallittua) MFA-todentajaa ei ole määritelty."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn-todentajan asetusvaihe"
@@ -4293,6 +4458,10 @@ msgstr "Sähköposti-OTP"
msgid "Event Notification"
msgstr "Tapahtumanotifikaatio"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Kutsu"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4411,6 +4580,62 @@ msgstr ""
"\n"
"Tämä viesti on lähetetty notifikaatiokanavasta %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4591,10 +4816,6 @@ msgid "Optional fixed data to enforce on user enrollment."
msgstr ""
"Valinnainen kiinteä data joka pakotetaan käyttäjän rekisteröitymisessä."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Kutsu"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Kutsut"
@@ -4719,6 +4940,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Staattinen: Staattinen arvo, näytetään sellaisenaan."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Valittavat kielialueet, joita authentik tukee"

Binary file not shown.

View File

@@ -15,7 +15,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-05-01 03:47+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Sp P, 2026\n"
"Language-Team: French (France) (https://app.transifex.com/authentik/teams/119923/fr_FR/)\n"
@@ -116,6 +116,14 @@ msgstr "Erreur de Validation"
msgid "Blueprint file does not exist"
msgstr "Le fichier de plan n'existe pas"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Échec de validation du plan"

Binary file not shown.

View File

@@ -5,15 +5,16 @@
#
# Translators:
# Marc Schmitt, 2025
# Pao P, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Marc Schmitt, 2025\n"
"Last-Translator: Pao P, 2026\n"
"Language-Team: Italian (Italy) (https://app.transifex.com/authentik/teams/119923/it_IT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -57,12 +58,14 @@ msgstr ""
#: authentik/admin/files/validation.py
#, python-brace-format
msgid "File name too long (max {MAX_FILE_NAME_LENGTH} characters)"
msgstr ""
msgstr "Nome del file troppo lungo (max {MAX_FILE_NAME_LENGTH} caratteri)"
#: authentik/admin/files/validation.py
#, python-brace-format
msgid "Path component too long (max {MAX_PATH_COMPONENT_LENGTH} characters)"
msgstr ""
"Componente del percorso troppo lungo (max {MAX_PATH_COMPONENT_LENGTH} "
"caratteri)"
#: authentik/admin/models.py
msgid "Version history"
@@ -105,6 +108,14 @@ msgstr "Errore di validazione"
msgid "Blueprint file does not exist"
msgstr "File del progetto inesistente"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Impossibile convalidare il progetto"
@@ -113,6 +124,11 @@ msgstr "Impossibile convalidare il progetto"
msgid "Either path or content must be set."
msgstr "È necessario impostare il percorso o il contenuto."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "L'utente non ha i diritti per creare {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Gestito da authentik"
@@ -238,10 +254,13 @@ msgstr ""
" vengono restituiti solo i provider di backchannel. Se impostato su falso, i"
" provider di backchannel vengono esclusi"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "L'utente non ha i diritti per creare {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -303,6 +322,12 @@ msgstr ""
msgid "This field is required."
msgstr "Questo campo è obbligatorio."
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nome"
@@ -409,6 +434,10 @@ msgstr "Nome interno dell'applicazione, utilizzato negli URL."
msgid "Open launch URL in a new browser tab or window."
msgstr "Apri l'URL di avvio in una nuova scheda o finestra del browser."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Applicazione"
@@ -597,6 +626,14 @@ msgstr "Rimuovi gli utenti temporanei creati da SAML Sources."
msgid "Go home"
msgstr "Vai alla pagina iniziale"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -703,6 +740,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr "Scopri, importa e aggiorna i certificati dal file system."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -757,6 +798,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -827,6 +876,12 @@ msgstr "Versione Enterprise richiesta per creare/aggiornare questo oggetto"
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -844,6 +899,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verifica del tuo browser..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -860,10 +928,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -891,7 +955,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -905,7 +970,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1153,6 +1218,14 @@ msgstr "Per Enterprise è tenuta a utilizzare EAP-TLS."
msgid "Enterprise is required to use the OAuth mode."
msgstr "Per Enterprise è obbligatorio utilizzare la modalità OAuth."
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1234,6 +1307,78 @@ msgstr ""
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr ""
@@ -1252,10 +1397,6 @@ msgstr "Dispositivo di Accesso"
msgid "Endpoint Devices"
msgstr "Dispositivi di Accesso"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verifica del tuo browser..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1339,6 +1480,12 @@ msgstr ""
"Invia una notifica solo una volta, ad esempio quando invii un webhook in un "
"canale di chat."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1509,6 +1656,15 @@ msgstr "Politiche pre-flusso"
msgid "Flow"
msgstr "Flusso"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Il flusso non si applica all'utente corrente."
@@ -1623,8 +1779,8 @@ msgstr "Token del flusso"
msgid "Flow Tokens"
msgstr "Tokens del flusso"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -2013,22 +2169,6 @@ msgstr "Punteggio di reputazione"
msgid "Reputation Scores"
msgstr "Punteggi di reputazione"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "In attesa di autenticazione..."
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
"Ti stai già autenticando in un'altra scheda. Questa pagina si aggiornerà una"
" volta completata l'autenticazione."
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Autenticati in questa scheda"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Permesso negato"
@@ -2156,6 +2296,14 @@ msgstr "Confronto URL rigoroso"
msgid "Regular Expression URL matching"
msgstr "Corrispondenza URL espressione regolare"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr ""
@@ -2518,10 +2666,6 @@ msgstr "Provider Proxy"
msgid "Proxy Providers"
msgstr "Providers Proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr ""
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2653,8 +2797,10 @@ msgstr ""
"vuoto, non verrà aggiunta alcuna restrizione sul pubblico."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Conosciuto anche come EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2868,6 +3014,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "Sessione SAML "
@@ -2896,6 +3046,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3177,7 +3335,7 @@ msgstr ""
" e di aver configurato correttamente il browser. \n"
"Contatta il tuo amministratore."
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
"È consentita solo una singola sorgente LDAP con sincronizzazione della "
@@ -3711,6 +3869,12 @@ msgstr ""
"rappresentare un rischio per la sicurezza, poiché non viene eseguita alcuna "
"convalida dell'ID richiesta."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4142,6 +4306,10 @@ msgstr "Fasi di convalida dell'autenticatore"
msgid "No (allowed) MFA authenticator configured."
msgstr "Nessun autenticatore MFA (consentito) configurato."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Fase di configurazione dell'autenticatore WebAuthn"
@@ -4280,6 +4448,10 @@ msgstr "Email OTP"
msgid "Event Notification"
msgstr "Notifica evento"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Invito"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4398,6 +4570,62 @@ msgstr ""
"\n"
"Questa email è stata inviata dal trasporto delle notifiche %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4577,10 +4805,6 @@ msgstr "Se abilitato, l'invito verrà eliminato dopo l'utilizzo."
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Dati fissi facoltativi da applicare alla registrazione dell'utente."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Invito"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Inviti"
@@ -4706,6 +4930,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Statico: Valore statico, visualizzato così com'è."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr ""

Binary file not shown.

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Marc Schmitt, 2025\n"
"Language-Team: Japanese (Japan) (https://app.transifex.com/authentik/teams/119923/ja_JP/)\n"
@@ -105,6 +105,14 @@ msgstr "検証エラー"
msgid "Blueprint file does not exist"
msgstr "ブループリントファイルがありません"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "ブループリントの検証に失敗しました"
@@ -113,6 +121,11 @@ msgstr "ブループリントの検証に失敗しました"
msgid "Either path or content must be set."
msgstr "パスかコンテンツの設定は必須です。"
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "ユーザーは {model} を作成するための権限がありません"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Managed by authentik"
@@ -228,10 +241,13 @@ msgid ""
msgstr ""
"設定されていない場合、すべてのプロバイダーが返されます。trueに設定すると、バックチャネルプロバイダーのみが返されます。falseに設定すると、バックチャネルプロバイダーは除外されます"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "ユーザーは {model} を作成するための権限がありません"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -293,6 +309,12 @@ msgstr ""
msgid "This field is required."
msgstr "このフィールドは必須です。"
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "名前"
@@ -395,6 +417,10 @@ msgstr "URLで使用される内部アプリ名。"
msgid "Open launch URL in a new browser tab or window."
msgstr "ブラウザーの新しいタブまたはウィンドウで起動URLを開きます。"
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "アプリ"
@@ -566,6 +592,14 @@ msgstr "SAMLで作成された一時ユーザを削除。"
msgid "Go home"
msgstr "ホームに戻る"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -670,6 +704,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr "証明書をファイルシステムから検出、インポート、更新する。"
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -724,6 +762,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -794,6 +840,12 @@ msgstr "このオブジェクトの作成/更新にはエンタープライズ
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -809,6 +861,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "ブラウザの確認中...。"
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -825,10 +890,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -856,7 +917,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -870,7 +932,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1095,6 +1157,14 @@ msgstr "EAP-TLSを使用するにはエンタープライズが必要です。"
msgid "Enterprise is required to use the OAuth mode."
msgstr "OAuthモードを使用するにはエンタープライズが必要です。"
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1176,6 +1246,78 @@ msgstr ""
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "エンドポイント認証器Google Device Trust Connectorステージ"
@@ -1192,10 +1334,6 @@ msgstr "エンドポイントデバイス"
msgid "Endpoint Devices"
msgstr "エンドポイントデバイス"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "ブラウザの確認中...。"
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1273,6 +1411,12 @@ msgid ""
"channel."
msgstr "チャットチャンネルにWebhookを送るときのような場合に、一度だけ通知を送信します。"
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1432,6 +1576,15 @@ msgstr "事前フローのポリシー"
msgid "Flow"
msgstr "フロー"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "フローは現在のユーザーに適用されません。"
@@ -1536,8 +1689,8 @@ msgstr "フロートークン"
msgid "Flow Tokens"
msgstr "フロートークン"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -1897,20 +2050,6 @@ msgstr "評判スコア"
msgid "Reputation Scores"
msgstr "評判スコア"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "認証を待機中...。"
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr "別のタブで既に認証中です。認証が完了するとこのページが更新されます。"
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "このタブで認証"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "権限がありません"
@@ -2031,6 +2170,14 @@ msgstr "厳密な URL 比較"
msgid "Regular Expression URL matching"
msgstr "正規表現 URL マッチング"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "バックチャネル"
@@ -2358,10 +2505,6 @@ msgstr "プロキシプロバイダー"
msgid "Proxy Providers"
msgstr "プロキシプロバイダー"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Proxy Outpost でセッションを終了。"
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2485,8 +2628,10 @@ msgid ""
msgstr "アサーションのオーディエンス制限フィールドの値。空の場合、オーディエンス制限は追加されません。"
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "EntityID とも呼ばれる"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2686,6 +2831,10 @@ msgstr "このセッションの SAML NameID 値"
msgid "SAML NameID format"
msgstr "SAML NameID フォーマット"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "SAML セッション"
@@ -2714,6 +2863,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr "Salesforce"
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -2978,7 +3135,7 @@ msgstr ""
" 管理者に連絡してください。\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr "パスワード同期を備えた単一の LDAP ソースのみが許可されます"
@@ -3491,6 +3648,12 @@ msgid ""
"risk, as no validation of the request ID is done."
msgstr "IdP によって開始される認証フローを許可します。リクエスト ID の検証が行われないため、セキュリティリスクになる可能性があります。"
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -3894,6 +4057,10 @@ msgstr "認証器検証ステージ"
msgid "No (allowed) MFA authenticator configured."
msgstr "許可されたMFA 認証器が設定されていません。"
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn 認証器セットアップステージ"
@@ -4026,6 +4193,10 @@ msgstr "メール OTP"
msgid "Event Notification"
msgstr "イベント通知"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "招待"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4138,6 +4309,62 @@ msgstr ""
"\n"
"このメールは通知トランスポート %(name)s から送信されました。\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4301,10 +4528,6 @@ msgstr "有効にすると、招待は使用後に削除されます。"
msgid "Optional fixed data to enforce on user enrollment."
msgstr "ユーザー登録に強制するオプショナル固定データ。"
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "招待"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "招待"
@@ -4415,6 +4638,18 @@ msgstr "非表示: 非表示フィールド、フォームにデータを挿入
msgid "Static: Static value, displayed as-is."
msgstr "静的: 静的値、そのまま表示。"
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: authentik がサポートするロケールの選択"

View File

@@ -12,7 +12,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-04-23 00:25+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Raphael Cancelliere, 2026\n"
"Language-Team: Norwegian (Norway) (https://app.transifex.com/authentik/teams/119923/no_NO/)\n"
@@ -109,6 +109,14 @@ msgstr "Valideringsfeil"
msgid "Blueprint file does not exist"
msgstr "Blueprint-filen eksisterer ikke"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Klarte ikke å validere blueprint"
@@ -247,6 +255,14 @@ msgstr ""
" kun backchannel-leverandører. Når satt til false, ekskluderes backchannel-"
"leverandører."
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
msgstr "Ingen skråstreker i starten eller slutten er tillatt."
@@ -421,6 +437,10 @@ msgstr "Internt applikasjonsnavn, brukt i URL-er."
msgid "Open launch URL in a new browser tab or window."
msgstr "Åpne start-URL i en ny nettleserfane eller -vindu."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Applikasjon"
@@ -917,10 +937,6 @@ msgstr "Enten en vurderingsgruppe eller en vurderer må være angitt."
msgid "Grace period must be shorter than the interval."
msgstr "Respittiden må være kortere enn intervallet."
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr "Kun én type-omfattende regel for hver objekttype er tillatt."
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -950,9 +966,9 @@ msgid "Go to {self._get_model_name()}"
msgstr "Gå til {self._get_model_name()}"
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
"Tilgangsvurdering forfaller for {self.content_type.name} {str(self.object)}"
#: authentik/enterprise/lifecycle/models.py
msgid ""
@@ -968,8 +984,8 @@ msgstr ""
"Tilgangsvurdering fullført for {self.content_type.name} {str(self.object)}"
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgstr "Send ut oppgaver for å validere livssyklusregler."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Apply lifecycle rule."
@@ -1305,6 +1321,78 @@ msgstr "Last ned"
msgid "Generate data export."
msgstr "Generer eksport av data."
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Trinn for endepunktautentisering via Google Device Trust-kobling"
@@ -2705,8 +2793,10 @@ msgstr ""
" vil ingen målgrupperestriksjon bli lagt til."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Også kjent som EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2924,6 +3014,10 @@ msgstr "SAML NameID-verdi for denne økten"
msgid "SAML NameID format"
msgstr "SAML NameID-format"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "SAML-økt"
@@ -2956,6 +3050,10 @@ msgstr "Salesforce"
msgid "Webex"
msgstr "Webex"
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr "Gruppefiltre brukt for å definere synkroniseringsomfang for grupper."
@@ -4830,6 +4928,18 @@ msgstr "Skjult: Skjult felt, kan brukes til å sette inn data i skjemaet."
msgid "Static: Static value, displayed as-is."
msgstr "Statisk: Statisk verdi, vises som den er."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Utvalg av språk som authentik støtter"

Binary file not shown.

View File

@@ -6,16 +6,16 @@
# Translators:
# Marc Schmitt, 2025
# Darek “NeroPcStation” NeroPcStation <dareknowacki2001@gmail.com>, 2025
# Jens L. <jens@goauthentik.io>, 2025
# Jens L. <jens@goauthentik.io>, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Jens L. <jens@goauthentik.io>, 2025\n"
"Last-Translator: Jens L. <jens@goauthentik.io>, 2026\n"
"Language-Team: Polish (Poland) (https://app.transifex.com/authentik/teams/119923/pl_PL/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -107,6 +107,14 @@ msgstr "Błąd walidacji"
msgid "Blueprint file does not exist"
msgstr "Plik szablonu nie istnieje"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Nie udało się zweryfikować szablonu"
@@ -115,6 +123,11 @@ msgstr "Nie udało się zweryfikować szablonu"
msgid "Either path or content must be set."
msgstr "Ścieżka albo treść muszą być ustawione."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr ""
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Zarządzane przez authentik"
@@ -241,9 +254,12 @@ msgstr ""
"zwracani są tylko dostawcy kanału zwrotnego. Gdy ustawiono na fałsz, "
"dostawcy kanału zwrotnego są wykluczeni."
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
@@ -306,6 +322,12 @@ msgstr ""
msgid "This field is required."
msgstr ""
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nazwa"
@@ -412,6 +434,10 @@ msgstr "Wewnętrzna nazwa aplikacji, używana w adresach URL."
msgid "Open launch URL in a new browser tab or window."
msgstr "Otwórz adres URL uruchamiania w nowej karcie lub oknie przeglądarki."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Aplikacja"
@@ -596,6 +622,14 @@ msgstr ""
msgid "Go home"
msgstr "Przejdź do domu"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -702,6 +736,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr ""
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -756,6 +794,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -827,6 +873,12 @@ msgstr ""
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -842,6 +894,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Weryfikowanie Twojej przeglądarki..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -858,10 +923,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -889,7 +950,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -903,7 +965,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1130,6 +1192,14 @@ msgstr ""
msgid "Enterprise is required to use the OAuth mode."
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1211,6 +1281,78 @@ msgstr "Pobierz"
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr ""
@@ -1227,10 +1369,6 @@ msgstr ""
msgid "Endpoint Devices"
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Weryfikowanie Twojej przeglądarki..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1311,6 +1449,12 @@ msgstr ""
"Wyślij powiadomienie tylko raz, na przykład podczas wysyłania webhooka na "
"kanał czatu."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1475,6 +1619,15 @@ msgstr "Przed-przepływowe zasady"
msgid "Flow"
msgstr "Przepływ"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Przepływ nie dotyczy bieżącego użytkownika."
@@ -1590,8 +1743,8 @@ msgstr "Token przepływu"
msgid "Flow Tokens"
msgstr "Tokeny przepływu"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -1975,20 +2128,6 @@ msgstr "Punkty reputacji"
msgid "Reputation Scores"
msgstr "Punkty reputacji"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "Oczekiwanie na uwierzytelnienie..."
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr ""
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Odmowa uprawnień"
@@ -2115,6 +2254,14 @@ msgstr ""
msgid "Regular Expression URL matching"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "Autoryzacja"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr "Wyloguj"
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr ""
@@ -2465,10 +2612,6 @@ msgstr "Dostawca proxy"
msgid "Proxy Providers"
msgstr "Dostawcy proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr ""
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2596,8 +2739,10 @@ msgstr ""
" ograniczenie odbiorców nie zostanie dodane."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Znany również jako EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2801,6 +2946,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr ""
@@ -2829,6 +2978,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3089,7 +3246,7 @@ msgid ""
" "
msgstr ""
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
@@ -3616,6 +3773,12 @@ msgstr ""
" Może to stanowić zagrożenie bezpieczeństwa, ponieważ nie przeprowadza się "
"weryfikacji identyfikatora żądania."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4029,6 +4192,10 @@ msgstr "Etapy weryfikacji uwierzytelniacza"
msgid "No (allowed) MFA authenticator configured."
msgstr "Nie skonfigurowano (dozwolonego) uwierzytelniania MFA."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Etap konfiguracji uwierzytelniacza WebAuthn"
@@ -4165,6 +4332,10 @@ msgstr ""
msgid "Event Notification"
msgstr ""
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Zaproszenie"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4280,6 +4451,62 @@ msgstr ""
"\n"
"Ta wiadomość e-mail została wysłana z transportu powiadomień %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4456,10 +4683,6 @@ msgstr "Gdy ta opcja jest włączona, zaproszenie zostanie usunięte po użyciu.
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Opcjonalne stałe dane do wymuszenia przy rejestracji użytkownika."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Zaproszenie"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Zaproszenia"
@@ -4583,6 +4806,18 @@ msgstr "Ukryte: Ukryte pole, może służyć do wstawiania danych do formularza.
msgid "Static: Static value, displayed as-is."
msgstr "Statyczny: wartość statyczna, wyświetlana w stanie, w jakim jest."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Wybór ustawień regionalnych obsługiwanych przez authentik"

View File

@@ -6,17 +6,18 @@
# Translators:
# Marc Schmitt, 2025
# André Cristian Neidert, 2025
# Rafael Mundel, 2025
# Ariel Amaral, 2025
# Rafael Mundel, 2026
# Gil Poiares-Oliveira, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Ariel Amaral, 2025\n"
"Last-Translator: Gil Poiares-Oliveira, 2026\n"
"Language-Team: Portuguese (Brazil) (https://app.transifex.com/authentik/teams/119923/pt_BR/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -111,6 +112,14 @@ msgstr "Erro de Validação"
msgid "Blueprint file does not exist"
msgstr "Arquivo de Blueprint não existe"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Falha ao validar o projeto"
@@ -119,6 +128,11 @@ msgstr "Falha ao validar o projeto"
msgid "Either path or content must be set."
msgstr "O caminho ou o conteúdo devem ser definidos."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "O usuário não tem permissão para criar {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Gerenciado pelo authentik"
@@ -248,10 +262,13 @@ msgstr ""
"true, somente os provedores de backchannel são retornados. Quando definido "
"para false, provedores de backchannel são excluídos"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "O usuário não tem permissão para criar {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -313,6 +330,12 @@ msgstr ""
msgid "This field is required."
msgstr "Este campo é obrigatório."
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nome"
@@ -419,6 +442,10 @@ msgstr "Nome do aplicativo interno, usado em URLs."
msgid "Open launch URL in a new browser tab or window."
msgstr "Abra o URL de inicialização em uma nova guia ou janela do navegador."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Aplicativo"
@@ -607,6 +634,14 @@ msgstr "Remover usuários temporários criados por Fontes SAML."
msgid "Go home"
msgstr "Ir para casa"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr "Rodapé do site"
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -715,6 +750,10 @@ msgstr "Visualizar chave privada do par de chaves"
msgid "Discover, import and update certificates from the filesystem."
msgstr "Descobrir, importar e atualizar certificados do sistema de arquivos."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr "A plataforma selecionada não é compatível."
@@ -769,6 +808,14 @@ msgstr "Nonce Apple"
msgid "Apple Nonces"
msgstr "Nonces Apple"
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -839,6 +886,12 @@ msgstr "Enterprise é necessário para criar/atualizar esse objeto."
msgid "Enterprise is required to use this endpoint."
msgstr "Enterprise é necessário para usar este endpoint."
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -856,6 +909,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verificando seu navegador…"
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -872,10 +938,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -903,7 +965,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -917,7 +980,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1161,6 +1224,14 @@ msgstr "Enterprise é necessário para usar EAP-TLS."
msgid "Enterprise is required to use the OAuth mode."
msgstr "Enterprise é necessário para usar o modo OAuth."
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1242,6 +1313,78 @@ msgstr "Download"
msgid "Generate data export."
msgstr "Gerar exportação de dados."
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Etapa do Conector Google Device Trust do autenticador de endpoint."
@@ -1258,10 +1401,6 @@ msgstr "Dispositivo de endpoint."
msgid "Endpoint Devices"
msgstr "Dispositivos de endpoint."
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Verificando seu navegador…"
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1344,6 +1483,12 @@ msgstr ""
"Envie uma notificação apenas uma vez, por exemplo, ao enviar um webhook para"
" um canal de bate-papo."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1514,6 +1659,15 @@ msgstr "Políticas de pré-fluxo"
msgid "Flow"
msgstr "Fluxo"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "O fluxo não se aplica ao usuário atual."
@@ -1624,9 +1778,9 @@ msgstr "Token de Fluxo"
msgid "Flow Tokens"
msgstr "Tokens de Fluxo"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
msgstr "Rodapé do site"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
msgid "Invalid next URL"
@@ -2010,22 +2164,6 @@ msgstr "Pontuação de reputação"
msgid "Reputation Scores"
msgstr "Pontuações de reputação"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "Aguardando autenticação…"
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
"Você já está autenticando em outra aba. Esta página será atualizada quando a"
" autenticação for concluída."
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Autenticar nesta aba"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Permissão negada"
@@ -2150,6 +2288,14 @@ msgstr "Comparação estrita de URL"
msgid "Regular Expression URL matching"
msgstr "Correspondência de URL por expressão regular"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "Autorização"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr "Sair"
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "Back-channel"
@@ -2512,10 +2658,6 @@ msgstr "Provedor de proxy"
msgid "Proxy Providers"
msgstr "Provedores de proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Encerrar sessão no outpost Proxy"
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2648,8 +2790,10 @@ msgstr ""
"branco, nenhuma restrição de público será adicionada."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Também conhecido como EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2870,6 +3014,10 @@ msgstr "Valor do SAML NameID para essa sessão"
msgid "SAML NameID format"
msgstr "Formato do SAML NameID"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "Sessão SAML"
@@ -2898,6 +3046,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr "Salesforce"
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3181,7 +3337,7 @@ msgstr ""
"e que o navegador esteja configurado corretamente. \n"
"Contate seu administrador."
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr "Somente uma Origem LDAP com sincronização de senha é aceita"
@@ -3716,6 +3872,12 @@ msgstr ""
"Permite fluxos de autenticação iniciados pelo IdP. Isso pode ser um risco de"
" segurança, pois nenhuma validação do ID da solicitação é feita."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4141,6 +4303,10 @@ msgstr "Etapas de validação do autenticador"
msgid "No (allowed) MFA authenticator configured."
msgstr "Nenhum autenticador MFA (permitido) configurado."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Estágio de configuração do autenticador WebAuthn"
@@ -4280,6 +4446,10 @@ msgstr "OTP por Email"
msgid "Event Notification"
msgstr "Notificação de Evento"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Convite"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4399,6 +4569,62 @@ msgstr ""
"\n"
"Este email foi enviado pelo transporte de notificações %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4577,10 +4803,6 @@ msgstr "Quando ativado, o convite será excluído após o uso."
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Dados fixos opcionais para aplicar na inscrição do usuário."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Convite"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Convites"
@@ -4704,6 +4926,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Estático: valor estático, exibido como está."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Seleção de locais suportados pelo authentik"

View File

@@ -7,17 +7,18 @@
# Hélder Silva <hsilva@keep.pt>, 2025
# Sergio Reis, 2025
# Marc Schmitt, 2025
# Gil Poiares-Oliveira, 2025
# Tiago Gaspar, 2025
# G S, 2026
# Gil Poiares-Oliveira, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Tiago Gaspar, 2025\n"
"Last-Translator: Gil Poiares-Oliveira, 2026\n"
"Language-Team: Portuguese (Portugal) (https://app.transifex.com/authentik/teams/119923/pt_PT/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -109,6 +110,14 @@ msgstr "Erro de validação"
msgid "Blueprint file does not exist"
msgstr "Ficheiro de modelos não existe"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Falha na validação de modelo"
@@ -117,6 +126,11 @@ msgstr "Falha na validação de modelo"
msgid "Either path or content must be set."
msgstr "O caminho ou o conteúdo devem ser definidos."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "O utilizador não tem permissão para criar {model}"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Gerido por authentik"
@@ -244,10 +258,13 @@ msgstr ""
"como verdadeiro, apenas os provedores de backchannel são retornados. Quando "
"definido como falso, os provedores de backchannel são excluídos"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "O utilizador não tem permissão para criar {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -309,6 +326,12 @@ msgstr ""
msgid "This field is required."
msgstr "Este campo é necessário."
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "nome"
@@ -415,6 +438,10 @@ msgstr "Nome interno da aplicação, usado em URLs."
msgid "Open launch URL in a new browser tab or window."
msgstr "Abrir o URL de inicialização num novo separador ou janela do browser."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Aplicação"
@@ -602,6 +629,14 @@ msgstr ""
msgid "Go home"
msgstr "Ir para início"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -708,6 +743,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr "Descobrir, importar e atualizar certificados do sistema de arquivos."
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -762,6 +801,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -832,6 +879,12 @@ msgstr "Enterprise necessário para criar/atualizar este objeto."
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -849,6 +902,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "A verificar o seu browser..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -865,10 +931,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -896,7 +958,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -910,7 +973,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1140,6 +1203,14 @@ msgstr ""
msgid "Enterprise is required to use the OAuth mode."
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1221,6 +1292,78 @@ msgstr "Descarregar"
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr ""
@@ -1239,10 +1382,6 @@ msgstr "Dispositivo do ponto de ligação"
msgid "Endpoint Devices"
msgstr "Dispositivos do ponto de ligação"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "A verificar o seu browser..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1323,6 +1462,12 @@ msgstr ""
"Enviar a notificação apenas uma vez, por exemplo, ao enviar um webhook para "
"um canal de chat."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1489,6 +1634,15 @@ msgstr "Políticas de pré-fluxo"
msgid "Flow"
msgstr "Fluxo"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "O fluxo não se aplica ao utilizador atual."
@@ -1602,8 +1756,8 @@ msgstr "Token do fluxo"
msgid "Flow Tokens"
msgstr "Tokens do fluxo"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -1991,20 +2145,6 @@ msgstr "Pontuação da reputação"
msgid "Reputation Scores"
msgstr "Pontuações da reputação"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "A aguardar autenticação"
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "Autenticar nesta aba"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Permissão negada"
@@ -2130,6 +2270,14 @@ msgstr "Comparação rigorosa de URL"
msgid "Regular Expression URL matching"
msgstr "Correspondência de URL com expressões regulares"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "Autorização"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "Back-channel"
@@ -2492,10 +2640,6 @@ msgstr "Provedor de Proxy"
msgid "Proxy Providers"
msgstr "Provedores de Proxy"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "Terminar sessão no Proxy outpost "
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2629,8 +2773,10 @@ msgstr ""
"branco, nenhuma restrição de audiência será adicionada."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Também conhecido como EntityID."
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2849,6 +2995,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "Instância SAML"
@@ -2877,6 +3027,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr "Salesforce"
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3156,7 +3314,7 @@ msgstr ""
" Contacte o seu administrador.\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
"Apenas é permitida uma única fonte LDAP com sincronização de palavras-passe"
@@ -3688,6 +3846,12 @@ msgstr ""
"Permite fluxos de autenticação iniciados pelo IdP. Isto pode ser um risco de"
" segurança uma vez que não é feita nenhuma validação do ID do pedido."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4112,6 +4276,10 @@ msgstr "Etapas de validação do autenticador"
msgid "No (allowed) MFA authenticator configured."
msgstr "Nenhum autenticador MFA (permitido) configurado."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Etapa de configuração do autenticador WebAuthn"
@@ -4249,6 +4417,10 @@ msgstr "OTP E-mail"
msgid "Event Notification"
msgstr "Notificação de Evento"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Convite"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4368,6 +4540,62 @@ msgstr ""
"\n"
"Este e-mail foi enviado a partir do transporte de notificações %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4553,10 +4781,6 @@ msgstr "Quando ativado, o convite será eliminado após utilização."
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Dados fixos opcionais a aplicar no registo de utilizadores."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Convite"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Convites"
@@ -4682,6 +4906,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Estático: Valor estático, mostrado tal como é."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Seleção de localizações suportadas"

Binary file not shown.

View File

@@ -6,16 +6,16 @@
# Translators:
# Marc Schmitt, 2025
# Vladimir, 2025
# Andrey Boyko, 2025
# Andrey Boyko, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Andrey Boyko, 2025\n"
"Last-Translator: Andrey Boyko, 2026\n"
"Language-Team: Russian (Russia) (https://app.transifex.com/authentik/teams/119923/ru_RU/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -107,6 +107,14 @@ msgstr "Ошибка валидации"
msgid "Blueprint file does not exist"
msgstr "Файл чертежа не существует"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr ""
@@ -115,6 +123,11 @@ msgstr ""
msgid "Either path or content must be set."
msgstr "Путь или содержимое должно быть установлено."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr ""
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Управляется authentik"
@@ -242,9 +255,12 @@ msgstr ""
"значение true, возвращаются только провайдеры обратного канала. При значении"
" false провайдеры обратного канала исключаются."
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
@@ -307,6 +323,12 @@ msgstr ""
msgid "This field is required."
msgstr ""
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "имя"
@@ -413,6 +435,10 @@ msgstr "Внутреннее имя приложения, используемо
msgid "Open launch URL in a new browser tab or window."
msgstr "Открыть URL-адрес запуска в новой вкладке или окне браузера."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Приложение"
@@ -604,6 +630,14 @@ msgstr ""
msgid "Go home"
msgstr "Домой"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -710,6 +744,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr ""
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -764,6 +802,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -834,6 +880,12 @@ msgstr "Для создания/обновления этого объекта
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -849,6 +901,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Проверка вашего браузера..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -865,10 +930,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -896,7 +957,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -910,7 +972,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1136,6 +1198,14 @@ msgstr ""
msgid "Enterprise is required to use the OAuth mode."
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1217,6 +1287,78 @@ msgstr "Скачать"
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr ""
@@ -1236,10 +1378,6 @@ msgstr "Конечное устройство"
msgid "Endpoint Devices"
msgstr "Конечные устройства"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Проверка вашего браузера..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1320,6 +1458,12 @@ msgstr ""
"Отправлять уведомление только один раз, например, при отправке вебхука в "
"чат-канал."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1483,6 +1627,15 @@ msgstr "Предварительные политики потока"
msgid "Flow"
msgstr "Поток"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Поток не применяется к текущему пользователю."
@@ -1595,8 +1748,8 @@ msgstr "Токен потока"
msgid "Flow Tokens"
msgstr "Токены потока"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -1983,20 +2136,6 @@ msgstr "Оценка репутации"
msgid "Reputation Scores"
msgstr "Оценка репутации"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr ""
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "Доступ запрещен"
@@ -2124,6 +2263,14 @@ msgstr ""
msgid "Regular Expression URL matching"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "Авторизация"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr "Выход"
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr ""
@@ -2478,10 +2625,6 @@ msgstr "Прокси провайдер"
msgid "Proxy Providers"
msgstr "Прокси провайдеры"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr ""
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2611,8 +2754,10 @@ msgstr ""
" ограничение аудитории не будет добавлено."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "Также известен как EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2822,6 +2967,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr ""
@@ -2850,6 +2999,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3119,7 +3276,7 @@ msgid ""
" "
msgstr ""
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
@@ -3646,6 +3803,12 @@ msgstr ""
"угрозу безопасности, так как проверка идентификатора запроса не "
"производится."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4059,6 +4222,10 @@ msgstr "Этапы проверки аутентификатора"
msgid "No (allowed) MFA authenticator configured."
msgstr "Не сконфигурирован ни один (разрешенный) MFA аутентификатор"
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "Этап настройки аутентификатора WebAuthn"
@@ -4195,6 +4362,10 @@ msgstr ""
msgid "Event Notification"
msgstr ""
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Приглашение"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4309,6 +4480,62 @@ msgstr ""
"\n"
"Это письмо было отправлено с помощью поставщика уведомления %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4488,10 +4715,6 @@ msgstr ""
"Необязательные фиксированные данные, которые будут применяться при "
"регистрации пользователя."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Приглашение"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Приглашения"
@@ -4617,6 +4840,18 @@ msgstr ""
msgid "Static: Static value, displayed as-is."
msgstr "Статический: Статичное значение, отображается как есть."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: Выбор локализаций, которые поддерживает authentik"

Binary file not shown.

View File

@@ -11,7 +11,7 @@ msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: Marc Schmitt, 2025\n"
"Language-Team: Turkish (Turkey) (https://app.transifex.com/authentik/teams/119923/tr_TR/)\n"
@@ -105,6 +105,14 @@ msgstr "Doğrulama Hatası"
msgid "Blueprint file does not exist"
msgstr "Plan dosyası mevcut değil"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "Plan doğrulanamadı"
@@ -113,6 +121,11 @@ msgstr "Plan doğrulanamadı"
msgid "Either path or content must be set."
msgstr "Ya yol ya da içerik ayarlanmalıdır."
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr ""
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "Authentik tarafından yönetilmektedir"
@@ -239,9 +252,12 @@ msgstr ""
"yalnızca arka kanal sağlayıcıları döndürülür. false olarak ayarlandığında, "
"arka kanal sağlayıcıları hariç tutulur"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
@@ -304,6 +320,12 @@ msgstr ""
msgid "This field is required."
msgstr ""
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "isim"
@@ -411,6 +433,10 @@ msgid "Open launch URL in a new browser tab or window."
msgstr ""
"Başlatma URL'sini yeni bir tarayıcı sekmesinde veya penceresinde açın."
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "Uygulama"
@@ -597,6 +623,14 @@ msgstr ""
msgid "Go home"
msgstr "Başa dön"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr ""
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -703,6 +737,10 @@ msgstr ""
msgid "Discover, import and update certificates from the filesystem."
msgstr ""
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr ""
@@ -757,6 +795,14 @@ msgstr ""
msgid "Apple Nonces"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr ""
@@ -827,6 +873,12 @@ msgstr "Bu nesneyi oluşturmak/güncellemek için Kurumsal Paket gereklidir."
msgid "Enterprise is required to use this endpoint."
msgstr ""
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -842,6 +894,19 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Tarayıcınız doğrulanıyor..."
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
@@ -858,10 +923,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -889,7 +950,8 @@ msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -903,7 +965,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1130,6 +1192,14 @@ msgstr ""
msgid "Enterprise is required to use the OAuth mode."
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1211,6 +1281,78 @@ msgstr ""
msgid "Generate data export."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "Uç Nokta Kimlik Doğrulayıcı Google Cihaz Güven Bağlayıcısı Aşaması"
@@ -1227,10 +1369,6 @@ msgstr "Uç Nokta Cihazı"
msgid "Endpoint Devices"
msgstr "Uç Nokta Cihazları"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "Tarayıcınız doğrulanıyor..."
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1311,6 +1449,12 @@ msgstr ""
"Örneğin bir sohbet kanalına web kancası gönderirken yalnızca bir kez "
"bildirim gönderin."
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1476,6 +1620,15 @@ msgstr "Akış öncesi ilkeleri"
msgid "Flow"
msgstr "Akış"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "Akış mevcut kullanıcı için geçerli değildir."
@@ -1589,8 +1742,8 @@ msgstr "Akış Jetonu"
msgid "Flow Tokens"
msgstr "Akış Jetonları"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
@@ -1972,20 +2125,6 @@ msgstr "İtibar Puanı"
msgid "Reputation Scores"
msgstr "İtibar Puanları"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr ""
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr ""
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "İzin reddedildi"
@@ -2112,6 +2251,14 @@ msgstr ""
msgid "Regular Expression URL matching"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr ""
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr ""
@@ -2469,10 +2616,6 @@ msgstr "Vekil Sağlayıcı"
msgid "Proxy Providers"
msgstr "Vekil Sağlayıcılar"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr ""
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2605,8 +2748,10 @@ msgstr ""
"herhangi bir hedef kitle kısıtlaması eklenmez."
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "EntityID olarak da bilinir"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2816,6 +2961,10 @@ msgstr ""
msgid "SAML NameID format"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr ""
@@ -2844,6 +2993,14 @@ msgstr ""
msgid "Salesforce"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr ""
@@ -3119,7 +3276,7 @@ msgstr ""
" Lütfen yöneticinizle iletişime geçin.\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr ""
"Parola senkronizasyonuna sahip yalnızca tek bir LDAP Kaynağına izin verilir"
@@ -3646,6 +3803,12 @@ msgstr ""
"IdP tarafından başlatılan kimlik doğrulama akışlarına izin verir. İstek "
"kimliğinin doğrulanması yapılmadığından, bu bir güvenlik riski olabilir."
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -4055,6 +4218,10 @@ msgstr "Kimlik Doğrulayıcı Doğrulama Aşamaları"
msgid "No (allowed) MFA authenticator configured."
msgstr "Yapılandırılmış (izin verilen) MFA kimlik doğrulayıcısı yok."
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn Authenticator Kurulum Aşaması"
@@ -4190,6 +4357,10 @@ msgstr ""
msgid "Event Notification"
msgstr ""
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Davetiye"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4304,6 +4475,62 @@ msgstr ""
"\n"
"Bu e-posta bildirim aktarımından gönderilmiştir %(name)s.\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr ""
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4470,10 +4697,6 @@ msgstr "Etkinleştirildiğinde, davetiye kullanımdan sonra silinir."
msgid "Optional fixed data to enforce on user enrollment."
msgstr "Kullanıcı kaydında zorlamak için isteğe bağlı sabit veriler."
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "Davetiye"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "Davetiyeler"
@@ -4595,6 +4818,18 @@ msgstr "Gizli: Gizli alan, form içine veri eklemek için kullanılabilir."
msgid "Static: Static value, displayed as-is."
msgstr "Statik: Statik değer, olduğu gibi görüntülenir."
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik: authentik'in desteklediği yerel dillerin seçimi"

Binary file not shown.

View File

@@ -8,18 +8,19 @@
# 刘松, 2025
# deluxghost, 2025
# Marc Schmitt, 2025
# Jens L. <jens@goauthentik.io>, 2025
# Kuang Jr, 2025
# RocketDev, 2026
# Lei Kou, 2026
# Jens L. <jens@goauthentik.io>, 2026
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2026-02-10 19:27+0000\n"
"POT-Creation-Date: 2026-05-06 00:27+0000\n"
"PO-Revision-Date: 2025-12-01 19:09+0000\n"
"Last-Translator: RocketDev, 2026\n"
"Last-Translator: Jens L. <jens@goauthentik.io>, 2026\n"
"Language-Team: Chinese Simplified (https://app.transifex.com/authentik/teams/119923/zh-Hans/)\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
@@ -113,6 +114,14 @@ msgstr "校验错误"
msgid "Blueprint file does not exist"
msgstr "蓝图文件不存在"
#: authentik/blueprints/api.py
msgid "Context must be valid JSON"
msgstr ""
#: authentik/blueprints/api.py
msgid "Context must be a JSON object"
msgstr ""
#: authentik/blueprints/api.py
msgid "Failed to validate blueprint"
msgstr "验证蓝图失败"
@@ -121,6 +130,11 @@ msgstr "验证蓝图失败"
msgid "Either path or content must be set."
msgstr "必须设置路径或内容。"
#: authentik/blueprints/api.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "用户缺少创建 {model} 的权限"
#: authentik/blueprints/models.py
msgid "Managed by authentik"
msgstr "由 authentik 管理"
@@ -234,10 +248,13 @@ msgid ""
"excluded"
msgstr "如果未设置,则返回所有提供程序。如果启用,仅返回反向通道提供程序。如果禁用,则返回非反向通道提供程序"
#: authentik/core/api/transactional_applications.py
#, python-brace-format
msgid "User lacks permission to create {model}"
msgstr "用户缺少创建 {model} 的权限"
#: authentik/core/api/users.py
msgid "Invalid password hash format. Must be a valid Django password hash."
msgstr ""
#: authentik/core/api/users.py
msgid "Cannot set both password and password_hash. Use only one."
msgstr ""
#: authentik/core/api/users.py
msgid "No leading or trailing slashes allowed."
@@ -299,6 +316,12 @@ msgstr "未找到电子邮件阶段。"
msgid "This field is required."
msgstr "此字段是必需的。"
#: authentik/core/apps.py
msgid ""
"Configure if applications without any policy/group/user bindings should be "
"accessible to any user."
msgstr ""
#: authentik/core/models.py
msgid "name"
msgstr "名称"
@@ -401,6 +424,10 @@ msgstr "应用的内部名称,在 URL 中使用。"
msgid "Open launch URL in a new browser tab or window."
msgstr "在新浏览器标签页或窗口中打开启动 URL。"
#: authentik/core/models.py
msgid "Hide this application from the user's My applications page."
msgstr ""
#: authentik/core/models.py
msgid "Application"
msgstr "应用程序"
@@ -571,6 +598,14 @@ msgstr "移除由 SAML 源创建的临时用户。"
msgid "Go home"
msgstr "前往首页"
#: authentik/core/templates/login/base_full.html
msgid "Site footer"
msgstr "网站页脚"
#: authentik/core/templates/login/base_full.html
msgid "Flow links"
msgstr ""
#: authentik/core/templates/login/base_full.html
#: authentik/flows/templates/if/flow-sfe.html
msgid "Powered by authentik"
@@ -675,6 +710,10 @@ msgstr "查看证书-密钥对的私钥"
msgid "Discover, import and update certificates from the filesystem."
msgstr "从文件系统中发现、导入并更新证书。"
#: authentik/endpoints/api/stages.py
msgid "Selected connector is not compatible with this stage."
msgstr ""
#: authentik/endpoints/connectors/agent/api/connectors.py
msgid "Selected platform not supported"
msgstr "所选平台不受支持"
@@ -729,6 +768,14 @@ msgstr "Apple 随机数"
msgid "Apple Nonces"
msgstr "Apple 随机数"
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclave"
msgstr ""
#: authentik/endpoints/connectors/agent/models.py
msgid "Apple Independent Secure Enclaves"
msgstr ""
#: authentik/endpoints/facts.py
msgid "Operating System name, such as 'Server 2022' or 'Ubuntu'"
msgstr "操作系统名称例如“Server 2022”或“Ubuntu”"
@@ -799,6 +846,12 @@ msgstr "创建/更新此对象需要企业版。"
msgid "Enterprise is required to use this endpoint."
msgstr "企业要求使用这个端点。"
#: authentik/enterprise/audit/apps.py
msgid ""
"Include additional information in audit logs, may incur a performance "
"penalty."
msgstr ""
#: authentik/enterprise/endpoints/connectors/fleet/models.py
#: authentik/events/models.py
msgid ""
@@ -814,13 +867,26 @@ msgstr ""
msgid "Fleet Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connector"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/models.py
msgid "Google Device Trust Connectors"
msgstr ""
#: authentik/enterprise/endpoints/connectors/google_chrome/stage.py
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "正在验证您的浏览器…"
#: authentik/enterprise/lifecycle/api/reviews.py
msgid "You are not allowed to submit a review for this object."
msgstr ""
msgstr "您不能为此对象提交评论。"
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Object does not exist"
msgstr ""
msgstr "对象不存在"
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Either a reviewer group or a reviewer must be set."
@@ -830,10 +896,6 @@ msgstr ""
msgid "Grace period must be shorter than the interval."
msgstr ""
#: authentik/enterprise/lifecycle/api/rules.py
msgid "Only one type-wide rule for each object type is allowed."
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid ""
"Select which transports should be used to notify the reviewers. If none are "
@@ -842,26 +904,27 @@ msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Reviewed"
msgstr ""
msgstr "已审核"
#: authentik/enterprise/lifecycle/models.py
msgid "Pending"
msgstr ""
msgstr "待处理"
#: authentik/enterprise/lifecycle/models.py
msgid "Overdue"
msgstr ""
msgstr "逾期"
#: authentik/enterprise/lifecycle/models.py
msgid "Canceled"
msgstr ""
msgstr "已取消"
#: authentik/enterprise/lifecycle/models.py
msgid "Go to {self._get_model_name()}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
msgid "Access review is due for {self.content_type.name} {str(self.object)}"
msgid ""
"Access review is due for {self.content_type.name.lower()} {object_label}"
msgstr ""
#: authentik/enterprise/lifecycle/models.py
@@ -875,7 +938,7 @@ msgid ""
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
msgid "Dispatch tasks to validate lifecycle rules."
msgid "Dispatch tasks to apply lifecycle rules."
msgstr ""
#: authentik/enterprise/lifecycle/tasks.py
@@ -1100,6 +1163,14 @@ msgstr "使用 EAP-TLS 需要企业版。"
msgid "Enterprise is required to use the OAuth mode."
msgstr "使用 OAuth 模式需要企业版。"
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Push"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
msgid "SSF RFC Pull"
msgstr ""
#: authentik/enterprise/providers/ssf/models.py
#: authentik/providers/oauth2/models.py
msgid "Signing Key"
@@ -1181,6 +1252,78 @@ msgstr "下载"
msgid "Generate data export."
msgstr "生成数据导出文件。"
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "User to lock. If omitted, locks the current user (self-service)."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Lockdown flow is not applicable."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Choose the target account, then return a flow link."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "No lockdown flow configured or the flow is not applicable"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/api.py
msgid "Permission denied (when targeting another user)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Deactivate the user account (set is_active to False)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Set an unusable password for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Delete all active sessions for the user"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Revoke all tokens for the user (API, app password, recovery, verification, "
"OAuth)"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid ""
"Flow to redirect users to after self-service lockdown. This flow should not "
"require authentication since the user's session is deleted."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stage"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/models.py
msgid "Account Lockdown Stages"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "No target user specified for account lockdown"
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "You do not have permission to lock down this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Account lockdown failed for this account."
msgstr ""
#: authentik/enterprise/stages/account_lockdown/stage.py
msgid "Self-service account lockdown requires a completion flow."
msgstr ""
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/models.py
msgid "Endpoint Authenticator Google Device Trust Connector Stage"
msgstr "端点身份验证器 Google 设备信任连接器阶段"
@@ -1197,10 +1340,6 @@ msgstr "端点设备"
msgid "Endpoint Devices"
msgstr "端点设备"
#: authentik/enterprise/stages/authenticator_endpoint_gdtc/stage.py
msgid "Verifying your browser..."
msgstr "正在验证您的浏览器…"
#: authentik/enterprise/stages/mtls/models.py
msgid ""
"Configure certificate authorities to validate the certificate against. This "
@@ -1277,6 +1416,12 @@ msgid ""
"channel."
msgstr "仅发送一次通知,例如在向聊天频道发送 Webhook 时。"
#: authentik/events/models.py
msgid ""
"When set, the selected ceritifcate is used to validate the certificate of "
"the webhook server."
msgstr ""
#: authentik/events/models.py
msgid ""
"Customize the body of the request. Mapping should return data that is JSON-"
@@ -1435,6 +1580,15 @@ msgstr "流程前置策略"
msgid "Flow"
msgstr "流程"
#: authentik/flows/apps.py
msgid "Refresh other tabs after successful authentication."
msgstr ""
#: authentik/flows/apps.py
msgid ""
"Upon successful authentication, re-start authentication in other open tabs."
msgstr ""
#: authentik/flows/exceptions.py
msgid "Flow does not apply to current user."
msgstr "流程不应用于当前用户。"
@@ -1536,9 +1690,9 @@ msgstr "流程令牌"
msgid "Flow Tokens"
msgstr "流程令牌"
#: authentik/flows/templates/if/flow.html
msgid "Site footer"
msgstr "网站页脚"
#: authentik/flows/planner.py
msgid "This link is invalid or has expired. Please request a new one."
msgstr ""
#: authentik/flows/views/executor.py
msgid "Invalid next URL"
@@ -1546,7 +1700,7 @@ msgstr "无效的 next URL"
#: authentik/lib/sync/incoming/models.py
msgid "When to trigger sync for outgoing providers"
msgstr ""
msgstr "何时触发对外提供商的同步"
#: authentik/lib/sync/outgoing/models.py
msgid "Controls the number of objects synced in a single task"
@@ -1894,20 +2048,6 @@ msgstr "信誉分数"
msgid "Reputation Scores"
msgstr "信誉分数"
#: authentik/policies/templates/policies/buffer.html
msgid "Waiting for authentication..."
msgstr "正在等待身份验证…"
#: authentik/policies/templates/policies/buffer.html
msgid ""
"You're already authenticating in another tab. This page will refresh once "
"authentication is completed."
msgstr "您正在另一个标签页中验证身份。身份验证完成后,此页面会刷新。"
#: authentik/policies/templates/policies/buffer.html
msgid "Authenticate in this tab"
msgstr "在此标签页中验证身份"
#: authentik/policies/templates/policies/denied.html
msgid "Permission denied"
msgstr "权限被拒绝"
@@ -2026,6 +2166,14 @@ msgstr "严格 URL 比较"
msgid "Regular Expression URL matching"
msgstr "正则表达式 URL 匹配"
#: authentik/providers/oauth2/models.py
msgid "Authorization"
msgstr "授权"
#: authentik/providers/oauth2/models.py
msgid "Logout"
msgstr "登出"
#: authentik/providers/oauth2/models.py
msgid "Back-channel"
msgstr "反向通道"
@@ -2352,10 +2500,6 @@ msgstr "代理提供程序"
msgid "Proxy Providers"
msgstr "代理提供程序"
#: authentik/providers/proxy/tasks.py
msgid "Terminate session on Proxy outpost."
msgstr "终止代理前哨的会话。"
#: authentik/providers/rac/models.py authentik/stages/user_login/models.py
msgid ""
"Determines how long a session lasts. Default of 0 means that the sessions "
@@ -2473,8 +2617,10 @@ msgid ""
msgstr "断言的 Audience 受限字段的值。留空时,不会添加 Audience 限制。"
#: authentik/providers/saml/models.py
msgid "Also known as EntityID"
msgstr "也称为 EntityID"
msgid ""
"Also known as EntityID. Providing a value overrides the default issuer "
"generated by authentik."
msgstr ""
#: authentik/providers/saml/models.py
msgid "SLS URL"
@@ -2668,6 +2814,10 @@ msgstr "当前会话的 SAML NameID 值"
msgid "SAML NameID format"
msgstr "SAML NameID 格式"
#: authentik/providers/saml/models.py
msgid "SAML Issuer used for this session"
msgstr ""
#: authentik/providers/saml/models.py
msgid "SAML Session"
msgstr "SAML 会话"
@@ -2696,6 +2846,14 @@ msgstr "Slack"
msgid "Salesforce"
msgstr "Salesforce"
#: authentik/providers/scim/models.py
msgid "Webex"
msgstr ""
#: authentik/providers/scim/models.py
msgid "vCenter"
msgstr ""
#: authentik/providers/scim/models.py
msgid "Group filters used to define sync-scope for groups."
msgstr "用于定义组同步范围的组过滤器。"
@@ -2960,7 +3118,7 @@ msgstr ""
" 请联系您的管理员。\n"
" "
#: authentik/sources/ldap/api.py
#: authentik/sources/ldap/api/sources.py
msgid "Only a single LDAP Source with password synchronization is allowed"
msgstr "仅允许使用密码同步的单个 LDAP 源"
@@ -3468,6 +3626,12 @@ msgid ""
"risk, as no validation of the request ID is done."
msgstr "允许由 IdP 启动的身份验证流程。这可能存在安全风险,因为未对请求 ID 进行验证。"
#: authentik/sources/saml/models.py
msgid ""
"When enabled, the IdP will re-authenticate the user even if a session "
"exists."
msgstr ""
#: authentik/sources/saml/models.py
msgid ""
"NameID Policy sent to the IdP. Can be unset, in which case no Policy is "
@@ -3870,6 +4034,10 @@ msgstr "身份验证器验证阶段"
msgid "No (allowed) MFA authenticator configured."
msgstr "未配置允许的MFA 身份验证器。"
#: authentik/stages/authenticator_webauthn/models.py
msgid "When enabled, a given device can only be registered once."
msgstr ""
#: authentik/stages/authenticator_webauthn/models.py
msgid "WebAuthn Authenticator Setup Stage"
msgstr "WebAuthn 身份验证器设置阶段"
@@ -4000,6 +4168,10 @@ msgstr "电子邮件 OTP"
msgid "Event Notification"
msgstr "事件通知"
#: authentik/stages/email/models.py authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "邀请"
#: authentik/stages/email/models.py
msgid ""
"The time window used to count recent account recovery attempts. If the "
@@ -4112,6 +4284,62 @@ msgstr ""
"\n"
"此邮件由通知递送 %(name)s 发送。\n"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" You're Invited!\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" You have been invited to join %(host)s. Click the button below to get started.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#, python-format
msgid ""
"\n"
" This invitation expires %(expires)s.\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.html
#: authentik/stages/email/templates/email/invitation.txt
msgid "Accept Invitation"
msgstr "接受邀请"
#: authentik/stages/email/templates/email/invitation.html
msgid ""
"\n"
" If you cannot click the button above, please copy and paste the following URL into your browser:\n"
" "
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
msgid "You're Invited!"
msgstr "你被邀请了!"
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid ""
"You have been invited to join %(host)s. Use the link below to get started."
msgstr ""
#: authentik/stages/email/templates/email/invitation.txt
#, python-format
msgid "This invitation expires %(expires)s."
msgstr "此邀请已失效 %(expires)s"
#: authentik/stages/email/templates/email/invitation.txt
msgid ""
"If you cannot click the link above, please copy and paste the following URL "
"into your browser:"
msgstr "如果无法点击上方链接,请将以下网址复制并粘贴到浏览器中:"
#: authentik/stages/email/templates/email/password_reset.html
msgid ""
"\n"
@@ -4272,10 +4500,6 @@ msgstr "启用后,邀请将在使用后被删除。"
msgid "Optional fixed data to enforce on user enrollment."
msgstr "在用户注册时强制设置的可选固定数据。"
#: authentik/stages/invitation/models.py
msgid "Invitation"
msgstr "邀请"
#: authentik/stages/invitation/models.py
msgid "Invitations"
msgstr "邀请"
@@ -4386,6 +4610,18 @@ msgstr "隐藏:隐藏字段,可用于将数据插入表单。"
msgid "Static: Static value, displayed as-is."
msgstr "静态:静态值,按原样显示。"
#: authentik/stages/prompt/models.py
msgid "Alert (Info): Static alert box with info styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Warning): Static alert box with warning styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "Alert (Danger): Static alert box with danger styling"
msgstr ""
#: authentik/stages/prompt/models.py
msgid "authentik: Selection of locales authentik supports"
msgstr "authentik选择 authentik 支持的语言环境。"

View File

@@ -8,7 +8,8 @@
"url": "https://github.com/goauthentik/authentik.git"
},
"scripts": {
"build": "tsc && tsc -p tsconfig.esm.json",
"clean": "tsc -b --clean tsconfig.json tsconfig.esm.json",
"build": "npm run clean && tsc -b tsconfig.json tsconfig.esm.json",
"prepare": "npm run build"
},
"main": "./dist/index.js",

View File

@@ -47,6 +47,7 @@ export interface ManagedBlueprintsDestroyRequest {
export interface ManagedBlueprintsImportCreateRequest {
file?: Blob;
path?: string;
context?: string;
}
export interface ManagedBlueprintsListRequest {
@@ -369,6 +370,10 @@ export class ManagedApi extends runtime.BaseAPI {
formParams.append("path", requestParameters["path"] as any);
}
if (requestParameters["context"] != null) {
formParams.append("context", requestParameters["context"] as any);
}
let urlPath = `/managed/blueprints/import/`;
return {

View File

@@ -23,7 +23,7 @@ export interface AuthenticatedSessionUserAgentDevice {
* @type {string}
* @memberof AuthenticatedSessionUserAgentDevice
*/
brand: string;
brand: string | null;
/**
*
* @type {string}
@@ -35,7 +35,7 @@ export interface AuthenticatedSessionUserAgentDevice {
* @type {string}
* @memberof AuthenticatedSessionUserAgentDevice
*/
model: string;
model: string | null;
}
/**

View File

@@ -29,25 +29,25 @@ export interface AuthenticatedSessionUserAgentOs {
* @type {string}
* @memberof AuthenticatedSessionUserAgentOs
*/
major: string;
major: string | null;
/**
*
* @type {string}
* @memberof AuthenticatedSessionUserAgentOs
*/
minor: string;
minor: string | null;
/**
*
* @type {string}
* @memberof AuthenticatedSessionUserAgentOs
*/
patch: string;
patch: string | null;
/**
*
* @type {string}
* @memberof AuthenticatedSessionUserAgentOs
*/
patchMinor: string;
patchMinor: string | null;
}
/**

View File

@@ -124,6 +124,30 @@ export interface AuthenticatorValidateStage {
* @memberof AuthenticatorValidateStage
*/
readonly webauthnAllowedDeviceTypesObj: Array<WebAuthnDeviceType>;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStage
*/
emailOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStage
*/
smsOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStage
*/
totpOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStage
*/
staticOtpThrottlingFactor?: number;
}
/**
@@ -193,6 +217,22 @@ export function AuthenticatorValidateStageFromJSONTyped(
webauthnAllowedDeviceTypesObj: (
json["webauthn_allowed_device_types_obj"] as Array<any>
).map(WebAuthnDeviceTypeFromJSON),
emailOtpThrottlingFactor:
json["email_otp_throttling_factor"] == null
? undefined
: json["email_otp_throttling_factor"],
smsOtpThrottlingFactor:
json["sms_otp_throttling_factor"] == null
? undefined
: json["sms_otp_throttling_factor"],
totpOtpThrottlingFactor:
json["totp_otp_throttling_factor"] == null
? undefined
: json["totp_otp_throttling_factor"],
staticOtpThrottlingFactor:
json["static_otp_throttling_factor"] == null
? undefined
: json["static_otp_throttling_factor"],
};
}
@@ -232,5 +272,9 @@ export function AuthenticatorValidateStageToJSONTyped(
? undefined
: (value["webauthnHints"] as Array<any>).map(WebAuthnHintEnumToJSON),
webauthn_allowed_device_types: value["webauthnAllowedDeviceTypes"],
email_otp_throttling_factor: value["emailOtpThrottlingFactor"],
sms_otp_throttling_factor: value["smsOtpThrottlingFactor"],
totp_otp_throttling_factor: value["totpOtpThrottlingFactor"],
static_otp_throttling_factor: value["staticOtpThrottlingFactor"],
};
}

View File

@@ -78,6 +78,30 @@ export interface AuthenticatorValidateStageRequest {
* @memberof AuthenticatorValidateStageRequest
*/
webauthnAllowedDeviceTypes?: Array<string>;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStageRequest
*/
emailOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStageRequest
*/
smsOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStageRequest
*/
totpOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof AuthenticatorValidateStageRequest
*/
staticOtpThrottlingFactor?: number;
}
/**
@@ -129,6 +153,22 @@ export function AuthenticatorValidateStageRequestFromJSONTyped(
json["webauthn_allowed_device_types"] == null
? undefined
: json["webauthn_allowed_device_types"],
emailOtpThrottlingFactor:
json["email_otp_throttling_factor"] == null
? undefined
: json["email_otp_throttling_factor"],
smsOtpThrottlingFactor:
json["sms_otp_throttling_factor"] == null
? undefined
: json["sms_otp_throttling_factor"],
totpOtpThrottlingFactor:
json["totp_otp_throttling_factor"] == null
? undefined
: json["totp_otp_throttling_factor"],
staticOtpThrottlingFactor:
json["static_otp_throttling_factor"] == null
? undefined
: json["static_otp_throttling_factor"],
};
}
@@ -161,5 +201,9 @@ export function AuthenticatorValidateStageRequestToJSONTyped(
? undefined
: (value["webauthnHints"] as Array<any>).map(WebAuthnHintEnumToJSON),
webauthn_allowed_device_types: value["webauthnAllowedDeviceTypes"],
email_otp_throttling_factor: value["emailOtpThrottlingFactor"],
sms_otp_throttling_factor: value["smsOtpThrottlingFactor"],
totp_otp_throttling_factor: value["totpOtpThrottlingFactor"],
static_otp_throttling_factor: value["staticOtpThrottlingFactor"],
};
}

View File

@@ -40,6 +40,7 @@ export interface CurrentBrandFlags {
* Refresh other tabs after successful authentication.
* @type {boolean}
* @memberof CurrentBrandFlags
* @deprecated
*/
flowsRefreshOthers: boolean;
}

View File

@@ -58,7 +58,7 @@ export interface NotificationRule {
* @type {Group}
* @memberof NotificationRule
*/
readonly destinationGroupObj: Group;
readonly destinationGroupObj: Group | null;
/**
* When enabled, notification will be sent to user the user that triggered the event.When destination_group is configured, notification is sent to both.
* @type {boolean}

View File

@@ -78,6 +78,30 @@ export interface PatchedAuthenticatorValidateStageRequest {
* @memberof PatchedAuthenticatorValidateStageRequest
*/
webauthnAllowedDeviceTypes?: Array<string>;
/**
*
* @type {number}
* @memberof PatchedAuthenticatorValidateStageRequest
*/
emailOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof PatchedAuthenticatorValidateStageRequest
*/
smsOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof PatchedAuthenticatorValidateStageRequest
*/
totpOtpThrottlingFactor?: number;
/**
*
* @type {number}
* @memberof PatchedAuthenticatorValidateStageRequest
*/
staticOtpThrottlingFactor?: number;
}
/**
@@ -128,6 +152,22 @@ export function PatchedAuthenticatorValidateStageRequestFromJSONTyped(
json["webauthn_allowed_device_types"] == null
? undefined
: json["webauthn_allowed_device_types"],
emailOtpThrottlingFactor:
json["email_otp_throttling_factor"] == null
? undefined
: json["email_otp_throttling_factor"],
smsOtpThrottlingFactor:
json["sms_otp_throttling_factor"] == null
? undefined
: json["sms_otp_throttling_factor"],
totpOtpThrottlingFactor:
json["totp_otp_throttling_factor"] == null
? undefined
: json["totp_otp_throttling_factor"],
staticOtpThrottlingFactor:
json["static_otp_throttling_factor"] == null
? undefined
: json["static_otp_throttling_factor"],
};
}
@@ -160,5 +200,9 @@ export function PatchedAuthenticatorValidateStageRequestToJSONTyped(
? undefined
: (value["webauthnHints"] as Array<any>).map(WebAuthnHintEnumToJSON),
webauthn_allowed_device_types: value["webauthnAllowedDeviceTypes"],
email_otp_throttling_factor: value["emailOtpThrottlingFactor"],
sms_otp_throttling_factor: value["smsOtpThrottlingFactor"],
totp_otp_throttling_factor: value["totpOtpThrottlingFactor"],
static_otp_throttling_factor: value["staticOtpThrottlingFactor"],
};
}

View File

@@ -40,6 +40,7 @@ export interface PatchedSettingsRequestFlags {
* Refresh other tabs after successful authentication.
* @type {boolean}
* @memberof PatchedSettingsRequestFlags
* @deprecated
*/
flowsRefreshOthers: boolean;
}

View File

@@ -14,8 +14,8 @@
import type { MatchingModeEnum } from "./MatchingModeEnum";
import { MatchingModeEnumFromJSON, MatchingModeEnumToJSON } from "./MatchingModeEnum";
import type { RedirectUriTypeEnum } from "./RedirectUriTypeEnum";
import { RedirectUriTypeEnumFromJSON, RedirectUriTypeEnumToJSON } from "./RedirectUriTypeEnum";
import type { RedirectURITypeEnum } from "./RedirectURITypeEnum";
import { RedirectURITypeEnumFromJSON, RedirectURITypeEnumToJSON } from "./RedirectURITypeEnum";
/**
* A single allowed redirect URI entry
@@ -37,10 +37,10 @@ export interface RedirectURI {
url: string;
/**
*
* @type {RedirectUriTypeEnum}
* @type {RedirectURITypeEnum}
* @memberof RedirectURI
*/
redirectUriType?: RedirectUriTypeEnum;
redirectUriType?: RedirectURITypeEnum;
}
/**
@@ -66,7 +66,7 @@ export function RedirectURIFromJSONTyped(json: any, ignoreDiscriminator: boolean
redirectUriType:
json["redirect_uri_type"] == null
? undefined
: RedirectUriTypeEnumFromJSON(json["redirect_uri_type"]),
: RedirectURITypeEnumFromJSON(json["redirect_uri_type"]),
};
}
@@ -85,6 +85,6 @@ export function RedirectURIToJSONTyped(
return {
matching_mode: MatchingModeEnumToJSON(value["matchingMode"]),
url: value["url"],
redirect_uri_type: RedirectUriTypeEnumToJSON(value["redirectUriType"]),
redirect_uri_type: RedirectURITypeEnumToJSON(value["redirectUriType"]),
};
}

View File

@@ -14,8 +14,8 @@
import type { MatchingModeEnum } from "./MatchingModeEnum";
import { MatchingModeEnumFromJSON, MatchingModeEnumToJSON } from "./MatchingModeEnum";
import type { RedirectUriTypeEnum } from "./RedirectUriTypeEnum";
import { RedirectUriTypeEnumFromJSON, RedirectUriTypeEnumToJSON } from "./RedirectUriTypeEnum";
import type { RedirectURITypeEnum } from "./RedirectURITypeEnum";
import { RedirectURITypeEnumFromJSON, RedirectURITypeEnumToJSON } from "./RedirectURITypeEnum";
/**
* A single allowed redirect URI entry
@@ -37,10 +37,10 @@ export interface RedirectURIRequest {
url: string;
/**
*
* @type {RedirectUriTypeEnum}
* @type {RedirectURITypeEnum}
* @memberof RedirectURIRequest
*/
redirectUriType?: RedirectUriTypeEnum;
redirectUriType?: RedirectURITypeEnum;
}
/**
@@ -69,7 +69,7 @@ export function RedirectURIRequestFromJSONTyped(
redirectUriType:
json["redirect_uri_type"] == null
? undefined
: RedirectUriTypeEnumFromJSON(json["redirect_uri_type"]),
: RedirectURITypeEnumFromJSON(json["redirect_uri_type"]),
};
}
@@ -88,6 +88,6 @@ export function RedirectURIRequestToJSONTyped(
return {
matching_mode: MatchingModeEnumToJSON(value["matchingMode"]),
url: value["url"],
redirect_uri_type: RedirectUriTypeEnumToJSON(value["redirectUriType"]),
redirect_uri_type: RedirectURITypeEnumToJSON(value["redirectUriType"]),
};
}

View File

@@ -0,0 +1,57 @@
/* tslint:disable */
/* eslint-disable */
/**
* authentik
* Making authentication simple.
*
* The version of the OpenAPI document: 2026.5.0-rc1
* Contact: hello@goauthentik.io
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
/**
*
* @export
*/
export const RedirectURITypeEnum = {
Authorization: "authorization",
Logout: "logout",
UnknownDefaultOpenApi: "11184809",
} as const;
export type RedirectURITypeEnum = (typeof RedirectURITypeEnum)[keyof typeof RedirectURITypeEnum];
export function instanceOfRedirectURITypeEnum(value: any): boolean {
for (const key in RedirectURITypeEnum) {
if (Object.prototype.hasOwnProperty.call(RedirectURITypeEnum, key)) {
if (RedirectURITypeEnum[key as keyof typeof RedirectURITypeEnum] === value) {
return true;
}
}
}
return false;
}
export function RedirectURITypeEnumFromJSON(json: any): RedirectURITypeEnum {
return RedirectURITypeEnumFromJSONTyped(json, false);
}
export function RedirectURITypeEnumFromJSONTyped(
json: any,
ignoreDiscriminator: boolean,
): RedirectURITypeEnum {
return json as RedirectURITypeEnum;
}
export function RedirectURITypeEnumToJSON(value?: RedirectURITypeEnum | null): any {
return value as any;
}
export function RedirectURITypeEnumToJSONTyped(
value: any,
ignoreDiscriminator: boolean,
): RedirectURITypeEnum {
return value as RedirectURITypeEnum;
}

View File

@@ -1,57 +0,0 @@
/* tslint:disable */
/* eslint-disable */
/**
* authentik
* Making authentication simple.
*
* The version of the OpenAPI document: 2026.5.0-rc1
* Contact: hello@goauthentik.io
*
* NOTE: This class is auto generated by OpenAPI Generator (https://openapi-generator.tech).
* https://openapi-generator.tech
* Do not edit the class manually.
*/
/**
*
* @export
*/
export const RedirectUriTypeEnum = {
Authorization: "authorization",
Logout: "logout",
UnknownDefaultOpenApi: "11184809",
} as const;
export type RedirectUriTypeEnum = (typeof RedirectUriTypeEnum)[keyof typeof RedirectUriTypeEnum];
export function instanceOfRedirectUriTypeEnum(value: any): boolean {
for (const key in RedirectUriTypeEnum) {
if (Object.prototype.hasOwnProperty.call(RedirectUriTypeEnum, key)) {
if (RedirectUriTypeEnum[key as keyof typeof RedirectUriTypeEnum] === value) {
return true;
}
}
}
return false;
}
export function RedirectUriTypeEnumFromJSON(json: any): RedirectUriTypeEnum {
return RedirectUriTypeEnumFromJSONTyped(json, false);
}
export function RedirectUriTypeEnumFromJSONTyped(
json: any,
ignoreDiscriminator: boolean,
): RedirectUriTypeEnum {
return json as RedirectUriTypeEnum;
}
export function RedirectUriTypeEnumToJSON(value?: RedirectUriTypeEnum | null): any {
return value as any;
}
export function RedirectUriTypeEnumToJSONTyped(
value: any,
ignoreDiscriminator: boolean,
): RedirectUriTypeEnum {
return value as RedirectUriTypeEnum;
}

View File

@@ -266,6 +266,18 @@ export interface SAMLProvider {
* @memberof SAMLProvider
*/
readonly urlIssuer: string;
/**
* Get unified SAML endpoint URL (handles SSO and SLO)
* @type {string}
* @memberof SAMLProvider
*/
readonly urlUnified: string;
/**
* Get IdP-initiated SAML URL
* @type {string}
* @memberof SAMLProvider
*/
readonly urlUnifiedInit: string;
/**
* Get SSO Post URL
* @type {string}
@@ -328,6 +340,8 @@ export function instanceOfSAMLProvider(value: object): value is SAMLProvider {
if (!("urlDownloadMetadata" in value) || value["urlDownloadMetadata"] === undefined)
return false;
if (!("urlIssuer" in value) || value["urlIssuer"] === undefined) return false;
if (!("urlUnified" in value) || value["urlUnified"] === undefined) return false;
if (!("urlUnifiedInit" in value) || value["urlUnifiedInit"] === undefined) return false;
if (!("urlSsoPost" in value) || value["urlSsoPost"] === undefined) return false;
if (!("urlSsoRedirect" in value) || value["urlSsoRedirect"] === undefined) return false;
if (!("urlSsoInit" in value) || value["urlSsoInit"] === undefined) return false;
@@ -414,6 +428,8 @@ export function SAMLProviderFromJSONTyped(json: any, ignoreDiscriminator: boolea
: SAMLNameIDPolicyEnumFromJSON(json["default_name_id_policy"]),
urlDownloadMetadata: json["url_download_metadata"],
urlIssuer: json["url_issuer"],
urlUnified: json["url_unified"],
urlUnifiedInit: json["url_unified_init"],
urlSsoPost: json["url_sso_post"],
urlSsoRedirect: json["url_sso_redirect"],
urlSsoInit: json["url_sso_init"],
@@ -440,6 +456,8 @@ export function SAMLProviderToJSONTyped(
| "meta_model_name"
| "url_download_metadata"
| "url_issuer"
| "url_unified"
| "url_unified_init"
| "url_sso_post"
| "url_sso_redirect"
| "url_sso_init"

View File

@@ -707,7 +707,7 @@ export * from "./RedirectStageModeEnum";
export * from "./RedirectStageRequest";
export * from "./RedirectURI";
export * from "./RedirectURIRequest";
export * from "./RedirectUriTypeEnum";
export * from "./RedirectURITypeEnum";
export * from "./RelatedGroup";
export * from "./RelatedRule";
export * from "./Reputation";

View File

@@ -1,9 +1,7 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"composite": true,
"isolatedModules": true,
"incremental": true,
"rootDir": "src",
"strict": true,
"newLine": "lf",

View File

@@ -1,9 +1,7 @@
{
"$schema": "https://json.schemastore.org/tsconfig",
"compilerOptions": {
"composite": true,
"isolatedModules": true,
"incremental": true,
"rootDir": "src",
"strict": true,
"newLine": "lf",

View File

@@ -32,16 +32,17 @@ class DjangoDramatiqPostgres(AppConfig):
middleware=[],
)
for middleware_class, middleware_kwargs in Conf().middlewares:
middleware: dramatiq.middleware.middleware.Middleware = import_string(middleware_class)(
**middleware_kwargs,
)
if isinstance(middleware, Results):
middleware.backend = import_string(Conf().result_backend)(
for middleware_class_path, middleware_kwargs in Conf().middlewares:
middleware_class = import_string(middleware_class_path)
if issubclass(middleware_class, Results):
middleware_kwargs["backend"] = import_string(Conf().result_backend)(
*Conf().result_backend_args,
**Conf().result_backend_kwargs,
)
broker.add_middleware(middleware) # type: ignore[no-untyped-call]
middleware: dramatiq.middleware.middleware.Middleware = middleware_class(
**middleware_kwargs,
)
broker.add_middleware(middleware)
dramatiq.set_broker(broker)

View File

@@ -23,11 +23,9 @@ from django.utils.functional import cached_property
from django.utils.module_loading import import_string
from dramatiq.broker import Broker, Consumer, MessageProxy
from dramatiq.common import compute_backoff, current_millis, dq_name, q_name, xq_name
from dramatiq.errors import ConnectionError, QueueJoinTimeout
from dramatiq.errors import BrokerConnectionError, DecodeError, QueueJoinTimeout
from dramatiq.message import Message
from dramatiq.middleware import (
Middleware,
)
from dramatiq.middleware import Middleware
from pglock.core import _cast_lock_id
from psycopg import sql
from psycopg.errors import AdminShutdown
@@ -46,7 +44,6 @@ DATABASE_ERRORS = (
AdminShutdown,
InterfaceError,
DatabaseError,
ConnectionError,
OperationalError,
)
@@ -55,7 +52,7 @@ def channel_name(queue_name: str, identifier: ChannelIdentifier) -> str:
return f"{CHANNEL_PREFIX}.{queue_name}.{identifier.value}"
def raise_connection_error(func: Callable[P, R]) -> Callable[P, R]: # noqa: UP047
def raise_broker_connection_error(func: Callable[P, R]) -> Callable[P, R]: # noqa: UP047
@functools.wraps(func)
def wrapper(*args: P.args, **kwargs: P.kwargs) -> R:
try:
@@ -66,13 +63,13 @@ def raise_connection_error(func: Callable[P, R]) -> Callable[P, R]: # noqa: UP0
connections.close_all()
except DATABASE_ERRORS:
pass
raise ConnectionError(str(exc)) from exc # type: ignore[no-untyped-call]
raise BrokerConnectionError(str(exc)) from exc # type: ignore[no-untyped-call]
return wrapper
class PostgresBroker(Broker):
queues: set[str] # type: ignore[assignment]
queues: set[str]
def __init__(
self,
@@ -81,7 +78,7 @@ class PostgresBroker(Broker):
db_alias: str = DEFAULT_DB_ALIAS,
**kwargs: Any,
) -> None:
super().__init__(*args, middleware=[], **kwargs) # type: ignore[no-untyped-call,misc]
super().__init__(*args, middleware=[], **kwargs) # type: ignore[misc]
self.logger = get_logger(__name__, type(self))
self.queues = set()
@@ -122,10 +119,10 @@ class PostgresBroker(Broker):
def declare_queue(self, queue_name: str) -> None:
if queue_name not in self.queues:
self.emit_before("declare_queue", queue_name) # type: ignore[no-untyped-call]
self.emit_before("declare_queue", queue_name)
self.queues.add(queue_name)
# Nothing more to do, all queues are in the same table
self.emit_after("declare_queue", queue_name) # type: ignore[no-untyped-call]
self.emit_after("declare_queue", queue_name)
def model_defaults(self, message: Message[Any]) -> dict[str, Any]:
eta = None
@@ -141,7 +138,7 @@ class PostgresBroker(Broker):
}
@tenacity.retry(
retry=tenacity.retry_if_exception_type(ConnectionError),
retry=tenacity.retry_if_exception_type(BrokerConnectionError),
reraise=True,
wait=tenacity.wait_random_exponential(multiplier=1, max=5),
stop=tenacity.stop_after_attempt(3),
@@ -149,11 +146,11 @@ class PostgresBroker(Broker):
cast(logging.Logger, logger), logging.INFO, exc_info=True
),
)
@raise_connection_error
@raise_broker_connection_error
def enqueue(self, message: Message[Any], *, delay: int | None = None) -> Message[Any]:
queue_name = q_name(message.queue_name) # type: ignore[no-untyped-call]
queue_name = q_name(message.queue_name)
if delay:
message_eta = current_millis() + delay # type: ignore[no-untyped-call]
message_eta = current_millis() + delay
message.options["eta"] = message_eta
self.declare_queue(queue_name)
@@ -163,7 +160,7 @@ class PostgresBroker(Broker):
message.options["model_defaults"] = self.model_defaults(message)
message.options["model_create_defaults"] = {}
self.emit_before("enqueue", message, delay) # type: ignore[no-untyped-call]
self.emit_before("enqueue", message, delay)
with transaction.atomic(using=self.db_alias):
query = {
@@ -185,7 +182,7 @@ class PostgresBroker(Broker):
message.options["task"] = task
message.options["task_created"] = created
self.emit_after("enqueue", message, delay) # type: ignore[no-untyped-call]
self.emit_after("enqueue", message, delay)
return message
def get_declared_queues(self) -> set[str]:
@@ -193,7 +190,7 @@ class PostgresBroker(Broker):
def flush(self, queue_name: str) -> None:
self.query_set.filter(
queue_name__in=(queue_name, dq_name(queue_name), xq_name(queue_name)) # type: ignore[no-untyped-call]
queue_name__in=(queue_name, dq_name(queue_name), xq_name(queue_name))
).delete()
def flush_all(self) -> None:
@@ -370,12 +367,23 @@ class _PostgresConsumer(Consumer):
)
if task is None:
return None
message = Message.decode(cast(bytes, task.message))
try:
message = Message.decode(cast(bytes, task.message))
except DecodeError:
self.logger.error(
"Failed to decode task, rejecting", queue=self.queue_name, message_id=message_id
)
self.query_set.filter(message_id=message_id, queue_name=self.queue_name).update(
state=TaskState.REJECTED,
mtime=timezone.now(),
eta=None,
)
return None
message.options["task"] = task
self.in_processing.add(str(message_id))
return message
@raise_connection_error
@raise_broker_connection_error
def __next__(self) -> MessageProxy | None:
# This method is called every second
@@ -395,7 +403,7 @@ class _PostgresConsumer(Consumer):
if processing >= self.prefetch:
# If we have too many messages already processing, wait and don't consume a message
# straight away, other workers will be faster.
self.misses, backoff_ms = compute_backoff(self.misses, max_backoff=1000) # type: ignore[no-untyped-call]
self.misses, backoff_ms = compute_backoff(self.misses, max_backoff=1000)
self.logger.debug(
"Too many messages in processing, Sleeping",
processing=processing,
@@ -420,7 +428,7 @@ class _PostgresConsumer(Consumer):
break
message = self._consume_one(str(message_id))
if message is not None:
return MessageProxy(message) # type: ignore[no-untyped-call]
return MessageProxy(message)
else:
self.logger.debug("Message already consumed. Skipping.", message_id=message_id)
continue
@@ -444,7 +452,7 @@ class _PostgresConsumer(Consumer):
self.to_unlock.add(str(message_id))
return False
def _post_process_message(self, message: Message[Any], state: TaskState) -> None:
def _post_process_message(self, message: MessageProxy, state: TaskState) -> None:
self.logger.debug("Post-processing message", message=message.message_id, state=state)
try:
self.in_processing.remove(str(message.message_id))
@@ -466,16 +474,16 @@ class _PostgresConsumer(Consumer):
)
message.options["task"] = task
@raise_connection_error
def ack(self, message: Message[Any]) -> None:
@raise_broker_connection_error
def ack(self, message: MessageProxy) -> None:
self._post_process_message(message, TaskState.DONE)
@raise_connection_error
def nack(self, message: Message[Any]) -> None:
@raise_broker_connection_error
def nack(self, message: MessageProxy) -> None:
self._post_process_message(message, TaskState.REJECTED)
@raise_connection_error
def requeue(self, messages: Iterable[Message[Any]]) -> None:
@raise_broker_connection_error
def requeue(self, messages: Iterable[MessageProxy]) -> None:
self.query_set.filter(
message_id__in=[message.message_id for message in messages],
).update(
@@ -514,7 +522,7 @@ class _PostgresConsumer(Consumer):
self.logger.info("Purged messages in all queues", count=count)
self.task_purge_last_run = timezone.now()
@raise_connection_error
@raise_broker_connection_error
def close(self) -> None:
try:
self._purge_locks()

Some files were not shown because too many files have changed in this diff Show More