Compare commits

..

277 Commits

Author SHA1 Message Date
Teffen Ellis
fbd9460720 web: Tidy timestamps. 2025-09-29 21:58:22 +02:00
Marc 'risson' Schmitt
c65060b3d0 ci: fix node version in docker image build (#17110) 2025-09-29 18:28:44 +00:00
transifex-integration[bot]
79fc574980 translate: Updates for file web/xliff/en.xlf in pt_BR (#17111)
* Translate web/xliff/en.xlf in pt_BR

100% translated source file: 'web/xliff/en.xlf'
on 'pt_BR'.

* Translate web/xliff/en.xlf in pt_BR

100% translated source file: 'web/xliff/en.xlf'
on 'pt_BR'.

* Translate web/xliff/en.xlf in pt_BR

100% translated source file: 'web/xliff/en.xlf'
on 'pt_BR'.

* Translate web/xliff/en.xlf in pt_BR

100% translated source file: 'web/xliff/en.xlf'
on 'pt_BR'.

---------

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-29 18:22:52 +00:00
Marc 'risson' Schmitt
a87f182503 tasks: reduce default number of retries and max backoff (#17107)
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-09-29 17:17:23 +00:00
Marc 'risson' Schmitt
0dba78a757 packages/django-dramatiq-postgres: broker: fix new messages not being picked up when too many messages are waiting (#17106)
Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-09-29 18:54:03 +02:00
boesr
bb8c007e63 website/docs: additional documentation for ak_user_by (#17098)
* adds additional documentation to search for user by attribute

* changes attribute naming in expression example

Co-authored-by: Jens L. <jens@beryju.org>
Signed-off-by: boesr <88541074+boesr@users.noreply.github.com>

* Adjusts ak_user_by to style guide

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: boesr <88541074+boesr@users.noreply.github.com>

* Update website/docs/expressions/_functions.mdx

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: boesr <88541074+boesr@users.noreply.github.com>

---------

Signed-off-by: boesr <88541074+boesr@users.noreply.github.com>
Co-authored-by: Jens L. <jens@beryju.org>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2025-09-29 10:49:23 -04:00
Jens L.
5cdd4d6d54 stages/identification: fix mismatched error messages (#17090)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-29 16:24:18 +02:00
Jens L.
e0f754c789 providers/oauth2: fix authentication error with identical app passwords (#17100)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-29 16:22:47 +02:00
transifex-integration[bot]
8be7a035d5 translate: Updates for file web/xliff/en.xlf in de (#17099)
Translate web/xliff/en.xlf in de

100% translated source file: 'web/xliff/en.xlf'
on 'de'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-29 14:05:29 +00:00
transifex-integration[bot]
ffef94dcc2 translate: Updates for file locale/en/LC_MESSAGES/django.po in de (#17096)
Translate locale/en/LC_MESSAGES/django.po in de

100% translated source file: 'locale/en/LC_MESSAGES/django.po'
on 'de'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-29 15:21:05 +02:00
dependabot[bot]
8ba0ccac48 core: bump goauthentik.io/api/v3 from 3.2025100.11 to 3.2025100.14 (#17071)
Bumps [goauthentik.io/api/v3](https://github.com/goauthentik/client-go) from 3.2025100.11 to 3.2025100.14.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Changelog](https://github.com/goauthentik/client-go/blob/main/model_version_history.go)
- [Commits](https://github.com/goauthentik/client-go/compare/v3.2025100.11...v3.2025100.14)

---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.14
  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>
2025-09-29 15:20:19 +02:00
dependabot[bot]
90b1f483d1 website: bump @types/react from 19.1.13 to 19.1.15 in /website (#17075)
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 19.1.13 to 19.1.15.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.15
  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>
2025-09-29 15:19:07 +02:00
Dominic R
3e587560eb website/integrations: add cloudflare access redirect (#17094)
Signed-off-by: Dominic R <dominic@sdko.org>
2025-09-29 08:51:21 -04:00
Marc 'risson' Schmitt
f92abbf291 cmd/server/healthcheck: info log success instead of debug (#17093) 2025-09-29 12:48:38 +00:00
Dominic R
e0917490e3 website/integrations: cloudflare (#17039)
* wip

* e

* codereview

co-authored-by: dewi <dewi@goauthentik.io>

* Update website/integrations/security/cloudflare-access/index.md

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

* Update website/integrations/security/cloudflare-access/index.md

Signed-off-by: Dominic R <dominic@sdko.org>

* lintfix

* Revert "lintfix"

This reverts commit b7643f4e8a.

* lintfix?????????

* Apply suggestion from @tanberry

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

* Apply suggestion from @tanberry

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

* Apply suggestion from @tanberry

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

* Apply suggestion from @tanberry

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

---------

Signed-off-by: Dominic R <dominic@sdko.org>
Co-authored-by: dewi <dewi@goauthentik.io>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
2025-09-29 08:18:37 -04:00
Marc 'risson' Schmitt
30698778c3 rbac: optimize rbac assigned by users query (#17015) 2025-09-29 14:12:40 +02:00
Jérôme W.
922f01d7de web: Fix layout class for 'row' in LibraryPage (#16752)
Fix layout class for 'row' in LibraryPage

Signed-off-by: Jérôme W. <jerome@wnetworks.org>
2025-09-29 14:11:24 +02:00
authentik-automation[bot]
8a1b6c8b07 *: Auto compress images (#16733)
[create-pull-request] automated change

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Co-authored-by: dewi-tik <204862582+dewi-tik@users.noreply.github.com>
2025-09-29 13:39:15 +02:00
dependabot[bot]
e6d9293fea core: bump github.com/go-openapi/runtime from 0.28.0 to 0.29.0 (#17072)
Bumps [github.com/go-openapi/runtime](https://github.com/go-openapi/runtime) from 0.28.0 to 0.29.0.
- [Release notes](https://github.com/go-openapi/runtime/releases)
- [Commits](https://github.com/go-openapi/runtime/compare/v0.28.0...v0.29.0)

---
updated-dependencies:
- dependency-name: github.com/go-openapi/runtime
  dependency-version: 0.29.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>
2025-09-29 13:38:33 +02:00
dependabot[bot]
abc42d6f6d website: bump the build group in /website with 6 updates (#17076)
Bumps the build group in /website with 6 updates:

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


Updates `@swc/core-darwin-arm64` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-arm64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-x64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/html-darwin-arm64` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/html-linux-arm64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/html-linux-x64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-29 13:38:28 +02:00
dependabot[bot]
5807d86d20 web: bump @spotlightjs/spotlight from 4.0.0 to 4.1.1 in /web in the sentry group across 1 directory (#17077)
web: bump @spotlightjs/spotlight

Bumps the sentry group with 1 update in the /web directory: @spotlightjs/spotlight.


Updates `@spotlightjs/spotlight` from 4.0.0 to 4.1.1

---
updated-dependencies:
- dependency-name: "@spotlightjs/spotlight"
  dependency-version: 4.1.1
  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>
2025-09-29 13:38:25 +02:00
dependabot[bot]
f1ba6f6786 web: bump the rollup group across 1 directory with 4 updates (#17078)
Bumps the rollup group with 4 updates in the /web directory: [@rollup/rollup-darwin-arm64](https://github.com/rollup/rollup), [@rollup/rollup-linux-arm64-gnu](https://github.com/rollup/rollup), [@rollup/rollup-linux-x64-gnu](https://github.com/rollup/rollup) and [rollup](https://github.com/rollup/rollup).


Updates `@rollup/rollup-darwin-arm64` from 4.52.2 to 4.52.3
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.2...v4.52.3)

Updates `@rollup/rollup-linux-arm64-gnu` from 4.52.2 to 4.52.3
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.2...v4.52.3)

Updates `@rollup/rollup-linux-x64-gnu` from 4.52.2 to 4.52.3
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.2...v4.52.3)

Updates `rollup` from 4.52.2 to 4.52.3
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.2...v4.52.3)

---
updated-dependencies:
- dependency-name: "@rollup/rollup-darwin-arm64"
  dependency-version: 4.52.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-arm64-gnu"
  dependency-version: 4.52.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-x64-gnu"
  dependency-version: 4.52.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: rollup
  dependency-version: 4.52.3
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-29 13:38:21 +02:00
dependabot[bot]
38020de4f1 web: bump the swc group across 1 directory with 11 updates (#17079)
Bumps the swc group with 1 update in the /web directory: [@swc/core](https://github.com/swc-project/swc).


Updates `@swc/core` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-darwin-arm64` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-darwin-x64` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-arm-gnueabihf` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-arm64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-arm64-musl` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-x64-gnu` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-linux-x64-musl` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-win32-arm64-msvc` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-win32-ia32-msvc` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

Updates `@swc/core-win32-x64-msvc` from 1.13.19 to 1.13.20
- [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.13.19...v1.13.20)

---
updated-dependencies:
- dependency-name: "@swc/core"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-arm64"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-x64"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm-gnueabihf"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-gnu"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-musl"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-gnu"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-musl"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-arm64-msvc"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-ia32-msvc"
  dependency-version: 1.13.20
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-x64-msvc"
  dependency-version: 1.13.20
  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>
2025-09-29 13:38:17 +02:00
dependabot[bot]
ba21c9a417 web: bump the react group across 2 directories with 1 update (#17083)
Bumps the react group with 1 update in the /packages/docusaurus-config directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).
Bumps the react group with 1 update in the /web directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.1.13 to 19.1.15
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react` from 19.1.13 to 19.1.15
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.15
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.1.15
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-29 13:38:14 +02:00
dependabot[bot]
860598fc61 web: bump knip from 5.64.0 to 5.64.1 in /web (#17084)
Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 5.64.0 to 5.64.1.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Changelog](https://github.com/webpro-nl/knip/blob/main/packages/knip/.release-it.json)
- [Commits](https://github.com/webpro-nl/knip/commits/5.64.1/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 5.64.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>
2025-09-29 13:38:10 +02:00
dependabot[bot]
a2d5c652b8 web: bump pino from 9.11.0 to 9.12.0 in /web (#17085)
Bumps [pino](https://github.com/pinojs/pino) from 9.11.0 to 9.12.0.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.11.0...v9.12.0)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.12.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>
2025-09-29 13:38:06 +02:00
dependabot[bot]
fd731c23bf core: bump axllent/mailpit from v1.27.8 to v1.27.9 in /tests/e2e (#17086)
Bumps axllent/mailpit from v1.27.8 to v1.27.9.

---
updated-dependencies:
- dependency-name: axllent/mailpit
  dependency-version: v1.27.9
  dependency-type: direct:production
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-29 13:38:03 +02:00
Jens L.
68292fede2 enterprise/stages/mtls: Improve Email address extraction (#17068)
* enterprise/stages/mtls: improve email attribute extraction

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

* return error from outpost flow executor correctly

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-28 19:28:52 +02:00
Jens L.
dce25e3fc1 web/admin: fix federation sources automatically selected (#17069)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-28 19:28:43 +02:00
Jens L.
b2c6ec284c tasks: fix errors found in tests (#17062)
fix tests

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-27 03:47:22 +02:00
Jens L.
1790c7efed tasks: fix logger name (#17009)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-27 01:48:42 +02:00
authentik-automation[bot]
44a04705e3 web: bump API Client version (#17058)
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>
2025-09-26 22:45:15 +00:00
Jens L.
1028c962c7 providers/oauth2: only issue new refresh token if old one is about to expire (#16905)
* providers/oauth2: only issue new refresh token if old one is about to expire

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

* make configurable

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

* tests and fixes

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

* sigh

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-27 00:18:14 +02:00
Jens L.
1c30c16c35 ci: cherry-pick branch in folder, include target branch in title (#17054)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-26 18:45:01 +02:00
Connor Peshek
87a28d63ed sources/saml: add location selection for Signature node (#15626)
* sources/saml: add location selection for Signature node

---------

Signed-off-by: Connor Peshek <connor@connorpeshek.me>
Co-authored-by: connor <connor@connors-MacBook-Pro.local>
Co-authored-by: Dominic R <dominic@sdko.org>
Co-authored-by: connor peshek <connorpeshek@connors-MacBook-Pro.local>
Co-authored-by: Katsushi Kobayashi < ikob@acm.org>
2025-09-26 11:07:51 -05:00
Jens L.
8c635ebb02 */bindings: order by pk (#17027)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-26 17:53:54 +02:00
authentik-automation[bot]
85e9803da8 core, web: update translations (#17036)
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>
2025-09-26 16:04:16 +02:00
authentik-automation[bot]
1db0ba1cc1 web: bump API Client version (#17048)
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>
2025-09-26 15:04:06 +02:00
Jens L.
b3e9c46cf4 tests/e2e: less hardcoded names (#17047)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-26 14:55:16 +02:00
Jens L.
4ec785a598 core/api: Better naming for partial user/group serializer, optimise bindings (#17022)
* core: add index on Group.is_superuser (#17011)

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

* update go code

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

* also optimise bindings

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

* typo

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

* remove unused

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-09-26 14:43:39 +02:00
dependabot[bot]
d4e5ee4bf5 core: bump goauthentik.io/api/v3 from 3.2025100.10 to 3.2025100.11 (#17040)
Bumps [goauthentik.io/api/v3](https://github.com/goauthentik/client-go) from 3.2025100.10 to 3.2025100.11.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Changelog](https://github.com/goauthentik/client-go/blob/main/model_version_history.go)
- [Commits](https://github.com/goauthentik/client-go/compare/v3.2025100.10...v3.2025100.11)

---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.11
  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>
2025-09-26 14:23:56 +02:00
dependabot[bot]
3f87279535 website: bump the build group in /website with 6 updates (#17042)
Bumps the build group in /website with 6 updates:

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


Updates `@swc/core-darwin-arm64` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-arm64-gnu` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-x64-gnu` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/html-darwin-arm64` from 1.13.8 to 1.13.19
- [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.13.8...v1.13.19)

Updates `@swc/html-linux-arm64-gnu` from 1.13.8 to 1.13.19
- [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.13.8...v1.13.19)

Updates `@swc/html-linux-x64-gnu` from 1.13.8 to 1.13.19
- [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.13.8...v1.13.19)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-26 14:23:47 +02:00
dependabot[bot]
5fe0de5267 web: bump the swc group across 1 directory with 11 updates (#17043)
Bumps the swc group with 1 update in the /web directory: [@swc/core](https://github.com/swc-project/swc).


Updates `@swc/core` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-darwin-arm64` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-darwin-x64` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-arm-gnueabihf` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-arm64-gnu` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-arm64-musl` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-x64-gnu` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-linux-x64-musl` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-win32-arm64-msvc` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-win32-ia32-msvc` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

Updates `@swc/core-win32-x64-msvc` from 1.13.5 to 1.13.19
- [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.13.5...v1.13.19)

---
updated-dependencies:
- dependency-name: "@swc/core"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-arm64"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-darwin-x64"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm-gnueabihf"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-gnu"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-arm64-musl"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-gnu"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-linux-x64-musl"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-arm64-msvc"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-ia32-msvc"
  dependency-version: 1.13.19
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: swc
- dependency-name: "@swc/core-win32-x64-msvc"
  dependency-version: 1.13.19
  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>
2025-09-26 14:23:10 +02:00
Dominic R
8a0e14b3bb website/integrations: Move Cloudflare Access Documentation. (#17038)
No other changes were made except moving this documentation. Cloudflare Access is authentication, not networking related, so it's logical to move it to this category.
2025-09-26 07:09:02 -04:00
Teffen Ellis
05e26b33e1 web: Fix skip-to-content element target, order. (#17030) 2025-09-25 19:43:24 -04:00
Teffen Ellis
b7df7d0478 web: Add disabled radio styles. (#17026)
* web: Add disabled radio styles.

* web: Use built-in system colors.
2025-09-25 18:55:16 +00:00
Teffen Ellis
ae518bf34f web: Report unregistered elements. (#17025) 2025-09-25 19:12:28 +02:00
Patrick
4c6e0150a7 website/docs: Update Github expression to handle non-OAuth sources gracefully (#17014)
Co-authored-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-09-25 16:55:59 +00:00
Marc 'risson' Schmitt
ba1cea1516 tests/e2e: fix ldap tests following #17010 (#17021) 2025-09-25 16:21:41 +00:00
dependabot[bot]
7c70defa5a web: bump @sentry/browser from 10.13.0 to 10.14.0 in /web in the sentry group across 1 directory (#16966)
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.13.0 to 10.14.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.13.0...10.14.0)

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-version: 10.14.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>
2025-09-25 17:57:45 +02:00
transifex-integration[bot]
e81f789248 translate: Updates for file locale/en/LC_MESSAGES/django.po in pt_BR (#17001)
Translate locale/en/LC_MESSAGES/django.po in pt_BR

100% translated source file: 'locale/en/LC_MESSAGES/django.po'
on 'pt_BR'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-25 15:52:04 +00:00
Marc 'risson' Schmitt
e2040dc3ad lib/config: fix listen settings (#17005) 2025-09-25 15:31:17 +00:00
dependabot[bot]
6e1cd6793a core: bump goauthentik.io/api/v3 from 3.2025100.8 to 3.2025100.10 (#17019)
Bumps [goauthentik.io/api/v3](https://github.com/goauthentik/client-go) from 3.2025100.8 to 3.2025100.10.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Changelog](https://github.com/goauthentik/client-go/blob/main/model_version_history.go)
- [Commits](https://github.com/goauthentik/client-go/compare/v3.2025100.8...v3.2025100.10)

---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.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>
2025-09-25 16:49:20 +02:00
Marc 'risson' Schmitt
6ba054b54c core: add index on Group.is_superuser (#17011) 2025-09-25 16:33:57 +02:00
Jens L.
033439db26 lib: match exception_to_dict locals behaviour (#17006)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-25 16:31:31 +02:00
Marc 'risson' Schmitt
9df7e50b8f outposts/ldap: add pwdChangeTime attribute (#17010)
* outposts/ldap: add pwdChangeTime attribute

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* simplify

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

* update schema

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

---------

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2025-09-25 16:16:08 +02:00
Jens L.
27033764dd website/docs: improve discord policies when also bound to non-oauth sources (#17008) 2025-09-25 13:47:17 +00:00
dependabot[bot]
53f457f84a web: bump @goauthentik/prettier-config from 1.0.5 to 3.1.0 in /web in the goauthentik group across 1 directory (#17007)
web: bump @goauthentik/prettier-config

Bumps the goauthentik group with 1 update in the /web directory: @goauthentik/prettier-config.


Updates `@goauthentik/prettier-config` from 1.0.5 to 3.1.0

---
updated-dependencies:
- dependency-name: "@goauthentik/prettier-config"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-25 15:40:50 +02:00
Marc 'risson' Schmitt
f4ec1bd88a flows: SessionEndStage: only show page if user is still authenticated (#17003) 2025-09-25 13:25:43 +00:00
Dominic R
81923d1b58 website/integrations: zammad: fix broken markdown (#17002)
* website/integrations: zammad: fix broken markdown

Signed-off-by: Dominic R <dominic@sdko.org>

* more

Signed-off-by: Dominic R <dominic@sdko.org>

---------

Signed-off-by: Dominic R <dominic@sdko.org>
2025-09-25 13:24:04 +00:00
authentik-automation[bot]
dc4e2788c7 web: bump API Client version (#16997)
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>
2025-09-25 13:11:40 +00:00
dependabot[bot]
e864654c7f web: bump @types/node from 22.15.19 to 24.5.2 in /web (#16989)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  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>
2025-09-25 14:56:35 +02:00
dependabot[bot]
5dc711e962 web: bump chromedriver from 140.0.3 to 140.0.4 in /web (#16990)
Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 140.0.3 to 140.0.4.
- [Commits](https://github.com/giggio/node-chromedriver/compare/140.0.3...140.0.4)

---
updated-dependencies:
- dependency-name: chromedriver
  dependency-version: 140.0.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>
2025-09-25 14:56:19 +02:00
dependabot[bot]
965cf2126e website: bump the build group in /website with 3 updates (#16933)
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.5.5 to 1.5.6
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.6/packages/rspack)

Updates `@rspack/binding-linux-arm64-gnu` from 1.5.5 to 1.5.6
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.6/packages/rspack)

Updates `@rspack/binding-linux-x64-gnu` from 1.5.5 to 1.5.6
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.6/packages/rspack)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-25 14:56:07 +02:00
Daniel Adu-Gyan
e415d3b667 providers/ldap: add include_children parameter to cached search mode (#16918) 2025-09-25 14:41:33 +02:00
Dewi Roberts
edb46b42fe webiste/docs: add missing oauth endpoints (#16995)
Add endpoints
2025-09-25 12:39:01 +00:00
dependabot[bot]
cbff24e506 lifecycle/aws: bump aws-cdk from 2.1029.2 to 2.1029.3 in /lifecycle/aws (#16991)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-25 14:38:21 +02:00
Dominic R
3d94049e00 website/docs: oauth provider: Add 'device' and 'introspect' to reserved slugs (#16994)
Updated the list of reserved application slugs for OAuth2 endpoints.

Signed-off-by: Dominic R <dominic@sdko.org>
2025-09-25 12:37:41 +00:00
Jens L.
53308295a2 providers/scim: add salesforce support (#16976)
* providers/scim: add salesforce support

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

* fix lint

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-25 14:36:23 +02:00
Katsushi Kobayashi
053c639aa8 outposts: fix flow executor when using subpath (#16947)
* Refer refConfig's URL

* Update internal/outpost/flow/executor.go

Co-authored-by: Jens L. <jens@beryju.org>
Signed-off-by: Katsushi Kobayashi <ikob@acm.org>

---------

Signed-off-by: Katsushi Kobayashi <ikob@acm.org>
Co-authored-by: Jens L. <jens@beryju.org>
2025-09-25 14:34:44 +02:00
Dominic R
c03ee971dc website/developer docs: What domain for what doc version (#16987)
* website/developer docs: What domain for what doc version

Closes: AUTH-1316

* 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: Dewi Roberts <dewi@goauthentik.io>
2025-09-25 13:16:35 +01:00
Jens L.
cc61f92a0b sources/oauth: add support for login support if source was started within a flow executor (#16982)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-24 20:05:13 +02:00
Marco Lecheler
df33b4d3e9 website: fix docs links (#16926)
* fix: add other docker-compose links

* fix: update other docs urls
2025-09-24 11:48:33 -04:00
Dominic R
62bf60a82c web/admin: Fix dissapearing "Create" button in service account modal (#16963)
Reproduction:

1. Attempt to create a service account: fill out the username and click Create.
2. There's a popup giving you your username and token. Click Close
3. Attempt to click Create Service Account again, the Create button should be here this time.

Root Cause: When the form is reset (it happens when the modal is closed), it was resetting the form data and clearing the result but not restoring the showSubmitButton property back to true.
2025-09-24 11:20:40 -04:00
Dewi Roberts
6becb1f0ea website/integrations: update apache guacamole (#16917)
* Update doc with new info

* Typos

* Update website/integrations/infrastructure/apache-guacamole/index.mdx

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Update website/integrations/infrastructure/apache-guacamole/index.mdx

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Applied suggestions

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
2025-09-24 14:22:48 +00:00
Dewi Roberts
30fc1b93bf website/docs: website/integrations: update docker-compose to Docker Compose (#16945)
Updates instances of docker-compose to Docker Compose
2025-09-24 14:20:19 +00:00
Dewi Roberts
0496549386 website/docs: add missing release notes (#16804)
* Add notes

* Remove docs changes

* WIP
2025-09-24 07:39:34 -04:00
dependabot[bot]
7d718a16df web: bump the storybook group across 1 directory with 5 updates (#16967)
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 9.1.7 to 9.1.8
- [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/v9.1.8/code/addons/docs)

Updates `@storybook/addon-links` from 9.1.7 to 9.1.8
- [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/v9.1.8/code/addons/links)

Updates `@storybook/web-components` from 9.1.7 to 9.1.8
- [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/v9.1.8/code/renderers/web-components)

Updates `@storybook/web-components-vite` from 9.1.7 to 9.1.8
- [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/v9.1.8/code/frameworks/web-components-vite)

Updates `storybook` from 9.1.7 to 9.1.8
- [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/v9.1.8/code/core)

---
updated-dependencies:
- dependency-name: "@storybook/addon-docs"
  dependency-version: 9.1.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-version: 9.1.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components"
  dependency-version: 9.1.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components-vite"
  dependency-version: 9.1.8
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-version: 9.1.8
  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>
2025-09-24 13:11:49 +02:00
authentik-automation[bot]
1cc3bbe784 core, web: update translations (#16961)
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
2025-09-24 13:08:54 +02:00
dependabot[bot]
de98877aac core: bump astral-sh/uv from 0.8.20 to 0.8.22 (#16965)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.8.20 to 0.8.22.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.8.20...0.8.22)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.8.22
  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>
2025-09-24 13:00:11 +02:00
dependabot[bot]
2dde770580 web: bump the rollup group across 1 directory with 4 updates (#16968)
Bumps the rollup group with 4 updates in the /web directory: [@rollup/rollup-darwin-arm64](https://github.com/rollup/rollup), [@rollup/rollup-linux-arm64-gnu](https://github.com/rollup/rollup), [@rollup/rollup-linux-x64-gnu](https://github.com/rollup/rollup) and [rollup](https://github.com/rollup/rollup).


Updates `@rollup/rollup-darwin-arm64` from 4.52.0 to 4.52.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.0...v4.52.2)

Updates `@rollup/rollup-linux-arm64-gnu` from 4.52.0 to 4.52.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.0...v4.52.2)

Updates `@rollup/rollup-linux-x64-gnu` from 4.52.0 to 4.52.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.0...v4.52.2)

Updates `rollup` from 4.52.0 to 4.52.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.52.0...v4.52.2)

---
updated-dependencies:
- dependency-name: "@rollup/rollup-darwin-arm64"
  dependency-version: 4.52.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-arm64-gnu"
  dependency-version: 4.52.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-x64-gnu"
  dependency-version: 4.52.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: rollup
  dependency-version: 4.52.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 13:00:04 +02:00
dependabot[bot]
1def462835 web: bump @goauthentik/api from 2025.10.0-rc1-1758642738 to 2025.10.0-rc1-1758664464 in /web in the goauthentik group across 1 directory (#16969)
web: bump @goauthentik/api

Bumps the goauthentik group with 1 update in the /web directory: [@goauthentik/api](https://github.com/goauthentik/authentik).


Updates `@goauthentik/api` from 2025.10.0-rc1-1758642738 to 2025.10.0-rc1-1758664464
- [Release notes](https://github.com/goauthentik/authentik/releases)
- [Commits](https://github.com/goauthentik/authentik/commits)

---
updated-dependencies:
- dependency-name: "@goauthentik/api"
  dependency-version: 2025.10.0-rc1-1758664464
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-24 13:00:01 +02:00
dependabot[bot]
96db43a85e web: bump playwright from 1.55.0 to 1.55.1 in /web (#16970)
Bumps [playwright](https://github.com/microsoft/playwright) from 1.55.0 to 1.55.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.55.0...v1.55.1)

---
updated-dependencies:
- dependency-name: playwright
  dependency-version: 1.55.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>
2025-09-24 12:59:58 +02:00
dependabot[bot]
b589be91e1 web: bump @playwright/test from 1.55.0 to 1.55.1 in /web (#16971)
Bumps [@playwright/test](https://github.com/microsoft/playwright) from 1.55.0 to 1.55.1.
- [Release notes](https://github.com/microsoft/playwright/releases)
- [Commits](https://github.com/microsoft/playwright/compare/v1.55.0...v1.55.1)

---
updated-dependencies:
- dependency-name: "@playwright/test"
  dependency-version: 1.55.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>
2025-09-24 12:59:55 +02:00
Jared Harrison
44c01f88c4 blueprints: fix typo in sources-google-ldap-mappings (#16955) 2025-09-24 00:29:03 +02:00
Jens L.
1f81d234cb enterprise/providers/radius: add EAP-TLS support (#15702)
* implement with library (backend)

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

* add outpost

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

* format

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

* add basic docs

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

* add enterprise notice to certificate

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

* clearer enterprise stuff

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

* idk

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-23 23:54:09 +02:00
Nuno Alves
1dda417596 website/docs: update url to docker-compose.yml (#16901)
Update URL of docker-compose.yml from "https://goauthentik.io/docker-compose.yml" to "https://docs.goauthentik.io/docker-compose.yml"
2025-09-23 16:31:41 -05:00
Jared Harrison
2862fa1728 website/docs: random typo fixes (#16956) 2025-09-23 20:57:42 +00:00
Tana M Berry
14b1d25f66 website/docs: fix capitalization (#16944)
* fix capitalization

* tweak

* Update website/docs/add-secure-apps/outposts/manual-deploy-docker-compose.md

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

---------

Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>
Co-authored-by: Tana M Berry <tana@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-23 14:32:28 -05:00
Tana M Berry
dbf85d04ef website/docs: add docs for source switch expression policy (#16878)
* draft for source switch docs

* add python

* add sidebar entry

* Update website/docs/customize/policies/expression/source_switch.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* add sectin about binding the policy

* tweak

* Update website/docs/customize/policies/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/working_with_policies.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

* Update website/docs/customize/policies/expression.mdx

Co-authored-by: Jens L. <jens@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

---------

Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>
Co-authored-by: Tana M Berry <tana@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Jens L. <jens@goauthentik.io>
2025-09-23 13:57:51 -05:00
Dominic R
d482bf9887 recovery: Default to 60 minutes (#16005)
* recovery: Default to 60 minutes

* Suggestion

* oops left in an old comment

* ide autocompleted the wrong thing and I went along with it. Now uses timesince as Jens suggested lol

* which means I don't need this anymore

* Update authentik/recovery/tests.py

Signed-off-by: Dominic R <dominic@sdko.org>

* wip

* a

---------

Signed-off-by: Dominic R <dominic@sdko.org>
2025-09-23 19:18:08 +02:00
Marc 'risson' Schmitt
2f2c5338c0 website/docs: 2025.8: fix worker concurrency setting rename (#16946) 2025-09-23 17:12:40 +00:00
authentik-automation[bot]
a51067c123 web: bump API Client version (#16949)
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>
2025-09-23 18:03:16 +02:00
Jens L.
2e56082066 enterprise/providers/scim: Add SCIM OAuth support (#16903)
* sources/oauth: add expires field to user source connection

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

* providers/scim: add support for other auth methods

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

* rest of the owl

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

* allow specifying any params

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

* add UI

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

* delete user when token

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

* add tests and fix

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

* sigh

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

* gen

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

* better API validation

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

* fix sentry

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

* one more test and fix

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-23 17:52:02 +02:00
Marc 'risson' Schmitt
b704a54ceb core, events: reduce memory usage when batch deleting objects (#12436)
* core, events: reduce memory usage when batch deleting objects

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

* rework

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>

---------

Signed-off-by: Marc 'risson' Schmitt <marc.schmitt@risson.space>
2025-09-23 15:47:33 +02:00
dependabot[bot]
3ddbaeb4fd web: bump knip from 5.63.1 to 5.64.0 in /web (#16937)
Bumps [knip](https://github.com/webpro-nl/knip/tree/HEAD/packages/knip) from 5.63.1 to 5.64.0.
- [Release notes](https://github.com/webpro-nl/knip/releases)
- [Changelog](https://github.com/webpro-nl/knip/blob/main/packages/knip/.release-it.json)
- [Commits](https://github.com/webpro-nl/knip/commits/5.64.0/packages/knip)

---
updated-dependencies:
- dependency-name: knip
  dependency-version: 5.64.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>
2025-09-23 14:39:42 +02:00
authentik-automation[bot]
212f847444 core, web: update translations (#16931)
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>
2025-09-23 13:44:49 +02:00
dependabot[bot]
a14acf2093 core: bump astral-sh/uv from 0.8.19 to 0.8.20 (#16932)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.8.19 to 0.8.20.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.8.19...0.8.20)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.8.20
  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>
2025-09-23 13:44:46 +02:00
dependabot[bot]
5e381bc825 website: bump the eslint group in /website with 3 updates (#16934)
Bumps the eslint group in /website with 3 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@typescript-eslint/eslint-plugin` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/parser)

Updates `typescript-eslint` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 13:44:41 +02:00
dependabot[bot]
1cafea5930 web: bump the sentry group across 1 directory with 2 updates (#16935)
Bumps the sentry group with 2 updates in the /web directory: [@sentry/browser](https://github.com/getsentry/sentry-javascript) and @spotlightjs/spotlight.


Updates `@sentry/browser` from 10.12.0 to 10.13.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.12.0...10.13.0)

Updates `@spotlightjs/spotlight` from 3.0.2 to 4.0.0

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-version: 10.13.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: sentry
- dependency-name: "@spotlightjs/spotlight"
  dependency-version: 4.0.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: sentry
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 13:44:37 +02:00
dependabot[bot]
b9bf3b2e7c web: bump the eslint group across 2 directories with 3 updates (#16936)
Bumps the eslint group with 1 update in the /packages/eslint-config directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).
Bumps the eslint group with 1 update in the /web directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint)

Updates `typescript-eslint` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/typescript-eslint)

Updates `@typescript-eslint/eslint-plugin` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.44.0 to 8.44.1
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.1/packages/parser)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.44.1
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.44.1
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-23 13:44:34 +02:00
dependabot[bot]
f670acdde0 web: bump country-flag-icons from 1.5.20 to 1.5.21 in /web (#16938)
Bumps [country-flag-icons](https://gitlab.com/catamphetamine/country-flag-icons) from 1.5.20 to 1.5.21.
- [Changelog](https://gitlab.com/catamphetamine/country-flag-icons/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/country-flag-icons/compare/v1.5.20...v1.5.21)

---
updated-dependencies:
- dependency-name: country-flag-icons
  dependency-version: 1.5.21
  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>
2025-09-23 13:44:29 +02:00
dependabot[bot]
d017e7c419 web: bump vite from 7.1.6 to 7.1.7 in /web (#16939)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.6 to 7.1.7.
- [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/v7.1.7/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.7
  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>
2025-09-23 13:44:25 +02:00
Jens L.
3d8f4c5979 *: add ruff BLE rules (#16943)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-23 13:38:42 +02:00
Dewi Roberts
486f1d8b04 website/docs: website/integrations: random language fixes (#16896)
* Random language fixes

* Osticket changed to match other files
2025-09-23 01:42:16 -05:00
Ken Sternberg
7666ba1eb7 web: revise ak-page-navbar to use standard event handlers (#16898)
* web: Add InvalidationFlow to Radius Provider dialogues

## What

- Bugfix: adds the InvalidationFlow to the Radius Provider dialogues
  - Repairs: `{"invalidation_flow":["This field is required."]}` message, which was *not* propagated
    to the Notification.
- Nitpick: Pretties `?foo=${true}` expressions: `s/\?([^=]+)=\$\{true\}/\1/`

## Note

Yes, I know I'm going to have to do more magic when we harmonize the forms, and no, I didn't add the
Property Mappings to the wizard, and yes, I know I'm going to have pain with the *new* version of
the wizard. But this is a serious bug; you can't make Radius servers with *either* of the current
dialogues at the moment.

* This (temporary) change is needed to prevent the unit tests from failing.

\# What

\# Why

\# How

\# Designs

\# Test Steps

\# Other Notes

* Revert "This (temporary) change is needed to prevent the unit tests from failing."

This reverts commit dddde09be5.

* This commit refactors `ak-page-navbar` into rendering elements that support a more DOM-oriented behavior model. The core insights here is that there were two signals being propagated through the system: “page detail change” and “toggle sidebar,” and that they are *Events*.

## What

### Changes to Sidebar handling.

The event `SidebarToggle` has been changed to a more generic `PageNavMenuToggle`, so that we’re not dictating what kind of main menu the UI provides. It has also been made a typed, global event, rather than a CustomEvent. `ak-page-navbar` sends it, and `ak-interface-admin` listens for it, the way Hermes intended. Because events from `ak-page-navbar` propagate *up*,

### Changes to the Page Navbar

The static, ad-hoc handler for page identity has been replaced with a bog-standard event listener. The event listener is placed on `window`, and so has been added to the `connectCallback()/disconnectCallback()` portions of the lifecycle so it is removed successfully on disconnect.

I have also moved the Websocket event handler (`EVENT_WS_MESSAGE`) into the `connectCallback()/disconnectCallback()` lifecycle, for the same reson.

A function, `setPageDetails(header: PageInit);` has been provided to replicate the functionality of `AKPageNavbar.setNavbrDetails()`. This function pushes the event onto `window`, to which we are listening. The event is synchronous (since its origin is in custom code), and is delivered at the same time and in the same way as the prior method.

**Why**: Primarily, it’s the standard way to do things. Both the static method and this method happen in a single JSVM microtask (the same task, actually), so there’s no change in behavior or performance. If we ever want to go to a different idiom, like making the header a child element of a route, or turning this into some series of MPAs using view-transitions and a state-managing webworker, the lifecycle components will no longer get in the way. This change also eliminates the need for every instance of `ak-page-navbar` to keep a static reference to the “current” navbar. We were not using that reference to ensure singleton status, nor clean up multiple instances, so its utility wasn’t clear.

### Changes to pages that need to update the page header details.

A mechanical script<sup>\*</sup> replaced every instance of `import ... ak-page-header` with `import { setPageDetails } from ak-page-navbar`, and every instance of `<ak-page-header ...>` with:

    updated(changed: PropertyValues<this>) {
        setPageDetails(header: ...derived_from_ak-page-header);
    }

In several cases, this left render statements that looked like:

    render() {
       return html`${this.renderBody()}`;
    }

… in which case I manually short-circuited the extra function call.

**Note**: Doing this sometimes resulted in a lot of whitespace changes (thank you very effin’ much, *prettier*), so some of the changes look much bigger than they should. I have made marks in the PR when this happens.

## Not Fixed

The call to `ak-page-header` in `ApplicationPage` looked like this:

    <ak-page-header
        header=${this.application?.name || msg("Loading")}
        description=${ifPresent(this.application?.metaPublisher)}
    >
        <ak-app-icon
            size=${PFSize.Medium}
            name=${ifPresent(this.application?.name)}
            icon=${ifPresent(this.application?.metaIcon)}
            slot="icon"
        ></ak-app-icon>
    </ak-page-header>

When `ak-page-header` was revised to be nothing but an pub-hub style event emitter, it lost any `render` capability at all, falling back to the `nothing` inherited from `lit-html`. That slot does not exist. `ApplicationPage` has not been able to show user-supplied application icons for awhile now, and this commit does not change that.

<hr/>

<sup>\*</sup>The script is written in elisp. If anyone wants to read it, I’m willing to message it to ya.

* web: applied several fixes to the PR as requested.

* One more hack.

* Missed a bug that prevented Storybook from deploying.

* Prettier has some (silly) opinions.
2025-09-22 14:53:46 -07:00
Jens L.
5bfac4c11e root: add mypy (#16904)
* add mypy

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

* fix some stuff

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

* fix more stuff

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

* actually do overrides on a per-module basis

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

* fix small stuff

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

* add pydantic plugin

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-22 19:37:49 +02:00
Teffen Ellis
1b96009be8 website: Remove duplicate sidebar entries. (#16922) 2025-09-22 19:14:23 +02:00
Teffen Ellis
20c67b3d85 web: Remove CSS constructor polyfill. (#16920) 2025-09-22 18:54:17 +02:00
Teffen Ellis
0fb542bd51 web: Replace Github Slugger package with change-case. (#16921) 2025-09-22 16:43:34 +00:00
Teffen Ellis
5997667501 website: Fix broken schema links v2 (#16919)
* website: fix broken schema links

* website: Add schema redirects.

---------

Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-22 10:46:58 -05:00
dependabot[bot]
62dda3c869 website: bump the build group in /website with 3 updates (#16908)
Bumps the build group in /website with 3 updates: [@swc/html-darwin-arm64](https://github.com/swc-project/swc), [@swc/html-linux-arm64-gnu](https://github.com/swc-project/swc) and [@swc/html-linux-x64-gnu](https://github.com/swc-project/swc).


Updates `@swc/html-darwin-arm64` from 1.13.5 to 1.13.8
- [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.13.5...v1.13.8)

Updates `@swc/html-linux-arm64-gnu` from 1.13.5 to 1.13.8
- [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.13.5...v1.13.8)

Updates `@swc/html-linux-x64-gnu` from 1.13.5 to 1.13.8
- [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.13.5...v1.13.8)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-22 16:37:12 +02:00
dependabot[bot]
7eba478fb3 core: bump astral-sh/uv from 0.8.18 to 0.8.19 (#16906)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.8.18 to 0.8.19.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.8.18...0.8.19)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.8.19
  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>
2025-09-22 16:36:58 +02:00
dependabot[bot]
4fab920b3e core: bump goauthentik.io/api/v3 from 3.2025100.6 to 3.2025100.8 (#16907)
---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.8
  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>
2025-09-22 16:36:46 +02:00
dependabot[bot]
05cfcafbbc website: bump the eslint group in /website with 2 updates (#16909)
Bumps the eslint group in /website with 2 updates: [@eslint/js](https://github.com/eslint/eslint/tree/HEAD/packages/js) and [eslint](https://github.com/eslint/eslint).


Updates `@eslint/js` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js)

Updates `eslint` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0)

---
updated-dependencies:
- dependency-name: "@eslint/js"
  dependency-version: 9.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-22 16:36:36 +02:00
dependabot[bot]
2f7bbd0d50 web: bump the eslint group across 2 directories with 2 updates (#16911)
Bumps the eslint group with 1 update in the /packages/eslint-config directory: [eslint](https://github.com/eslint/eslint).
Bumps the eslint group with 1 update in the /web directory: [eslint](https://github.com/eslint/eslint).


Updates `eslint` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0)

Updates `eslint` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/compare/v9.35.0...v9.36.0)

Updates `@eslint/js` from 9.35.0 to 9.36.0
- [Release notes](https://github.com/eslint/eslint/releases)
- [Changelog](https://github.com/eslint/eslint/blob/main/CHANGELOG.md)
- [Commits](https://github.com/eslint/eslint/commits/v9.36.0/packages/js)

---
updated-dependencies:
- dependency-name: eslint
  dependency-version: 9.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: eslint
  dependency-version: 9.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@eslint/js"
  dependency-version: 9.36.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-22 16:35:38 +02:00
dependabot[bot]
4070b4b105 web: bump the rollup group across 1 directory with 4 updates (#16912)
Bumps the rollup group with 4 updates in the /web directory: [@rollup/rollup-darwin-arm64](https://github.com/rollup/rollup), [@rollup/rollup-linux-arm64-gnu](https://github.com/rollup/rollup), [@rollup/rollup-linux-x64-gnu](https://github.com/rollup/rollup) and [rollup](https://github.com/rollup/rollup).


Updates `@rollup/rollup-darwin-arm64` from 4.50.2 to 4.52.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.2...v4.52.0)

Updates `@rollup/rollup-linux-arm64-gnu` from 4.50.2 to 4.52.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.2...v4.52.0)

Updates `@rollup/rollup-linux-x64-gnu` from 4.50.2 to 4.52.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.2...v4.52.0)

Updates `rollup` from 4.50.2 to 4.52.0
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.2...v4.52.0)

---
updated-dependencies:
- dependency-name: "@rollup/rollup-darwin-arm64"
  dependency-version: 4.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-arm64-gnu"
  dependency-version: 4.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-x64-gnu"
  dependency-version: 4.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rollup
- dependency-name: rollup
  dependency-version: 4.52.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: rollup
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-22 16:35:05 +02:00
dependabot[bot]
b98be8092a web: bump typedoc-plugin-markdown from 4.8.1 to 4.9.0 in /packages/esbuild-plugin-live-reload (#16913)
web: bump typedoc-plugin-markdown

Bumps [typedoc-plugin-markdown](https://github.com/typedoc2md/typedoc-plugin-markdown/tree/HEAD/packages/typedoc-plugin-markdown) from 4.8.1 to 4.9.0.
- [Release notes](https://github.com/typedoc2md/typedoc-plugin-markdown/releases)
- [Changelog](https://github.com/typedoc2md/typedoc-plugin-markdown/blob/main/packages/typedoc-plugin-markdown/CHANGELOG.md)
- [Commits](https://github.com/typedoc2md/typedoc-plugin-markdown/commits/typedoc-plugin-markdown@4.9.0/packages/typedoc-plugin-markdown)

---
updated-dependencies:
- dependency-name: typedoc-plugin-markdown
  dependency-version: 4.9.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>
2025-09-22 16:34:05 +02:00
dependabot[bot]
09a65dfa52 web: bump pino from 9.10.0 to 9.11.0 in /packages/esbuild-plugin-live-reload (#16914)
web: bump pino in /packages/esbuild-plugin-live-reload

Bumps [pino](https://github.com/pinojs/pino) from 9.10.0 to 9.11.0.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.10.0...v9.11.0)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.11.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>
2025-09-22 16:33:27 +02:00
dependabot[bot]
bf1325e93c web: bump pino from 9.10.0 to 9.11.0 in /web (#16915)
Bumps [pino](https://github.com/pinojs/pino) from 9.10.0 to 9.11.0.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.10.0...v9.11.0)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.11.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>
2025-09-22 16:32:54 +02:00
Dewi Roberts
493be79baf website: add hierarchy line to sidebar (#16565)
* Adds hierarchy line

* Color changes for light and dark mode and remove rounded corners

* Remove comments

* website: Fix selector specificity, alignment, theming.

* Padding change

* website: Limit hover states. Add a11y checks.

---------

Co-authored-by: Teffen Ellis <teffen@goauthentik.io>
2025-09-22 16:17:21 +02:00
Marc 'risson' Schmitt
2ce75b0b70 events: remove deprecated models (#15823) 2025-09-22 13:08:11 +00:00
Marc 'risson' Schmitt
1db626df90 core: update_attributes: only update the model if attributes changed (#16322) 2025-09-22 14:34:47 +02:00
Tana M Berry
56b3137ef2 Revert "website: Fix broken schema links, non-relative paths, unapplied redirect aliases" (#16902)
Revert "website: Fix broken schema links, non-relative paths, unapplied redir…"

This reverts commit 0e56195c82.
2025-09-22 01:01:01 +02:00
Dominic R
0e56195c82 website: Fix broken schema links, non-relative paths, unapplied redirect aliases (#16900)
* website: fix broken schema links

* website: Use download links.

* website: Use env constants for URLs.

* website: Add schema redirects.

* website: Use path alias for integrations.

* website: Use docs alias in integrations.

* website: Use relative links, better dead-link checking.

* website: Fix nested docs prefix affecting redirects. Add aliases.

* website: Remove hard links.

* website: Replace hardcoded edit URL with environment URL.

---------

Co-authored-by: Teffen Ellis <teffen@goauthentik.io>
2025-09-21 14:32:26 -04:00
Dewi Roberts
e8236871fb website/integrations: adds termix (#16889)
* Adds termix document

* Applied suggestions

* minor fix
2025-09-21 09:36:12 -05:00
authentik-automation[bot]
e85db7e83c web: bump API Client version (#16894)
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>
2025-09-19 16:46:27 +00:00
Connor Peshek
1636707dcd blueprints: exclude exporting UserConsent (#16640)
The blueprint exporter would error when attempting to export a blueprint containing UserConsent. UserConsent no longer exports when exporting a blueprint
2025-09-19 11:15:45 -05:00
authentik-automation[bot]
48a4e76bab web: bump API Client version (#16890)
* web: bump API Client version

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* fix missing package

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

---------

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Co-authored-by: authentik-automation[bot] <135050075+authentik-automation[bot]@users.noreply.github.com>
Co-authored-by: Jens Langhammer <jens@goauthentik.io>
2025-09-19 17:29:41 +02:00
dependabot[bot]
310aa627fb web: bump mermaid from 11.11.0 to 11.12.0 in /web (#16887)
Bumps [mermaid](https://github.com/mermaid-js/mermaid) from 11.11.0 to 11.12.0.
- [Release notes](https://github.com/mermaid-js/mermaid/releases)
- [Commits](https://github.com/mermaid-js/mermaid/compare/mermaid@11.11.0...mermaid@11.12.0)

---
updated-dependencies:
- dependency-name: mermaid
  dependency-version: 11.12.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>
2025-09-19 17:29:25 +02:00
authentik-automation[bot]
c0d498cfbf core, web: update translations (#16885)
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>
2025-09-19 14:03:47 +02:00
dependabot[bot]
0cf5f47695 web: bump the storybook group across 1 directory with 5 updates (#16886)
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 9.1.6 to 9.1.7
- [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/v9.1.7/code/addons/docs)

Updates `@storybook/addon-links` from 9.1.6 to 9.1.7
- [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/v9.1.7/code/addons/links)

Updates `@storybook/web-components` from 9.1.6 to 9.1.7
- [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/v9.1.7/code/renderers/web-components)

Updates `@storybook/web-components-vite` from 9.1.6 to 9.1.7
- [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/v9.1.7/code/frameworks/web-components-vite)

Updates `storybook` from 9.1.6 to 9.1.7
- [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/v9.1.7/code/core)

---
updated-dependencies:
- dependency-name: "@storybook/addon-docs"
  dependency-version: 9.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-version: 9.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components"
  dependency-version: 9.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components-vite"
  dependency-version: 9.1.7
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-version: 9.1.7
  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>
2025-09-19 14:03:43 +02:00
Jens L.
2363c0d09f api: optimise schemas' common query parameters (#16884)
* api: optimise schemas' common query parameters

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

* fix location?

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

* format

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-19 13:51:07 +02:00
dependabot[bot]
26ac581d6b web: bump the esbuild group across 2 directories with 4 updates (#16868)
Bumps the esbuild group with 1 update in the /packages/esbuild-plugin-live-reload directory: [esbuild](https://github.com/evanw/esbuild).
Bumps the esbuild group with 1 update in the /web directory: [esbuild](https://github.com/evanw/esbuild).


Updates `esbuild` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/darwin-arm64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/linux-arm64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/linux-x64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `esbuild` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/darwin-arm64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/linux-arm64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

Updates `@esbuild/linux-x64` from 0.25.9 to 0.25.10
- [Release notes](https://github.com/evanw/esbuild/releases)
- [Changelog](https://github.com/evanw/esbuild/blob/main/CHANGELOG.md)
- [Commits](https://github.com/evanw/esbuild/compare/v0.25.9...v0.25.10)

---
updated-dependencies:
- dependency-name: esbuild
  dependency-version: 0.25.10
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/darwin-arm64"
  dependency-version: 0.25.10
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/linux-arm64"
  dependency-version: 0.25.10
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/linux-x64"
  dependency-version: 0.25.10
  dependency-type: indirect
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: esbuild
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/darwin-arm64"
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/linux-arm64"
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: esbuild
- dependency-name: "@esbuild/linux-x64"
  dependency-version: 0.25.10
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: esbuild
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-18 13:36:37 +02:00
authentik-automation[bot]
2ba1aeb466 core, web: update translations (#16864)
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>
2025-09-18 13:33:07 +02:00
dependabot[bot]
db28ad3d49 core: bump astral-sh/uv from 0.8.17 to 0.8.18 (#16866)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.8.17 to 0.8.18.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.8.17...0.8.18)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.8.18
  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>
2025-09-18 13:33:04 +02:00
dependabot[bot]
a1ad6476d8 website: bump @types/node from 24.5.1 to 24.5.2 in /website (#16867)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.1 to 24.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  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>
2025-09-18 13:33:00 +02:00
dependabot[bot]
9e478ec08f web: bump @types/node from 24.5.1 to 24.5.2 in /packages/esbuild-plugin-live-reload (#16869)
web: bump @types/node in /packages/esbuild-plugin-live-reload

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.1 to 24.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  dependency-type: direct:development
  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>
2025-09-18 13:32:55 +02:00
dependabot[bot]
6078b35406 web: bump pino from 9.9.5 to 9.10.0 in /packages/esbuild-plugin-live-reload (#16870)
web: bump pino in /packages/esbuild-plugin-live-reload

Bumps [pino](https://github.com/pinojs/pino) from 9.9.5 to 9.10.0.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.9.5...v9.10.0)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.10.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>
2025-09-18 13:32:52 +02:00
dependabot[bot]
56c93af180 web: bump @types/node from 24.5.1 to 24.5.2 in /packages/prettier-config (#16871)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.1 to 24.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  dependency-type: direct:development
  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>
2025-09-18 13:32:49 +02:00
dependabot[bot]
0b7b07b499 web: bump @types/node from 22.15.19 to 24.5.2 in /web (#16872)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.5.2.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.2
  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>
2025-09-18 13:32:46 +02:00
dependabot[bot]
c16f6ecf5b web: bump dompurify from 3.2.6 to 3.2.7 in /web (#16873)
Bumps [dompurify](https://github.com/cure53/DOMPurify) from 3.2.6 to 3.2.7.
- [Release notes](https://github.com/cure53/DOMPurify/releases)
- [Commits](https://github.com/cure53/DOMPurify/compare/3.2.6...3.2.7)

---
updated-dependencies:
- dependency-name: dompurify
  dependency-version: 3.2.7
  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>
2025-09-18 13:32:43 +02:00
dependabot[bot]
194ed23d12 web: bump pino from 9.9.5 to 9.10.0 in /web (#16874)
Bumps [pino](https://github.com/pinojs/pino) from 9.9.5 to 9.10.0.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.9.5...v9.10.0)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.10.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>
2025-09-18 13:32:39 +02:00
dependabot[bot]
af85f29a01 web: bump vite from 7.1.5 to 7.1.6 in /web (#16875)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.5 to 7.1.6.
- [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/v7.1.6/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.6
  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>
2025-09-18 13:32:36 +02:00
dependabot[bot]
2ec60446a0 web: bump chromedriver from 140.0.2 to 140.0.3 in /web (#16876)
Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 140.0.2 to 140.0.3.
- [Commits](https://github.com/giggio/node-chromedriver/compare/140.0.2...140.0.3)

---
updated-dependencies:
- dependency-name: chromedriver
  dependency-version: 140.0.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>
2025-09-18 13:30:20 +02:00
dependabot[bot]
beaf1dde50 lifecycle/aws: bump aws-cdk from 2.1029.1 to 2.1029.2 in /lifecycle/aws (#16877)
Bumps [aws-cdk](https://github.com/aws/aws-cdk-cli/tree/HEAD/packages/aws-cdk) from 2.1029.1 to 2.1029.2.
- [Release notes](https://github.com/aws/aws-cdk-cli/releases)
- [Commits](https://github.com/aws/aws-cdk-cli/commits/aws-cdk@v2.1029.2/packages/aws-cdk)

---
updated-dependencies:
- dependency-name: aws-cdk
  dependency-version: 2.1029.2
  dependency-type: direct:development
  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>
2025-09-18 13:30:11 +02:00
Teffen Ellis
17da90df6c web: Fix docs links, a11y input descriptors (#16671)
* web: Clarify required marker when using screen reader.

* web: Mark helper text as input descriptor.

* web: Use next domain when in development.

* web: Clean up constants. Fix attribute mapping.

* web: use previous function name.

* web: Fix sort.

* web: Use constant.

* web: Use prefix.

* web: keep using current release for notes.
2025-09-18 00:34:15 +00:00
dependabot[bot]
d4f6370119 website: bump the eslint group in /website with 3 updates (#16788)
Bumps the eslint group in /website with 3 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@typescript-eslint/eslint-plugin` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/parser)

Updates `typescript-eslint` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 23:27:23 +02:00
dependabot[bot]
3f761e2358 website: bump the build group in /website with 3 updates (#16787)
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.5.3 to 1.5.4
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.4/packages/rspack)

Updates `@rspack/binding-linux-arm64-gnu` from 1.5.3 to 1.5.4
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.4/packages/rspack)

Updates `@rspack/binding-linux-x64-gnu` from 1.5.3 to 1.5.4
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.4/packages/rspack)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 23:25:53 +02:00
dependabot[bot]
3040987501 web: bump the eslint group across 2 directories with 3 updates (#16790)
Bumps the eslint group with 1 update in the /packages/eslint-config directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).
Bumps the eslint group with 1 update in the /web directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint)

Updates `@typescript-eslint/eslint-plugin` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/parser)

Updates `typescript-eslint` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/typescript-eslint)

Updates `@typescript-eslint/eslint-plugin` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.43.0 to 8.44.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.44.0/packages/parser)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.44.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.44.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.44.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 23:25:36 +02:00
Max Kratz
5597bb64dd website/docs: extends the example to include jwt_config for matrix/synapse (#16860)
* website: extends the example to include `jwt_config`

This is necessary to successfully connect Synapse to authentik.

* Updated formatting

---------

Co-authored-by: dewi-tik <dewi@goauthentik.io>
2025-09-17 20:33:17 +00:00
Teffen Ellis
75d1771bb8 web/a11y: Flow Search (#15876)
* web: Flesh out flow search clean up.

* web: Fix issues surrounding escape key in modals. Tidy properties.

* web: Tidy properties, types.

* web: Clean up types.

* web: Clarify labels for screen readers.

* web: Fix ARIA group behavior, labeling, input selectors.

* web: Flesh out test prereqs.

* web: Clean up usage of nullish attributes directive.

* web: Add placeholder attribute.

* web: touch up comment.

* web: Fix role matching, test selectors, etc.

* web: Fix typo.

* web: Remove redundant clean up.

* web: Normalize tab attributes.

* web: Use main role wrapper.
2025-09-17 18:35:40 +00:00
authentik-automation[bot]
a7b02bcef4 web: bump API Client version, remove Webdriver dependencies (#16836)
* web: bump API Client version

Signed-off-by: github-actions[bot] <41898282+github-actions[bot]@users.noreply.github.com>

* web: Remove WDIO tests.

* web: bump tmp package.

---------

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>
Co-authored-by: Teffen Ellis <teffen@goauthentik.io>
2025-09-17 18:34:02 +00:00
Teffen Ellis
68684d1731 web: Ignore spellchecking of Playwright output. (#16862) 2025-09-17 20:14:49 +02:00
Jens L.
a648d00783 api: Fix locale propagation from ?locale parameter in frontend (#16857)
* web: add middleware to propagate locale header

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

* add Locale middleware

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

* extract

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

* Update web/src/common/api/middleware.ts

Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
Signed-off-by: Jens L. <jens@beryju.org>
Signed-off-by: Jens Langhammer <jens@goauthentik.io>

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
Signed-off-by: Jens L. <jens@beryju.org>
Co-authored-by: Teffen Ellis <592134+GirlBossRush@users.noreply.github.com>
2025-09-17 19:42:44 +02:00
authentik-automation[bot]
b2c40392e8 core, web: update translations (#16841)
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>
2025-09-17 18:58:38 +02:00
dependabot[bot]
53b56faf31 website: bump @types/node from 24.5.0 to 24.5.1 in /website (#16843)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.0 to 24.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.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>
2025-09-17 18:58:22 +02:00
Teffen Ellis
5359318650 web/a11y: Tables -- labels, input handlers, selection and expanded state (#16207)
* web: Clean up types.

* web: Flesh out a11y clean up.

* web: Fix text selection.

* Flesh out property.

* web: Clean up stateful issues. Add labels.

* web: Clean up column rendering.

* web: Hide icons from screen reader.

* web: Fix nesting of region base elements.

* web: Add labels to hidden columns.

* web: Add aria label to row actions.

* web: Use common timestamp component.

* web: Fix column text wrapping.

* web: Add labels to all rows.

* web: Fix icon alignment.

* web: Fix mix of method properties, duplicate role assignments.

* web: Fix alignment, labeling.

* web: Fix `nothing` typing.
2025-09-17 16:28:43 +00:00
Teffen Ellis
c1d4e5cf83 web: Flush logs on SIGINT. (#16723) 2025-09-17 11:08:34 -04:00
dependabot[bot]
968aef0567 core: bump goauthentik.io/api/v3 from 3.2025100.5 to 3.2025100.6 (#16844)
Bumps [goauthentik.io/api/v3](https://github.com/goauthentik/client-go) from 3.2025100.5 to 3.2025100.6.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Changelog](https://github.com/goauthentik/client-go/blob/main/model_version_history.go)
- [Commits](https://github.com/goauthentik/client-go/compare/v3.2025100.5...v3.2025100.6)

---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.6
  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>
2025-09-17 17:06:17 +02:00
dependabot[bot]
174bc946b6 web: bump @goauthentik/api from 2025.10.0-rc1-1757525772 to 2025.10.0-rc1-1758042786 in /web in the goauthentik group across 1 directory (#16846)
web: bump @goauthentik/api

Bumps the goauthentik group with 1 update in the /web directory: [@goauthentik/api](https://github.com/goauthentik/authentik).


Updates `@goauthentik/api` from 2025.10.0-rc1-1757525772 to 2025.10.0-rc1-1758042786
- [Release notes](https://github.com/goauthentik/authentik/releases)
- [Commits](https://github.com/goauthentik/authentik/commits)

---
updated-dependencies:
- dependency-name: "@goauthentik/api"
  dependency-version: 2025.10.0-rc1-1758042786
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-17 17:04:05 +02:00
dependabot[bot]
cb63a0d5ea web: bump @sentry/browser from 10.11.0 to 10.12.0 in /web in the sentry group across 1 directory (#16845)
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.11.0 to 10.12.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.11.0...10.12.0)

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-version: 10.12.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>
2025-09-17 16:12:25 +02:00
dependabot[bot]
3f623f8ac0 web: bump @types/node from 24.5.0 to 24.5.1 in /packages/esbuild-plugin-live-reload (#16847)
web: bump @types/node in /packages/esbuild-plugin-live-reload

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.0 to 24.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.1
  dependency-type: direct:development
  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>
2025-09-17 16:11:44 +02:00
dependabot[bot]
783d92a6b1 web: bump @types/node from 24.5.0 to 24.5.1 in /packages/prettier-config (#16848)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.5.0 to 24.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.1
  dependency-type: direct:development
  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>
2025-09-17 16:11:20 +02:00
dependabot[bot]
ff6a42cc19 web: bump @types/node from 22.15.19 to 24.5.1 in /web (#16849)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.5.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.1
  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>
2025-09-17 16:10:45 +02:00
Adam Shirt
301ade8502 providers/scim: fix string formatting for SCIM user filter (#16465)
* providers/scim: fix string formatting for SCIM user filter

Signed-off-by: Adam Shirt <adamshirt@outlook.com>

* format

---------

Signed-off-by: Adam Shirt <adamshirt@outlook.com>
Co-authored-by: Jens Langhammer <jens.langhammer@beryju.org>
2025-09-17 12:42:05 +02:00
Marcelo Elizeche Landó
57e12cef06 core: bump azure-core from 1.35.0 to v1.35.1 (#16811) 2025-09-16 23:55:36 +02:00
Marcelo Elizeche Landó
41744d95c7 core: bump azure-identity from 1.23.1 to v1.25.0 (#16812) 2025-09-16 23:55:33 +02:00
Marcelo Elizeche Landó
ecc3021ede core: bump boto3 from 1.40.2 to v1.40.31 (#16813) 2025-09-16 23:55:30 +02:00
Marcelo Elizeche Landó
cde73f9f9f core: bump cffi from 1.17.1 to v2.0.0 (#16814) 2025-09-16 23:55:27 +02:00
Marcelo Elizeche Landó
f93398959c core: bump dnspython from 2.7.0 to v2.8.0 (#16815) 2025-09-16 23:55:22 +02:00
Marcelo Elizeche Landó
f89b62b0d7 core: bump httplib2 from 0.22.0 to v0.31.0 (#16816) 2025-09-16 23:55:18 +02:00
Marcelo Elizeche Landó
1b76286257 core: bump jsii from 1.113.0 to v1.114.1 (#16817) 2025-09-16 23:55:15 +02:00
Marcelo Elizeche Landó
70b39eed55 core: bump jsonschema-specifications from 2025.4.1 to v2025.9.1 (#16818) 2025-09-16 23:55:12 +02:00
Marcelo Elizeche Landó
2b0d91e571 core: bump microsoft-kiota-abstractions from 1.9.5 to v1.9.7 (#16819) 2025-09-16 23:55:09 +02:00
Marcelo Elizeche Landó
59d496d499 core: bump microsoft-kiota-authentication-azure from 1.9.5 to v1.9.6 (#16820) 2025-09-16 23:55:06 +02:00
Marcelo Elizeche Landó
3648fd287e core: bump microsoft-kiota-http from 1.9.5 to v1.9.6 (#16821) 2025-09-16 23:55:03 +02:00
Marcelo Elizeche Landó
adb9aa223f core: bump microsoft-kiota-serialization-form from 1.9.5 to v1.9.7 (#16822) 2025-09-16 23:55:01 +02:00
Marcelo Elizeche Landó
ab66ba2924 core: bump microsoft-kiota-serialization-json from 1.9.5 to v1.9.7 (#16823) 2025-09-16 23:54:57 +02:00
Marcelo Elizeche Landó
0575b9142a core: bump microsoft-kiota-serialization-multipart from 1.9.5 to v1.9.7 (#16824) 2025-09-16 23:54:55 +02:00
Marcelo Elizeche Landó
1c66f7964a core: bump microsoft-kiota-serialization-text from 1.9.5 to v1.9.7 (#16825) 2025-09-16 23:54:51 +02:00
Marcelo Elizeche Landó
a1ff4732d2 core: bump msgraph-core from 1.3.5 to v1.3.8 (#16826) 2025-09-16 23:54:48 +02:00
Marcelo Elizeche Landó
7374a9544a core: bump opentelemetry-api from 1.36.0 to v1.37.0 (#16827) 2025-09-16 23:54:44 +02:00
Marcelo Elizeche Landó
7c976fa86f core: bump protobuf from 6.31.1 to v6.32.1 (#16828) 2025-09-16 23:54:41 +02:00
Marcelo Elizeche Landó
37743fc3ac core: bump pycparser from 2.22 to v2.23 (#16829) 2025-09-16 23:54:38 +02:00
Marcelo Elizeche Landó
56af515ca8 core: bump pynacl from 1.5.0 to v1.6.0 (#16830) 2025-09-16 23:54:35 +02:00
Marcelo Elizeche Landó
4fdba8febf core: bump pyparsing from 3.2.3 to v3.2.4 (#16831) 2025-09-16 23:54:32 +02:00
Marcelo Elizeche Landó
a98d845e17 core: bump trio from 0.30.0 to v0.31.0 (#16832) 2025-09-16 23:54:29 +02:00
Marcelo Elizeche Landó
21193952bc core: bump zope-event from 5.1.1 to v6.0 (#16833) 2025-09-16 23:54:25 +02:00
Marcelo Elizeche Landó
2fe6a6d115 core: bump zope-interface from 7.2 to v8.0 (#16834) 2025-09-16 23:54:22 +02:00
Dewi Roberts
b5ec7df9d1 webiste/docs: improve user ref doc (#16779)
* WIP

* WIP

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

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Language change

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

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
2025-09-16 22:54:00 +01:00
transifex-integration[bot]
cf0afd98e3 translate: Updates for file web/xliff/en.xlf in de (#16808)
Translate web/xliff/en.xlf in de

100% translated source file: 'web/xliff/en.xlf'
on 'de'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-16 20:13:15 +02:00
Connor Peshek
d94f743124 stages: update friendly_name model from null to blank (#16672)
authentik/stages: update friendly_name model from null to blank
2025-09-16 12:06:42 -05:00
Connor Peshek
7abd287bd0 sources/saml: add default error messages to exceptions (#15562)
Co-authored-by: connor <connor@connors-MacBook-Pro.local>
2025-09-16 12:06:20 -05:00
Jens L.
84fb8143a2 website/docs: 2025.8.3 release notes (#16809)
Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-16 16:34:05 +02:00
authentik-automation[bot]
f285e5f8d1 core, web: update translations (#16783)
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>
2025-09-16 16:11:28 +02:00
Marcelo Elizeche Landó
b0a508a602 stages/email_authenticator: Fix email mfa loop (#16579)
* Return error message instead of infinite loop

* Remove unused code

* check for existing email device

* revert to initial behaviour

* Add test for failing when the user already has an email device
2025-09-16 16:04:01 +02:00
Josh Martin
e9fa7ad16b website/docs: updated Frontend development environment contributor docs (#16731)
* updated Frontend development environment contributor docs 

Updated the docs on how to start the frontend project. 

clarifying  how to override the docker-compose.yml and starting the front-end project for the first time.

Signed-off-by: Josh Martin <joshmartin@reprogrammed.software>

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

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Josh Martin <joshmartin5001@gmail.com>

---------

Signed-off-by: Josh Martin <joshmartin@reprogrammed.software>
Signed-off-by: Josh Martin <joshmartin5001@gmail.com>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2025-09-16 08:57:12 -05:00
Dewi Roberts
04023265a6 webiste/integrations: update roundcube doc (#16753)
* Update doc

* variable names

* Applied suggestions

* Update website/integrations/chat-communication-collaboration/roundcube/index.md

Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>

* Applied suggestions

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Tana M Berry <tanamarieberry@yahoo.com>
2025-09-16 13:45:47 +00:00
Dewi Roberts
87b92767e2 website/docs: update create oauth provider page (#16617)
* Updated the page to be more consistent with upcoming changes to the saml page

* Add note
2025-09-16 14:20:08 +01:00
dependabot[bot]
f80d668b43 website: bump @types/node from 24.4.0 to 24.5.0 in /website (#16789)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.4.0 to 24.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.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>
2025-09-16 14:54:08 +02:00
dependabot[bot]
317db14940 web: bump the rollup group across 1 directory with 4 updates (#16792)
Bumps the rollup group with 4 updates in the /web directory: [@rollup/rollup-darwin-arm64](https://github.com/rollup/rollup), [@rollup/rollup-linux-arm64-gnu](https://github.com/rollup/rollup), [@rollup/rollup-linux-x64-gnu](https://github.com/rollup/rollup) and [rollup](https://github.com/rollup/rollup).


Updates `@rollup/rollup-darwin-arm64` from 4.50.1 to 4.50.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.1...v4.50.2)

Updates `@rollup/rollup-linux-arm64-gnu` from 4.50.1 to 4.50.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.1...v4.50.2)

Updates `@rollup/rollup-linux-x64-gnu` from 4.50.1 to 4.50.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.1...v4.50.2)

Updates `rollup` from 4.50.1 to 4.50.2
- [Release notes](https://github.com/rollup/rollup/releases)
- [Changelog](https://github.com/rollup/rollup/blob/master/CHANGELOG.md)
- [Commits](https://github.com/rollup/rollup/compare/v4.50.1...v4.50.2)

---
updated-dependencies:
- dependency-name: "@rollup/rollup-darwin-arm64"
  dependency-version: 4.50.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-arm64-gnu"
  dependency-version: 4.50.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: "@rollup/rollup-linux-x64-gnu"
  dependency-version: 4.50.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
- dependency-name: rollup
  dependency-version: 4.50.2
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: rollup
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-16 14:54:00 +02:00
dependabot[bot]
15597d131c core: bump github.com/getsentry/sentry-go from 0.35.2 to 0.35.3 (#16786)
Bumps [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go) from 0.35.2 to 0.35.3.
- [Release notes](https://github.com/getsentry/sentry-go/releases)
- [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-go/compare/v0.35.2...v0.35.3)

---
updated-dependencies:
- dependency-name: github.com/getsentry/sentry-go
  dependency-version: 0.35.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>
2025-09-16 14:53:41 +02:00
dependabot[bot]
fc4ab5ff2f web: bump the storybook group across 1 directory with 5 updates (#16791)
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 9.1.5 to 9.1.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/v9.1.6/code/addons/docs)

Updates `@storybook/addon-links` from 9.1.5 to 9.1.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/v9.1.6/code/addons/links)

Updates `@storybook/web-components` from 9.1.5 to 9.1.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/v9.1.6/code/renderers/web-components)

Updates `@storybook/web-components-vite` from 9.1.5 to 9.1.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/v9.1.6/code/frameworks/web-components-vite)

Updates `storybook` from 9.1.5 to 9.1.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/v9.1.6/code/core)

---
updated-dependencies:
- dependency-name: "@storybook/addon-docs"
  dependency-version: 9.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/addon-links"
  dependency-version: 9.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components"
  dependency-version: 9.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: "@storybook/web-components-vite"
  dependency-version: 9.1.6
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: storybook
- dependency-name: storybook
  dependency-version: 9.1.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>
2025-09-16 14:53:28 +02:00
dependabot[bot]
d4b4e60348 web: bump @types/node from 24.4.0 to 24.5.0 in /packages/esbuild-plugin-live-reload (#16794)
web: bump @types/node in /packages/esbuild-plugin-live-reload

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.4.0 to 24.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.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>
2025-09-16 14:53:17 +02:00
dependabot[bot]
78be0900c8 web: bump @goauthentik/prettier-config from 1.0.5 to 3.1.0 in /web in the goauthentik group across 1 directory (#16793)
web: bump @goauthentik/prettier-config

Bumps the goauthentik group with 1 update in the /web directory: @goauthentik/prettier-config.


Updates `@goauthentik/prettier-config` from 1.0.5 to 3.1.0

---
updated-dependencies:
- dependency-name: "@goauthentik/prettier-config"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-16 14:53:00 +02:00
dependabot[bot]
d621f7b221 web: bump @types/node from 24.4.0 to 24.5.0 in /packages/prettier-config (#16795)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.4.0 to 24.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.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>
2025-09-16 14:52:31 +02:00
dependabot[bot]
9fe4bd6e4a web: bump @types/node from 22.15.19 to 24.5.0 in /web (#16796)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.5.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.5.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>
2025-09-16 14:52:18 +02:00
Teffen Ellis
45821e0bf1 web: Use curated dictionary for e2e fixtures. (#16750) 2025-09-16 08:37:26 -04:00
cbka
1226446be7 website/integrations: fix wekan redirect URL (#16801)
Update index.mdx

correct redirect url template

Signed-off-by: cbka <cb@mct-datensysteme.de>
2025-09-16 09:42:10 +00:00
Connor Peshek
fd1a0c3afc website/docs: fix docker tabs not rendering properly (#16799)
docs: fix docker tabs not rendering properly
2025-09-16 10:19:56 +01:00
Josh Martin
979f511030 web: Fixed null lastUsed and autofocus on TOTP login field (#16739)
* web: Fix repeated copy alert overlapping input.

* web: Fix null `lastUsed` property in request payload.

Co-authored-by: Josh Martin <joshmartin@reprogrammed.software>

* web: Fix Chrome warning about submitting unmounted forms.

* web: Fix issues surrounding autofocus on mount.

---------

Co-authored-by: Teffen Ellis <teffen@goauthentik.io>
2025-09-16 01:03:27 +02:00
Dewi Roberts
62f0e6757f website/integrations: add logout url to paperless (#16758)
Add logout URL
2025-09-15 15:41:07 +00:00
Dewi Roberts
1752b0f03d website/integrations: update omada controller doc (#16771)
* Adds tabs, updates group name property mapping, fixes some language.

* WIP

* WIP
2025-09-15 16:15:48 +01:00
Marc 'risson' Schmitt
2a76399c37 website/docs: 2025.8.2 release notes (#16773) 2025-09-15 15:13:55 +00:00
Marc 'risson' Schmitt
9db012ee35 sources/oauth/entra_id: do not assume group_id comes from entra (#16456) 2025-09-15 16:40:36 +02:00
dependabot[bot]
425216a353 website: bump @types/react from 19.1.12 to 19.1.13 in /website (#16761)
Bumps [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react) from 19.1.12 to 19.1.13.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.13
  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>
2025-09-15 16:32:44 +02:00
dependabot[bot]
d5a1a9edbf web: bump @types/node from 24.3.1 to 24.4.0 in /packages/esbuild-plugin-live-reload (#16763)
web: bump @types/node in /packages/esbuild-plugin-live-reload

Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.3.1 to 24.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.4.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>
2025-09-15 16:32:34 +02:00
dependabot[bot]
a8a95b76f3 web: bump @types/node from 22.15.19 to 24.4.0 in /web (#16768)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.4.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>
2025-09-15 16:32:23 +02:00
dependabot[bot]
eff8b1ea5d web: bump chromedriver from 140.0.1 to 140.0.2 in /web (#16766)
Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 140.0.1 to 140.0.2.
- [Commits](https://github.com/giggio/node-chromedriver/compare/140.0.1...140.0.2)

---
updated-dependencies:
- dependency-name: chromedriver
  dependency-version: 140.0.2
  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>
2025-09-15 16:32:09 +02:00
dependabot[bot]
3ca352cbc1 website: bump @types/node from 24.3.1 to 24.4.0 in /website (#16762)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.3.1 to 24.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.4.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>
2025-09-15 15:47:10 +02:00
dependabot[bot]
77fd73d0f8 web: bump the react group across 2 directories with 1 update (#16764)
Bumps the react group with 1 update in the /packages/docusaurus-config directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).
Bumps the react group with 1 update in the /web directory: [@types/react](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/react).


Updates `@types/react` from 19.1.12 to 19.1.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

Updates `@types/react` from 19.1.12 to 19.1.13
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/react)

---
updated-dependencies:
- dependency-name: "@types/react"
  dependency-version: 19.1.13
  dependency-type: direct:development
  update-type: version-update:semver-patch
  dependency-group: react
- dependency-name: "@types/react"
  dependency-version: 19.1.13
  dependency-type: direct:production
  update-type: version-update:semver-patch
  dependency-group: react
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-15 15:46:51 +02:00
dependabot[bot]
b59ccfaf4c web: bump typedoc from 0.28.12 to 0.28.13 in /packages/esbuild-plugin-live-reload (#16765)
web: bump typedoc in /packages/esbuild-plugin-live-reload

Bumps [typedoc](https://github.com/TypeStrong/TypeDoc) from 0.28.12 to 0.28.13.
- [Release notes](https://github.com/TypeStrong/TypeDoc/releases)
- [Changelog](https://github.com/TypeStrong/typedoc/blob/master/CHANGELOG.md)
- [Commits](https://github.com/TypeStrong/TypeDoc/compare/v0.28.12...v0.28.13)

---
updated-dependencies:
- dependency-name: typedoc
  dependency-version: 0.28.13
  dependency-type: direct:development
  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>
2025-09-15 15:46:31 +02:00
dependabot[bot]
b9fa1171e9 web: bump @types/node from 24.3.1 to 24.4.0 in /packages/prettier-config (#16767)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 24.3.1 to 24.4.0.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.4.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>
2025-09-15 15:46:21 +02:00
Jens L.
68a23327a8 lib/logging: only show locals when in debug mode (#16772) 2025-09-15 15:33:51 +02:00
Dominic R
7e70c6a3b2 readme: Remove Docker pulls badge (#16707) 2025-09-15 14:58:48 +02:00
authentik-automation[bot]
f565803cc7 stages/authenticator_webauthn: Update FIDO MDS3 & Passkey aaguid blobs (#16759)
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>
2025-09-15 11:22:37 +00:00
dependabot[bot]
ab96bb1ed5 ci: bump tj-actions/changed-files from 46.0.5 to 47.0.0 (#16760)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-15 12:58:07 +02:00
dependabot[bot]
0ed65d2df8 core: bump axllent/mailpit from v1.27.7 to v1.27.8 in /tests/e2e (#16769)
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-15 12:57:19 +02:00
zinen
51320d2cd5 website/integrations: remove uneeed slash from semaphore doc (#16749)
Remove uneeed slash

Signed-off-by: zinen <9595798+zinen@users.noreply.github.com>
2025-09-12 22:03:31 +00:00
dependabot[bot]
ebdb0fd7d3 lifecycle/aws: bump aws-cdk from 2.1029.0 to 2.1029.1 in /lifecycle/aws (#16742)
Bumps [aws-cdk](https://github.com/aws/aws-cdk-cli/tree/HEAD/packages/aws-cdk) from 2.1029.0 to 2.1029.1.
- [Release notes](https://github.com/aws/aws-cdk-cli/releases)
- [Commits](https://github.com/aws/aws-cdk-cli/commits/aws-cdk@v2.1029.1/packages/aws-cdk)

---
updated-dependencies:
- dependency-name: aws-cdk
  dependency-version: 2.1029.1
  dependency-type: direct:development
  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>
2025-09-12 11:17:20 -05:00
dependabot[bot]
fe25a0aa07 web: bump @goauthentik/prettier-config from 1.0.5 to 3.1.0 in /web in the goauthentik group across 1 directory (#16741)
web: bump @goauthentik/prettier-config

Bumps the goauthentik group with 1 update in the /web directory: @goauthentik/prettier-config.


Updates `@goauthentik/prettier-config` from 1.0.5 to 3.1.0

---
updated-dependencies:
- dependency-name: "@goauthentik/prettier-config"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-12 11:17:01 -05:00
authentik-automation[bot]
55ebadd2f6 core, web: update translations (#16740)
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>
2025-09-12 11:16:39 -05:00
dependabot[bot]
50f8e750a6 web: bump axios from 1.8.4 to 1.12.0 in /web (#16748)
Bumps [axios](https://github.com/axios/axios) from 1.8.4 to 1.12.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.8.4...v1.12.0)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-12 10:21:09 -05:00
dependabot[bot]
886f9a766c web: bump @codemirror/lang-html from 6.4.9 to 6.4.10 in /web (#16744)
Bumps [@codemirror/lang-html](https://github.com/codemirror/lang-html) from 6.4.9 to 6.4.10.
- [Changelog](https://github.com/codemirror/lang-html/blob/main/CHANGELOG.md)
- [Commits](https://github.com/codemirror/lang-html/compare/6.4.9...6.4.10)

---
updated-dependencies:
- dependency-name: "@codemirror/lang-html"
  dependency-version: 6.4.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>
2025-09-12 14:10:29 +02:00
dependabot[bot]
15e4c8ee4f web: bump @types/node from 22.15.19 to 24.3.1 in /web (#16743)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.3.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.3.1
  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>
2025-09-12 14:10:19 +02:00
Jens L.
06d59dd08d lifecycle: fix permission error when running worker as root (#16735)
* lifecycle: fix permission error when running worker as root

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

* fix maybe?

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

---------

Signed-off-by: Jens Langhammer <jens@goauthentik.io>
2025-09-11 15:48:19 -05:00
Teffen Ellis
f1f234e879 core: Normalize NPM script arguments. (#16725) 2025-09-11 15:29:23 -05:00
Tana M Berry
515a065831 website/docs: re-fix sentence about Go (#16736)
re-fix sentence about Go

Co-authored-by: Tana M Berry <tana@goauthentik.io>
2025-09-11 15:24:47 -05:00
Dewi Roberts
a02aaa130e website/integrations: update tautulli doc (#16717)
* Update doc
Co-Authored-By: dewi-tik <dewi@goauthentik.io>
Co-Authored-By: Brian Begun <begunfx@usa.net>

* Fix link and typo

* Apply suggestions

* Apply suggestions from code review

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

* Applied suggestions

* Add http and port to k8s step

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-11 19:48:35 +01:00
dependabot[bot]
930a924c78 website: bump the build group in /website with 3 updates (#16687)
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.5.2 to 1.5.3
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.3/packages/rspack)

Updates `@rspack/binding-linux-arm64-gnu` from 1.5.2 to 1.5.3
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.3/packages/rspack)

Updates `@rspack/binding-linux-x64-gnu` from 1.5.2 to 1.5.3
- [Release notes](https://github.com/web-infra-dev/rspack/releases)
- [Commits](https://github.com/web-infra-dev/rspack/commits/v1.5.3/packages/rspack)

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

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-11 13:06:24 -05:00
dependabot[bot]
5fc5429226 web: bump @sentry/browser from 10.10.0 to 10.11.0 in /web in the sentry group across 1 directory (#16688)
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.10.0 to 10.11.0
- [Release notes](https://github.com/getsentry/sentry-javascript/releases)
- [Changelog](https://github.com/getsentry/sentry-javascript/blob/10.11.0/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-javascript/compare/10.10.0...10.11.0)

---
updated-dependencies:
- dependency-name: "@sentry/browser"
  dependency-version: 10.11.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>
2025-09-11 13:06:20 -05:00
dependabot[bot]
0ecc442412 web: bump country-flag-icons from 1.5.19 to 1.5.20 in /web (#16689)
Bumps [country-flag-icons](https://gitlab.com/catamphetamine/country-flag-icons) from 1.5.19 to 1.5.20.
- [Changelog](https://gitlab.com/catamphetamine/country-flag-icons/blob/master/CHANGELOG.md)
- [Commits](https://gitlab.com/catamphetamine/country-flag-icons/compare/v1.5.19...v1.5.20)

---
updated-dependencies:
- dependency-name: country-flag-icons
  dependency-version: 1.5.20
  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>
2025-09-11 13:06:16 -05:00
dependabot[bot]
b3f046cfcf web: bump globals from 16.3.0 to 16.4.0 in /web (#16690)
Bumps [globals](https://github.com/sindresorhus/globals) from 16.3.0 to 16.4.0.
- [Release notes](https://github.com/sindresorhus/globals/releases)
- [Commits](https://github.com/sindresorhus/globals/compare/v16.3.0...v16.4.0)

---
updated-dependencies:
- dependency-name: globals
  dependency-version: 16.4.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>
2025-09-11 13:06:11 -05:00
dependabot[bot]
473d528ad2 core: bump astral-sh/uv from 0.8.15 to 0.8.17 (#16708)
Bumps [astral-sh/uv](https://github.com/astral-sh/uv) from 0.8.15 to 0.8.17.
- [Release notes](https://github.com/astral-sh/uv/releases)
- [Changelog](https://github.com/astral-sh/uv/blob/main/CHANGELOG.md)
- [Commits](https://github.com/astral-sh/uv/compare/0.8.15...0.8.17)

---
updated-dependencies:
- dependency-name: astral-sh/uv
  dependency-version: 0.8.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>
2025-09-11 13:06:09 -05:00
dependabot[bot]
26ac6547be core: bump github.com/redis/go-redis/v9 from 9.13.0 to 9.14.0 (#16709)
Bumps [github.com/redis/go-redis/v9](https://github.com/redis/go-redis) from 9.13.0 to 9.14.0.
- [Release notes](https://github.com/redis/go-redis/releases)
- [Changelog](https://github.com/redis/go-redis/blob/master/RELEASE-NOTES.md)
- [Commits](https://github.com/redis/go-redis/compare/v9.13.0...v9.14.0)

---
updated-dependencies:
- dependency-name: github.com/redis/go-redis/v9
  dependency-version: 9.14.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>
2025-09-11 13:06:05 -05:00
dependabot[bot]
a867ae9ae1 core: bump goauthentik.io/api/v3 from 3.2025100.4 to 3.2025100.5 (#16710)
Bumps [goauthentik.io/api/v3](https://github.com/goauthentik/client-go) from 3.2025100.4 to 3.2025100.5.
- [Release notes](https://github.com/goauthentik/client-go/releases)
- [Changelog](https://github.com/goauthentik/client-go/blob/main/model_version_history.go)
- [Commits](https://github.com/goauthentik/client-go/compare/v3.2025100.4...v3.2025100.5)

---
updated-dependencies:
- dependency-name: goauthentik.io/api/v3
  dependency-version: 3.2025100.5
  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>
2025-09-11 13:06:01 -05:00
dependabot[bot]
6186455cb9 core: bump github.com/getsentry/sentry-go from 0.35.1 to 0.35.2 (#16711)
Bumps [github.com/getsentry/sentry-go](https://github.com/getsentry/sentry-go) from 0.35.1 to 0.35.2.
- [Release notes](https://github.com/getsentry/sentry-go/releases)
- [Changelog](https://github.com/getsentry/sentry-go/blob/master/CHANGELOG.md)
- [Commits](https://github.com/getsentry/sentry-go/compare/v0.35.1...v0.35.2)

---
updated-dependencies:
- dependency-name: github.com/getsentry/sentry-go
  dependency-version: 0.35.2
  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>
2025-09-11 13:05:58 -05:00
dependabot[bot]
812b912ea2 web: bump @goauthentik/prettier-config from 1.0.5 to 3.1.0 in /web in the goauthentik group across 1 directory (#16712)
web: bump @goauthentik/prettier-config

Bumps the goauthentik group with 1 update in the /web directory: @goauthentik/prettier-config.


Updates `@goauthentik/prettier-config` from 1.0.5 to 3.1.0

---
updated-dependencies:
- dependency-name: "@goauthentik/prettier-config"
  dependency-version: 3.1.0
  dependency-type: direct:production
  update-type: version-update:semver-major
  dependency-group: goauthentik
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-11 13:05:55 -05:00
dependabot[bot]
218ffb9179 web: bump chromedriver from 140.0.0 to 140.0.1 in /web (#16713)
Bumps [chromedriver](https://github.com/giggio/node-chromedriver) from 140.0.0 to 140.0.1.
- [Commits](https://github.com/giggio/node-chromedriver/compare/140.0.0...140.0.1)

---
updated-dependencies:
- dependency-name: chromedriver
  dependency-version: 140.0.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>
2025-09-11 13:05:52 -05:00
dependabot[bot]
2a12be73b5 web: bump pino from 9.9.4 to 9.9.5 in /web (#16714)
Bumps [pino](https://github.com/pinojs/pino) from 9.9.4 to 9.9.5.
- [Release notes](https://github.com/pinojs/pino/releases)
- [Commits](https://github.com/pinojs/pino/compare/v9.9.4...v9.9.5)

---
updated-dependencies:
- dependency-name: pino
  dependency-version: 9.9.5
  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>
2025-09-11 13:05:49 -05:00
dependabot[bot]
3f1921c0d3 web: bump @types/node from 22.15.19 to 24.3.1 in /web (#16715)
Bumps [@types/node](https://github.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node) from 22.15.19 to 24.3.1.
- [Release notes](https://github.com/DefinitelyTyped/DefinitelyTyped/releases)
- [Commits](https://github.com/DefinitelyTyped/DefinitelyTyped/commits/HEAD/types/node)

---
updated-dependencies:
- dependency-name: "@types/node"
  dependency-version: 24.3.1
  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>
2025-09-11 13:05:46 -05:00
transifex-integration[bot]
5ef530d7c9 translate: Updates for file locale/en/LC_MESSAGES/django.po in de (#16697)
Translate locale/en/LC_MESSAGES/django.po in de

100% translated source file: 'locale/en/LC_MESSAGES/django.po'
on 'de'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-11 13:02:20 -05:00
transifex-integration[bot]
5e86610b63 translate: Updates for file web/xliff/en.xlf in de (#16698)
Translate web/xliff/en.xlf in de

100% translated source file: 'web/xliff/en.xlf'
on 'de'.

Co-authored-by: transifex-integration[bot] <43880903+transifex-integration[bot]@users.noreply.github.com>
2025-09-11 13:02:06 -05:00
Teffen Ellis
3906ba90f2 website: Bump @goauthentik/docusaurus-config (#16722) 2025-09-11 17:07:52 +00:00
Teffen Ellis
d8bc6e7d9b core: Fix middlware race condition induced crash (#16705) 2025-09-11 11:35:16 -05:00
Tana M Berry
e582a178e1 website/docs: remove reference to Go migration (#16724)
remove reference to Go migration

Co-authored-by: Tana M Berry <tana@goauthentik.io>
2025-09-11 09:50:15 -05:00
Dewi Roberts
aa56b2fdb1 website: add powershell syntax highlighting and bump package (#16683)
Add powershell syntax highlighting and bump package
2025-09-11 15:35:03 +02:00
Dewi Roberts
5f3b6ddbb2 website/docs: update ssh rac doc (#16695)
* Added linebreak preservation and changed blocks to yaml syntax

* Update website/docs/add-secure-apps/providers/rac/rac-public-key.md

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

* Update website/docs/add-secure-apps/providers/rac/rac-public-key.md

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

---------

Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-11 14:22:09 +01:00
Dewi Roberts
bb193a4a15 website/docs: fix typos (#16716)
Fix typos
2025-09-11 14:21:22 +01:00
Dewi Roberts
d24cebbf07 website/docs: moves display source notes (#16704)
Moves display source note location to better location
2025-09-11 14:20:41 +01:00
authentik-automation[bot]
26616b8d7d web: bump API Client version (#16700)
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>
2025-09-10 17:20:16 -04:00
Teffen Ellis
ff31e0fc3d web: Use Pino console logger, reduce live reload noise. (#16703)
* web: Use Pino console logger, reduce live reload noise.

* web: Update package.
2025-09-10 20:56:50 +00:00
Teffen Ellis
62918e9f58 web/a11y: Codemirror (#16010)
* web: Make Codemirror screen reader friendly.

* web: Include shared directory.
2025-09-10 20:21:37 +00:00
Teffen Ellis
37d8ccdd31 web: Use embedded layout. (#16481)
* web: Use embedded layout.

* web: Fix import path. Clarify type.
2025-09-10 18:59:08 +00:00
Teffen Ellis
ca73d7df8a web: Remove deprecated node:path polyfill. (#16702) 2025-09-10 18:08:37 +00:00
Teffen Ellis
635df5694e web/esbuild-plugin-live-reload: Logger options. (#16701) 2025-09-10 18:03:21 +00:00
Dewi Roberts
3a978dc348 core: fix description on remove_user_from_group (#16694)
Fix description on authentik_core.remove_user_from_group and regenerated schema
2025-09-10 12:35:56 -05:00
Dewi Roberts
480a110d74 website/docs: clarify docker compose install (#16696)
* Change order

* WIP
2025-09-10 12:35:35 -05:00
Rahammetoela Toekiman
607cbf5148 website/integrations: add osticket (#16572)
* add osticket

* website/integrations/infrastructure/osticket/index.md

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* further improved wording

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

* remove extra header

* Capitalize authentik

* Update website/integrations/infrastructure/osticket/index.md

Co-authored-by: Dominic R <dominic@sdko.org>
Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>

---------

Signed-off-by: Rahammetoela Toekiman <fusekai@outlook.com>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-10 13:33:49 +00:00
bazhard
cab8d42fe0 website/integrations: add appflowy (#16499)
* Add documentation for Appflowy service

Signed-off-by: bazhard <52638579+rayanbzd@users.noreply.github.com>

* Update index.md

Signed-off-by: bazhard <52638579+rayanbzd@users.noreply.github.com>

* Update website/integrations/documentation/appflowy/index.md

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

* Update website/integrations/documentation/appflowy/index.md

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

* Update website/integrations/documentation/appflowy/index.md

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

* Apply suggestions from code review

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

* Apply suggestions from code review

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

* Applied suggestions

* Apply suggestions from code review

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

* Apply suggestions

* Fixed cert names

* Applied suggestions

---------

Signed-off-by: bazhard <52638579+rayanbzd@users.noreply.github.com>
Signed-off-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Co-authored-by: Dominic R <dominic@sdko.org>
2025-09-10 11:45:47 +00:00
Tana M Berry
7b9945202b website/docs: add rate limiting info to Email stage docs (#16668)
* add rate limiting info

* added Jens' edits

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

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

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

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

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

Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>

---------

Signed-off-by: Tana M Berry <tanamarieberry@yahoo.com>
Co-authored-by: Tana M Berry <tana@goauthentik.io>
Co-authored-by: Dewi Roberts <dewi@goauthentik.io>
2025-09-10 04:50:44 -05:00
dependabot[bot]
3418776ab1 website: bump the eslint group in /website with 3 updates (#16674)
Bumps the eslint group in /website with 3 updates: [@typescript-eslint/eslint-plugin](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin), [@typescript-eslint/parser](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser) and [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `@typescript-eslint/eslint-plugin` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/parser)

Updates `typescript-eslint` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

---
updated-dependencies:
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 09:42:44 -05:00
dependabot[bot]
79dbcca0f4 web: bump the eslint group across 2 directories with 3 updates (#16675)
Bumps the eslint group with 1 update in the /packages/eslint-config directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).
Bumps the eslint group with 1 update in the /web directory: [typescript-eslint](https://github.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/typescript-eslint).


Updates `typescript-eslint` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

Updates `@typescript-eslint/eslint-plugin` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/parser)

Updates `typescript-eslint` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/typescript-eslint/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/typescript-eslint)

Updates `@typescript-eslint/eslint-plugin` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/eslint-plugin/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/eslint-plugin)

Updates `@typescript-eslint/parser` from 8.42.0 to 8.43.0
- [Release notes](https://github.com/typescript-eslint/typescript-eslint/releases)
- [Changelog](https://github.com/typescript-eslint/typescript-eslint/blob/main/packages/parser/CHANGELOG.md)
- [Commits](https://github.com/typescript-eslint/typescript-eslint/commits/v8.43.0/packages/parser)

---
updated-dependencies:
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:development
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.43.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.43.0
  dependency-type: indirect
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: typescript-eslint
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/eslint-plugin"
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
- dependency-name: "@typescript-eslint/parser"
  dependency-version: 8.43.0
  dependency-type: direct:production
  update-type: version-update:semver-minor
  dependency-group: eslint
...

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
2025-09-09 09:42:24 -05:00
dependabot[bot]
34c1c9794e web: bump vite from 7.1.4 to 7.1.5 in /web (#16676)
Bumps [vite](https://github.com/vitejs/vite/tree/HEAD/packages/vite) from 7.1.4 to 7.1.5.
- [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/v7.1.5/packages/vite)

---
updated-dependencies:
- dependency-name: vite
  dependency-version: 7.1.5
  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>
2025-09-09 09:20:58 -05:00
Dewi Roberts
14adb060ee website/docs: fix typo (#16681)
Fix typo
2025-09-09 14:12:49 +01:00
Teffen Ellis
a8b6030f07 core: Include region comments in VSCode Minimap. (#16667) 2025-09-09 09:10:38 -04:00
795 changed files with 27754 additions and 25662 deletions

View File

@@ -179,7 +179,7 @@ runs:
fi
# Create a unique branch name for the cherry-pick
CHERRY_PICK_BRANCH="cherry-pick-${PR_NUMBER}-to-${TARGET_BRANCH}"
CHERRY_PICK_BRANCH="cherry-pick/${PR_NUMBER}-to-${TARGET_BRANCH}"
# Check if a cherry-pick PR already exists
EXISTING_PR=$(gh pr list --head "$CHERRY_PICK_BRANCH" --json number --jq '.[0].number' 2>/dev/null || echo "")
@@ -201,7 +201,7 @@ runs:
git push origin "$CHERRY_PICK_BRANCH"
# Create PR for the cherry-pick
CHERRY_PICK_TITLE="$PR_TITLE (cherry-pick #$PR_NUMBER)"
CHERRY_PICK_TITLE="$PR_TITLE (cherry-pick #$PR_NUMBER to $TARGET_BRANCH)"
CHERRY_PICK_BODY="Cherry-pick of #$PR_NUMBER to \`$TARGET_BRANCH\` branch.
**Original PR:** #$PR_NUMBER
@@ -236,7 +236,7 @@ runs:
git push origin "$CHERRY_PICK_BRANCH"
# Create PR with conflict notice
CONFLICT_TITLE="$PR_TITLE (backport of #$PR_NUMBER)"
CONFLICT_TITLE="$PR_TITLE (cherry-pick #$PR_NUMBER to $TARGET_BRANCH)"
CONFLICT_BODY="⚠️ **This cherry-pick has conflicts that require manual resolution.**
Cherry-pick of #$PR_NUMBER to \`$TARGET_BRANCH\` branch.

View File

@@ -2,16 +2,28 @@
import os
from json import dumps
from sys import exit as sysexit
from time import time
from authentik import authentik_version
def must_or_fail(input: str | None, error: str) -> str:
if not input:
print(f"::error::{error}")
sysexit(1)
return input
# Decide if we should push the image or not
should_push = True
if len(os.environ.get("DOCKER_USERNAME", "")) < 1:
# Don't push if we don't have DOCKER_USERNAME, i.e. no secrets are available
should_push = False
if os.environ.get("GITHUB_REPOSITORY").lower() == "goauthentik/authentik-internal":
if (
must_or_fail(os.environ.get("GITHUB_REPOSITORY"), "Repo required").lower()
== "goauthentik/authentik-internal"
):
# Don't push on the internal repo
should_push = False
@@ -20,13 +32,16 @@ if os.environ.get("GITHUB_HEAD_REF", "") != "":
branch_name = os.environ["GITHUB_HEAD_REF"]
safe_branch_name = branch_name.replace("refs/heads/", "").replace("/", "-").replace("'", "-")
image_names = os.getenv("IMAGE_NAME").split(",")
image_names = must_or_fail(os.getenv("IMAGE_NAME"), "Image name required").split(",")
image_arch = os.getenv("IMAGE_ARCH") or None
is_pull_request = bool(os.getenv("PR_HEAD_SHA"))
is_release = "dev" not in image_names[0]
sha = os.environ["GITHUB_SHA"] if not is_pull_request else os.getenv("PR_HEAD_SHA")
sha = must_or_fail(
os.environ["GITHUB_SHA"] if not is_pull_request else os.getenv("PR_HEAD_SHA"),
"could not determine SHA",
)
# 2042.1.0 or 2042.1.0-rc1
version = authentik_version()
@@ -58,7 +73,7 @@ else:
image_main_tag = image_tags[0].split(":")[-1]
def get_attest_image_names(image_with_tags: list[str]):
def get_attest_image_names(image_with_tags: list[str]) -> str:
"""Attestation only for GHCR"""
image_tags = []
for image_name in set(name.split(":")[0] for name in image_with_tags):
@@ -82,7 +97,6 @@ if os.getenv("RELEASE", "false").lower() == "true":
image_build_args = [f"VERSION={os.getenv('REF')}"]
else:
image_build_args = [f"GIT_BUILD_HASH={sha}"]
image_build_args = "\n".join(image_build_args)
with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
print(f"shouldPush={str(should_push).lower()}", file=_output)
@@ -95,4 +109,4 @@ with open(os.environ["GITHUB_OUTPUT"], "a+", encoding="utf-8") as _output:
print(f"imageMainTag={image_main_tag}", file=_output)
print(f"imageMainName={image_tags[0]}", file=_output)
print(f"cacheTo={cache_to}", file=_output)
print(f"imageBuildArgs={image_build_args}", file=_output)
print(f"imageBuildArgs={"\n".join(image_build_args)}", file=_output)

View File

@@ -72,6 +72,13 @@ jobs:
run: |
mkdir -p ./gen-ts-api
mkdir -p ./gen-go-api
- name: Setup node
if: ${{ !inputs.release }}
uses: actions/setup-node@v4
with:
node-version-file: web/package.json
cache: "npm"
cache-dependency-path: web/package-lock.json
- name: generate ts client
if: ${{ !inputs.release }}
run: make gen-client-ts

View File

@@ -34,6 +34,7 @@ jobs:
- codespell
- pending-migrations
- ruff
- mypy
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v5

View File

@@ -35,7 +35,7 @@ jobs:
registry-url: "https://registry.npmjs.org"
- name: Get changed files
id: changed-files
uses: tj-actions/changed-files@ed68ef82c095e0d48ec87eccea555d944a631a4c
uses: tj-actions/changed-files@24d32ffd492484c1d75e0c0b894501ddb9d30d62
with:
files: |
${{ matrix.package }}/package.json

12
.vscode/settings.json vendored
View File

@@ -1,4 +1,16 @@
{
"[css]": {
"editor.minimap.markSectionHeaderRegex": "#\\bregion\\s*(?<separator>-?)\\s*(?<label>.*)\\*/$"
},
"[makefile]": {
"editor.minimap.markSectionHeaderRegex": "^#{25}\n##\\s\\s*(?<separator>-?)\\s*(?<label>[^\n]*)\n#{25}$"
},
"[dockerfile]": {
"editor.minimap.markSectionHeaderRegex": "\\bStage\\s*\\d:(?<separator>-?)\\s*(?<label>.*)$"
},
"[jsonc]": {
"editor.minimap.markSectionHeaderRegex": "#\\bregion\\s*(?<separator>-?)\\s*(?<label>.*)$"
},
"todo-tree.tree.showCountsInTree": true,
"todo-tree.tree.showBadges": true,
"yaml.customTags": [

View File

@@ -76,7 +76,7 @@ RUN --mount=type=secret,id=GEOIPUPDATE_ACCOUNT_ID \
/bin/sh -c "GEOIPUPDATE_LICENSE_KEY_FILE=/run/secrets/GEOIPUPDATE_LICENSE_KEY /usr/bin/entry.sh || echo 'Failed to get GeoIP database, disabling'; exit 0"
# Stage 4: Download uv
FROM ghcr.io/astral-sh/uv:0.8.15 AS uv
FROM ghcr.io/astral-sh/uv:0.8.22 AS uv
# Stage 5: Base python image
FROM ghcr.io/goauthentik/fips-python:3.13.7-slim-trixie-fips AS python-base

View File

@@ -193,6 +193,7 @@ gen-client-ts: gen-clean-ts ## Build and install the authentik API for Typescri
--git-repo-id authentik \
--git-user-id goauthentik
cd ${PWD}/${GEN_API_TS} && npm i
cd ${PWD}/${GEN_API_TS} && npm link
cd ${PWD}/web && npm link @goauthentik/api
@@ -238,34 +239,30 @@ node-install: ## Install the necessary libraries to build Node.js packages
#########################
web-build: node-install ## Build the Authentik UI
cd web && npm run build
npm run --prefix web build
web: web-lint-fix web-lint web-check-compile ## Automatically fix formatting issues in the Authentik UI source code, lint the code, and compile it
web-test: ## Run tests for the Authentik UI
cd web && npm run test
npm run --prefix web test
web-watch: ## Build and watch the Authentik UI for changes, updating automatically
rm -rf web/dist/
mkdir web/dist/
touch web/dist/.gitkeep
cd web && npm run watch
npm run --prefix web watch
web-storybook-watch: ## Build and run the storybook documentation server
cd web && npm run storybook
npm run --prefix web storybook
web-lint-fix:
cd web && npm run prettier
npm run --prefix web prettier
web-lint:
cd web && npm run lint
cd web && npm run lit-analyse
npm run --prefix web lint
npm run --prefix web lit-analyse
web-check-compile:
cd web && npm run tsc
npm run --prefix web tsc
web-i18n-extract:
cd web && npm run extract-locales
npm run --prefix web extract-locales
#########################
## Docs
@@ -277,31 +274,31 @@ docs-install:
npm ci --prefix website
docs-lint-fix: lint-codespell
npm run prettier --prefix website
npm run --prefix website prettier
docs-build:
npm run build --prefix website
npm run --prefix website build
docs-watch: ## Build and watch the topics documentation
npm run start --prefix website
npm run --prefix website start
integrations: docs-lint-fix integrations-build ## Fix formatting issues in the integrations source code, lint the code, and compile it
integrations-build:
npm run build --prefix website -w integrations
npm run --prefix website -w integrations build
integrations-watch: ## Build and watch the Integrations documentation
npm run start --prefix website -w integrations
npm run --prefix website -w integrations start
docs-api-build:
npm run build --prefix website -w api
npm run --prefix website -w api build
docs-api-watch: ## Build and watch the API documentation
npm run build:api --prefix website -w api
npm run start --prefix website -w api
npm run --prefix website -w api build:api
npm run --prefix website -w api start
docs-api-clean: ## Clean generated API documentation
npm run build:api:clean --prefix website -w api
npm run --prefix website -w api build:api:clean
#########################
## Docker
@@ -324,6 +321,9 @@ ci--meta-debug:
python -V
node --version
ci-mypy: ci--meta-debug
uv run mypy --strict $(PY_SOURCES)
ci-black: ci--meta-debug
uv run black --check $(PY_SOURCES)

View File

@@ -9,7 +9,6 @@
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/goauthentik/authentik/ci-outpost.yml?branch=main&label=outpost%20build&style=for-the-badge)](https://github.com/goauthentik/authentik/actions/workflows/ci-outpost.yml)
[![GitHub Workflow Status](https://img.shields.io/github/actions/workflow/status/goauthentik/authentik/ci-web.yml?branch=main&label=web%20build&style=for-the-badge)](https://github.com/goauthentik/authentik/actions/workflows/ci-web.yml)
[![Code Coverage](https://img.shields.io/codecov/c/gh/goauthentik/authentik?style=for-the-badge)](https://codecov.io/gh/goauthentik/authentik)
![Docker pulls](https://img.shields.io/docker/pulls/authentik/server.svg?style=for-the-badge)
![Latest version](https://img.shields.io/docker/v/authentik/server?sort=semver&style=for-the-badge)
[![](https://img.shields.io/badge/Help%20translate-transifex-blue?style=for-the-badge)](https://www.transifex.com/authentik/authentik/)

View File

@@ -1,5 +1,8 @@
"""Error Response schema, from https://github.com/axnsan12/drf-yasg/issues/224"""
from collections.abc import Callable
from typing import Any
from django.utils.translation import gettext_lazy as _
from drf_spectacular.generators import SchemaGenerator
from drf_spectacular.plumbing import (
@@ -8,6 +11,7 @@ from drf_spectacular.plumbing import (
build_basic_type,
build_object_type,
)
from drf_spectacular.renderers import OpenApiJsonRenderer
from drf_spectacular.settings import spectacular_settings
from drf_spectacular.types import OpenApiTypes
from rest_framework.settings import api_settings
@@ -15,34 +19,28 @@ from rest_framework.settings import api_settings
from authentik.api.apps import AuthentikAPIConfig
from authentik.api.pagination import PAGINATION_COMPONENT_NAME, PAGINATION_SCHEMA
def build_standard_type(obj, **kwargs):
"""Build a basic type with optional add owns."""
schema = build_basic_type(obj)
schema.update(kwargs)
return schema
GENERIC_ERROR = build_object_type(
description=_("Generic API Error"),
properties={
"detail": build_standard_type(OpenApiTypes.STR),
"code": build_standard_type(OpenApiTypes.STR),
"detail": build_basic_type(OpenApiTypes.STR),
"code": build_basic_type(OpenApiTypes.STR),
},
required=["detail"],
)
VALIDATION_ERROR = build_object_type(
description=_("Validation Error"),
properties={
api_settings.NON_FIELD_ERRORS_KEY: build_array_type(build_standard_type(OpenApiTypes.STR)),
"code": build_standard_type(OpenApiTypes.STR),
api_settings.NON_FIELD_ERRORS_KEY: build_array_type(build_basic_type(OpenApiTypes.STR)),
"code": build_basic_type(OpenApiTypes.STR),
},
required=[],
additionalProperties={},
)
def create_component(generator: SchemaGenerator, name, schema, type_=ResolvedComponent.SCHEMA):
def create_component(
generator: SchemaGenerator, name: str, schema: Any, type_=ResolvedComponent.SCHEMA
) -> ResolvedComponent:
"""Register a component and return a reference to it."""
component = ResolvedComponent(
name=name,
@@ -54,7 +52,18 @@ def create_component(generator: SchemaGenerator, name, schema, type_=ResolvedCom
return component
def postprocess_schema_responses(result, generator: SchemaGenerator, **kwargs):
def preprocess_schema_exclude_non_api(endpoints: list[tuple[str, Any, Any, Callable]], **kwargs):
"""Filter out all API Views which are not mounted under /api"""
return [
(path, path_regex, method, callback)
for path, path_regex, method, callback in endpoints
if path.startswith("/" + AuthentikAPIConfig.mountpoint)
]
def postprocess_schema_responses(
result: dict[str, Any], generator: SchemaGenerator, **kwargs
) -> dict[str, Any]:
"""Workaround to set a default response for endpoints.
Workaround suggested at
<https://github.com/tfranzel/drf-spectacular/issues/119#issuecomment-656970357>
@@ -104,10 +113,81 @@ def postprocess_schema_responses(result, generator: SchemaGenerator, **kwargs):
return result
def preprocess_schema_exclude_non_api(endpoints, **kwargs):
"""Filter out all API Views which are not mounted under /api"""
return [
(path, path_regex, method, callback)
for path, path_regex, method, callback in endpoints
if path.startswith("/" + AuthentikAPIConfig.mountpoint)
]
def postprocess_schema_pagination(
result: dict[str, Any], generator: SchemaGenerator, **kwargs
) -> dict[str, Any]:
"""Optimise pagination parameters, instead of redeclaring parameters for each endpoint
declare them globally and refer to them"""
to_replace = {
"ordering": create_component(
generator,
"QueryPaginationOrdering",
{
"name": "ordering",
"required": False,
"in": "query",
"description": "Which field to use when ordering the results.",
"schema": {"type": "string"},
},
ResolvedComponent.PARAMETER,
),
"page": create_component(
generator,
"QueryPaginationPage",
{
"name": "page",
"required": False,
"in": "query",
"description": "A page number within the paginated result set.",
"schema": {"type": "integer"},
},
ResolvedComponent.PARAMETER,
),
"page_size": create_component(
generator,
"QueryPaginationPageSize",
{
"name": "page_size",
"required": False,
"in": "query",
"description": "Number of results to return per page.",
"schema": {"type": "integer"},
},
ResolvedComponent.PARAMETER,
),
"search": create_component(
generator,
"QuerySearch",
{
"name": "search",
"required": False,
"in": "query",
"description": "A search term.",
"schema": {"type": "string"},
},
ResolvedComponent.PARAMETER,
),
}
for path in result["paths"].values():
for method in path.values():
for idx, param in enumerate(method.get("parameters", [])):
for replace_name, replace_ref in to_replace.items():
if param["name"] == replace_name:
method["parameters"][idx] = replace_ref.ref
return result
def postprocess_schema_remove_unused(
result: dict[str, Any], generator: SchemaGenerator, **kwargs
) -> dict[str, Any]:
"""Remove unused components"""
# To check if the schema is used, render it to JSON and then substring check that
# less efficient than walking through the tree but a lot simpler and no
# possibility that we miss something
raw = OpenApiJsonRenderer().render(result, renderer_context={}).decode()
for key in result["components"][ResolvedComponent.SCHEMA].keys():
if raw.count(key) > 1:
continue
del generator.registry._components[(key, ResolvedComponent.SCHEMA)]
result["components"] = generator.registry.build(spectacular_settings.APPEND_COMPONENTS)
return result

View File

@@ -76,6 +76,7 @@ from authentik.providers.scim.models import SCIMProviderGroup, SCIMProviderUser
from authentik.rbac.models import Role
from authentik.sources.scim.models import SCIMSourceGroup, SCIMSourceUser
from authentik.stages.authenticator_webauthn.models import WebAuthnDeviceType
from authentik.stages.consent.models import UserConsent
from authentik.tasks.models import Task
from authentik.tenants.models import Tenant
@@ -135,6 +136,7 @@ def excluded_models() -> list[type[Model]]:
EndpointDeviceConnection,
DeviceToken,
StreamEvent,
UserConsent,
)

View File

@@ -113,7 +113,7 @@ class Brand(SerializerModel):
try:
return self.attributes.get("settings", {}).get("locale", "")
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Failed to get default locale", exc=exc)
return ""

View File

@@ -29,8 +29,8 @@ from authentik.rbac.api.roles import RoleSerializer
from authentik.rbac.decorators import permission_required
class GroupMemberSerializer(ModelSerializer):
"""Stripped down user serializer to show relevant users for groups"""
class PartialUserSerializer(ModelSerializer):
"""Partial User Serializer, does not include child relations."""
attributes = JSONDictField(required=False)
uid = CharField(read_only=True)
@@ -94,11 +94,11 @@ class GroupSerializer(ModelSerializer):
return True
return str(request.query_params.get("include_children", "false")).lower() == "true"
@extend_schema_field(GroupMemberSerializer(many=True))
def get_users_obj(self, instance: Group) -> list[GroupMemberSerializer] | None:
@extend_schema_field(PartialUserSerializer(many=True))
def get_users_obj(self, instance: Group) -> list[PartialUserSerializer] | None:
if not self._should_include_users:
return None
return GroupMemberSerializer(instance.users, many=True).data
return PartialUserSerializer(instance.users, many=True).data
@extend_schema_field(GroupChildSerializer(many=True))
def get_children_obj(self, instance: Group) -> list[GroupChildSerializer] | None:
@@ -295,7 +295,7 @@ class GroupViewSet(UsedByMixin, ModelViewSet):
@extend_schema(
request=UserAccountSerializer,
responses={
204: OpenApiResponse(description="User added"),
204: OpenApiResponse(description="User removed"),
404: OpenApiResponse(description="User not found"),
},
)
@@ -307,7 +307,7 @@ class GroupViewSet(UsedByMixin, ModelViewSet):
permission_classes=[],
)
def remove_user(self, request: Request, pk: str) -> Response:
"""Add user to group"""
"""Remove user from group"""
group: Group = self.get_object()
user: User = (
get_objects_for_user(request.user, "authentik_core.view_user")

View File

@@ -171,7 +171,7 @@ class PropertyMappingViewSet(
except PropertyMappingExpressionException as exc:
response_data["result"] = exception_to_string(exc.exc)
response_data["successful"] = False
except Exception as exc:
except Exception as exc: # noqa
response_data["result"] = exception_to_string(exc)
response_data["successful"] = False
response = PropertyMappingTestResultSerializer(response_data)

View File

@@ -97,8 +97,8 @@ class ParamUserSerializer(PassiveSerializer):
user = PrimaryKeyRelatedField(queryset=User.objects.all().exclude_anonymous(), required=False)
class UserGroupSerializer(ModelSerializer):
"""Simplified Group Serializer for user's groups"""
class PartialGroupSerializer(ModelSerializer):
"""Partial Group Serializer, does not include child relations."""
attributes = JSONDictField(required=False)
parent_name = CharField(source="parent.name", read_only=True, allow_null=True)
@@ -143,11 +143,11 @@ class UserSerializer(ModelSerializer):
return True
return str(request.query_params.get("include_groups", "true")).lower() == "true"
@extend_schema_field(UserGroupSerializer(many=True))
def get_groups_obj(self, instance: User) -> list[UserGroupSerializer] | None:
@extend_schema_field(PartialGroupSerializer(many=True))
def get_groups_obj(self, instance: User) -> list[PartialGroupSerializer] | None:
if not self._should_include_groups:
return None
return UserGroupSerializer(instance.ak_groups, many=True).data
return PartialGroupSerializer(instance.ak_groups, many=True).data
def __init__(self, *args, **kwargs):
super().__init__(*args, **kwargs)
@@ -719,7 +719,7 @@ class UserViewSet(UsedByMixin, ModelViewSet):
return Response(status=204)
@extend_schema(
request=OpenApiTypes.NONE,
request=None,
responses={
"204": OpenApiResponse(description="Successfully ended impersonation"),
},

View File

@@ -1,6 +1,6 @@
"""custom runserver command"""
from typing import TextIO
from io import StringIO
from daphne.management.commands.runserver import Command as RunServer
from daphne.server import Server
@@ -33,4 +33,4 @@ class Command(RunServer):
super().__init__(*args, **kwargs)
# Redirect standard stdout banner from Daphne into the void
# as there are a couple more steps that happen before startup is fully done
self.stdout = TextIO()
self.stdout = StringIO()

View File

@@ -99,7 +99,7 @@ class Command(BaseCommand):
else:
try:
hook()
except Exception:
except Exception: # noqa
# Match the behavior of the cpython shell where an error in
# sys.__interactivehook__ prints a warning and the exception
# and continues.

View File

@@ -0,0 +1,18 @@
# Generated by Django 5.1.12 on 2025-09-25 13:39
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_core", "0050_user_last_updated_and_more"),
("authentik_rbac", "0006_alter_role_options"),
]
operations = [
migrations.AddIndex(
model_name="group",
index=models.Index(fields=["is_superuser"], name="authentik_c_is_supe_1e5a97_idx"),
),
]

View File

@@ -114,15 +114,21 @@ class AttributesMixin(models.Model):
def update_attributes(self, properties: dict[str, Any]):
"""Update fields and attributes, but correctly by merging dicts"""
needs_update = False
for key, value in properties.items():
if key == "attributes":
continue
setattr(self, key, value)
if getattr(self, key, None) != value:
setattr(self, key, value)
needs_update = True
final_attributes = {}
MERGE_LIST_UNIQUE.merge(final_attributes, self.attributes)
MERGE_LIST_UNIQUE.merge(final_attributes, properties.get("attributes", {}))
self.attributes = final_attributes
self.save()
if self.attributes != final_attributes:
self.attributes = final_attributes
needs_update = True
if needs_update:
self.save()
@classmethod
def update_or_create_attributes(
@@ -200,7 +206,10 @@ class Group(SerializerModel, AttributesMixin):
"parent",
),
)
indexes = [models.Index(fields=["name"])]
indexes = (
models.Index(fields=["name"]),
models.Index(fields=["is_superuser"]),
)
verbose_name = _("Group")
verbose_name_plural = _("Groups")
permissions = [
@@ -400,7 +409,7 @@ class User(SerializerModel, GuardianUserMixin, AttributesMixin, AbstractUser):
try:
return self.attributes.get("settings", {}).get("locale", "")
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Failed to get default locale", exc=exc)
if request:
return request.brand.locale
@@ -581,7 +590,7 @@ class Application(SerializerModel, PolicyBindingModel):
try:
return url % user.__dict__
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Failed to format launch url", exc=exc)
return url
return url
@@ -777,7 +786,7 @@ class Source(ManagedModel, SerializerModel, PolicyBindingModel):
"slug": self.slug,
}
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Failed to template user path", exc=exc, source=self)
return User.default_path()

View File

@@ -2,10 +2,9 @@
from django.contrib.auth.signals import user_logged_in
from django.core.cache import cache
from django.core.signals import Signal
from django.db.models import Model
from django.db.models.signals import post_delete, post_save, pre_save
from django.dispatch import receiver
from django.dispatch import Signal, receiver
from django.http.request import HttpRequest
from structlog.stdlib import get_logger

View File

@@ -14,6 +14,7 @@ from authentik.core.models import (
ExpiringModel,
User,
)
from authentik.lib.utils.db import chunked_queryset
from authentik.tasks.models import Task
LOGGER = get_logger()
@@ -28,7 +29,7 @@ def clean_expired_models():
cls.objects.all().exclude(expiring=False).exclude(expiring=True, expires__gt=now())
)
amount = objects.count()
for obj in objects:
for obj in chunked_queryset(objects):
obj.expire_action()
LOGGER.debug("Expired models", model=cls, amount=amount)
self.info(f"Expired {amount} {cls._meta.verbose_name_plural}")

View File

@@ -8,6 +8,7 @@
{% endblock %}
{% block body %}
<ak-skip-to-content></ak-skip-to-content>
<ak-message-container alignment="bottom"></ak-message-container>
<ak-interface-admin>
<ak-loading></ak-loading>

View File

@@ -8,6 +8,7 @@
{% endblock %}
{% block body %}
<ak-skip-to-content></ak-skip-to-content>
<ak-message-container></ak-message-container>
<ak-interface-user>
<ak-loading></ak-loading>

View File

@@ -45,6 +45,7 @@
{% block body %}
<div class="pf-c-background-image">
</div>
<ak-skip-to-content></ak-skip-to-content>
<ak-message-container></ak-message-container>
<div class="pf-c-login stacked">
<div class="ak-login-container">

View File

@@ -20,6 +20,11 @@ from authentik.lib.models import CreatedUpdatedModel, SerializerModel
LOGGER = get_logger()
def fingerprint_sha256(cert: Certificate) -> str:
"""Get SHA256 Fingerprint of certificate"""
return hexlify(cert.fingerprint(hashes.SHA256()), ":").decode("utf-8")
class CertificateKeyPair(SerializerModel, ManagedModel, CreatedUpdatedModel):
"""CertificateKeyPair that can be used for signing or encrypting if `key_data`
is set, otherwise it can be used to verify remote data."""
@@ -82,7 +87,7 @@ class CertificateKeyPair(SerializerModel, ManagedModel, CreatedUpdatedModel):
@property
def fingerprint_sha256(self) -> str:
"""Get SHA256 Fingerprint of certificate_data"""
return hexlify(self.certificate.fingerprint(hashes.SHA256()), ":").decode("utf-8")
return fingerprint_sha256(self.certificate)
@property
def fingerprint_sha1(self) -> str:

View File

@@ -27,7 +27,7 @@ class TestCrypto(APITestCase):
def test_model_private(self):
"""Test model private key"""
cert = CertificateKeyPair.objects.create(
name="test",
name=generate_id(),
certificate_data="foo",
key_data="foo",
)
@@ -271,7 +271,7 @@ class TestCrypto(APITestCase):
keypair = create_test_cert()
provider = OAuth2Provider.objects.create(
name=generate_id(),
client_id="test",
client_id=generate_id(),
client_secret=generate_key(),
authorization_flow=create_test_flow(),
redirect_uris=[RedirectURI(RedirectURIMatchingMode.STRICT, "http://localhost")],
@@ -303,7 +303,7 @@ class TestCrypto(APITestCase):
keypair = create_test_cert()
OAuth2Provider.objects.create(
name=generate_id(),
client_id="test",
client_id=generate_id(),
client_secret=generate_key(),
authorization_flow=create_test_flow(),
redirect_uris=[RedirectURI(RedirectURIMatchingMode.STRICT, "http://localhost")],

View File

@@ -4,7 +4,7 @@ from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.users import UserGroupSerializer
from authentik.core.api.users import PartialGroupSerializer
from authentik.core.api.utils import ModelSerializer
from authentik.enterprise.providers.google_workspace.models import GoogleWorkspaceProviderGroup
from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
@@ -13,7 +13,7 @@ from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
class GoogleWorkspaceProviderGroupSerializer(ModelSerializer):
"""GoogleWorkspaceProviderGroup Serializer"""
group_obj = UserGroupSerializer(source="group", read_only=True)
group_obj = PartialGroupSerializer(source="group", read_only=True)
class Meta:

View File

@@ -3,7 +3,7 @@
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.groups import GroupMemberSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.utils import ModelSerializer
from authentik.enterprise.providers.google_workspace.models import GoogleWorkspaceProviderUser
@@ -13,7 +13,7 @@ from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
class GoogleWorkspaceProviderUserSerializer(ModelSerializer):
"""GoogleWorkspaceProviderUser Serializer"""
user_obj = GroupMemberSerializer(source="user", read_only=True)
user_obj = PartialUserSerializer(source="user", read_only=True)
class Meta:

View File

@@ -4,7 +4,7 @@ from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.users import UserGroupSerializer
from authentik.core.api.users import PartialGroupSerializer
from authentik.core.api.utils import ModelSerializer
from authentik.enterprise.providers.microsoft_entra.models import MicrosoftEntraProviderGroup
from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
@@ -13,7 +13,7 @@ from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
class MicrosoftEntraProviderGroupSerializer(ModelSerializer):
"""MicrosoftEntraProviderGroup Serializer"""
group_obj = UserGroupSerializer(source="group", read_only=True)
group_obj = PartialGroupSerializer(source="group", read_only=True)
class Meta:

View File

@@ -3,7 +3,7 @@
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.groups import GroupMemberSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.utils import ModelSerializer
from authentik.enterprise.providers.microsoft_entra.models import MicrosoftEntraProviderUser
@@ -13,7 +13,7 @@ from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
class MicrosoftEntraProviderUserSerializer(ModelSerializer):
"""MicrosoftEntraProviderUser Serializer"""
user_obj = GroupMemberSerializer(source="user", read_only=True)
user_obj = PartialUserSerializer(source="user", read_only=True)
class Meta:

View File

@@ -0,0 +1,14 @@
from django.utils.translation import gettext as _
from rest_framework.exceptions import ValidationError
from authentik.crypto.models import CertificateKeyPair
from authentik.enterprise.license import LicenseKey
class RadiusProviderSerializerMixin:
def validate_certificate(self, cert: CertificateKeyPair) -> CertificateKeyPair:
if cert:
if not LicenseKey.cached_summary().status.is_valid:
raise ValidationError(_("Enterprise is required to use EAP-TLS."))
return cert

View File

@@ -0,0 +1,9 @@
from authentik.enterprise.apps import EnterpriseConfig
class AuthentikEnterpriseProviderRadiusConfig(EnterpriseConfig):
name = "authentik.enterprise.providers.radius"
label = "authentik_enterprise_providers_radius"
verbose_name = "authentik Enterprise.Providers.Radius"
default = True

View File

@@ -0,0 +1,14 @@
from django.utils.translation import gettext as _
from rest_framework.exceptions import ValidationError
from authentik.enterprise.license import LicenseKey
from authentik.providers.scim.models import SCIMAuthenticationMode
class SCIMProviderSerializerMixin:
def validate_auth_mode(self, auth_mode: SCIMAuthenticationMode) -> SCIMAuthenticationMode:
if auth_mode == SCIMAuthenticationMode.OAUTH:
if not LicenseKey.cached_summary().status.is_valid:
raise ValidationError(_("Enterprise is required to use the OAuth mode."))
return auth_mode

View File

@@ -0,0 +1,9 @@
from authentik.enterprise.apps import EnterpriseConfig
class AuthentikEnterpriseProviderSCIMConfig(EnterpriseConfig):
name = "authentik.enterprise.providers.scim"
label = "authentik_enterprise_providers_scim"
verbose_name = "authentik Enterprise.Providers.SCIM"
default = True

View File

@@ -0,0 +1,80 @@
from datetime import timedelta
from typing import TYPE_CHECKING
from django.utils.timezone import now
from requests import Request, RequestException
from structlog.stdlib import get_logger
from authentik.providers.scim.clients.exceptions import SCIMRequestException
from authentik.sources.oauth.clients.oauth2 import OAuth2Client
from authentik.sources.oauth.models import OAuthSource, UserOAuthSourceConnection
if TYPE_CHECKING:
from authentik.providers.scim.models import SCIMProvider
class SCIMOAuthException(SCIMRequestException):
"""Exceptions related to OAuth operations for SCIM requests"""
class SCIMOAuthAuth:
def __init__(self, provider: "SCIMProvider"):
self.provider = provider
self.user = provider.auth_oauth_user
self.connection = self.get_connection()
self.logger = get_logger().bind()
def retrieve_token(self):
if not self.provider.auth_oauth:
return None
source: OAuthSource = self.provider.auth_oauth
client = OAuth2Client(source, None)
access_token_url = source.source_type.access_token_url or ""
if source.source_type.urls_customizable and source.access_token_url:
access_token_url = source.access_token_url
data = client.get_access_token_args(None, None)
data["grant_type"] = "password"
data.update(self.provider.auth_oauth_params)
try:
response = client.do_request(
"POST",
access_token_url,
auth=client.get_access_token_auth(),
data=data,
headers=client._default_headers,
)
response.raise_for_status()
body = response.json()
if "error" in body:
self.logger.info("Failed to get new OAuth token", error=body["error"])
raise SCIMOAuthException(response, body["error"])
return body
except RequestException as exc:
raise SCIMOAuthException(exc.response, message="Failed to get OAuth token") from exc
def get_connection(self):
token = UserOAuthSourceConnection.objects.filter(
source=self.provider.auth_oauth, user=self.user, expires__gt=now()
).first()
if token and token.access_token:
return token
token = self.retrieve_token()
access_token = token["access_token"]
expires_in = int(token.get("expires_in", 0))
token, _ = UserOAuthSourceConnection.objects.update_or_create(
source=self.provider.auth_oauth,
user=self.user,
defaults={
"access_token": access_token,
"expires": now() + timedelta(seconds=expires_in),
},
)
return token
def __call__(self, request: Request) -> Request:
if not self.connection.is_valid:
self.logger.info("OAuth token expired, renewing token")
self.connection = self.get_connection()
request.headers["Authorization"] = f"Bearer {self.connection.access_token}"
return request

View File

@@ -0,0 +1,30 @@
from django.db.models import Model
from django.db.models.signals import post_save
from django.dispatch import receiver
from authentik.core.models import USER_PATH_SYSTEM_PREFIX, User, UserTypes
from authentik.events.middleware import audit_ignore
from authentik.providers.scim.models import SCIMAuthenticationMode, SCIMProvider
USER_PATH_PROVIDERS_SCIM = USER_PATH_SYSTEM_PREFIX + "/providers/scim"
@receiver(post_save, sender=SCIMProvider)
def scim_provider_post_save(sender: type[Model], instance: SCIMProvider, created: bool, **__):
"""Create service account before provider is saved"""
identifier = f"ak-providers-scim-{instance.pk}"
with audit_ignore():
if instance.auth_mode == SCIMAuthenticationMode.OAUTH:
user, user_created = User.objects.update_or_create(
username=identifier,
defaults={
"name": f"SCIM Provider {instance.name} Service-Account",
"type": UserTypes.INTERNAL_SERVICE_ACCOUNT,
"path": USER_PATH_PROVIDERS_SCIM,
},
)
if created or user_created:
instance.auth_oauth_user = user
instance.save()
elif instance.auth_mode == SCIMAuthenticationMode.TOKEN:
User.objects.filter(username=identifier).delete()

View File

@@ -0,0 +1,193 @@
"""SCIM OAuth tests"""
from base64 import b64encode
from datetime import timedelta
from unittest.mock import MagicMock, PropertyMock, patch
from django.urls import reverse
from django.utils.timezone import now
from requests_mock import Mocker
from rest_framework.test import APITestCase
from authentik.blueprints.tests import apply_blueprint
from authentik.core.models import Application, Group, User
from authentik.core.tests.utils import create_test_admin_user
from authentik.enterprise.license import LicenseKey
from authentik.enterprise.models import License
from authentik.enterprise.tests.test_license import expiry_valid
from authentik.lib.generators import generate_id
from authentik.providers.scim.models import SCIMAuthenticationMode, SCIMMapping, SCIMProvider
from authentik.sources.oauth.models import OAuthSource, UserOAuthSourceConnection
from authentik.tenants.models import Tenant
class SCIMOAuthTests(APITestCase):
"""SCIM User tests"""
@apply_blueprint("system/providers-scim.yaml")
def setUp(self) -> None:
# Delete all users and groups as the mocked HTTP responses only return one ID
# which will cause errors with multiple users
Tenant.objects.update(avatars="none")
User.objects.all().exclude_anonymous().delete()
Group.objects.all().delete()
self.source = OAuthSource.objects.create(
name=generate_id(),
slug=generate_id(),
access_token_url="http://localhost/token", # nosec
consumer_key=generate_id(),
consumer_secret=generate_id(),
provider_type="openidconnect",
)
self.provider = SCIMProvider.objects.create(
name=generate_id(),
url="https://localhost",
auth_mode=SCIMAuthenticationMode.OAUTH,
auth_oauth=self.source,
auth_oauth_params={
"foo": "bar",
},
exclude_users_service_account=True,
)
self.app: Application = Application.objects.create(
name=generate_id(),
slug=generate_id(),
)
self.app.backchannel_providers.add(self.provider)
self.provider.property_mappings.add(
SCIMMapping.objects.get(managed="goauthentik.io/providers/scim/user")
)
self.provider.property_mappings_group.add(
SCIMMapping.objects.get(managed="goauthentik.io/providers/scim/group")
)
def test_retrieve_token(self):
"""Test token retrieval"""
with Mocker() as mocker:
token = generate_id()
mocker.post("http://localhost/token", json={"access_token": token, "expires_in": 3600})
self.provider.scim_auth()
conn = UserOAuthSourceConnection.objects.filter(
source=self.source,
user=self.provider.auth_oauth_user,
).first()
self.assertIsNotNone(conn)
self.assertTrue(conn.is_valid)
auth = (
b64encode(
b":".join((self.source.consumer_key.encode(), self.source.consumer_secret.encode()))
)
.strip()
.decode()
)
self.assertEqual(
mocker.request_history[0].headers["Authorization"],
f"Basic {auth}",
)
self.assertEqual(mocker.request_history[0].body, "grant_type=password&foo=bar")
def test_existing_token(self):
"""Test existing token"""
UserOAuthSourceConnection.objects.create(
source=self.source,
user=self.provider.auth_oauth_user,
access_token=generate_id(),
expires=now() + timedelta(hours=3),
)
with Mocker() as mocker:
self.provider.scim_auth()
self.assertEqual(len(mocker.request_history), 0)
@Mocker()
def test_user_create(self, mock: Mocker):
"""Test user creation"""
scim_id = generate_id()
token = generate_id()
mock.post("http://localhost/token", json={"access_token": token, "expires_in": 3600})
mock.get(
"https://localhost/ServiceProviderConfig",
json={},
)
mock.post(
"https://localhost/Users",
json={
"id": scim_id,
},
)
uid = generate_id()
user = User.objects.create(
username=uid,
name=f"{uid} {uid}",
email=f"{uid}@goauthentik.io",
)
self.assertEqual(mock.call_count, 3)
self.assertEqual(mock.request_history[1].method, "GET")
self.assertEqual(mock.request_history[2].method, "POST")
self.assertJSONEqual(
mock.request_history[2].body,
{
"schemas": ["urn:ietf:params:scim:schemas:core:2.0:User"],
"active": True,
"emails": [
{
"primary": True,
"type": "other",
"value": f"{uid}@goauthentik.io",
}
],
"externalId": user.uid,
"name": {
"familyName": uid,
"formatted": f"{uid} {uid}",
"givenName": uid,
},
"displayName": f"{uid} {uid}",
"userName": uid,
},
)
@patch(
"authentik.enterprise.license.LicenseKey.validate",
MagicMock(
return_value=LicenseKey(
aud="",
exp=expiry_valid,
name=generate_id(),
internal_users=100,
external_users=100,
)
),
)
def test_api_create(self):
License.objects.create(key=generate_id())
self.client.force_login(create_test_admin_user())
res = self.client.post(
reverse("authentik_api:scimprovider-list"),
{
"name": generate_id(),
"url": "http://localhost",
"auth_mode": "oauth",
"auth_oauth": str(self.source.pk),
},
)
self.assertEqual(res.status_code, 201)
@patch(
"authentik.enterprise.models.LicenseUsageStatus.is_valid",
PropertyMock(return_value=False),
)
def test_api_create_no_license(self):
self.client.force_login(create_test_admin_user())
res = self.client.post(
reverse("authentik_api:scimprovider-list"),
{
"name": generate_id(),
"url": "http://localhost",
"auth_mode": "oauth",
"auth_oauth": str(self.source.pk),
},
)
self.assertEqual(res.status_code, 400)
self.assertJSONEqual(
res.content, {"auth_mode": ["Enterprise is required to use the OAuth mode."]}
)

View File

@@ -1,6 +1,8 @@
SPECTACULAR_SETTINGS = {
"POSTPROCESSING_HOOKS": [
"authentik.api.schema.postprocess_schema_responses",
"authentik.api.schema.postprocess_schema_pagination",
"authentik.api.schema.postprocess_schema_remove_unused",
"authentik.enterprise.search.schema.postprocess_schema_search_autocomplete",
"drf_spectacular.hooks.postprocess_schema_enums",
],

View File

@@ -5,6 +5,8 @@ TENANT_APPS = [
"authentik.enterprise.policies.unique_password",
"authentik.enterprise.providers.google_workspace",
"authentik.enterprise.providers.microsoft_entra",
"authentik.enterprise.providers.radius",
"authentik.enterprise.providers.scim",
"authentik.enterprise.providers.ssf",
"authentik.enterprise.search",
"authentik.enterprise.stages.authenticator_endpoint_gdtc",

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.1.12 on 2025-09-08 19:43
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_stages_authenticator_endpoint_gdtc", "0001_initial"),
]
operations = [
migrations.AlterField(
model_name="authenticatorendpointgdtcstage",
name="friendly_name",
field=models.TextField(blank=True, default=""),
preserve_default=False,
),
]

View File

@@ -7,6 +7,8 @@ from cryptography.x509 import (
Certificate,
NameOID,
ObjectIdentifier,
RFC822Name,
SubjectAlternativeName,
UnsupportedGeneralNameType,
load_pem_x509_certificate,
)
@@ -15,7 +17,7 @@ from django.utils.translation import gettext_lazy as _
from authentik.brands.models import Brand
from authentik.core.models import User
from authentik.crypto.models import CertificateKeyPair
from authentik.crypto.models import CertificateKeyPair, fingerprint_sha256
from authentik.enterprise.stages.mtls.models import (
CertAttributes,
MutualTLSStage,
@@ -137,7 +139,7 @@ class MTLSStageView(ChallengeStageView):
case CertAttributes.COMMON_NAME:
cert_attr = self.get_cert_attribute(cert, NameOID.COMMON_NAME)
case CertAttributes.EMAIL:
cert_attr = self.get_cert_attribute(cert, NameOID.EMAIL_ADDRESS)
cert_attr = self.get_cert_email(cert)
match stage.user_attribute:
case UserAttributes.USERNAME:
user_attr = "username"
@@ -171,7 +173,7 @@ class MTLSStageView(ChallengeStageView):
self.executor.plan.context.setdefault(PLAN_CONTEXT_PROMPT, {})
self.executor.plan.context[PLAN_CONTEXT_PROMPT].update(
{
"email": self.get_cert_attribute(cert, NameOID.EMAIL_ADDRESS),
"email": self.get_cert_email(cert),
"name": self.get_cert_attribute(cert, NameOID.COMMON_NAME),
}
)
@@ -183,6 +185,13 @@ class MTLSStageView(ChallengeStageView):
return None
return str(attr[0].value)
def get_cert_email(self, cert: Certificate) -> str | None:
ext = cert.extensions.get_extension_for_class(SubjectAlternativeName)
_cert_attr = ext.value.get_values_for_type(RFC822Name)
if len(_cert_attr) < 1:
return None
return str(_cert_attr[0])
def dispatch(self, request, *args, **kwargs):
stage: MutualTLSStage = self.executor.current_stage
certs = [
@@ -210,6 +219,7 @@ class MTLSStageView(ChallengeStageView):
if not cert and stage.mode == TLSMode.OPTIONAL:
self.logger.info("No certificate given, continuing")
return self.executor.stage_ok()
self.logger.debug("Received certificate", cert=fingerprint_sha256(cert))
existing_user = self.check_if_user(cert)
if self.executor.flow.designation == FlowDesignation.ENROLLMENT:
self.enroll_prepare_user(cert)

View File

@@ -19,7 +19,7 @@ if TYPE_CHECKING:
class ASNDict(TypedDict):
"""ASN Details"""
asn: int
asn: int | None
as_org: str | None
network: str | None
@@ -60,7 +60,7 @@ class ASNContextProcessor(MMDBContextProcessor):
except (GeoIP2Error, ValueError):
return None
def asn_to_dict(self, asn: ASN | None) -> ASNDict:
def asn_to_dict(self, asn: ASN | None) -> ASNDict | dict:
"""Convert ASN to dict"""
if not asn:
return {}

View File

@@ -19,10 +19,10 @@ if TYPE_CHECKING:
class GeoIPDict(TypedDict):
"""GeoIP Details"""
continent: str
country: str
lat: float
long: float
continent: str | None
country: str | None
lat: float | None
long: float | None
city: str
@@ -61,7 +61,7 @@ class GeoIPContextProcessor(MMDBContextProcessor):
except (GeoIP2Error, ValueError):
return None
def city_to_dict(self, city: City | None) -> GeoIPDict:
def city_to_dict(self, city: City | None) -> GeoIPDict | dict:
"""Convert City to dict"""
if not city:
return {}

View File

@@ -197,7 +197,8 @@ class AuditMiddleware:
return
if _CTX_IGNORE.get():
return
if request.request_id != _CTX_REQUEST.get().request_id:
current_request = _CTX_REQUEST.get()
if current_request is None or request.request_id != current_request.request_id:
return
user = self.get_user(request)
@@ -212,7 +213,8 @@ class AuditMiddleware:
return
if _CTX_IGNORE.get():
return
if request.request_id != _CTX_REQUEST.get().request_id:
current_request = _CTX_REQUEST.get()
if current_request is None or request.request_id != current_request.request_id:
return
user = self.get_user(request)
@@ -239,7 +241,8 @@ class AuditMiddleware:
return
if _CTX_IGNORE.get():
return
if request.request_id != _CTX_REQUEST.get().request_id:
current_request = _CTX_REQUEST.get()
if current_request is None or request.request_id != current_request.request_id:
return
user = self.get_user(request)

View File

@@ -0,0 +1,16 @@
# Generated by Django 5.1.11 on 2025-07-28 15:05
from django.db import migrations
class Migration(migrations.Migration):
dependencies = [
("authentik_events", "0012_notificationtransport_email_subject_prefix_and_more"),
]
operations = [
migrations.DeleteModel(
name="SystemTask",
),
]

View File

@@ -632,45 +632,3 @@ class NotificationWebhookMapping(PropertyMapping):
class Meta:
verbose_name = _("Webhook Mapping")
verbose_name_plural = _("Webhook Mappings")
class TaskStatus(models.TextChoices):
"""DEPRECATED do not use"""
UNKNOWN = "unknown"
SUCCESSFUL = "successful"
WARNING = "warning"
ERROR = "error"
class SystemTask(ExpiringModel):
"""DEPRECATED do not use"""
uuid = models.UUIDField(primary_key=True, editable=False, default=uuid4)
name = models.TextField()
uid = models.TextField(null=True)
start_timestamp = models.DateTimeField(default=now)
finish_timestamp = models.DateTimeField(default=now)
duration = models.FloatField(default=0)
status = models.TextField(choices=TaskStatus.choices)
description = models.TextField(null=True)
messages = models.JSONField()
task_call_module = models.TextField()
task_call_func = models.TextField()
task_call_args = models.JSONField(default=list)
task_call_kwargs = models.JSONField(default=dict)
def __str__(self) -> str:
return f"System Task {self.name}"
class Meta:
unique_together = (("name", "uid"),)
default_permissions = ()
permissions = ()
verbose_name = _("System Task")
verbose_name_plural = _("System Tasks")
indexes = ExpiringModel.Meta.indexes

View File

@@ -16,6 +16,7 @@ from authentik.events.models import (
NotificationRule,
NotificationTransport,
)
from authentik.lib.utils.db import chunked_queryset
from authentik.policies.engine import PolicyEngine
from authentik.policies.models import PolicyBinding, PolicyEngineMode
from authentik.tasks.models import Task
@@ -123,7 +124,8 @@ def gdpr_cleanup(user_pk: int):
"""cleanup events from gdpr_compliance"""
events = Event.objects.filter(user__pk=user_pk)
LOGGER.debug("GDPR cleanup, removing events from user", events=events.count())
events.delete()
for event in chunked_queryset(events):
event.delete()
@actor(description=_("Cleanup seen notifications and notifications whose event expired."))

View File

@@ -46,5 +46,5 @@ class FlowStageBindingViewSet(UsedByMixin, ModelViewSet):
serializer_class = FlowStageBindingSerializer
filterset_fields = "__all__"
search_fields = ["stage__name"]
ordering = ["order"]
ordering_fields = ["order", "stage__name"]
ordering = ["order", "pk"]
ordering_fields = ["order", "stage__name", "target__uuid", "pk"]

View File

@@ -291,7 +291,7 @@ class ConfigurableStage(models.Model):
class FriendlyNamedStage(models.Model):
"""Abstract base class for a Stage that can have a user friendly name configured."""
friendly_name = models.TextField(null=True)
friendly_name = models.TextField(blank=True)
class Meta:
abstract = True

View File

@@ -160,7 +160,7 @@ class ChallengeStageView(StageView):
"user": self.get_pending_user(for_display=True),
}
except Exception as exc:
except Exception as exc: # noqa
self.logger.warning("failed to template title", exc=exc)
return self.executor.flow.title
@@ -286,6 +286,12 @@ class SessionEndStage(ChallengeStageView):
that the user is likely to take after signing out of a provider."""
def get_challenge(self, *args, **kwargs) -> Challenge:
if not self.request.user.is_authenticated:
return RedirectChallenge(
data={
"to": reverse("authentik_core:root-redirect"),
},
)
application: Application | None = self.executor.plan.context.get(PLAN_CONTEXT_APPLICATION)
data = {
"component": "ak-stage-session-end",

View File

@@ -27,6 +27,7 @@ window.authentik.flow = {
{% endblock %}
{% block body %}
<ak-skip-to-content></ak-skip-to-content>
<ak-message-container></ak-message-container>
<ak-flow-executor flowSlug="{{ flow.slug }}">
<ak-loading></ak-loading>

View File

@@ -198,7 +198,7 @@ class FlowExecutorView(APIView):
# if the cached plan is from an older version, it might have different attributes
# in which case we just delete the plan and invalidate everything
next_binding = self.plan.next(self.request)
except Exception as exc:
except Exception as exc: # noqa
self._logger.warning(
"f(exec): found incompatible flow plan, invalidating run", exc=exc
)
@@ -288,7 +288,7 @@ class FlowExecutorView(APIView):
span.set_data("authentik Flow", self.flow.slug)
stage_response = self.current_stage_view.dispatch(request)
return to_stage_response(request, stage_response)
except Exception as exc:
except Exception as exc: # noqa
return self.handle_exception(exc)
@extend_schema(
@@ -339,7 +339,7 @@ class FlowExecutorView(APIView):
span.set_data("authentik Flow", self.flow.slug)
stage_response = self.current_stage_view.dispatch(request)
return to_stage_response(request, stage_response)
except Exception as exc:
except Exception as exc: # noqa
return self.handle_exception(exc)
def _initiate_plan(self) -> FlowPlan:
@@ -351,7 +351,7 @@ class FlowExecutorView(APIView):
# there are no issues with the class we might've gotten
# from the cache. If there are errors, just delete all cached flows
_ = plan.has_stages
except Exception:
except Exception: # noqa
keys = cache.keys(f"{CACHE_PREFIX}*")
cache.delete_many(keys)
return self._initiate_plan()

View File

@@ -19,7 +19,7 @@ def start_debug_server(**kwargs) -> bool:
)
return False
listen: str = CONFIG.get("listen.listen_debug_py", "127.0.0.1:9901")
listen: str = CONFIG.get("listen.debug_py", "127.0.0.1:9901")
host, _, port = listen.rpartition(":")
try:
debugpy.listen((host, int(port)), **kwargs) # nosec

View File

@@ -31,14 +31,14 @@ postgresql:
# host: replica1.example.com
listen:
listen_http: 0.0.0.0:9000
listen_https: 0.0.0.0:9443
listen_ldap: 0.0.0.0:3389
listen_ldaps: 0.0.0.0:6636
listen_radius: 0.0.0.0:1812
listen_metrics: 0.0.0.0:9300
listen_debug: 0.0.0.0:9900
listen_debug_py: 0.0.0.0:9901
http: 0.0.0.0:9000
https: 0.0.0.0:9443
ldap: 0.0.0.0:3389
ldaps: 0.0.0.0:6636
radius: 0.0.0.0:1812
metrics: 0.0.0.0:9300
debug: 0.0.0.0:9900
debug_py: 0.0.0.0:9901
trusted_proxy_cidrs:
- 127.0.0.0/8
- 10.0.0.0/8
@@ -152,7 +152,7 @@ worker:
processes: 1
threads: 2
consumer_listen_timeout: "seconds=30"
task_max_retries: 20
task_max_retries: 5
task_default_time_limit: "minutes=10"
lock_purge_interval: "minutes=1"
task_purge_interval: "days=1"

View File

@@ -43,7 +43,9 @@ def structlog_configure():
structlog.stdlib.PositionalArgumentsFormatter(),
structlog.processors.TimeStamper(fmt="iso", utc=False),
structlog.processors.StackInfoRenderer(),
structlog.processors.dict_tracebacks,
structlog.processors.ExceptionRenderer(
structlog.processors.ExceptionDictTransformer(show_locals=CONFIG.get_bool("debug"))
),
structlog.stdlib.ProcessorFormatter.wrap_for_formatter,
],
logger_factory=structlog.stdlib.LoggerFactory(),
@@ -65,7 +67,14 @@ def get_logger_config():
"json": {
"()": structlog.stdlib.ProcessorFormatter,
"processor": structlog.processors.JSONRenderer(sort_keys=True),
"foreign_pre_chain": LOG_PRE_CHAIN + [structlog.processors.dict_tracebacks],
"foreign_pre_chain": LOG_PRE_CHAIN
+ [
structlog.processors.ExceptionRenderer(
structlog.processors.ExceptionDictTransformer(
show_locals=CONFIG.get_bool("debug")
)
),
],
},
"console": {
"()": structlog.stdlib.ProcessorFormatter,

29
authentik/lib/utils/db.py Normal file
View File

@@ -0,0 +1,29 @@
"""authentik database utilities"""
import gc
from django.db import reset_queries
from django.db.models import QuerySet
def chunked_queryset(queryset: QuerySet, chunk_size: int = 1_000):
if not queryset.exists():
return []
def get_chunks(qs: QuerySet):
qs = qs.order_by("pk")
pks = qs.values_list("pk", flat=True)
start_pk = pks[0]
while True:
try:
end_pk = pks.filter(pk__gte=start_pk)[chunk_size]
except IndexError:
break
yield qs.filter(pk__gte=start_pk, pk__lt=end_pk)
start_pk = end_pk
yield qs.filter(pk__gte=start_pk)
for chunk in get_chunks(queryset):
reset_queries()
gc.collect()
yield from chunk.iterator()

View File

@@ -4,9 +4,11 @@ from traceback import extract_tb
from structlog.tracebacks import ExceptionDictTransformer
from authentik.lib.config import CONFIG
from authentik.lib.utils.reflection import class_to_path
TRACEBACK_HEADER = "Traceback (most recent call last):"
_exception_transformer = ExceptionDictTransformer(show_locals=CONFIG.get_bool("debug"))
def exception_to_string(exc: Exception) -> str:
@@ -23,4 +25,4 @@ def exception_to_string(exc: Exception) -> str:
def exception_to_dict(exc: Exception) -> dict:
"""Format exception as a dictionary"""
return ExceptionDictTransformer()((type(exc), exc, exc.__traceback__))
return _exception_transformer((type(exc), exc, exc.__traceback__))

View File

@@ -6,6 +6,7 @@ from pathlib import Path
from tempfile import gettempdir
from django.conf import settings
from django.utils.module_loading import import_string
from authentik.lib.config import CONFIG
@@ -62,3 +63,13 @@ def get_env() -> str:
if "AK_APPLIANCE" in os.environ:
return os.environ["AK_APPLIANCE"]
return "custom"
def ConditionalInheritance(path: str):
"""Conditionally inherit from a class, intended for things like authentik.enterprise,
without which authentik should still be able to run"""
try:
cls = import_string(path)
return cls
except ModuleNotFoundError:
return object

View File

@@ -13,6 +13,7 @@ from urllib3.exceptions import HTTPError
from yaml import dump_all
from authentik.events.logs import LogEvent, capture_logs
from authentik.lib.utils.reflection import class_to_path
from authentik.outposts.controllers.base import BaseClient, BaseController, ControllerException
from authentik.outposts.controllers.k8s.base import KubernetesObjectReconciler
from authentik.outposts.controllers.k8s.deployment import DeploymentReconciler
@@ -105,7 +106,7 @@ class KubernetesController(BaseController):
LogEvent(
log_level="info",
event=f"{reconcile_key.title()}: Disabled",
logger=str(type(self)),
logger=class_to_path(self.__class__),
)
)
continue
@@ -144,7 +145,7 @@ class KubernetesController(BaseController):
LogEvent(
log_level="info",
event=f"{reconcile_key.title()}: Disabled",
logger=str(type(self)),
logger=class_to_path(self.__class__),
)
)
continue

View File

@@ -357,7 +357,7 @@ class Outpost(ScheduledModel, SerializerModel, ManagedModel):
message=(
"While setting the permissions for the service-account, a "
"permission was not found: Check "
"https://goauthentik.io/docs/troubleshooting/missing_permission"
"https://docs.goauthentik.io/troubleshooting/missing_permission"
),
).with_exception(exc).set_user(user).save()
else:

View File

@@ -10,9 +10,9 @@ from rest_framework.serializers import PrimaryKeyRelatedField
from rest_framework.viewsets import ModelViewSet
from structlog.stdlib import get_logger
from authentik.core.api.groups import GroupSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.users import UserSerializer
from authentik.core.api.users import PartialGroupSerializer
from authentik.core.api.utils import ModelSerializer
from authentik.policies.api.policies import PolicySerializer
from authentik.policies.models import PolicyBinding, PolicyBindingModel
@@ -61,8 +61,8 @@ class PolicyBindingSerializer(ModelSerializer):
)
policy_obj = PolicySerializer(required=False, read_only=True, source="policy")
group_obj = GroupSerializer(required=False, read_only=True, source="group")
user_obj = UserSerializer(required=False, read_only=True, source="user")
group_obj = PartialGroupSerializer(required=False, read_only=True, source="group")
user_obj = PartialUserSerializer(required=False, read_only=True, source="user")
class Meta:
model = PolicyBinding
@@ -124,4 +124,5 @@ class PolicyBindingViewSet(UsedByMixin, ModelViewSet):
serializer_class = PolicyBindingSerializer
search_fields = ["policy__name"]
filterset_class = PolicyBindingFilter
ordering = ["target", "order"]
ordering = ["order", "pk"]
ordering_fields = ["order", "target__uuid", "pk"]

View File

@@ -71,7 +71,7 @@ class PolicyEvaluator(BaseEvaluator):
# PolicyExceptions should be propagated back to the process,
# which handles recording and returning a correct result
raise exc
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Expression error", exc=exc)
return PolicyResult(False, str(exc))
else:

View File

@@ -144,6 +144,6 @@ class PolicyProcess(PROCESS_CLASS):
"""Task wrapper to run policy checking"""
try:
self.connection.send(self.profiling_wrapper())
except Exception as exc:
except Exception as exc: # noqa
LOGGER.warning("Policy failed to run", exc=exc)
self.connection.send(PolicyResult(False, str(exc)))

View File

@@ -66,6 +66,7 @@ class OAuth2ProviderSerializer(ProviderSerializer):
"access_code_validity",
"access_token_validity",
"refresh_token_validity",
"refresh_token_threshold",
"include_claims_in_id_token",
"signing_key",
"encryption_key",

View File

@@ -0,0 +1,23 @@
# Generated by Django 5.1.12 on 2025-09-25 15:26
import authentik.lib.utils.time
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_providers_oauth2", "0029_oauth2provider__backchannel_logout_uris"),
]
operations = [
migrations.AddField(
model_name="oauth2provider",
name="refresh_token_threshold",
field=models.TextField(
default="seconds=0",
help_text="When refreshing a token, if the refresh token is valid for less than this duration, it will be renewed. When set to seconds=0, token will always be renewed. (Format: hours=1;minutes=2;seconds=3).",
validators=[authentik.lib.utils.time.timedelta_string_validator],
),
),
]

View File

@@ -238,6 +238,16 @@ class OAuth2Provider(WebfingerProvider, Provider):
"(Format: hours=1;minutes=2;seconds=3)."
),
)
refresh_token_threshold = models.TextField(
default="seconds=0",
validators=[timedelta_string_validator],
help_text=_(
"When refreshing a token, if the refresh token is valid for less than "
"this duration, it will be renewed. "
"When set to seconds=0, token will always be renewed. "
"(Format: hours=1;minutes=2;seconds=3)."
),
)
sub_mode = models.TextField(
choices=SubModes.choices,

View File

@@ -376,3 +376,63 @@ class TestToken(OAuthTestCase):
)
self.assertEqual(response.status_code, 400)
self.assertTrue(Event.objects.filter(action=EventAction.SUSPICIOUS_REQUEST).exists())
@apply_blueprint("system/providers-oauth2.yaml")
def test_refresh_token_view_threshold(self):
"""test request param"""
provider = OAuth2Provider.objects.create(
name=generate_id(),
authorization_flow=create_test_flow(),
redirect_uris=[RedirectURI(RedirectURIMatchingMode.STRICT, "http://local.invalid")],
signing_key=self.keypair,
refresh_token_threshold="hours=1", # nosec
)
provider.property_mappings.set(
ScopeMapping.objects.filter(
managed__in=[
"goauthentik.io/providers/oauth2/scope-openid",
"goauthentik.io/providers/oauth2/scope-email",
"goauthentik.io/providers/oauth2/scope-profile",
"goauthentik.io/providers/oauth2/scope-offline_access",
]
)
)
# Needs to be assigned to an application for iss to be set
self.app.provider = provider
self.app.save()
header = b64encode(f"{provider.client_id}:{provider.client_secret}".encode()).decode()
user = create_test_admin_user()
token: RefreshToken = RefreshToken.objects.create(
provider=provider,
user=user,
token=generate_id(),
_id_token=dumps({}),
auth_time=timezone.now(),
_scope="offline_access",
)
response = self.client.post(
reverse("authentik_providers_oauth2:token"),
data={
"grant_type": GRANT_TYPE_REFRESH_TOKEN,
"refresh_token": token.token,
"redirect_uri": "http://local.invalid",
},
HTTP_AUTHORIZATION=f"Basic {header}",
HTTP_ORIGIN="http://local.invalid",
)
self.assertEqual(response["Access-Control-Allow-Credentials"], "true")
self.assertEqual(response["Access-Control-Allow-Origin"], "http://local.invalid")
access: AccessToken = AccessToken.objects.filter(user=user, provider=provider).first()
self.assertJSONEqual(
response.content.decode(),
{
"access_token": access.token,
"token_type": TOKEN_TYPE,
"expires_in": 3600,
"id_token": provider.encode(
access.id_token.to_dict(),
),
"scope": "offline_access",
},
)
self.validate_jwt(access, provider)

View File

@@ -8,7 +8,12 @@ from jwt import decode
from authentik.blueprints.tests import apply_blueprint
from authentik.core.models import Application, Group, Token, TokenIntents, UserTypes
from authentik.core.tests.utils import create_test_admin_user, create_test_cert, create_test_flow
from authentik.core.tests.utils import (
create_test_admin_user,
create_test_cert,
create_test_flow,
create_test_user,
)
from authentik.policies.models import PolicyBinding
from authentik.providers.oauth2.constants import (
GRANT_TYPE_CLIENT_CREDENTIALS,
@@ -182,6 +187,47 @@ class TestTokenClientCredentialsUserNamePassword(OAuthTestCase):
self.assertEqual(jwt["given_name"], self.user.name)
self.assertEqual(jwt["preferred_username"], self.user.username)
def test_successful_two_tokens(self):
"""test successful when two app passwords with the same key exist"""
Token.objects.create(
identifier="sa-token-two",
user=create_test_user(),
intent=TokenIntents.INTENT_APP_PASSWORD,
expiring=False,
key=self.token.key,
)
response = self.client.post(
reverse("authentik_providers_oauth2:token"),
{
"grant_type": GRANT_TYPE_CLIENT_CREDENTIALS,
"scope": f"{SCOPE_OPENID} {SCOPE_OPENID_EMAIL} {SCOPE_OPENID_PROFILE}",
"client_id": self.provider.client_id,
"username": "sa",
"password": self.token.key,
},
)
self.assertEqual(response.status_code, 200)
body = loads(response.content.decode())
self.assertEqual(body["token_type"], TOKEN_TYPE)
_, alg = self.provider.jwt_key
jwt = decode(
body["access_token"],
key=self.provider.signing_key.public_key,
algorithms=[alg],
audience=self.provider.client_id,
)
self.assertEqual(jwt["given_name"], self.user.name)
self.assertEqual(jwt["preferred_username"], self.user.username)
jwt = decode(
body["id_token"],
key=self.provider.signing_key.public_key,
algorithms=[alg],
audience=self.provider.client_id,
)
self.assertEqual(jwt["given_name"], self.user.name)
self.assertEqual(jwt["preferred_username"], self.user.username)
def test_successful_password(self):
"""test successful (password grant)"""
response = self.client.post(

View File

@@ -340,7 +340,7 @@ class TokenParams:
if not user:
raise TokenError("invalid_grant")
token: Token = Token.filter_not_expired(
key=password, intent=TokenIntents.INTENT_APP_PASSWORD
key=password, intent=TokenIntents.INTENT_APP_PASSWORD, user=user
).first()
if not token or token.user.uid != user.uid:
raise TokenError("invalid_grant")
@@ -684,32 +684,8 @@ class TokenView(View):
)
access_token.save()
refresh_token_expiry = now + timedelta_from_string(self.provider.refresh_token_validity)
refresh_token = RefreshToken(
user=self.params.refresh_token.user,
scope=self.params.refresh_token.scope,
expires=refresh_token_expiry,
provider=self.provider,
auth_time=self.params.refresh_token.auth_time,
session=self.params.refresh_token.session,
)
id_token = IDToken.new(
self.provider,
refresh_token,
self.request,
)
id_token.nonce = self.params.refresh_token.id_token.nonce
id_token.at_hash = access_token.at_hash
refresh_token.id_token = id_token
refresh_token.save()
# Mark old token as revoked
self.params.refresh_token.revoked = True
self.params.refresh_token.save()
return {
res = {
"access_token": access_token.token,
"refresh_token": refresh_token.token,
"token_type": TOKEN_TYPE,
"scope": " ".join(access_token.scope),
"expires_in": int(
@@ -718,6 +694,37 @@ class TokenView(View):
"id_token": access_token.id_token.to_jwt(self.provider),
}
refresh_token_threshold = timedelta_from_string(self.provider.refresh_token_threshold)
if (
refresh_token_threshold.total_seconds() == 0
or (now - self.params.refresh_token.expires) > refresh_token_threshold
):
refresh_token_expiry = now + timedelta_from_string(self.provider.refresh_token_validity)
refresh_token = RefreshToken(
user=self.params.refresh_token.user,
scope=self.params.refresh_token.scope,
expires=refresh_token_expiry,
provider=self.provider,
auth_time=self.params.refresh_token.auth_time,
session=self.params.refresh_token.session,
)
id_token = IDToken.new(
self.provider,
refresh_token,
self.request,
)
id_token.nonce = self.params.refresh_token.id_token.nonce
id_token.at_hash = access_token.at_hash
refresh_token.id_token = id_token
refresh_token.save()
# Mark old token as revoked
self.params.refresh_token.revoked = True
self.params.refresh_token.save()
res["refresh_token"] = refresh_token.token
return res
def create_client_credentials_response(self) -> dict[str, Any]:
"""See https://datatracker.ietf.org/doc/html/rfc6749#section-4.4"""
now = timezone.now()

View File

@@ -60,7 +60,7 @@ class UserInfoView(View):
for scope in scopes:
if scope in special_scope_map:
scope_descriptions.append(
PermissionDict(id=scope, name=str(special_scope_map[scope]))
PermissionDict(id=str(scope), name=str(special_scope_map[scope]))
)
return scope_descriptions

View File

@@ -3,7 +3,7 @@
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.groups import GroupMemberSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.utils import ModelSerializer
from authentik.providers.rac.api.endpoints import EndpointSerializer
@@ -16,7 +16,7 @@ class ConnectionTokenSerializer(ModelSerializer):
provider_obj = RACProviderSerializer(source="provider", read_only=True)
endpoint_obj = EndpointSerializer(source="endpoint", read_only=True)
user = GroupMemberSerializer(source="session.user", read_only=True)
user = PartialUserSerializer(source="session.user", read_only=True)
class Meta:
model = ConnectionToken

View File

@@ -23,13 +23,19 @@ from authentik.core.models import Application
from authentik.events.models import Event, EventAction
from authentik.lib.expression.exceptions import ControlFlowException
from authentik.lib.sync.mapper import PropertyMappingManager
from authentik.lib.utils.reflection import ConditionalInheritance
from authentik.policies.api.exec import PolicyTestResultSerializer
from authentik.policies.engine import PolicyEngine
from authentik.policies.types import PolicyResult
from authentik.providers.radius.models import RadiusProvider, RadiusProviderPropertyMapping
class RadiusProviderSerializer(ProviderSerializer):
class RadiusProviderSerializer(
ConditionalInheritance(
"authentik.enterprise.providers.radius.api.RadiusProviderSerializerMixin"
),
ProviderSerializer,
):
"""RadiusProvider Serializer"""
outpost_set = ListField(child=CharField(), read_only=True, source="outpost_set.all")
@@ -43,6 +49,7 @@ class RadiusProviderSerializer(ProviderSerializer):
"shared_secret",
"outpost_set",
"mfa_support",
"certificate",
]
extra_kwargs = ProviderSerializer.Meta.extra_kwargs
@@ -78,6 +85,7 @@ class RadiusOutpostConfigSerializer(ModelSerializer):
"client_networks",
"shared_secret",
"mfa_support",
"certificate",
]

View File

@@ -0,0 +1,25 @@
# Generated by Django 5.1.11 on 2025-07-20 17:20
import django.db.models.deletion
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_crypto", "0004_alter_certificatekeypair_name"),
("authentik_providers_radius", "0004_alter_radiusproviderpropertymapping_options"),
]
operations = [
migrations.AddField(
model_name="radiusprovider",
name="certificate",
field=models.ForeignKey(
default=None,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to="authentik_crypto.certificatekeypair",
),
),
]

View File

@@ -1,11 +1,14 @@
"""Radius Provider"""
from collections.abc import Iterable
from django.db import models
from django.templatetags.static import static
from django.utils.translation import gettext_lazy as _
from rest_framework.serializers import Serializer
from authentik.core.models import PropertyMapping, Provider
from authentik.crypto.models import CertificateKeyPair
from authentik.lib.generators import generate_id
from authentik.outposts.models import OutpostModel
@@ -38,6 +41,10 @@ class RadiusProvider(OutpostModel, Provider):
),
)
certificate = models.ForeignKey(
CertificateKeyPair, on_delete=models.CASCADE, default=None, null=True
)
@property
def launch_url(self) -> str | None:
"""Radius never has a launch URL"""
@@ -57,6 +64,12 @@ class RadiusProvider(OutpostModel, Provider):
return RadiusProviderSerializer
def get_required_objects(self) -> Iterable[models.Model | str]:
required = [self, "authentik_stages_mtls.pass_outpost_certificate"]
if self.certificate is not None:
required.append(self.certificate)
return required
def __str__(self):
return f"Radius Provider {self.name}"

View File

@@ -239,32 +239,33 @@ class AssertionProcessor:
).from_http(self.http_request)
LOGGER.warning("Failed to evaluate property mapping", exc=exc)
return name_id
if name_id.attrib["Format"] == SAML_NAME_ID_FORMAT_EMAIL:
if self.auth_n_request.name_id_policy == SAML_NAME_ID_FORMAT_EMAIL:
name_id.text = self.http_request.user.email
return name_id
if name_id.attrib["Format"] in [
if self.auth_n_request.name_id_policy in [
SAML_NAME_ID_FORMAT_PERSISTENT,
SAML_NAME_ID_FORMAT_UNSPECIFIED,
]:
name_id.text = persistent
return name_id
if name_id.attrib["Format"] == SAML_NAME_ID_FORMAT_X509:
if self.auth_n_request.name_id_policy == SAML_NAME_ID_FORMAT_X509:
# This attribute is statically set by the LDAP source
name_id.text = self.http_request.user.attributes.get(
LDAP_DISTINGUISHED_NAME, persistent
)
return name_id
if name_id.attrib["Format"] == SAML_NAME_ID_FORMAT_WINDOWS:
if self.auth_n_request.name_id_policy == SAML_NAME_ID_FORMAT_WINDOWS:
# This attribute is statically set by the LDAP source
name_id.text = self.http_request.user.attributes.get("upn", persistent)
return name_id
if name_id.attrib["Format"] == SAML_NAME_ID_FORMAT_TRANSIENT:
if self.auth_n_request.name_id_policy == SAML_NAME_ID_FORMAT_TRANSIENT:
# Use the hash of the user's session, which changes every session
session_key: str = self.http_request.session.session_key
name_id.text = sha256(session_key.encode()).hexdigest()
return name_id
raise UnsupportedNameIDFormat(
f"Assertion contains NameID with unsupported format {name_id.attrib['Format']}."
"Assertion contains NameID with unsupported "
f"format {self.auth_n_request.name_id_policy}."
)
def get_assertion_subject(self) -> Element:

View File

@@ -97,6 +97,7 @@ class TestAuthNRequest(TestCase):
pre_authentication_flow=create_test_flow(),
signing_kp=self.cert,
verification_kp=self.cert,
signed_assertion=True,
)
def test_signed_valid(self):
@@ -171,6 +172,7 @@ class TestAuthNRequest(TestCase):
self.provider.sign_assertion = True
self.provider.sign_response = True
self.provider.save()
self.source.signed_response = True
http_request = get_request("/")
# First create an AuthNRequest

View File

@@ -4,7 +4,7 @@ from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.users import UserGroupSerializer
from authentik.core.api.users import PartialGroupSerializer
from authentik.core.api.utils import ModelSerializer
from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
from authentik.providers.scim.models import SCIMProviderGroup
@@ -13,7 +13,7 @@ from authentik.providers.scim.models import SCIMProviderGroup
class SCIMProviderGroupSerializer(ModelSerializer):
"""SCIMProviderGroup Serializer"""
group_obj = UserGroupSerializer(source="group", read_only=True)
group_obj = PartialGroupSerializer(source="group", read_only=True)
class Meta:

View File

@@ -5,11 +5,15 @@ from rest_framework.viewsets import ModelViewSet
from authentik.core.api.providers import ProviderSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.lib.sync.outgoing.api import OutgoingSyncProviderStatusMixin
from authentik.lib.utils.reflection import ConditionalInheritance
from authentik.providers.scim.models import SCIMProvider
from authentik.providers.scim.tasks import scim_sync, scim_sync_objects
class SCIMProviderSerializer(ProviderSerializer):
class SCIMProviderSerializer(
ConditionalInheritance("authentik.enterprise.providers.scim.api.SCIMProviderSerializerMixin"),
ProviderSerializer,
):
"""SCIMProvider Serializer"""
class Meta:
@@ -28,6 +32,9 @@ class SCIMProviderSerializer(ProviderSerializer):
"url",
"verify_certificates",
"token",
"auth_mode",
"auth_oauth",
"auth_oauth_params",
"compatibility_mode",
"exclude_users_service_account",
"filter_group",

View File

@@ -3,7 +3,7 @@
from rest_framework import mixins
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.groups import GroupMemberSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.used_by import UsedByMixin
from authentik.core.api.utils import ModelSerializer
from authentik.lib.sync.outgoing.api import OutgoingSyncConnectionCreateMixin
@@ -13,7 +13,7 @@ from authentik.providers.scim.models import SCIMProviderUser
class SCIMProviderUserSerializer(ModelSerializer):
"""SCIMProviderUser Serializer"""
user_obj = GroupMemberSerializer(source="user", read_only=True)
user_obj = PartialUserSerializer(source="user", read_only=True)
class Meta:

View File

@@ -0,0 +1,16 @@
from typing import TYPE_CHECKING
from requests import Request
if TYPE_CHECKING:
from authentik.providers.scim.models import SCIMProvider
class SCIMTokenAuth:
def __init__(self, provider: "SCIMProvider"):
self.provider = provider
def __call__(self, request: Request) -> Request:
request.headers["Authorization"] = f"Bearer {self.provider.token}"
return request

View File

@@ -35,7 +35,6 @@ class SCIMClient[TModel: "Model", TConnection: "Model", TSchema: "BaseModel"](
"""SCIM Client"""
base_url: str
token: str
_session: Session
_config: ServiceProviderConfiguration
@@ -45,12 +44,12 @@ class SCIMClient[TModel: "Model", TConnection: "Model", TSchema: "BaseModel"](
self._session = get_http_session()
self._session.verify = provider.verify_certificates
self.provider = provider
self.auth = provider.scim_auth()
# Remove trailing slashes as we assume the URL doesn't have any
base_url = provider.url
if base_url.endswith("/"):
base_url = base_url[:-1]
self.base_url = base_url
self.token = provider.token
self._config = self.get_service_provider_config()
def _request(self, method: str, path: str, **kwargs) -> dict:
@@ -62,8 +61,8 @@ class SCIMClient[TModel: "Model", TConnection: "Model", TSchema: "BaseModel"](
method,
f"{self.base_url}{path}",
**kwargs,
auth=self.auth,
headers={
"Authorization": f"Bearer {self.token}",
"Accept": "application/scim+json",
"Content-Type": "application/scim+json",
},
@@ -89,10 +88,11 @@ class SCIMClient[TModel: "Model", TConnection: "Model", TSchema: "BaseModel"](
def get_service_provider_config(self):
"""Get Service provider config"""
default_config = ServiceProviderConfiguration.default()
path = "/ServiceProviderConfig"
if self.provider.compatibility_mode == SCIMCompatibilityMode.SALESFORCE:
path = "/ServiceProviderConfigs"
try:
config = ServiceProviderConfiguration.model_validate(
self._request("GET", "/ServiceProviderConfig")
)
config = ServiceProviderConfiguration.model_validate(self._request("GET", path))
if self.provider.compatibility_mode == SCIMCompatibilityMode.AWS:
config.patch.supported = False
if self.provider.compatibility_mode == SCIMCompatibilityMode.SLACK:

View File

@@ -72,7 +72,8 @@ class SCIMUserClient(SCIMClient[User, SCIMProviderUser, SCIMUserSchema]):
if not self._config.filter.supported:
raise exc
users = self._request(
"GET", f"/Users?{urlencode({'filter': f'userName eq {scim_user.userName}'})}"
"GET",
f"/Users?{urlencode({'filter': f'userName eq \"{scim_user.userName}\"'})}",
)
users_res = users.get("Resources", [])
if len(users_res) < 1:

View File

@@ -0,0 +1,59 @@
# Generated by Django 5.1.12 on 2025-09-23 12:31
import django.db.models.deletion
from django.conf import settings
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_providers_scim", "0013_scimprovidergroup_attributes_and_more"),
("authentik_sources_oauth", "0011_useroauthsourceconnection_expires"),
migrations.swappable_dependency(settings.AUTH_USER_MODEL),
]
operations = [
migrations.AddField(
model_name="scimprovider",
name="auth_mode",
field=models.TextField(
choices=[("token", "Token"), ("oauth", "OAuth")], default="token"
),
),
migrations.AddField(
model_name="scimprovider",
name="auth_oauth",
field=models.ForeignKey(
default=None,
help_text="OAuth Source used for authentication",
null=True,
on_delete=django.db.models.deletion.SET_DEFAULT,
to="authentik_sources_oauth.oauthsource",
),
),
migrations.AddField(
model_name="scimprovider",
name="auth_oauth_params",
field=models.JSONField(
blank=True,
default=dict,
help_text="Additional OAuth parameters, such as grant_type",
),
),
migrations.AddField(
model_name="scimprovider",
name="auth_oauth_user",
field=models.ForeignKey(
default=None,
null=True,
on_delete=django.db.models.deletion.CASCADE,
to=settings.AUTH_USER_MODEL,
),
),
migrations.AlterField(
model_name="scimprovider",
name="token",
field=models.TextField(blank=True, help_text="Authentication token"),
),
]

View File

@@ -0,0 +1,32 @@
# Generated by Django 5.1.12 on 2025-09-24 12:10
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
(
"authentik_providers_scim",
"0014_scimprovider_auth_mode_scimprovider_auth_oauth_and_more",
),
]
operations = [
migrations.AlterField(
model_name="scimprovider",
name="compatibility_mode",
field=models.CharField(
choices=[
("default", "Default"),
("aws", "AWS"),
("slack", "Slack"),
("sfdc", "Salesforce"),
],
default="default",
help_text="Alter authentik behavior for vendor-specific SCIM implementations.",
max_length=30,
verbose_name="SCIM Compatibility Mode",
),
),
]

View File

@@ -8,12 +8,17 @@ from django.db.models import QuerySet
from django.templatetags.static import static
from django.utils.translation import gettext_lazy as _
from dramatiq.actor import Actor
from requests.auth import AuthBase
from rest_framework.serializers import Serializer
from structlog.stdlib import get_logger
from authentik.core.models import BackchannelProvider, Group, PropertyMapping, User, UserTypes
from authentik.lib.models import SerializerModel
from authentik.lib.sync.outgoing.base import BaseOutgoingSyncClient
from authentik.lib.sync.outgoing.models import OutgoingSyncProvider
from authentik.providers.scim.clients.auth import SCIMTokenAuth
LOGGER = get_logger()
class SCIMProviderUser(SerializerModel):
@@ -60,12 +65,20 @@ class SCIMProviderGroup(SerializerModel):
return f"SCIM Provider Group {self.group_id} to {self.provider_id}"
class SCIMAuthenticationMode(models.TextChoices):
"""SCIM authentication modes"""
TOKEN = "token", _("Token")
OAUTH = "oauth", _("OAuth")
class SCIMCompatibilityMode(models.TextChoices):
"""SCIM compatibility mode"""
DEFAULT = "default", _("Default")
AWS = "aws", _("AWS")
SLACK = "slack", _("Slack")
SALESFORCE = "sfdc", _("Salesforce")
class SCIMProvider(OutgoingSyncProvider, BackchannelProvider):
@@ -78,7 +91,26 @@ class SCIMProvider(OutgoingSyncProvider, BackchannelProvider):
)
url = models.TextField(help_text=_("Base URL to SCIM requests, usually ends in /v2"))
token = models.TextField(help_text=_("Authentication token"))
auth_mode = models.TextField(
choices=SCIMAuthenticationMode.choices, default=SCIMAuthenticationMode.TOKEN
)
token = models.TextField(help_text=_("Authentication token"), blank=True)
auth_oauth = models.ForeignKey(
"authentik_sources_oauth.OAuthSource",
on_delete=models.SET_DEFAULT,
default=None,
null=True,
help_text=_("OAuth Source used for authentication"),
)
auth_oauth_params = models.JSONField(
blank=True, default=dict, help_text=_("Additional OAuth parameters, such as grant_type")
)
auth_oauth_user = models.ForeignKey(
"authentik_core.User", on_delete=models.CASCADE, default=None, null=True
)
verify_certificates = models.BooleanField(default=True)
property_mappings_group = models.ManyToManyField(
@@ -96,6 +128,16 @@ class SCIMProvider(OutgoingSyncProvider, BackchannelProvider):
help_text=_("Alter authentik behavior for vendor-specific SCIM implementations."),
)
def scim_auth(self) -> AuthBase:
if self.auth_mode == SCIMAuthenticationMode.OAUTH:
try:
from authentik.enterprise.providers.scim.auth_oauth2 import SCIMOAuthAuth
return SCIMOAuthAuth(self)
except ImportError:
LOGGER.warning("Failed to import SCIM OAuth Client")
return SCIMTokenAuth(self)
@property
def icon_url(self) -> str | None:
return static("authentik/sources/scim.png")

View File

@@ -1,5 +1,6 @@
"""common RBAC serializers"""
from django.contrib.auth.models import Permission
from django.db.models import Q, QuerySet
from django.db.transaction import atomic
from django_filters.filters import CharFilter, ChoiceFilter
@@ -15,9 +16,9 @@ from rest_framework.request import Request
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from authentik.core.api.groups import GroupMemberSerializer
from authentik.core.api.groups import PartialUserSerializer
from authentik.core.api.utils import ModelSerializer
from authentik.core.models import User, UserTypes
from authentik.core.models import Group, User, UserTypes
from authentik.policies.event_matcher.models import model_choices
from authentik.rbac.api.rbac import PermissionAssignResultSerializer, PermissionAssignSerializer
from authentik.rbac.decorators import permission_required
@@ -37,15 +38,15 @@ class UserObjectPermissionSerializer(ModelSerializer):
fields = ["id", "codename", "model", "app_label", "object_pk", "name"]
class UserAssignedObjectPermissionSerializer(GroupMemberSerializer):
class UserAssignedObjectPermissionSerializer(PartialUserSerializer):
"""Users assigned object permission serializer"""
permissions = UserObjectPermissionSerializer(many=True, source="userobjectpermission_set")
is_superuser = BooleanField()
class Meta:
model = GroupMemberSerializer.Meta.model
fields = GroupMemberSerializer.Meta.fields + ["permissions", "is_superuser"]
model = PartialUserSerializer.Meta.model
fields = PartialUserSerializer.Meta.fields + ["permissions", "is_superuser"]
class UserAssignedPermissionFilter(FilterSet):
@@ -54,26 +55,56 @@ class UserAssignedPermissionFilter(FilterSet):
model = ChoiceFilter(choices=model_choices(), method="filter_model", required=True)
object_pk = CharFilter(method="filter_object_pk")
def filter_queryset(self, queryset):
queryset = super().filter_queryset(queryset)
data = self.form.cleaned_data
model: str = data["model"]
object_pk: str | None = data.get("object_pk", None)
app, _, model = model.partition(".")
superuser_pks = (
Group.objects.filter(is_superuser=True).values_list("users", flat=True).distinct()
)
permissions = Permission.objects.filter(
content_type__app_label=app,
content_type__model=model,
)
user_pks_with_model_permission = (
permissions.order_by().values_list("user", flat=True).distinct()
)
user_pks_with_object_permission = []
if object_pk:
user_pks_with_object_permission = (
UserObjectPermission.objects.filter(
permission__in=permissions,
object_pk=object_pk,
)
.order_by()
.values_list("user", flat=True)
.distinct()
)
return queryset.filter(
Q(pk__in=superuser_pks)
| Q(pk__in=user_pks_with_model_permission)
| Q(pk__in=user_pks_with_object_permission)
)
def filter_model(self, queryset: QuerySet, name, value: str) -> QuerySet:
"""Filter by object type"""
app, _, model = value.partition(".")
return queryset.filter(
Q(
user_permissions__content_type__app_label=app,
user_permissions__content_type__model=model,
)
| Q(
userobjectpermission__permission__content_type__app_label=app,
userobjectpermission__permission__content_type__model=model,
)
| Q(ak_groups__is_superuser=True)
).distinct()
# Actual filtering is handled by the above method where both `model` and `object_pk` are
# available. Don't do anything here, this method is only left here to avoid overriding too
# much of filter_queryset.
return queryset
def filter_object_pk(self, queryset: QuerySet, name, value: str) -> QuerySet:
"""Filter by object primary key"""
return queryset.filter(
Q(userobjectpermission__object_pk=value) | Q(ak_groups__is_superuser=True),
).distinct()
# Actual filtering is handled by the above method where both `model` and `object_pk` are
# available. Don't do anything here, this method is only left here to avoid overriding too
# much of filter_queryset.
return queryset
class UserAssignedPermissionViewSet(ListModelMixin, GenericViewSet):
@@ -83,7 +114,7 @@ class UserAssignedPermissionViewSet(ListModelMixin, GenericViewSet):
ordering = ["username"]
# The filtering is done in the filterset,
# which has a required filter that does the heavy lifting
queryset = User.objects.all()
queryset = User.objects.all().prefetch_related("userobjectpermission_set")
filterset_class = UserAssignedPermissionFilter
@permission_required("authentik_core.assign_user_permissions")

View File

@@ -61,7 +61,8 @@ class InitialPermissionsMiddleware:
):
if not created:
return
if request.request_id != _CTX_REQUEST.get().request_id:
current_request = _CTX_REQUEST.get()
if current_request is None or request.request_id != current_request.request_id:
return
user: User = request.user
if not user or user.is_anonymous:

View File

@@ -3,6 +3,7 @@
from datetime import timedelta
from getpass import getuser
from django.utils.timesince import timesince
from django.utils.timezone import now
from django.utils.translation import gettext as _
@@ -16,25 +17,38 @@ class Command(TenantCommand):
help = _("Create a Key which can be used to restore access to authentik.")
def format_duration_message(self, duration: int) -> str:
"""Format duration in minutes to a human-readable message"""
current_time = now()
future_time = current_time + timedelta(minutes=duration)
# fyi a non-breaking space is returned by timesince
return timesince(current_time, future_time)
def add_arguments(self, parser):
parser.add_argument(
"duration",
default=1,
action="store",
help="How long the token is valid for (in years).",
nargs="?",
default=60,
type=int,
help="How long the token is valid for (in minutes). Default: 60 minutes (1 hour).",
)
parser.add_argument("user", action="store", help="Which user the Token gives access to.")
def handle_per_tenant(self, *args, **options):
"""Create Token used to recover access"""
duration = int(options.get("duration", 1))
expiry = now() + timedelta(days=duration * 365.2425)
duration = int(options.get("duration", 60))
expiry = now() + timedelta(minutes=duration)
user = User.objects.filter(username=options.get("user")).first()
if not user:
self.stderr.write(f"User '{options.get('user')}' not found.")
return
_, url = create_recovery_token(user, expiry, getuser())
duration_msg = self.format_duration_message(duration)
self.stdout.write(
f"Store this link safely, as it will allow anyone to access authentik as {user}."
)
self.stdout.write(f"This recovery token is valid for {duration_msg}.")
self.stdout.write(url)

View File

@@ -1,10 +1,12 @@
"""recovery tests"""
from datetime import timedelta
from io import StringIO
from django.core.management import call_command
from django.test import TestCase
from django.urls import reverse
from django.utils.timezone import now
from django_tenants.utils import get_public_schema_name
from authentik.core.models import Token, TokenIntents, User
@@ -22,20 +24,21 @@ class TestRecovery(TestCase):
self.assertEqual(len(Token.objects.filter(intent=TokenIntents.INTENT_RECOVERY)), 0)
call_command(
"create_recovery_key",
"1",
"5",
self.user.username,
schema=get_public_schema_name(),
stdout=out,
)
token = Token.objects.get(intent=TokenIntents.INTENT_RECOVERY, user=self.user)
self.assertIn(token.key, out.getvalue())
self.assertIn("valid for 5\xa0minutes", out.getvalue())
self.assertEqual(len(Token.objects.filter(intent=TokenIntents.INTENT_RECOVERY)), 1)
def test_create_key_invalid(self):
"""Test creation of a new key (invalid)"""
out = StringIO()
self.assertEqual(len(Token.objects.filter(intent=TokenIntents.INTENT_RECOVERY)), 0)
call_command("create_recovery_key", "1", "foo", schema=get_public_schema_name(), stderr=out)
call_command("create_recovery_key", "5", "foo", schema=get_public_schema_name(), stderr=out)
self.assertIn("not found", out.getvalue())
def test_recovery_view(self):
@@ -43,7 +46,7 @@ class TestRecovery(TestCase):
out = StringIO()
call_command(
"create_recovery_key",
"1",
"10",
self.user.username,
schema=get_public_schema_name(),
stdout=out,
@@ -71,3 +74,116 @@ class TestRecovery(TestCase):
)
self.assertIn("successfully added to", out.getvalue())
self.assertTrue(self.user.is_superuser)
def test_create_key_default_duration(self):
"""Test creation of a new key with default duration (60 minutes)"""
out = StringIO()
before_creation = now()
call_command(
"create_recovery_key",
self.user.username,
schema=get_public_schema_name(),
stdout=out,
)
after_creation = now()
token = Token.objects.get(intent=TokenIntents.INTENT_RECOVERY, user=self.user)
self.assertIn(token.key, out.getvalue())
self.assertIn("valid for 1\xa0hour", out.getvalue())
# Verify the token expires in approximately 60 minutes (default)
expected_expiry_min = before_creation + timedelta(minutes=60)
expected_expiry_max = after_creation + timedelta(minutes=60)
self.assertGreaterEqual(token.expires, expected_expiry_min)
self.assertLessEqual(token.expires, expected_expiry_max)
def test_create_key_custom_duration(self):
"""Test creation of a new key with custom duration"""
out = StringIO()
custom_duration = 120 # 2 hours
before_creation = now()
call_command(
"create_recovery_key",
str(custom_duration),
self.user.username,
schema=get_public_schema_name(),
stdout=out,
)
after_creation = now()
token = Token.objects.get(intent=TokenIntents.INTENT_RECOVERY, user=self.user)
self.assertIn(token.key, out.getvalue())
self.assertIn("valid for 2\xa0hours", out.getvalue())
# Verify the token expires in approximately the custom duration
expected_expiry_min = before_creation + timedelta(minutes=custom_duration)
expected_expiry_max = after_creation + timedelta(minutes=custom_duration)
self.assertGreaterEqual(token.expires, expected_expiry_min)
self.assertLessEqual(token.expires, expected_expiry_max)
def test_create_key_short_duration(self):
"""Test creation of a new key with very short duration (1 minute)"""
out = StringIO()
short_duration = 1
before_creation = now()
call_command(
"create_recovery_key",
str(short_duration),
self.user.username,
schema=get_public_schema_name(),
stdout=out,
)
after_creation = now()
token = Token.objects.get(intent=TokenIntents.INTENT_RECOVERY, user=self.user)
self.assertIn(token.key, out.getvalue())
self.assertIn("valid for 1\xa0minute", out.getvalue())
# Verify the token expires in approximately 1 minute
expected_expiry_min = before_creation + timedelta(minutes=short_duration)
expected_expiry_max = after_creation + timedelta(minutes=short_duration)
self.assertGreaterEqual(token.expires, expected_expiry_min)
self.assertLessEqual(token.expires, expected_expiry_max)
def test_create_key_duration_validation(self):
"""Test that the duration is correctly converted to minutes"""
# Test various durations to ensure they're calculated correctly
test_cases = [1, 5, 30, 60, 120, 1440] # 1min, 5min, 30min, 1hr, 2hr, 24hr
for duration in test_cases:
with self.subTest(duration=duration):
out = StringIO()
before_creation = now()
call_command(
"create_recovery_key",
str(duration),
self.user.username,
schema=get_public_schema_name(),
stdout=out,
)
after_creation = now()
token = Token.objects.get(intent=TokenIntents.INTENT_RECOVERY, user=self.user)
# Verify the token expires in approximately the specified duration
expected_expiry_min = before_creation + timedelta(minutes=duration)
expected_expiry_max = after_creation + timedelta(minutes=duration)
self.assertGreaterEqual(token.expires, expected_expiry_min)
self.assertLessEqual(token.expires, expected_expiry_max)
# Clean up for next iteration
token.delete()
def test_create_key_help_text(self):
"""Test that the help text correctly indicates minutes"""
from authentik.recovery.management.commands.create_recovery_key import Command
command = Command()
# Check that the help text mentions minutes
parser = command.create_parser("test", "create_recovery_key")
help_text = parser.format_help()
self.assertIn("minutes", help_text.lower())
self.assertNotIn("years", help_text.lower())

View File

@@ -175,6 +175,7 @@ SPECTACULAR_SETTINGS = {
"SAMLNameIDPolicyEnum": "authentik.sources.saml.models.SAMLNameIDPolicy",
"UserTypeEnum": "authentik.core.models.UserTypes",
"UserVerificationEnum": "authentik.stages.authenticator_webauthn.models.UserVerification",
"SCIMAuthenticationModeEnum": "authentik.providers.scim.models.SCIMAuthenticationMode",
},
"ENUM_ADD_EXPLICIT_BLANK_NULL_CHOICE": False,
"ENUM_GENERATE_CHOICE_DESCRIPTION": False,
@@ -183,6 +184,8 @@ SPECTACULAR_SETTINGS = {
],
"POSTPROCESSING_HOOKS": [
"authentik.api.schema.postprocess_schema_responses",
"authentik.api.schema.postprocess_schema_pagination",
"authentik.api.schema.postprocess_schema_remove_unused",
"drf_spectacular.hooks.postprocess_schema_enums",
],
}
@@ -255,6 +258,7 @@ MIDDLEWARE = [
"authentik.root.middleware.LoggingMiddleware",
"authentik.root.middleware.ClientIPMiddleware",
"authentik.stages.user_login.middleware.BoundSessionMiddleware",
"django.middleware.locale.LocaleMiddleware",
"authentik.core.middleware.AuthenticationMiddleware",
"authentik.core.middleware.RequestIDMiddleware",
"authentik.brands.middleware.BrandMiddleware",
@@ -413,7 +417,10 @@ DRAMATIQ = {
("dramatiq.middleware.pipelines.Pipelines", {}),
(
"dramatiq.middleware.retries.Retries",
{"max_retries": CONFIG.get_int("worker.task_max_retries") if not TEST else 0},
{
"max_retries": CONFIG.get_int("worker.task_max_retries") if not TEST else 0,
"max_backoff": 60 * 60 * 1000, # 1 hour
},
),
("dramatiq.results.middleware.Results", {"store_results": True}),
("django_dramatiq_postgres.middleware.CurrentTask", {}),

View File

@@ -1,7 +1,6 @@
from datetime import timedelta
from django.core.signals import Signal
from django.dispatch import receiver
from django.dispatch import Signal, receiver
from django.utils.timezone import now
from structlog.stdlib import get_logger

View File

@@ -177,6 +177,6 @@ class PytestTestRunner(DiscoverRunner): # pragma: no cover
with patch("guardian.shortcuts._get_ct_cached", patched__get_ct_cached):
try:
return pytest.main(self.args)
except Exception as e:
except Exception as e: # noqa
self.logger.error("Error running tests", error=str(e), test_files=self.args)
return 1

View File

@@ -12,7 +12,7 @@ from authentik.sources.oauth.models import GroupOAuthSourceConnection, UserOAuth
class UserOAuthSourceConnectionSerializer(UserSourceConnectionSerializer):
class Meta(UserSourceConnectionSerializer.Meta):
model = UserOAuthSourceConnection
fields = UserSourceConnectionSerializer.Meta.fields + ["access_token"]
fields = UserSourceConnectionSerializer.Meta.fields + ["access_token", "expires"]
extra_kwargs = {
**UserSourceConnectionSerializer.Meta.extra_kwargs,
"access_token": {"write_only": True},

View File

@@ -59,13 +59,15 @@ class OAuth2Client(BaseOAuthClient):
"""Get client secret"""
return self.source.consumer_secret
def get_access_token_args(self, callback: str, code: str) -> dict[str, Any]:
def get_access_token_args(self, callback: str | None, code: str | None) -> dict[str, Any]:
args = {
"redirect_uri": callback,
"code": code,
"grant_type": "authorization_code",
}
if SESSION_KEY_OAUTH_PKCE in self.request.session:
if callback:
args["redirect_uri"] = callback
if code:
args["code"] = code
if self.request and SESSION_KEY_OAUTH_PKCE in self.request.session:
args["code_verifier"] = self.request.session[SESSION_KEY_OAUTH_PKCE]
if (
self.source.source_type.authorization_code_auth_method

View File

@@ -0,0 +1,19 @@
# Generated by Django 5.1.12 on 2025-09-21 17:01
import django.utils.timezone
from django.db import migrations, models
class Migration(migrations.Migration):
dependencies = [
("authentik_sources_oauth", "0010_oauthsource_authorization_code_auth_method"),
]
operations = [
migrations.AddField(
model_name="useroauthsourceconnection",
name="expires",
field=models.DateTimeField(default=django.utils.timezone.now),
),
]

View File

@@ -5,6 +5,7 @@ from typing import TYPE_CHECKING
from django.db import models
from django.http.request import HttpRequest
from django.urls import reverse
from django.utils.timezone import now
from django.utils.translation import gettext_lazy as _
from rest_framework.serializers import Serializer
@@ -311,6 +312,11 @@ class UserOAuthSourceConnection(UserSourceConnection):
"""Authorized remote OAuth provider."""
access_token = models.TextField(blank=True, null=True, default=None)
expires = models.DateTimeField(default=now)
@property
def is_valid(self):
return self.expires > now()
@property
def serializer(self) -> type[Serializer]:

View File

@@ -1,10 +1,17 @@
"""OAuth Source tests"""
from urllib.parse import parse_qs
from django.urls import reverse
from requests_mock import Mocker
from rest_framework.test import APITestCase
from authentik.core.models import User
from authentik.core.tests.utils import create_test_admin_user
from authentik.flows.planner import PLAN_CONTEXT_PENDING_USER, FlowPlan
from authentik.flows.stage import PLAN_CONTEXT_PENDING_USER_IDENTIFIER
from authentik.flows.views.executor import SESSION_KEY_PLAN
from authentik.lib.generators import generate_id
from authentik.sources.oauth.api.source import OAuthSourceSerializer
from authentik.sources.oauth.models import OAuthSource
@@ -124,20 +131,68 @@ class TestOAuthSource(APITestCase):
)
self.assertFalse(serializer.is_valid())
def test_source_redirect(self):
"""test redirect view"""
self.client.get(
def test_source_redirect_login_hint_user(self):
"""test redirect view with login hint"""
user = User(email="foo@authentik.company")
session = self.client.session
plan = FlowPlan(generate_id())
plan.context[PLAN_CONTEXT_PENDING_USER] = user
session[SESSION_KEY_PLAN] = plan
session.save()
res = self.client.get(
reverse(
"authentik_sources_oauth:oauth-client-login",
kwargs={"source_slug": self.source.slug},
)
)
self.assertEqual(res.status_code, 302)
qs = parse_qs(res.url)
self.assertEqual(qs["login_hint"], ["foo@authentik.company"])
def test_source_redirect_login_hint_user_identifier(self):
"""test redirect view with login hint"""
session = self.client.session
plan = FlowPlan(generate_id())
plan.context[PLAN_CONTEXT_PENDING_USER_IDENTIFIER] = "foo@authentik.company"
session[SESSION_KEY_PLAN] = plan
session.save()
res = self.client.get(
reverse(
"authentik_sources_oauth:oauth-client-login",
kwargs={"source_slug": self.source.slug},
)
)
self.assertEqual(res.status_code, 302)
qs = parse_qs(res.url)
self.assertEqual(qs["login_hint"], ["foo@authentik.company"])
def test_source_redirect(self):
"""test redirect view"""
res = self.client.get(
reverse(
"authentik_sources_oauth:oauth-client-login",
kwargs={"source_slug": self.source.slug},
)
)
self.assertEqual(res.status_code, 302)
qs = parse_qs(res.url)
session = self.client.session
state = session[f"oauth-client-{self.source.name}-request-state"]
self.assertEqual(qs["redirect_uri"], ["http://testserver/source/oauth/callback/test/"])
self.assertEqual(qs["response_type"], ["code"])
self.assertEqual(qs["state"], [state])
self.assertEqual(qs["scope"], ["email openid profile"])
def test_source_callback(self):
"""test callback view"""
self.client.get(
res = self.client.get(
reverse(
"authentik_sources_oauth:oauth-client-callback",
kwargs={"source_slug": self.source.slug},
)
)
self.assertEqual(res.status_code, 302)

View File

@@ -96,7 +96,11 @@ class EntraIDType(SourceType):
}
def get_base_group_properties(self, source, group_id, **kwargs):
raw_group = kwargs["info"]["raw_groups"][group_id]
raw_groups = kwargs["info"]["raw_groups"]
if group_id in raw_groups:
name = raw_groups[group_id]["displayName"]
else:
name = group_id
return {
"name": raw_group["displayName"],
"name": name,
}

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